@rudderstack/integrations-lib 0.2.30 → 0.2.31
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/build/constants.d.ts +5 -64
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +1 -1
- package/build/logger.d.ts +1 -1
- package/build/logger.d.ts.map +1 -1
- package/build/logger.js +1 -1
- package/build/sdks/googleAdsRestAPI/googleAds.d.ts +2 -2
- package/build/sdks/googleAdsRestAPI/googleAds.d.ts.map +1 -1
- package/build/sdks/googleAdsRestAPI/googleAds.js +2 -2
- package/build/sdks/sfmc/index.d.ts +1 -1
- package/build/sdks/sfmc/index.d.ts.map +1 -1
- package/build/sdks/sfmc/index.js +11 -3
- package/build/sdks/sfmc/type.d.ts +5 -0
- package/build/sdks/sfmc/type.d.ts.map +1 -1
- package/build/sdks/sfmc/type.js +1 -1
- package/build/sdks/sfmc/utils.d.ts +6 -5
- package/build/sdks/sfmc/utils.d.ts.map +1 -1
- package/build/sdks/sfmc/utils.js +6 -6
- package/build/sdks/zoho/types.d.ts +2 -20
- package/build/sdks/zoho/types.d.ts.map +1 -1
- package/build/sdks/zoho/types.js +1 -1
- package/build/utils/misc.d.ts +7 -7
- package/build/utils/misc.d.ts.map +1 -1
- package/build/utils/misc.js +1 -1
- package/build/utils/request.d.ts +8 -1
- package/build/utils/request.d.ts.map +1 -1
- package/build/utils/request.js +1 -1
- package/package.json +2 -1
- package/build/lib/set-value/set-value.test.d.ts +0 -2
- package/build/lib/set-value/set-value.test.d.ts.map +0 -1
- package/build/lib/set-value/set-value.test.js +0 -105
- package/build/network/clients/axios_client.test.d.ts +0 -2
- package/build/network/clients/axios_client.test.d.ts.map +0 -1
- package/build/network/clients/axios_client.test.js +0 -276
- package/build/network/factory.test.d.ts +0 -2
- package/build/network/factory.test.d.ts.map +0 -1
- package/build/network/factory.test.js +0 -51
- package/build/sdks/customerio_audience/index.test.d.ts +0 -2
- package/build/sdks/customerio_audience/index.test.d.ts.map +0 -1
- package/build/sdks/customerio_audience/index.test.js +0 -121
- package/build/sdks/googleAdsRestAPI/googleAds.test.d.ts +0 -2
- package/build/sdks/googleAdsRestAPI/googleAds.test.d.ts.map +0 -1
- package/build/sdks/googleAdsRestAPI/googleAds.test.js +0 -771
- package/build/sdks/sfmc/index.test.d.ts +0 -2
- package/build/sdks/sfmc/index.test.d.ts.map +0 -1
- package/build/sdks/sfmc/index.test.js +0 -751
- package/build/sdks/sfmc/utils.test.d.ts +0 -2
- package/build/sdks/sfmc/utils.test.d.ts.map +0 -1
- package/build/sdks/sfmc/utils.test.js +0 -32
- package/build/sdks/zoho/zoho.test.d.ts +0 -2
- package/build/sdks/zoho/zoho.test.d.ts.map +0 -1
- package/build/sdks/zoho/zoho.test.js +0 -472
- package/build/structured-logger.test.d.ts +0 -2
- package/build/structured-logger.test.d.ts.map +0 -1
- package/build/structured-logger.test.js +0 -93
- package/build/utils/json-schema-generator.test.d.ts +0 -2
- package/build/utils/json-schema-generator.test.d.ts.map +0 -1
- package/build/utils/json-schema-generator.test.js +0 -368
- package/build/utils/misc.test.d.ts +0 -2
- package/build/utils/misc.test.d.ts.map +0 -1
- package/build/utils/misc.test.js +0 -2260
- package/build/utils/request.test.d.ts +0 -2
- package/build/utils/request.test.d.ts.map +0 -1
- package/build/utils/request.test.js +0 -72
- package/build/utils/tests.test.d.ts +0 -2
- package/build/utils/tests.test.d.ts.map +0 -1
- package/build/utils/tests.test.js +0 -89
- package/build/utils/zod.test.d.ts +0 -2
- package/build/utils/zod.test.d.ts.map +0 -1
- package/build/utils/zod.test.js +0 -48
package/build/utils/misc.test.js
DELETED
|
@@ -1,2260 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const misc_1 = require("./misc");
|
|
4
|
-
const tests_1 = require("./tests");
|
|
5
|
-
describe('misc', () => {
|
|
6
|
-
describe('isDefined', () => {
|
|
7
|
-
// Tests that the function returns true when a defined value is passed as an argument
|
|
8
|
-
it('should return true when a defined value is passed as an argument', () => {
|
|
9
|
-
expect((0, misc_1.isDefined)(5)).toBe(true);
|
|
10
|
-
});
|
|
11
|
-
// Tests that the function returns true when a non-null value is passed as an argument
|
|
12
|
-
it('should return true when a non-null value is passed as an argument', () => {
|
|
13
|
-
expect((0, misc_1.isDefined)('hello')).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
// Tests that the function returns true when an empty string is passed as an argument
|
|
16
|
-
it('should return true when an empty string is passed as an argument', () => {
|
|
17
|
-
expect((0, misc_1.isDefined)('')).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
// Tests that the function returns true when a number is passed as an argument
|
|
20
|
-
it('should return true when a number is passed as an argument', () => {
|
|
21
|
-
expect((0, misc_1.isDefined)(10)).toBe(true);
|
|
22
|
-
});
|
|
23
|
-
// Tests that the function returns true when a boolean is passed as an argument
|
|
24
|
-
it('should return true when a boolean is passed as an argument', () => {
|
|
25
|
-
expect((0, misc_1.isDefined)(true)).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
// Tests that the function returns false when an undefined value is passed as an argument
|
|
28
|
-
it('should return false when an undefined value is passed as an argument', () => {
|
|
29
|
-
expect((0, misc_1.isDefined)(undefined)).toBe(false);
|
|
30
|
-
});
|
|
31
|
-
// Tests that the function returns true when null is passed as an argument
|
|
32
|
-
it('should return true when null is passed as an argument', () => {
|
|
33
|
-
expect((0, misc_1.isDefined)(null)).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
// Tests that the function returns true when an empty object is passed as an argument
|
|
36
|
-
it('should return true when an empty object is passed as an argument', () => {
|
|
37
|
-
expect((0, misc_1.isDefined)({})).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
// Tests that the function returns true when an empty array is passed as an argument
|
|
40
|
-
it('should return true when an empty array is passed as an argument', () => {
|
|
41
|
-
expect((0, misc_1.isDefined)([])).toBe(true);
|
|
42
|
-
});
|
|
43
|
-
// Tests that the function returns true when NaN is passed as an argument
|
|
44
|
-
it('should return true when NaN is passed as an argument', () => {
|
|
45
|
-
expect((0, misc_1.isDefined)(NaN)).toBe(true);
|
|
46
|
-
});
|
|
47
|
-
// Tests that the function returns true when a function is passed as an argument
|
|
48
|
-
it('should return true when a function is passed as an argument', () => {
|
|
49
|
-
expect((0, misc_1.isDefined)(() => { })).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
// Tests that the function returns true when a symbol is passed as an argument
|
|
52
|
-
it('should return true when a symbol is passed as an argument', () => {
|
|
53
|
-
expect((0, misc_1.isDefined)(Symbol())).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
// To verify that the function returns true when an empty Map object is passed as an argument
|
|
56
|
-
it('should return true when an empty Map object is passed as an argument', () => {
|
|
57
|
-
const map = new Map();
|
|
58
|
-
expect((0, misc_1.isDefined)(map)).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
// The objective of this test is to verify that the function returns true when an empty Set object is passed as an argument.
|
|
61
|
-
it('should return true when an empty Set object is passed as an argument', () => {
|
|
62
|
-
const setObj = new Set();
|
|
63
|
-
expect((0, misc_1.isDefined)(setObj)).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
// The objective of this test is to verify that the function returns true when an empty WeakMap object is passed as an argument.
|
|
66
|
-
it('should return true when an empty WeakMap object is passed as an argument', () => {
|
|
67
|
-
const emptyWeakMap = new WeakMap();
|
|
68
|
-
expect((0, misc_1.isDefined)(emptyWeakMap)).toBe(true);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('isNotEmpty', () => {
|
|
72
|
-
// Tests that isNotEmpty returns true for non-empty arrays
|
|
73
|
-
it('should return true when the input is a non-empty array', () => {
|
|
74
|
-
const result = (0, misc_1.isNotEmpty)([1, 2, 3]);
|
|
75
|
-
expect(result).toBe(true);
|
|
76
|
-
});
|
|
77
|
-
// Tests that isNotEmpty returns false for empty arrays
|
|
78
|
-
it('should return false when the input is an empty array', () => {
|
|
79
|
-
const result = (0, misc_1.isNotEmpty)([]);
|
|
80
|
-
expect(result).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
// Tests that isNotEmpty returns true for non-empty objects
|
|
83
|
-
it('should return true when the input is a non-empty object', () => {
|
|
84
|
-
const result = (0, misc_1.isNotEmpty)({ key: 'value' });
|
|
85
|
-
expect(result).toBe(true);
|
|
86
|
-
});
|
|
87
|
-
// Tests that isNotEmpty returns false for empty objects
|
|
88
|
-
it('should return false when the input is an empty object', () => {
|
|
89
|
-
const result = (0, misc_1.isNotEmpty)({});
|
|
90
|
-
expect(result).toBe(false);
|
|
91
|
-
});
|
|
92
|
-
// Tests that isNotEmpty returns true for non-empty strings
|
|
93
|
-
it('should return true when the input is a non-empty string', () => {
|
|
94
|
-
const result = (0, misc_1.isNotEmpty)('hello');
|
|
95
|
-
expect(result).toBe(true);
|
|
96
|
-
});
|
|
97
|
-
// Tests that isNotEmpty returns false for empty strings
|
|
98
|
-
it('should return false when the input is an empty string', () => {
|
|
99
|
-
const result = (0, misc_1.isNotEmpty)('');
|
|
100
|
-
expect(result).toBe(false);
|
|
101
|
-
});
|
|
102
|
-
// Tests that isNotEmpty returns false for non-zero numbers
|
|
103
|
-
it('should return false when the input is a non-zero number', () => {
|
|
104
|
-
const result = (0, misc_1.isNotEmpty)(42);
|
|
105
|
-
expect(result).toBe(false);
|
|
106
|
-
});
|
|
107
|
-
// Tests that isNotEmpty returns false for zero
|
|
108
|
-
it('should return false when the input is zero', () => {
|
|
109
|
-
const result = (0, misc_1.isNotEmpty)(0);
|
|
110
|
-
expect(result).toBe(false);
|
|
111
|
-
});
|
|
112
|
-
// Tests that isNotEmpty returns false for null
|
|
113
|
-
it('should return false when the input is null', () => {
|
|
114
|
-
const result = (0, misc_1.isNotEmpty)(null);
|
|
115
|
-
expect(result).toBe(false);
|
|
116
|
-
});
|
|
117
|
-
// Tests that isNotEmpty returns false for undefined
|
|
118
|
-
it('should return false when the input is undefined', () => {
|
|
119
|
-
const result = (0, misc_1.isNotEmpty)(undefined);
|
|
120
|
-
expect(result).toBe(false);
|
|
121
|
-
});
|
|
122
|
-
// Tests that isNotEmpty returns false for NaN
|
|
123
|
-
it('should return false when the input is NaN', () => {
|
|
124
|
-
const result = (0, misc_1.isNotEmpty)(NaN);
|
|
125
|
-
expect(result).toBe(false);
|
|
126
|
-
});
|
|
127
|
-
// Tests that isNotEmpty returns false for false boolean
|
|
128
|
-
it('should return false when the input is false', () => {
|
|
129
|
-
const result = (0, misc_1.isNotEmpty)(false);
|
|
130
|
-
expect(result).toBe(false);
|
|
131
|
-
});
|
|
132
|
-
// Tests that isNotEmpty returns false for true boolean
|
|
133
|
-
it('should return false when the input is a true boolean', () => {
|
|
134
|
-
const result = (0, misc_1.isNotEmpty)(true);
|
|
135
|
-
expect(result).toBe(false);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
describe('isNotNull', () => {
|
|
139
|
-
// Tests that isNotNull returns true when a non-null value is passed
|
|
140
|
-
it('should return true when a non-null value is passed', () => {
|
|
141
|
-
expect((0, misc_1.isNotNull)('test')).toBe(true);
|
|
142
|
-
});
|
|
143
|
-
// Tests that isNotNull returns true when a truthy value is passed
|
|
144
|
-
it('should return true when a truthy value is passed', () => {
|
|
145
|
-
expect((0, misc_1.isNotNull)(true)).toBe(true);
|
|
146
|
-
});
|
|
147
|
-
// Tests that isNotNull returns true when an empty string is passed
|
|
148
|
-
it('should return true when an empty string is passed', () => {
|
|
149
|
-
expect((0, misc_1.isNotNull)('')).toBe(true);
|
|
150
|
-
});
|
|
151
|
-
// Tests that isNotNull returns true when a number is passed
|
|
152
|
-
it('should return true when a number is passed', () => {
|
|
153
|
-
expect((0, misc_1.isNotNull)(123)).toBe(true);
|
|
154
|
-
});
|
|
155
|
-
// Tests that isNotNull returns true when a boolean value is passed
|
|
156
|
-
it('should return true when a boolean value is passed', () => {
|
|
157
|
-
expect((0, misc_1.isNotNull)(true)).toBe(true);
|
|
158
|
-
});
|
|
159
|
-
// Tests that isNotNull returns false when null is passed
|
|
160
|
-
it('should return false when null is passed', () => {
|
|
161
|
-
expect((0, misc_1.isNotNull)(null)).toBe(false);
|
|
162
|
-
});
|
|
163
|
-
// Tests that isNotNull returns false when undefined is passed
|
|
164
|
-
it('should return false when undefined is passed', () => {
|
|
165
|
-
expect((0, misc_1.isNotNull)(undefined)).toBe(false);
|
|
166
|
-
});
|
|
167
|
-
// Tests that isNotNull returns true when an empty object is passed
|
|
168
|
-
it('should return true when an empty object is passed', () => {
|
|
169
|
-
expect((0, misc_1.isNotNull)({})).toBe(true);
|
|
170
|
-
});
|
|
171
|
-
// Tests that isNotNull returns true when an empty array is passed
|
|
172
|
-
it('should return true when an empty array is passed', () => {
|
|
173
|
-
expect((0, misc_1.isNotNull)([])).toBe(true);
|
|
174
|
-
});
|
|
175
|
-
// Tests that isNotNull returns true when a function is passed
|
|
176
|
-
it('should return true when a function is passed', () => {
|
|
177
|
-
expect((0, misc_1.isNotNull)(() => { })).toBe(true);
|
|
178
|
-
});
|
|
179
|
-
// Tests that isNotNull returns true when NaN is passed
|
|
180
|
-
it('should return true when NaN is passed', () => {
|
|
181
|
-
expect((0, misc_1.isNotNull)(NaN)).toBe(true);
|
|
182
|
-
});
|
|
183
|
-
// Tests that isNotNull returns true when a symbol is passed
|
|
184
|
-
it('should return true when a symbol is passed', () => {
|
|
185
|
-
expect((0, misc_1.isNotNull)(Symbol())).toBe(true);
|
|
186
|
-
});
|
|
187
|
-
// Tests that isNotNull returns true when a function is passed
|
|
188
|
-
it('should return true when a function is passed', () => {
|
|
189
|
-
expect((0, misc_1.isNotNull)(() => { })).toBe(true);
|
|
190
|
-
});
|
|
191
|
-
// Tests that isNotNull returns true when NaN is passed
|
|
192
|
-
it('should return true when NaN is passed', () => {
|
|
193
|
-
expect((0, misc_1.isNotNull)(NaN)).toBe(true);
|
|
194
|
-
});
|
|
195
|
-
// Tests that isNotNull returns true when a symbol is passed
|
|
196
|
-
it('should return true when a symbol is passed', () => {
|
|
197
|
-
const symbol = Symbol();
|
|
198
|
-
expect((0, misc_1.isNotNull)(symbol)).toBe(true);
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
describe('isDefinedAndNotNull', () => {
|
|
202
|
-
// Tests that the function returns true when a defined and not null value is passed as an argument
|
|
203
|
-
it('should return true when a defined and not null value is passed as an argument', () => {
|
|
204
|
-
const result = (0, misc_1.isDefinedAndNotNull)('test');
|
|
205
|
-
expect(result).toBe(true);
|
|
206
|
-
});
|
|
207
|
-
// Tests that the function returns true when a string value is passed as an argument
|
|
208
|
-
it('should return true when a string value is passed as an argument', () => {
|
|
209
|
-
const result = (0, misc_1.isDefinedAndNotNull)('test');
|
|
210
|
-
expect(result).toBe(true);
|
|
211
|
-
});
|
|
212
|
-
// Tests that the function returns true when a number value is passed as an argument
|
|
213
|
-
it('should return true when a number value is passed as an argument', () => {
|
|
214
|
-
const result = (0, misc_1.isDefinedAndNotNull)(123);
|
|
215
|
-
expect(result).toBe(true);
|
|
216
|
-
});
|
|
217
|
-
// Tests that the function returns true when a boolean value is passed as an argument
|
|
218
|
-
it('should return true when a boolean value is passed as an argument', () => {
|
|
219
|
-
const result = (0, misc_1.isDefinedAndNotNull)(true);
|
|
220
|
-
expect(result).toBe(true);
|
|
221
|
-
});
|
|
222
|
-
// Tests that the function returns true when an object value is passed as an argument
|
|
223
|
-
it('should return true when an object value is passed as an argument', () => {
|
|
224
|
-
const result = (0, misc_1.isDefinedAndNotNull)({ key: 'value' });
|
|
225
|
-
expect(result).toBe(true);
|
|
226
|
-
});
|
|
227
|
-
// Tests that the function returns true when an array value is passed as an argument
|
|
228
|
-
it('should return true when an array value is passed as an argument', () => {
|
|
229
|
-
const result = (0, misc_1.isDefinedAndNotNull)([1, 2, 3]);
|
|
230
|
-
expect(result).toBe(true);
|
|
231
|
-
});
|
|
232
|
-
// Tests that the function returns true when an empty string value is passed as an argument
|
|
233
|
-
it('should return true when an empty string value is passed as an argument', () => {
|
|
234
|
-
const result = (0, misc_1.isDefinedAndNotNull)('');
|
|
235
|
-
expect(result).toBe(true);
|
|
236
|
-
});
|
|
237
|
-
// Tests that the function returns true when an empty array value is passed as an argument
|
|
238
|
-
it('should return true when an empty array value is passed as an argument', () => {
|
|
239
|
-
const result = (0, misc_1.isDefinedAndNotNull)([]);
|
|
240
|
-
expect(result).toBe(true);
|
|
241
|
-
});
|
|
242
|
-
// Tests that the function returns true when an empty object value is passed as an argument
|
|
243
|
-
it('should return true when an empty object value is passed as an argument', () => {
|
|
244
|
-
const result = (0, misc_1.isDefinedAndNotNull)({});
|
|
245
|
-
expect(result).toBe(true);
|
|
246
|
-
});
|
|
247
|
-
// Tests that the function returns false when undefined is passed as an argument
|
|
248
|
-
it('should return false when undefined is passed as an argument', () => {
|
|
249
|
-
const result = (0, misc_1.isDefinedAndNotNull)(undefined);
|
|
250
|
-
expect(result).toBe(false);
|
|
251
|
-
});
|
|
252
|
-
// Tests that the function returns false when null is passed as an argument
|
|
253
|
-
it('should return false when null is passed as an argument', () => {
|
|
254
|
-
const result = (0, misc_1.isDefinedAndNotNull)(null);
|
|
255
|
-
expect(result).toBe(false);
|
|
256
|
-
});
|
|
257
|
-
// Tests that the function returns true when NaN is passed as an argument
|
|
258
|
-
it('should return true when NaN is passed as an argument', () => {
|
|
259
|
-
const result = (0, misc_1.isDefinedAndNotNull)(NaN);
|
|
260
|
-
expect(result).toBe(true);
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
describe('isDefinedAndNotNullAndNotEmpty', () => {
|
|
264
|
-
// Tests that the function returns true when passed a non-empty string
|
|
265
|
-
it('should return true when passed a non-empty string', () => {
|
|
266
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)('hello')).toBe(true);
|
|
267
|
-
});
|
|
268
|
-
// Tests that the function returns true when passed a non-empty object
|
|
269
|
-
it('should return true when passed a non-empty object', () => {
|
|
270
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)({ name: 'John', age: 25 })).toBe(true);
|
|
271
|
-
});
|
|
272
|
-
// Tests that the function returns true when passed a non-empty array
|
|
273
|
-
it('should return true when passed a non-empty array', () => {
|
|
274
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)([1, 2, 3])).toBe(true);
|
|
275
|
-
});
|
|
276
|
-
// Tests that the function returns false when passed a boolean value
|
|
277
|
-
it('should return false when passed a boolean value', () => {
|
|
278
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(true)).toBe(false);
|
|
279
|
-
});
|
|
280
|
-
// Tests that the function returns false when passed a number value
|
|
281
|
-
it('should return false when passed a number value', () => {
|
|
282
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(42)).toBe(false);
|
|
283
|
-
});
|
|
284
|
-
// Tests that the function returns false when passed an empty string
|
|
285
|
-
it('should return false when passed an empty string', () => {
|
|
286
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)('')).toBe(false);
|
|
287
|
-
});
|
|
288
|
-
// Tests that the function returns false when passed an empty object
|
|
289
|
-
it('should return false when passed an empty object', () => {
|
|
290
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)({})).toBe(false);
|
|
291
|
-
});
|
|
292
|
-
// Tests that the function returns false when passed an empty array
|
|
293
|
-
it('should return false when passed an empty array', () => {
|
|
294
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)([])).toBe(false);
|
|
295
|
-
});
|
|
296
|
-
// Tests that the function returns false when passed null
|
|
297
|
-
it('should return false when passed null', () => {
|
|
298
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(null)).toBe(false);
|
|
299
|
-
});
|
|
300
|
-
// Tests that the function returns false when passed undefined
|
|
301
|
-
it('should return false when passed undefined', () => {
|
|
302
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(undefined)).toBe(false);
|
|
303
|
-
});
|
|
304
|
-
// Tests that the function returns true when passed a string with only whitespace characters
|
|
305
|
-
it('should return true when passed a string with only whitespace characters', () => {
|
|
306
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)(' ')).toBe(true);
|
|
307
|
-
});
|
|
308
|
-
// Tests that the function returns true when passed an object with only null or undefined values
|
|
309
|
-
it('should return true when passed an object with only null or undefined values', () => {
|
|
310
|
-
expect((0, misc_1.isDefinedAndNotNullAndNotEmpty)({ prop1: null, prop2: undefined })).toBe(true);
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
describe('isBlank', () => {
|
|
314
|
-
// Tests that isBlank returns true for an empty string
|
|
315
|
-
it('should return true when value is an empty string', () => {
|
|
316
|
-
expect((0, misc_1.isBlank)('')).toBe(true);
|
|
317
|
-
});
|
|
318
|
-
// Tests that isBlank returns true for an empty array
|
|
319
|
-
it('should return true when value is an empty array', () => {
|
|
320
|
-
expect((0, misc_1.isBlank)([])).toBe(true);
|
|
321
|
-
});
|
|
322
|
-
// Tests that isBlank returns false for an empty object
|
|
323
|
-
it('should return true when value is an empty object', () => {
|
|
324
|
-
expect((0, misc_1.isBlank)({})).toBe(false);
|
|
325
|
-
});
|
|
326
|
-
// Tests that isBlank returns false for a non-empty string
|
|
327
|
-
it('should return false when value is a non-empty string', () => {
|
|
328
|
-
expect((0, misc_1.isBlank)('hello')).toBe(false);
|
|
329
|
-
});
|
|
330
|
-
// Tests that isBlank returns false for a non-empty array
|
|
331
|
-
it('should return false when value is a non-empty array', () => {
|
|
332
|
-
expect((0, misc_1.isBlank)([1, 2, 3])).toBe(false);
|
|
333
|
-
});
|
|
334
|
-
// Tests that isBlank returns false for a non-empty object
|
|
335
|
-
it('should return false when value is a non-empty object', () => {
|
|
336
|
-
expect((0, misc_1.isBlank)({ key: 'value' })).toBe(false);
|
|
337
|
-
});
|
|
338
|
-
// Tests that isBlank returns true for a null value
|
|
339
|
-
it('should return true when value is null', () => {
|
|
340
|
-
expect((0, misc_1.isBlank)(null)).toBe(true);
|
|
341
|
-
});
|
|
342
|
-
// Tests that isBlank returns true for an undefined value
|
|
343
|
-
it('should return true when value is undefined', () => {
|
|
344
|
-
expect((0, misc_1.isBlank)(undefined)).toBe(true);
|
|
345
|
-
});
|
|
346
|
-
// Tests that isBlank returns false for a boolean value
|
|
347
|
-
it('should return false when value is a boolean', () => {
|
|
348
|
-
expect((0, misc_1.isBlank)(true)).toBe(false);
|
|
349
|
-
expect((0, misc_1.isBlank)(false)).toBe(false);
|
|
350
|
-
});
|
|
351
|
-
// Tests that isBlank returns false for a number value
|
|
352
|
-
it('should return false when value is a number', () => {
|
|
353
|
-
expect((0, misc_1.isBlank)(123)).toBe(false);
|
|
354
|
-
expect((0, misc_1.isBlank)(0)).toBe(false);
|
|
355
|
-
expect((0, misc_1.isBlank)(-1)).toBe(false);
|
|
356
|
-
});
|
|
357
|
-
// Tests that isBlank returns false for a whitespace string
|
|
358
|
-
it('should return false when value is a whitespace string', () => {
|
|
359
|
-
expect((0, misc_1.isBlank)(' ')).toBe(false);
|
|
360
|
-
expect((0, misc_1.isBlank)('\t')).toBe(false);
|
|
361
|
-
expect((0, misc_1.isBlank)('\n')).toBe(false);
|
|
362
|
-
});
|
|
363
|
-
// Tests that isBlank returns false for NaN value
|
|
364
|
-
it('should return true when value is NaN', () => {
|
|
365
|
-
expect((0, misc_1.isBlank)(NaN)).toBe(false);
|
|
366
|
-
});
|
|
367
|
-
});
|
|
368
|
-
describe('removeUndefinedValues', () => {
|
|
369
|
-
// Tests that the function returns the same object if it is not an object
|
|
370
|
-
it('should return the same object when the input is not an object', () => {
|
|
371
|
-
const input = 123;
|
|
372
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
373
|
-
expect(result).toBe(input);
|
|
374
|
-
});
|
|
375
|
-
// Tests that the function returns an object without undefined values if all values are defined
|
|
376
|
-
it('should return an object without undefined values when all values are defined', () => {
|
|
377
|
-
const input = { a: 1, b: 'hello', c: true };
|
|
378
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
379
|
-
expect(result).toEqual(input);
|
|
380
|
-
});
|
|
381
|
-
// Tests that the function returns an object without undefined values if some values are defined
|
|
382
|
-
it('should return an object without undefined values when some values are defined', () => {
|
|
383
|
-
const input = { a: 1, b: undefined, c: true };
|
|
384
|
-
const expected = { a: 1, c: true };
|
|
385
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
386
|
-
expect(result).toEqual(expected);
|
|
387
|
-
});
|
|
388
|
-
// Tests that the function returns an empty object if the input is an empty object
|
|
389
|
-
it('should return an empty object when the input is an empty object', () => {
|
|
390
|
-
const input = {};
|
|
391
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
392
|
-
expect(result).toEqual({});
|
|
393
|
-
});
|
|
394
|
-
// Tests that the function returns null if the input is null
|
|
395
|
-
it('should return null when the input is null', () => {
|
|
396
|
-
const input = null;
|
|
397
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
398
|
-
expect(result).toBeNull();
|
|
399
|
-
});
|
|
400
|
-
// Tests that the function returns undefined if the input is undefined
|
|
401
|
-
it('should return undefined when the input is undefined', () => {
|
|
402
|
-
const input = undefined;
|
|
403
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
404
|
-
expect(result).toBeUndefined();
|
|
405
|
-
});
|
|
406
|
-
// Tests that the function returns an object without undefined values if some nested values are undefined
|
|
407
|
-
it('should return an object without undefined values when some nested values are undefined', () => {
|
|
408
|
-
const input = { a: { b: 1, c: undefined }, d: 2 };
|
|
409
|
-
const expected = { a: { b: 1 }, d: 2 };
|
|
410
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
411
|
-
expect(result).toEqual(expected);
|
|
412
|
-
});
|
|
413
|
-
// Tests that the function returns an object without undefined values if some nested values are null
|
|
414
|
-
it('should return an object without undefined values when some nested values are null', () => {
|
|
415
|
-
const input = { a: { b: 1, c: null }, d: 2 };
|
|
416
|
-
const expected = { a: { b: 1, c: null }, d: 2 };
|
|
417
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
418
|
-
expect(result).toEqual(expected);
|
|
419
|
-
});
|
|
420
|
-
// Tests that the function returns an object without undefined values if some nested values are empty strings
|
|
421
|
-
it('should return an object without undefined values when some nested values are empty strings', () => {
|
|
422
|
-
const input = { a: { b: 1, c: '' }, d: 2 };
|
|
423
|
-
const expected = { a: { b: 1, c: '' }, d: 2 };
|
|
424
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
425
|
-
expect(result).toEqual(expected);
|
|
426
|
-
});
|
|
427
|
-
// Tests that the function returns an object without undefined values if some nested values are false
|
|
428
|
-
it('should return an object without undefined values when some nested values are false', () => {
|
|
429
|
-
const input = { a: { b: 1, c: false }, d: 2 };
|
|
430
|
-
const expected = { a: { b: 1, c: false }, d: 2 };
|
|
431
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
432
|
-
expect(result).toEqual(expected);
|
|
433
|
-
});
|
|
434
|
-
// Tests that the function returns an object without undefined values if some nested values are zero
|
|
435
|
-
it('should return an object without undefined values when some nested values are zero', () => {
|
|
436
|
-
const input = { a: { b: 1, c: 0 }, d: 2 };
|
|
437
|
-
const expected = { a: { b: 1, c: 0 }, d: 2 };
|
|
438
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
439
|
-
expect(result).toEqual(expected);
|
|
440
|
-
});
|
|
441
|
-
// Tests that the function returns an object without undefined values if some nested values are NaN
|
|
442
|
-
it('should return an object without undefined values when some nested values are NaN', () => {
|
|
443
|
-
const input = { a: { b: 1, c: NaN }, d: 2 };
|
|
444
|
-
const expected = { a: { b: 1, c: NaN }, d: 2 };
|
|
445
|
-
const result = (0, misc_1.removeUndefinedValues)(input);
|
|
446
|
-
expect(result).toEqual(expected);
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
describe('removeNullValues', () => {
|
|
450
|
-
// Tests that the function correctly handles an empty object as input
|
|
451
|
-
it('should return an empty object when input is an empty object', () => {
|
|
452
|
-
const input = {};
|
|
453
|
-
const expected = {};
|
|
454
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
455
|
-
expect(result).toEqual(expected);
|
|
456
|
-
});
|
|
457
|
-
// Tests that the function correctly handles an object with no null values
|
|
458
|
-
it('should return the same object when input has no null values', () => {
|
|
459
|
-
const input = { a: 1, b: 'hello', c: [1, 2, 3] };
|
|
460
|
-
const expected = { a: 1, b: 'hello', c: [1, 2, 3] };
|
|
461
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
462
|
-
expect(result).toEqual(expected);
|
|
463
|
-
});
|
|
464
|
-
// Tests that the function correctly handles null as input
|
|
465
|
-
it('should return null when input is null', () => {
|
|
466
|
-
const input = null;
|
|
467
|
-
const expected = null;
|
|
468
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
469
|
-
expect(result).toEqual(expected);
|
|
470
|
-
});
|
|
471
|
-
// Tests that the function correctly handles undefined as input
|
|
472
|
-
it('should return undefined when input is undefined', () => {
|
|
473
|
-
const input = undefined;
|
|
474
|
-
const expected = undefined;
|
|
475
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
476
|
-
expect(result).toEqual(expected);
|
|
477
|
-
});
|
|
478
|
-
// Tests that the function correctly handles a string as input
|
|
479
|
-
it('should return the same string when input is a string', () => {
|
|
480
|
-
const input = 'hello';
|
|
481
|
-
const expected = 'hello';
|
|
482
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
483
|
-
expect(result).toEqual(expected);
|
|
484
|
-
});
|
|
485
|
-
// Tests that the function correctly handles a number as input
|
|
486
|
-
it('should return the same number when input is a number', () => {
|
|
487
|
-
const input = 123;
|
|
488
|
-
const expected = 123;
|
|
489
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
490
|
-
expect(result).toEqual(expected);
|
|
491
|
-
});
|
|
492
|
-
// Tests that the function correctly handles an array as input
|
|
493
|
-
it('should return the same array when input is an array', () => {
|
|
494
|
-
const input = [1, 2, 3];
|
|
495
|
-
const expected = { '0': 1, '1': 2, '2': 3 };
|
|
496
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
497
|
-
expect(result).toEqual(expected);
|
|
498
|
-
});
|
|
499
|
-
// Tests that the function correctly handles an object with only null values
|
|
500
|
-
it('should return an empty object when input has only null values', () => {
|
|
501
|
-
const input = { a: null, b: null, c: null };
|
|
502
|
-
const expected = {};
|
|
503
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
504
|
-
expect(result).toEqual(expected);
|
|
505
|
-
});
|
|
506
|
-
// Tests that the function correctly handles an object with nested null values
|
|
507
|
-
it('should remove nested null values from the object', () => {
|
|
508
|
-
const input = { a: { b: null }, c: { d: { e: null } } };
|
|
509
|
-
const expected = { a: {}, c: { d: {} } };
|
|
510
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
511
|
-
expect(result).not.toEqual(expected);
|
|
512
|
-
});
|
|
513
|
-
// Tests that the function correctly handles an object with nested non-null values
|
|
514
|
-
it('should return the same object when input has nested non-null values', () => {
|
|
515
|
-
const input = { a: { b: 1 }, c: { d: { e: 'hello' } } };
|
|
516
|
-
const expected = { a: { b: 1 }, c: { d: { e: 'hello' } } };
|
|
517
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
518
|
-
expect(result).toEqual(expected);
|
|
519
|
-
});
|
|
520
|
-
// Tests that the function correctly handles an object with mixed nested null and non-null values
|
|
521
|
-
it('should remove nested null values and keep non-null values in the object', () => {
|
|
522
|
-
const input = { a: { b: null, c: 1 }, d: { e: null, f: 'hello' } };
|
|
523
|
-
const expected = { a: { c: 1 }, d: { f: 'hello' } };
|
|
524
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
525
|
-
expect(result).not.toEqual(expected);
|
|
526
|
-
});
|
|
527
|
-
// Tests that the function correctly handles an object with null values and falsy non-null values
|
|
528
|
-
it('should remove null values and keep falsy non-null values in the object', () => {
|
|
529
|
-
const input = { a: null, b: false, c: 0, d: '' };
|
|
530
|
-
const expected = { b: false, c: 0, d: '' };
|
|
531
|
-
const result = (0, misc_1.removeNullValues)(input);
|
|
532
|
-
expect(result).toEqual(expected);
|
|
533
|
-
});
|
|
534
|
-
});
|
|
535
|
-
describe('removeUndefinedAndNullValues', () => {
|
|
536
|
-
// Tests that the function returns the same object when passed an object with defined and not null values
|
|
537
|
-
it('should return the same object when passed an object with defined and not null values', () => {
|
|
538
|
-
const obj = { a: 1, b: 'test', c: true };
|
|
539
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(obj);
|
|
540
|
-
});
|
|
541
|
-
// Tests that the function returns the object without null values when passed an object with defined and null values
|
|
542
|
-
it('should return the object without null values when passed an object with defined and null values', () => {
|
|
543
|
-
const obj = { a: 1, b: null, c: 'test', d: null };
|
|
544
|
-
const expected = { a: 1, c: 'test' };
|
|
545
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(expected);
|
|
546
|
-
});
|
|
547
|
-
// Tests that the function returns an empty object when passed an empty object
|
|
548
|
-
it('should return an empty object when passed an empty object', () => {
|
|
549
|
-
const obj = {};
|
|
550
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual({});
|
|
551
|
-
});
|
|
552
|
-
// Tests that the function returns the object without undefined and null values when passed an object with undefined and null values
|
|
553
|
-
it('should return the object without undefined and null values when passed an object with undefined and null values', () => {
|
|
554
|
-
const obj = { a: 1, b: undefined, c: 'test', d: null };
|
|
555
|
-
const expected = { a: 1, c: 'test' };
|
|
556
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(expected);
|
|
557
|
-
});
|
|
558
|
-
// Tests that the function returns the same value when passed a non-object value
|
|
559
|
-
it('should return the same value when passed a non-object value', () => {
|
|
560
|
-
const value = 123;
|
|
561
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(value)).toEqual(value);
|
|
562
|
-
});
|
|
563
|
-
// Tests that the function returns the same object with nested defined and not null values when passed an object with nested properties containing defined and not null values
|
|
564
|
-
it('should return the same object with nested defined and not null values when passed an object with nested properties containing defined and not null values', () => {
|
|
565
|
-
const obj = { a: 1, b: { c: 'test', d: true }, e: 'test' };
|
|
566
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(obj);
|
|
567
|
-
});
|
|
568
|
-
// Tests that the function returns the same object with properties containing defined and not null values when passed an object with properties containing defined and not null values
|
|
569
|
-
it('should return the same object with properties containing defined and not null values when passed an object with properties containing defined and not null values', () => {
|
|
570
|
-
const obj = { a: 1, b: 'test', c: true };
|
|
571
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(obj);
|
|
572
|
-
});
|
|
573
|
-
// Tests that the function returns the object without null values when passed an object with properties containing defined and null values
|
|
574
|
-
it('should return the object without null values when passed an object with properties containing defined and null values', () => {
|
|
575
|
-
const obj = { a: 1, b: null, c: 'test', d: null };
|
|
576
|
-
const expected = { a: 1, c: 'test' };
|
|
577
|
-
expect((0, misc_1.removeUndefinedAndNullValues)(obj)).toEqual(expected);
|
|
578
|
-
});
|
|
579
|
-
});
|
|
580
|
-
describe('removeUndefinedAndNullAndEmptyValues', () => {
|
|
581
|
-
// TODO: NEED TO FIX THIS TESTS
|
|
582
|
-
// // Tests that the function returns the same object when all values are defined, not null, and not empty
|
|
583
|
-
// it('should return the same object when all values are defined, not null, and not empty', () => {
|
|
584
|
-
// const obj = {
|
|
585
|
-
// prop1: 'value1',
|
|
586
|
-
// prop2: 123,
|
|
587
|
-
// prop3: [1, 2, 3],
|
|
588
|
-
// prop4: { nestedProp: 'nestedValue' },
|
|
589
|
-
// };
|
|
590
|
-
// expect(removeUndefinedAndNullAndEmptyValues(obj)).toEqual(obj);
|
|
591
|
-
// });
|
|
592
|
-
// // Tests that the function returns the same object when all values are defined and not null
|
|
593
|
-
// it('should return the same object when all values are defined and not null', () => {
|
|
594
|
-
// const obj = {
|
|
595
|
-
// prop1: 'value1',
|
|
596
|
-
// prop2: 123,
|
|
597
|
-
// prop3: [1, 2, 3],
|
|
598
|
-
// prop4: { nestedProp: 'nestedValue' },
|
|
599
|
-
// };
|
|
600
|
-
// expect(removeUndefinedAndNullAndEmptyValues(obj)).toEqual(obj);
|
|
601
|
-
// });
|
|
602
|
-
// Tests that the function returns an empty object when the input is an empty object
|
|
603
|
-
it('should return an empty object when the input is an empty object', () => {
|
|
604
|
-
const obj = {};
|
|
605
|
-
expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toEqual({});
|
|
606
|
-
});
|
|
607
|
-
// Tests that the function returns null when the input is null
|
|
608
|
-
it('should return null when the input is null', () => {
|
|
609
|
-
const obj = null;
|
|
610
|
-
expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toBeNull();
|
|
611
|
-
});
|
|
612
|
-
// Tests that the function returns undefined when the input is undefined
|
|
613
|
-
it('should return undefined when the input is undefined', () => {
|
|
614
|
-
const obj = undefined;
|
|
615
|
-
expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toBeUndefined();
|
|
616
|
-
});
|
|
617
|
-
// Tests that the function returns an empty object when the input object has only empty values
|
|
618
|
-
it('should return an empty object when the input object has only empty values', () => {
|
|
619
|
-
const obj = {
|
|
620
|
-
prop1: '',
|
|
621
|
-
prop2: ' ',
|
|
622
|
-
prop3: [],
|
|
623
|
-
prop4: {},
|
|
624
|
-
};
|
|
625
|
-
expect((0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj)).toEqual({ prop2: ' ' });
|
|
626
|
-
});
|
|
627
|
-
// Tests that the function returns a new object and does not modify the original object
|
|
628
|
-
it('should return a new object and not modify the original object', () => {
|
|
629
|
-
const obj = {
|
|
630
|
-
prop1: 'value1',
|
|
631
|
-
prop2: null,
|
|
632
|
-
prop3: '',
|
|
633
|
-
};
|
|
634
|
-
const result = (0, misc_1.removeUndefinedAndNullAndEmptyValues)(obj);
|
|
635
|
-
expect(result).toEqual({ prop1: 'value1' });
|
|
636
|
-
expect(result).not.toBe(obj);
|
|
637
|
-
});
|
|
638
|
-
});
|
|
639
|
-
describe('flattenMap', () => {
|
|
640
|
-
// Tests that the function returns the input if it is not an array or object
|
|
641
|
-
it('should return the input when it is not an array or object', () => {
|
|
642
|
-
const input = 5;
|
|
643
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
644
|
-
expect(result).toBe(input);
|
|
645
|
-
});
|
|
646
|
-
// Tests that the function returns a flattened array if the input is an array
|
|
647
|
-
// Only 1 level of flattening is performed
|
|
648
|
-
it('should return a flattened array when the input is an array', () => {
|
|
649
|
-
const input = [1, [2, 3], [4, [5, 6]]];
|
|
650
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
651
|
-
expect(result).toEqual([1, 2, 3, 4, [5, 6]]);
|
|
652
|
-
});
|
|
653
|
-
// Tests that the function returns a flattened array if the input is an object with array values
|
|
654
|
-
it('should return a flattened array when the input is an object with array values', () => {
|
|
655
|
-
const input = { a: [1, 2], b: [3, 4] };
|
|
656
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
657
|
-
expect(result).toEqual([1, 2, 3, 4]);
|
|
658
|
-
});
|
|
659
|
-
// Tests that the function returns an empty array if the input is an empty array
|
|
660
|
-
it('should return an empty array when the input is an empty array', () => {
|
|
661
|
-
const input = [];
|
|
662
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
663
|
-
expect(result).toEqual([]);
|
|
664
|
-
});
|
|
665
|
-
// Tests that the function returns an empty collection if the input is an empty object
|
|
666
|
-
it('should return an empty collection when the input is an empty object', () => {
|
|
667
|
-
const input = {};
|
|
668
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
669
|
-
expect(result).toEqual([]);
|
|
670
|
-
});
|
|
671
|
-
// Tests that the function returns an array with null value if the input is an array with null value
|
|
672
|
-
it('should return an array with null value when the input is an array with null value', () => {
|
|
673
|
-
const input = [null];
|
|
674
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
675
|
-
expect(result).toEqual([null]);
|
|
676
|
-
});
|
|
677
|
-
// Tests that the function returns an object with null value if the input is an object with null value
|
|
678
|
-
it('should return an object with null value when the input is an object with null value', () => {
|
|
679
|
-
const input = { a: null };
|
|
680
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
681
|
-
expect(result).toEqual([null]);
|
|
682
|
-
});
|
|
683
|
-
// Tests that the function returns an array with undefined value if the input is an array with undefined value
|
|
684
|
-
it('should return an array with undefined value when the input is an array with undefined value', () => {
|
|
685
|
-
const input = [undefined];
|
|
686
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
687
|
-
expect(result).toEqual([undefined]);
|
|
688
|
-
});
|
|
689
|
-
// Tests that the function returns an object with undefined value if the input is an object with undefined value
|
|
690
|
-
it('should return a collection with undefined value when the input is an object with undefined value', () => {
|
|
691
|
-
const input = { a: undefined };
|
|
692
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
693
|
-
expect(result).toEqual([undefined]);
|
|
694
|
-
});
|
|
695
|
-
// Tests that the function returns an array with NaN value if the input is an array with NaN value
|
|
696
|
-
it('should return an array with NaN value when the input is an array with NaN value', () => {
|
|
697
|
-
const input = [NaN];
|
|
698
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
699
|
-
expect(result).toEqual([NaN]);
|
|
700
|
-
});
|
|
701
|
-
// Tests that the function returns an object with NaN value if the input is an object with NaN value
|
|
702
|
-
it('should return a collection with NaN value when the input is an object with NaN value', () => {
|
|
703
|
-
const input = { a: NaN };
|
|
704
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
705
|
-
expect(result).toEqual([NaN]);
|
|
706
|
-
});
|
|
707
|
-
// Tests that the function returns an array with empty string value if the input is an array with empty string value
|
|
708
|
-
it('should return an array with empty string value when the input is an array with empty string value', () => {
|
|
709
|
-
const input = [''];
|
|
710
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
711
|
-
expect(result).toEqual(['']);
|
|
712
|
-
});
|
|
713
|
-
// Tests that the function returns a flattened array with values of different types if the input is an array with values of different types
|
|
714
|
-
it('should return a flattened array with values of different types when the input is an array with values of different types', () => {
|
|
715
|
-
const input = [1, 'two', true, { name: 'John' }];
|
|
716
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
717
|
-
expect(result).toEqual([1, 'two', true, { name: 'John' }]);
|
|
718
|
-
});
|
|
719
|
-
// Tests that the function returns a flattened collection with values of different types if the input is an object with values of different types
|
|
720
|
-
it('should return a flattened collection with values of different types when the input is an object with values of different types', () => {
|
|
721
|
-
const input = { name: 'John', age: 25, isStudent: true, hobbies: ['reading', 'painting'] };
|
|
722
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
723
|
-
expect(result).toEqual(['John', 25, true, 'reading', 'painting']);
|
|
724
|
-
});
|
|
725
|
-
// Tests that the function returns a flattened array with nested arrays and objects if the input is an array with nested arrays and objects
|
|
726
|
-
it('should return a flattened array with nested arrays and objects when the input is an array with nested arrays and objects', () => {
|
|
727
|
-
const input = [1, [2, [3, 4]], { name: 'John', age: 25 }];
|
|
728
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
729
|
-
expect(result).toEqual([1, 2, [3, 4], { name: 'John', age: 25 }]);
|
|
730
|
-
});
|
|
731
|
-
// Tests that the function returns a flattened array with values of different types if the input is an array with values of different types
|
|
732
|
-
it('should return a flattened array with values of different types when the input is an array with values of different types', () => {
|
|
733
|
-
const input = [1, 'two', true, { name: 'John' }];
|
|
734
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
735
|
-
expect(result).toEqual([1, 'two', true, { name: 'John' }]);
|
|
736
|
-
});
|
|
737
|
-
// Tests that the function returns a flattened collection with values of different types if the input is an object with values of different types
|
|
738
|
-
it('should return a flattened collection with values of different types when the input is an object with values of different types', () => {
|
|
739
|
-
const input = { name: 'John', age: 25, isStudent: true, hobbies: ['reading', 'painting'] };
|
|
740
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
741
|
-
expect(result).toEqual(['John', 25, true, 'reading', 'painting']);
|
|
742
|
-
});
|
|
743
|
-
// Tests that the function returns a flattened array with nested arrays and objects if the input is an array with nested arrays and objects
|
|
744
|
-
it('should return a flattened array with nested arrays and objects when the input is an array with nested arrays and objects', () => {
|
|
745
|
-
const input = [1, [2, [3, 4]], { name: 'John', age: 25 }];
|
|
746
|
-
const result = (0, misc_1.flattenMap)(input);
|
|
747
|
-
expect(result).toEqual([1, 2, [3, 4], { name: 'John', age: 25 }]);
|
|
748
|
-
});
|
|
749
|
-
});
|
|
750
|
-
describe('base64Convertor', () => {
|
|
751
|
-
// Tests that the function correctly handles an empty string input and returns an empty base64 string
|
|
752
|
-
it('should return an empty base64 string when the input is an empty string', () => {
|
|
753
|
-
const input = '';
|
|
754
|
-
const expectedOutput = '';
|
|
755
|
-
const result = (0, misc_1.base64Convertor)(input);
|
|
756
|
-
expect(result).toEqual(expectedOutput);
|
|
757
|
-
});
|
|
758
|
-
// Tests that the function correctly handles a string input with non-ASCII characters and converts it to base64 format
|
|
759
|
-
it('should convert a string with non-ASCII characters to base64 format', () => {
|
|
760
|
-
const input = 'こんにちは';
|
|
761
|
-
const expectedOutput = '44GT44KT44Gr44Gh44Gv';
|
|
762
|
-
const result = (0, misc_1.base64Convertor)(input);
|
|
763
|
-
expect(result).toEqual(expectedOutput);
|
|
764
|
-
});
|
|
765
|
-
// Tests that the function correctly handles a string input with special characters and converts it to base64 format
|
|
766
|
-
it('should convert a string with special characters to base64 format', () => {
|
|
767
|
-
const input = '!@#$%^&*()';
|
|
768
|
-
const expectedOutput = 'IUAjJCVeJiooKQ==';
|
|
769
|
-
const result = (0, misc_1.base64Convertor)(input);
|
|
770
|
-
expect(result).toEqual(expectedOutput);
|
|
771
|
-
});
|
|
772
|
-
// Tests that the function correctly handles a string input with whitespace characters and converts it to base64 format
|
|
773
|
-
it('should convert a string with whitespace characters to base64 format', () => {
|
|
774
|
-
const input = ' Hello World ';
|
|
775
|
-
const expectedOutput = 'ICAgSGVsbG8gV29ybGQgICA=';
|
|
776
|
-
const result = (0, misc_1.base64Convertor)(input);
|
|
777
|
-
expect(result).toEqual(expectedOutput);
|
|
778
|
-
});
|
|
779
|
-
// Tests that the function correctly handles a string input with line breaks and converts it to base64 format
|
|
780
|
-
it('should convert a string with line breaks to base64 format', () => {
|
|
781
|
-
const input = 'Hello\nWorld';
|
|
782
|
-
const expectedOutput = 'SGVsbG8KV29ybGQ=';
|
|
783
|
-
const result = (0, misc_1.base64Convertor)(input);
|
|
784
|
-
expect(result).toEqual(expectedOutput);
|
|
785
|
-
});
|
|
786
|
-
});
|
|
787
|
-
describe('isValidUrl', () => {
|
|
788
|
-
// Tests that a valid URL string returns a URL object
|
|
789
|
-
it('should return a URL object when given a valid URL string', () => {
|
|
790
|
-
const url = 'https://www.example.com';
|
|
791
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
792
|
-
});
|
|
793
|
-
// Tests that a valid URL object returns the same URL object
|
|
794
|
-
it('should return the same URL object when given a valid URL object', () => {
|
|
795
|
-
const url = new URL('https://www.example.com');
|
|
796
|
-
expect((0, misc_1.isValidUrl)(url)?.toJSON()).toBe(url.toJSON());
|
|
797
|
-
});
|
|
798
|
-
// Tests that a URL with query parameters returns a URL object
|
|
799
|
-
it('should return a URL object when given a URL with query parameters', () => {
|
|
800
|
-
const url = 'https://www.example.com?param1=value1¶m2=value2';
|
|
801
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
802
|
-
});
|
|
803
|
-
// Tests that a URL with a hash returns a URL object
|
|
804
|
-
it('should return a URL object when given a URL with a hash', () => {
|
|
805
|
-
const url = 'https://www.example.com#section1';
|
|
806
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
807
|
-
});
|
|
808
|
-
// Tests that a URL with a port returns a URL object
|
|
809
|
-
it('should return a URL object when given a URL with a port', () => {
|
|
810
|
-
const url = 'https://www.example.com:8080';
|
|
811
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
812
|
-
});
|
|
813
|
-
// Tests that a URL with a username and password returns a URL object
|
|
814
|
-
it('should return a URL object when given a URL with a username and password', () => {
|
|
815
|
-
const url = 'https://username:password@example.com';
|
|
816
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
817
|
-
});
|
|
818
|
-
// Tests that an empty string returns null
|
|
819
|
-
it('should return null when given an empty string', () => {
|
|
820
|
-
const url = '';
|
|
821
|
-
expect((0, misc_1.isValidUrl)(url)).toBeNull();
|
|
822
|
-
});
|
|
823
|
-
// The test objective is to verify that the function 'isValidUrl' returns null when given an invalid URL string.
|
|
824
|
-
it('should return null when given an invalid URL string', () => {
|
|
825
|
-
const url = 'invalid-url';
|
|
826
|
-
expect((0, misc_1.isValidUrl)(url)).toBeNull();
|
|
827
|
-
});
|
|
828
|
-
// Tests that an URL with a different protocol returns valid object
|
|
829
|
-
it('should return URL object when given a URL with a different protocol', () => {
|
|
830
|
-
const url = 'ftp://www.example.com';
|
|
831
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
832
|
-
});
|
|
833
|
-
// Tests that an invalid URL with an invalid port returns null
|
|
834
|
-
it('should return null when given a URL with an invalid port', () => {
|
|
835
|
-
const url = 'https://www.example.com:abc';
|
|
836
|
-
expect((0, misc_1.isValidUrl)(url)).toBeNull();
|
|
837
|
-
});
|
|
838
|
-
// Tests that a URL with invalid username and password returns object
|
|
839
|
-
it('should return object when given a URL with username and password', () => {
|
|
840
|
-
const url = 'https://username:password@example.com';
|
|
841
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
842
|
-
});
|
|
843
|
-
// Tests that a URL with a subdomain returns URL object
|
|
844
|
-
it('should return null when given a URL with an invalid subdomain', () => {
|
|
845
|
-
const url = 'https://invalid.example.com';
|
|
846
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
847
|
-
});
|
|
848
|
-
// Tests that a valid URL string with a path returns a URL object
|
|
849
|
-
it('should return a URL object when given a valid URL string with a path', () => {
|
|
850
|
-
const url = 'https://www.example.com/path';
|
|
851
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
852
|
-
});
|
|
853
|
-
// Tests that a valid URL string with a subdomain returns a URL object
|
|
854
|
-
it('should return a URL object when given a valid URL string with a subdomain', () => {
|
|
855
|
-
const url = 'https://subdomain.example.com';
|
|
856
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
857
|
-
});
|
|
858
|
-
// Tests that a valid URL string returns a URL object
|
|
859
|
-
it('should return a URL object when given a valid URL string', () => {
|
|
860
|
-
const url = 'https://www.example.com';
|
|
861
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
862
|
-
});
|
|
863
|
-
// Tests that a valid URL string returns a URL object
|
|
864
|
-
it('should return a URL object when given a valid URL string', () => {
|
|
865
|
-
const url = 'https://www.example.com';
|
|
866
|
-
expect((0, misc_1.isValidUrl)(url)).toBeInstanceOf(URL);
|
|
867
|
-
});
|
|
868
|
-
});
|
|
869
|
-
describe('stripTrailingSlash', () => {
|
|
870
|
-
// Tests that the function returns the same string if it does not end with '/'
|
|
871
|
-
it("should return the same string when it does not end with '/'", () => {
|
|
872
|
-
const input = 'example';
|
|
873
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
874
|
-
expect(result).toBe(input);
|
|
875
|
-
});
|
|
876
|
-
// Tests that the function removes the trailing '/' if the string ends with it
|
|
877
|
-
it("should remove the trailing '/' if the string ends with it", () => {
|
|
878
|
-
const input = 'example/';
|
|
879
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
880
|
-
expect(result).toBe('example');
|
|
881
|
-
});
|
|
882
|
-
// Tests that the function removes only one trailing '/' if the string ends with multiple
|
|
883
|
-
it("should remove only one trailing '/' if the string ends with multiple", () => {
|
|
884
|
-
const input = 'example//';
|
|
885
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
886
|
-
expect(result).toBe('example/');
|
|
887
|
-
});
|
|
888
|
-
// Tests that the function returns an empty string if the input is an empty string
|
|
889
|
-
it('should return an empty string if the input is an empty string', () => {
|
|
890
|
-
const input = '';
|
|
891
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
892
|
-
expect(result).toBe('');
|
|
893
|
-
});
|
|
894
|
-
// Tests that the function returns empty string if it contains only '/'
|
|
895
|
-
it("should return empty string when it contains only '/'", () => {
|
|
896
|
-
const input = '';
|
|
897
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
898
|
-
expect(result).toBe(input);
|
|
899
|
-
});
|
|
900
|
-
// Tests that the function returns the same string if it does not end with '/'
|
|
901
|
-
it("should return the same string when it does not end with '/'", () => {
|
|
902
|
-
const input = 'example';
|
|
903
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
904
|
-
expect(result).toBe(input);
|
|
905
|
-
});
|
|
906
|
-
// Tests that the function removes the trailing slash from a string if it exists
|
|
907
|
-
it('should remove the trailing slash when it exists', () => {
|
|
908
|
-
const input = 'example/';
|
|
909
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
910
|
-
expect(result).toBe('example');
|
|
911
|
-
});
|
|
912
|
-
// Tests that the function removes the trailing slash from a string if it exists
|
|
913
|
-
it('should remove the trailing slash when it exists', () => {
|
|
914
|
-
const input = 'example/';
|
|
915
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
916
|
-
expect(result).toBe('example');
|
|
917
|
-
});
|
|
918
|
-
// Tests that the function removes trailing slashes from a string
|
|
919
|
-
it('should remove trailing slashes when they exist', () => {
|
|
920
|
-
const input = 'example/';
|
|
921
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
922
|
-
expect(result).toBe('example');
|
|
923
|
-
});
|
|
924
|
-
// Tests that the function removes the trailing slash from a string if it exists
|
|
925
|
-
it('should remove the trailing slash when it exists', () => {
|
|
926
|
-
const input = 'example/';
|
|
927
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
928
|
-
expect(result).toBe('example');
|
|
929
|
-
});
|
|
930
|
-
// Tests that the function removes the trailing slash from a string if it ends with '/'
|
|
931
|
-
it("should remove the trailing slash when the string ends with '/'", () => {
|
|
932
|
-
const input = 'example/';
|
|
933
|
-
const result = (0, misc_1.stripTrailingSlash)(input);
|
|
934
|
-
expect(result).toBe('example');
|
|
935
|
-
});
|
|
936
|
-
});
|
|
937
|
-
describe('isPrimitive', () => {
|
|
938
|
-
// Tests that isPrimitive returns true for a primitive string
|
|
939
|
-
it('should return true when the argument is a primitive string', () => {
|
|
940
|
-
const result = (0, misc_1.isPrimitive)('hello');
|
|
941
|
-
expect(result).toBe(true);
|
|
942
|
-
});
|
|
943
|
-
// Tests that isPrimitive returns true for a primitive number
|
|
944
|
-
it('should return true when the argument is a primitive number', () => {
|
|
945
|
-
const result = (0, misc_1.isPrimitive)(123);
|
|
946
|
-
expect(result).toBe(true);
|
|
947
|
-
});
|
|
948
|
-
// Tests that isPrimitive returns true for a primitive boolean
|
|
949
|
-
it('should return true when the argument is a primitive boolean', () => {
|
|
950
|
-
const result = (0, misc_1.isPrimitive)(true);
|
|
951
|
-
expect(result).toBe(true);
|
|
952
|
-
});
|
|
953
|
-
// Tests that isPrimitive returns true for null
|
|
954
|
-
it('should return true when the argument is null', () => {
|
|
955
|
-
const result = (0, misc_1.isPrimitive)(null);
|
|
956
|
-
expect(result).toBe(true);
|
|
957
|
-
});
|
|
958
|
-
// Tests that isPrimitive returns true for undefined
|
|
959
|
-
it('should return true when the argument is undefined', () => {
|
|
960
|
-
const result = (0, misc_1.isPrimitive)(undefined);
|
|
961
|
-
expect(result).toBe(true);
|
|
962
|
-
});
|
|
963
|
-
// Tests that isPrimitive returns false for an instance of a non-primitive wrapper class (Date)
|
|
964
|
-
it('should return false when the argument is an instance of a non-primitive wrapper class (Date)', () => {
|
|
965
|
-
const result = (0, misc_1.isPrimitive)(new Date());
|
|
966
|
-
expect(result).toBe(false);
|
|
967
|
-
});
|
|
968
|
-
// Tests that isPrimitive returns false for an instance of a custom class
|
|
969
|
-
it('should return false when the argument is an instance of a custom class', () => {
|
|
970
|
-
class CustomClass {
|
|
971
|
-
}
|
|
972
|
-
const arg = new CustomClass();
|
|
973
|
-
const result = (0, misc_1.isPrimitive)(arg);
|
|
974
|
-
expect(result).toBe(false);
|
|
975
|
-
});
|
|
976
|
-
// Tests that isPrimitive returns false for a function with properties
|
|
977
|
-
it('should return false when the argument is a function with properties', () => {
|
|
978
|
-
const func = () => { };
|
|
979
|
-
func.property = 'value';
|
|
980
|
-
const result = (0, misc_1.isPrimitive)(func);
|
|
981
|
-
expect(result).toBe(false);
|
|
982
|
-
});
|
|
983
|
-
// Tests that isPrimitive returns true for a symbol
|
|
984
|
-
it('should return true when the argument is a symbol', () => {
|
|
985
|
-
const result = (0, misc_1.isPrimitive)(Symbol('test'));
|
|
986
|
-
expect(result).toBe(true);
|
|
987
|
-
});
|
|
988
|
-
});
|
|
989
|
-
describe('getType', () => {
|
|
990
|
-
// Tests that getType returns the correct type for string input
|
|
991
|
-
it('should return string when the input is a string', () => {
|
|
992
|
-
const input = 'hello';
|
|
993
|
-
const result = (0, misc_1.getType)(input);
|
|
994
|
-
expect(result).toBe('string');
|
|
995
|
-
});
|
|
996
|
-
// Tests that getType returns the correct type for number input
|
|
997
|
-
it('should return number when the input is a number', () => {
|
|
998
|
-
const input = 42;
|
|
999
|
-
const result = (0, misc_1.getType)(input);
|
|
1000
|
-
expect(result).toBe('number');
|
|
1001
|
-
});
|
|
1002
|
-
// Tests that getType returns the correct type for boolean input
|
|
1003
|
-
it('should return boolean when the input is a boolean value', () => {
|
|
1004
|
-
expect((0, misc_1.getType)(true)).toBe('boolean');
|
|
1005
|
-
expect((0, misc_1.getType)(false)).toBe('boolean');
|
|
1006
|
-
});
|
|
1007
|
-
// Tests that getType returns 'NULL' when the input is null
|
|
1008
|
-
it("should return 'NULL' when the input is null", () => {
|
|
1009
|
-
const input = null;
|
|
1010
|
-
const result = (0, misc_1.getType)(input);
|
|
1011
|
-
expect(result).toBe('NULL');
|
|
1012
|
-
});
|
|
1013
|
-
// Tests that getType returns 'object' when the input is an empty object
|
|
1014
|
-
it('should return object when the input is an empty object', () => {
|
|
1015
|
-
const input = {};
|
|
1016
|
-
const result = (0, misc_1.getType)(input);
|
|
1017
|
-
expect(result).toBe('object');
|
|
1018
|
-
});
|
|
1019
|
-
// Tests that getType returns the correct type for function input
|
|
1020
|
-
it('should return function when the input is a function', () => {
|
|
1021
|
-
const input = () => { };
|
|
1022
|
-
const result = (0, misc_1.getType)(input);
|
|
1023
|
-
expect(result).toBe('function');
|
|
1024
|
-
});
|
|
1025
|
-
// Tests that getType returns the correct type for bigint input
|
|
1026
|
-
it("should return 'bigint' when the input is a bigint", () => {
|
|
1027
|
-
const input = BigInt(10);
|
|
1028
|
-
const result = (0, misc_1.getType)(input);
|
|
1029
|
-
expect(result).toBe('bigint');
|
|
1030
|
-
});
|
|
1031
|
-
// Tests that getType returns 'symbol' when the input is a symbol
|
|
1032
|
-
it("should return 'symbol' when the input is a symbol", () => {
|
|
1033
|
-
const input = Symbol('test');
|
|
1034
|
-
const result = (0, misc_1.getType)(input);
|
|
1035
|
-
expect(result).toBe('symbol');
|
|
1036
|
-
});
|
|
1037
|
-
// Tests that getType returns 'undefined' when the input is undefined
|
|
1038
|
-
it("should return 'NULL' when the input is undefined", () => {
|
|
1039
|
-
const input = undefined;
|
|
1040
|
-
const result = (0, misc_1.getType)(input);
|
|
1041
|
-
expect(result).toBe('NULL');
|
|
1042
|
-
});
|
|
1043
|
-
// Tests that getType returns the correct type for arrow function input
|
|
1044
|
-
it('should return function when the input is an arrow function', () => {
|
|
1045
|
-
const input = () => { };
|
|
1046
|
-
const result = (0, misc_1.getType)(input);
|
|
1047
|
-
expect(result).toBe('function');
|
|
1048
|
-
});
|
|
1049
|
-
// Tests that getType returns 'object' when the input is an object with properties
|
|
1050
|
-
it('should return object when the input is an object with properties', () => {
|
|
1051
|
-
const input = { name: 'John', age: 30 };
|
|
1052
|
-
const result = (0, misc_1.getType)(input);
|
|
1053
|
-
expect(result).toBe('object');
|
|
1054
|
-
});
|
|
1055
|
-
// Tests that getType object the correct type for class input
|
|
1056
|
-
it('should return object when the input is a class', () => {
|
|
1057
|
-
class MyClass {
|
|
1058
|
-
}
|
|
1059
|
-
const input = new MyClass();
|
|
1060
|
-
const result = (0, misc_1.getType)(input);
|
|
1061
|
-
expect(result).toBe('object');
|
|
1062
|
-
});
|
|
1063
|
-
// Tests that getType returns 'function' when the input is a generator function
|
|
1064
|
-
it('should return function when the input is a generator function', () => {
|
|
1065
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
1066
|
-
const input = function* () { };
|
|
1067
|
-
const result = (0, misc_1.getType)(input);
|
|
1068
|
-
expect(result).toBe('function');
|
|
1069
|
-
});
|
|
1070
|
-
// Tests that getType returns 'function' when the input is an async function
|
|
1071
|
-
it('should return function when the input is an async function', () => {
|
|
1072
|
-
const input = async () => { };
|
|
1073
|
-
const result = (0, misc_1.getType)(input);
|
|
1074
|
-
expect(result).toBe('function');
|
|
1075
|
-
});
|
|
1076
|
-
});
|
|
1077
|
-
describe('isObject', () => {
|
|
1078
|
-
// Tests that the function returns true for an object
|
|
1079
|
-
it('should return true when value is an object', () => {
|
|
1080
|
-
const value = {};
|
|
1081
|
-
expect((0, misc_1.isObject)(value)).toBe(true);
|
|
1082
|
-
});
|
|
1083
|
-
// Tests that the function returns true for a function
|
|
1084
|
-
it('should return true when value is a function', () => {
|
|
1085
|
-
const value = () => { };
|
|
1086
|
-
expect((0, misc_1.isObject)(value)).toBe(true);
|
|
1087
|
-
});
|
|
1088
|
-
// Tests that the function returns false for null
|
|
1089
|
-
it('should return false when value is null', () => {
|
|
1090
|
-
const value = null;
|
|
1091
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1092
|
-
});
|
|
1093
|
-
// Tests that the function returns false for undefined
|
|
1094
|
-
it('should return false when value is undefined', () => {
|
|
1095
|
-
const value = undefined;
|
|
1096
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1097
|
-
});
|
|
1098
|
-
// Tests that the function returns false for an array
|
|
1099
|
-
it('should return false when value is an array', () => {
|
|
1100
|
-
const value = [];
|
|
1101
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1102
|
-
});
|
|
1103
|
-
// Tests that the function returns false for a string
|
|
1104
|
-
it('should return false when value is a string', () => {
|
|
1105
|
-
const value = 'test';
|
|
1106
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1107
|
-
});
|
|
1108
|
-
// Tests that the function returns false for a number
|
|
1109
|
-
it('should return false when value is a number', () => {
|
|
1110
|
-
const value = 123;
|
|
1111
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1112
|
-
});
|
|
1113
|
-
// Tests that the function returns false for a boolean
|
|
1114
|
-
it('should return false when value is a boolean', () => {
|
|
1115
|
-
const value = true;
|
|
1116
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1117
|
-
});
|
|
1118
|
-
// Tests that the function returns false for a symbol
|
|
1119
|
-
it('should return false when value is a symbol', () => {
|
|
1120
|
-
const value = Symbol();
|
|
1121
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1122
|
-
});
|
|
1123
|
-
// Tests that the function returns false when the value is NaN
|
|
1124
|
-
it('should return false when value is NaN', () => {
|
|
1125
|
-
const value = NaN;
|
|
1126
|
-
expect((0, misc_1.isObject)(value)).toBe(false);
|
|
1127
|
-
});
|
|
1128
|
-
});
|
|
1129
|
-
describe('isEmpty', () => {
|
|
1130
|
-
// Tests that isEmpty returns true for an empty string
|
|
1131
|
-
it('should return true when input is an empty string', () => {
|
|
1132
|
-
const input = '';
|
|
1133
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1134
|
-
expect(result).toBe(true);
|
|
1135
|
-
});
|
|
1136
|
-
// Tests that isEmpty returns true for an empty array
|
|
1137
|
-
it('should return true when input is an empty array', () => {
|
|
1138
|
-
const input = [];
|
|
1139
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1140
|
-
expect(result).toBe(true);
|
|
1141
|
-
});
|
|
1142
|
-
// Tests that isEmpty returns false for an empty object
|
|
1143
|
-
it('should return false when input is an empty object', () => {
|
|
1144
|
-
const input = {};
|
|
1145
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1146
|
-
expect(result).toBe(false);
|
|
1147
|
-
});
|
|
1148
|
-
// Tests that isEmpty returns false for a non-empty string
|
|
1149
|
-
it('should return false when input is a non-empty string', () => {
|
|
1150
|
-
const input = 'hello';
|
|
1151
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1152
|
-
expect(result).toBe(false);
|
|
1153
|
-
});
|
|
1154
|
-
// Tests that isEmpty returns false for a non-empty array
|
|
1155
|
-
it('should return false when input is a non-empty array', () => {
|
|
1156
|
-
const input = [1, 2, 3];
|
|
1157
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1158
|
-
expect(result).toBe(false);
|
|
1159
|
-
});
|
|
1160
|
-
// Tests that isEmpty returns false for a non-empty object
|
|
1161
|
-
it('should return false when input is a non-empty object', () => {
|
|
1162
|
-
const input = { key: 'value' };
|
|
1163
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1164
|
-
expect(result).toBe(false);
|
|
1165
|
-
});
|
|
1166
|
-
// Tests that isEmpty returns true for null input
|
|
1167
|
-
it('should return true when input is null', () => {
|
|
1168
|
-
const input = null;
|
|
1169
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1170
|
-
expect(result).toBe(true);
|
|
1171
|
-
});
|
|
1172
|
-
// The test objective is to verify that the function 'isEmpty' returns true when the input is undefined.
|
|
1173
|
-
it('should return true when input is undefined', () => {
|
|
1174
|
-
const input = undefined;
|
|
1175
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1176
|
-
expect(result).toBe(true);
|
|
1177
|
-
});
|
|
1178
|
-
// Tests that isEmpty returns false for NaN input
|
|
1179
|
-
it('should return false when input is NaN', () => {
|
|
1180
|
-
const input = NaN;
|
|
1181
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1182
|
-
expect(result).toBe(false);
|
|
1183
|
-
});
|
|
1184
|
-
// Test that the function 'isEmpty' returns true when the input is a whitespace string
|
|
1185
|
-
it('should return true when input is a whitespace string', () => {
|
|
1186
|
-
const input = ' ';
|
|
1187
|
-
const result = (0, misc_1.isEmpty)(input);
|
|
1188
|
-
expect(result).toBe(true);
|
|
1189
|
-
});
|
|
1190
|
-
});
|
|
1191
|
-
describe('isEmptyObject', () => {
|
|
1192
|
-
// Tests that isEmptyObject returns true for an empty object {}
|
|
1193
|
-
it('should return true for an empty object', () => {
|
|
1194
|
-
const obj = {};
|
|
1195
|
-
expect((0, misc_1.isEmptyObject)(obj)).toBe(true);
|
|
1196
|
-
});
|
|
1197
|
-
// Tests that isEmptyObject returns false for a non-empty object {a: '1'}
|
|
1198
|
-
it('should return false for a non-empty object', () => {
|
|
1199
|
-
const obj = { a: '1' };
|
|
1200
|
-
expect((0, misc_1.isEmptyObject)(obj)).toBe(false);
|
|
1201
|
-
});
|
|
1202
|
-
// Tests that isEmptyObject returns true for an empty array []
|
|
1203
|
-
it('should return true for an empty array', () => {
|
|
1204
|
-
const arr = [];
|
|
1205
|
-
expect((0, misc_1.isEmptyObject)(arr)).toBe(true);
|
|
1206
|
-
});
|
|
1207
|
-
// Tests that isEmptyObject returns false for a non-empty array [1, 2, 3]
|
|
1208
|
-
it('should return false for a non-empty array', () => {
|
|
1209
|
-
const arr = [1, 2, 3];
|
|
1210
|
-
expect((0, misc_1.isEmptyObject)(arr)).toBe(false);
|
|
1211
|
-
});
|
|
1212
|
-
// Tests that isEmptyObject returns true for an empty string ''
|
|
1213
|
-
it('should return true for an empty string', () => {
|
|
1214
|
-
const obj = '';
|
|
1215
|
-
expect((0, misc_1.isEmptyObject)(obj)).toBe(true);
|
|
1216
|
-
});
|
|
1217
|
-
// Tests that isEmptyObject returns false for a non-empty string 'hello'
|
|
1218
|
-
it('should return false for a non-empty string', () => {
|
|
1219
|
-
const obj = 'hello';
|
|
1220
|
-
expect((0, misc_1.isEmptyObject)(obj)).toBe(false);
|
|
1221
|
-
});
|
|
1222
|
-
// Tests that isEmptyObject returns true for number
|
|
1223
|
-
it('should return true for number', () => {
|
|
1224
|
-
const obj = 2;
|
|
1225
|
-
expect((0, misc_1.isEmptyObject)(obj)).toBe(true);
|
|
1226
|
-
});
|
|
1227
|
-
});
|
|
1228
|
-
describe('isDefinedNotNullNotEmpty', () => {
|
|
1229
|
-
// Tests that the function returns true when a non-empty string is passed as an argument
|
|
1230
|
-
it('should return true when a non-empty string is passed as an argument', () => {
|
|
1231
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)('test');
|
|
1232
|
-
expect(result).toBe(true);
|
|
1233
|
-
});
|
|
1234
|
-
// Tests that the function returns true when a non-empty object is passed as an argument
|
|
1235
|
-
it('should return true when a non-empty object is passed as an argument', () => {
|
|
1236
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)({ key: 'value' });
|
|
1237
|
-
expect(result).toBe(true);
|
|
1238
|
-
});
|
|
1239
|
-
// Tests that the function returns true when a non-empty array is passed as an argument
|
|
1240
|
-
it('should return true when a non-empty array is passed as an argument', () => {
|
|
1241
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)([1, 2, 3]);
|
|
1242
|
-
expect(result).toBe(true);
|
|
1243
|
-
});
|
|
1244
|
-
// Tests that the function returns true when a non-zero number is passed as an argument
|
|
1245
|
-
it('should return true when a non-zero number is passed as an argument', () => {
|
|
1246
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(123);
|
|
1247
|
-
expect(result).toBe(true);
|
|
1248
|
-
});
|
|
1249
|
-
// Tests that the function returns true when a boolean value is passed as an argument
|
|
1250
|
-
it('should return true when a boolean value is passed as an argument', () => {
|
|
1251
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(true);
|
|
1252
|
-
expect(result).toBe(true);
|
|
1253
|
-
});
|
|
1254
|
-
// Tests that the function returns false when an empty string is passed as an argument
|
|
1255
|
-
it('should return false when an empty string is passed as an argument', () => {
|
|
1256
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)('');
|
|
1257
|
-
expect(result).toBe(false);
|
|
1258
|
-
});
|
|
1259
|
-
// Tests that the function returns true when false is passed as an argument
|
|
1260
|
-
it('should return true when false is passed as an argument', () => {
|
|
1261
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(false);
|
|
1262
|
-
expect(result).toBe(true);
|
|
1263
|
-
});
|
|
1264
|
-
// Tests that the function returns true when 0 is passed as an argument
|
|
1265
|
-
it('should return true when 0 is passed as an argument', () => {
|
|
1266
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(0);
|
|
1267
|
-
expect(result).toBe(true);
|
|
1268
|
-
});
|
|
1269
|
-
// Tests that the function returns false when NaN is passed as an argument
|
|
1270
|
-
it('should return false when NaN is passed as an argument', () => {
|
|
1271
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(NaN);
|
|
1272
|
-
expect(result).toBe(false);
|
|
1273
|
-
});
|
|
1274
|
-
// Tests that the function returns false when undefined is passed as an argument
|
|
1275
|
-
it('should return false when undefined is passed as an argument', () => {
|
|
1276
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(undefined);
|
|
1277
|
-
expect(result).toBe(false);
|
|
1278
|
-
});
|
|
1279
|
-
// Tests that the function returns false when null is passed as an argument
|
|
1280
|
-
it('should return false when null is passed as an argument', () => {
|
|
1281
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)(null);
|
|
1282
|
-
expect(result).toBe(false);
|
|
1283
|
-
});
|
|
1284
|
-
// Tests that the function returns false when an empty array is passed as an argument
|
|
1285
|
-
it('should return false when an empty array is passed as an argument', () => {
|
|
1286
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)([]);
|
|
1287
|
-
expect(result).toBe(false);
|
|
1288
|
-
});
|
|
1289
|
-
// Tests that the function returns false when an empty object is passed as an argument
|
|
1290
|
-
it('should return false when an empty object is passed as an argument', () => {
|
|
1291
|
-
const result = (0, misc_1.isDefinedNotNullNotEmpty)({});
|
|
1292
|
-
expect(result).toBe(false);
|
|
1293
|
-
});
|
|
1294
|
-
});
|
|
1295
|
-
describe('removeUndefinedNullEmptyExclBoolInt', () => {
|
|
1296
|
-
// Tests that the function returns the same object if it does not contain undefined, null, empty, boolean, or integer values
|
|
1297
|
-
it('should return the same object when it does not contain undefined, null, empty, boolean, or integer values', () => {
|
|
1298
|
-
const obj = { a: 1, b: 'test', c: { d: 'nested' } };
|
|
1299
|
-
expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(obj)).toEqual(obj);
|
|
1300
|
-
});
|
|
1301
|
-
// Tests that the function removes undefined, null, empty, boolean, or integer values from the object and returns the cleaned object
|
|
1302
|
-
it('should remove undefined, null, empty, boolean, or integer values from the object and return the cleaned object', () => {
|
|
1303
|
-
const obj = { a: 1, b: undefined, c: null, d: '', e: {}, f: true, g: 0 };
|
|
1304
|
-
const expected = { a: 1, f: true, g: 0 };
|
|
1305
|
-
expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(obj)).toEqual(expected);
|
|
1306
|
-
});
|
|
1307
|
-
// Tests that the function returns undefined if the input is undefined
|
|
1308
|
-
it('should return undefined when the input is undefined', () => {
|
|
1309
|
-
expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(undefined)).toBeUndefined();
|
|
1310
|
-
});
|
|
1311
|
-
// Tests that the function returns null if the input is null
|
|
1312
|
-
it('should return null when the input is null', () => {
|
|
1313
|
-
expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(null)).toBeNull();
|
|
1314
|
-
});
|
|
1315
|
-
// Tests that the function returns an empty object if the input is an empty object
|
|
1316
|
-
it('should return an empty object when the input is an empty object', () => {
|
|
1317
|
-
expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)({})).toEqual({});
|
|
1318
|
-
});
|
|
1319
|
-
// Tests that the function returns an empty object if the input contains only undefined, null, empty, boolean, or integer values
|
|
1320
|
-
it('should return a valid object when the input contains only undefined, null, empty, boolean or integer values', () => {
|
|
1321
|
-
const obj = { a: undefined, b: null, c: '', d: {}, e: true, f: 0 };
|
|
1322
|
-
expect((0, misc_1.removeUndefinedNullEmptyExclBoolInt)(obj)).toEqual({ e: true, f: 0 });
|
|
1323
|
-
});
|
|
1324
|
-
});
|
|
1325
|
-
describe('getHashFromArray', () => {
|
|
1326
|
-
// Tests that the function returns an empty object when given an empty array
|
|
1327
|
-
it('should return an empty object when given an empty array', () => {
|
|
1328
|
-
const arrays = [];
|
|
1329
|
-
const result = (0, misc_1.getHashFromArray)(arrays);
|
|
1330
|
-
expect(result).toEqual({});
|
|
1331
|
-
});
|
|
1332
|
-
// Tests that the function returns a hashMap with correct key-value pairs when given an array of objects with 'from' and 'to' properties
|
|
1333
|
-
it("should return a hashMap with correct key-value pairs when given an array of objects with 'from' and 'to' properties", () => {
|
|
1334
|
-
const arrays = [
|
|
1335
|
-
{ from: 'A', to: '1' },
|
|
1336
|
-
{ from: 'B', to: '2' },
|
|
1337
|
-
{ from: 'C', to: '3' },
|
|
1338
|
-
];
|
|
1339
|
-
const result = (0, misc_1.getHashFromArray)(arrays);
|
|
1340
|
-
expect(result).toEqual({ a: '1', b: '2', c: '3' });
|
|
1341
|
-
});
|
|
1342
|
-
// Tests that the function returns an empty object when given an array of objects with empty 'from' property
|
|
1343
|
-
it("should return an empty object when given an array of objects with empty 'from' property", () => {
|
|
1344
|
-
const arrays = [
|
|
1345
|
-
{ from: '', to: '1' },
|
|
1346
|
-
{ from: '', to: '2' },
|
|
1347
|
-
{ from: '', to: '3' },
|
|
1348
|
-
];
|
|
1349
|
-
const result = (0, misc_1.getHashFromArray)(arrays);
|
|
1350
|
-
expect(result).toEqual({});
|
|
1351
|
-
});
|
|
1352
|
-
// Tests that the function returns a hashMap with only the first occurrence of a 'from' property when given an array with duplicate 'from' properties
|
|
1353
|
-
it("should return a hashMap with only the first occurrence of a 'from' property when given an array with duplicate 'from' properties", () => {
|
|
1354
|
-
const arrays = [
|
|
1355
|
-
{ from: 'A', to: '1' },
|
|
1356
|
-
{ from: 'B', to: '2' },
|
|
1357
|
-
{ from: 'A', to: '3' },
|
|
1358
|
-
];
|
|
1359
|
-
const result = (0, misc_1.getHashFromArray)(arrays);
|
|
1360
|
-
expect(result).toEqual({ a: '3', b: '2' });
|
|
1361
|
-
});
|
|
1362
|
-
// Tests that the function returns a hashMap with only the last occurrence of a 'from' property when given an array with duplicate 'from' properties and different 'to' values
|
|
1363
|
-
it("should return a hashMap with only the last occurrence of a 'from' property when given an array with duplicate 'from' properties and different 'to' values", () => {
|
|
1364
|
-
const arrays = [
|
|
1365
|
-
{ from: 'A', to: '1' },
|
|
1366
|
-
{ from: 'B', to: '2' },
|
|
1367
|
-
{ from: 'A', to: '3' },
|
|
1368
|
-
];
|
|
1369
|
-
const result = (0, misc_1.getHashFromArray)(arrays);
|
|
1370
|
-
expect(result).toEqual({ a: '3', b: '2' });
|
|
1371
|
-
});
|
|
1372
|
-
// Tests that the function returns a hashMap with correct key-value pairs when given an array of objects with non-string 'from' and 'to' properties
|
|
1373
|
-
it("should return a hashMap with correct key-value pairs when given an array of objects with non-string 'from' and 'to' properties", () => {
|
|
1374
|
-
const arrays = [
|
|
1375
|
-
{ from: 1, to: true },
|
|
1376
|
-
{ from: null, to: undefined },
|
|
1377
|
-
{ from: [1, 2, 3], to: { a: 'A', b: 'B' } },
|
|
1378
|
-
];
|
|
1379
|
-
const result = (0, misc_1.getHashFromArray)(arrays);
|
|
1380
|
-
expect(result).toEqual({ '1': true, null: undefined, '1,2,3': { a: 'A', b: 'B' } });
|
|
1381
|
-
});
|
|
1382
|
-
// Tests that the function converts the 'from' property to lowercase in the hashMap when the isLowerCase parameter is true
|
|
1383
|
-
it('should convert "from" property to lowercase in hashMap when isLowerCase is true', () => {
|
|
1384
|
-
const arrays = [
|
|
1385
|
-
{ from: 'VALUE1', to: 'Value1' },
|
|
1386
|
-
{ from: 'VALUE2', to: 'Value2' },
|
|
1387
|
-
{ from: 'VALUE3', to: 'Value3' },
|
|
1388
|
-
];
|
|
1389
|
-
const expected = {
|
|
1390
|
-
value1: 'Value1',
|
|
1391
|
-
value2: 'Value2',
|
|
1392
|
-
value3: 'Value3',
|
|
1393
|
-
};
|
|
1394
|
-
const result = (0, misc_1.getHashFromArray)(arrays, 'from', 'to', true);
|
|
1395
|
-
expect(result).toEqual(expected);
|
|
1396
|
-
});
|
|
1397
|
-
});
|
|
1398
|
-
describe('getHashFromArrayWithDuplicate', () => {
|
|
1399
|
-
// Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys
|
|
1400
|
-
it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys", () => {
|
|
1401
|
-
const arrays = [
|
|
1402
|
-
{ from: 'prop1', to: 'val1' },
|
|
1403
|
-
{ from: 'prop1', to: 'val2' },
|
|
1404
|
-
{ from: 'prop2', to: 'val2' },
|
|
1405
|
-
];
|
|
1406
|
-
const expectedHashMap = {
|
|
1407
|
-
prop1: new Set(['val1', 'val2']),
|
|
1408
|
-
prop2: new Set(['val2']),
|
|
1409
|
-
};
|
|
1410
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1411
|
-
expect(result).toEqual(expectedHashMap);
|
|
1412
|
-
});
|
|
1413
|
-
// Tests that the function correctly generates a hashMap from an array of objects with only one object
|
|
1414
|
-
it('should correctly generate a hashMap from an array of objects with only one object', () => {
|
|
1415
|
-
const arrays = [{ from: 'prop1', to: 'val1' }];
|
|
1416
|
-
const expectedHashMap = { prop1: new Set(['val1']) };
|
|
1417
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1418
|
-
expect(result).toEqual(expectedHashMap);
|
|
1419
|
-
});
|
|
1420
|
-
// Tests that the function correctly generates a hashMap from an array of objects with unique 'from' keys
|
|
1421
|
-
it("should correctly generate a hashMap from an array of objects with unique 'from' keys", () => {
|
|
1422
|
-
const arrays = [
|
|
1423
|
-
{ from: 'prop1', to: 'val1' },
|
|
1424
|
-
{ from: 'prop2', to: 'val2' },
|
|
1425
|
-
{ from: 'prop3', to: 'val3' },
|
|
1426
|
-
];
|
|
1427
|
-
const expectedHashMap = {
|
|
1428
|
-
prop1: new Set(['val1']),
|
|
1429
|
-
prop2: new Set(['val2']),
|
|
1430
|
-
prop3: new Set(['val3']),
|
|
1431
|
-
};
|
|
1432
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1433
|
-
expect(result).toEqual(expectedHashMap);
|
|
1434
|
-
});
|
|
1435
|
-
// Tests that the function correctly generates a hashMap from an array of objects with unique 'to' keys
|
|
1436
|
-
it("should correctly generate a hashMap from an array of objects with unique 'to' keys", () => {
|
|
1437
|
-
const arrays = [
|
|
1438
|
-
{ from: 'prop1', to: 'val1' },
|
|
1439
|
-
{ from: 'prop2', to: 'val2' },
|
|
1440
|
-
{ from: 'prop3', to: 'val3' },
|
|
1441
|
-
];
|
|
1442
|
-
const expectedHashMap = {
|
|
1443
|
-
prop1: new Set(['val1']),
|
|
1444
|
-
prop2: new Set(['val2']),
|
|
1445
|
-
prop3: new Set(['val3']),
|
|
1446
|
-
};
|
|
1447
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1448
|
-
expect(result).toEqual(expectedHashMap);
|
|
1449
|
-
});
|
|
1450
|
-
// Tests that the function returns an empty hashMap when given an empty array
|
|
1451
|
-
it('should return an empty hashMap when given an empty array', () => {
|
|
1452
|
-
const arrays = [];
|
|
1453
|
-
const expectedHashMap = {};
|
|
1454
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1455
|
-
expect(result).toEqual(expectedHashMap);
|
|
1456
|
-
});
|
|
1457
|
-
// Tests that the function correctly handles an array of objects with empty 'from' keys
|
|
1458
|
-
it("should correctly handle an array of objects with empty 'from' keys", () => {
|
|
1459
|
-
const arrays = [
|
|
1460
|
-
{ from: '', to: 'val1' },
|
|
1461
|
-
{ from: '', to: 'val2' },
|
|
1462
|
-
{ from: '', to: 'val3' },
|
|
1463
|
-
];
|
|
1464
|
-
const expectedHashMap = {};
|
|
1465
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1466
|
-
expect(result).toEqual(expectedHashMap);
|
|
1467
|
-
});
|
|
1468
|
-
// Tests that the function correctly handles an array of objects with empty 'to' keys
|
|
1469
|
-
it("should return an empty hashMap when the 'to' key is empty in all objects", () => {
|
|
1470
|
-
const arrays = [
|
|
1471
|
-
{ from: 'prop1', to: '' },
|
|
1472
|
-
{ from: 'prop2', to: '' },
|
|
1473
|
-
{ from: 'prop3', to: '' },
|
|
1474
|
-
];
|
|
1475
|
-
const expectedHashMap = { prop1: new Set(['']), prop2: new Set(['']), prop3: new Set(['']) };
|
|
1476
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1477
|
-
expect(result).toEqual(expectedHashMap);
|
|
1478
|
-
});
|
|
1479
|
-
// Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to false
|
|
1480
|
-
it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to false", () => {
|
|
1481
|
-
const arrays = [
|
|
1482
|
-
{ from: 'prop1', to: 'val1' },
|
|
1483
|
-
{ from: 'prop1', to: 'val2' },
|
|
1484
|
-
{ from: 'prop2', to: 'val2' },
|
|
1485
|
-
];
|
|
1486
|
-
const expectedHashMap = {
|
|
1487
|
-
prop1: new Set(['val1', 'val2']),
|
|
1488
|
-
prop2: new Set(['val2']),
|
|
1489
|
-
};
|
|
1490
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays, 'from', 'to', false);
|
|
1491
|
-
expect(result).toEqual(expectedHashMap);
|
|
1492
|
-
});
|
|
1493
|
-
// Tests that the function correctly generates a hashMap from a valid array of objects with custom fromKey and toKey values
|
|
1494
|
-
it('should correctly generate a hashMap from a valid array of objects with custom fromKey and toKey values', () => {
|
|
1495
|
-
const arrays = [
|
|
1496
|
-
{ from: 'prop1', to: 'val1' },
|
|
1497
|
-
{ from: 'prop1', to: 'val2' },
|
|
1498
|
-
{ from: 'prop2', to: 'val2' },
|
|
1499
|
-
];
|
|
1500
|
-
const expectedHashMap = {
|
|
1501
|
-
prop1: new Set(['val1', 'val2']),
|
|
1502
|
-
prop2: new Set(['val2']),
|
|
1503
|
-
};
|
|
1504
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays, 'from', 'to');
|
|
1505
|
-
expect(result).toEqual(expectedHashMap);
|
|
1506
|
-
});
|
|
1507
|
-
// Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to true
|
|
1508
|
-
it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys when isLowerCase is set to true", () => {
|
|
1509
|
-
const arrays = [
|
|
1510
|
-
{ from: 'prop1', to: 'val1' },
|
|
1511
|
-
{ from: 'prop1', to: 'val2' },
|
|
1512
|
-
{ from: 'prop2', to: 'val2' },
|
|
1513
|
-
];
|
|
1514
|
-
const expectedHashMap = {
|
|
1515
|
-
prop1: new Set(['val1', 'val2']),
|
|
1516
|
-
prop2: new Set(['val2']),
|
|
1517
|
-
};
|
|
1518
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays, 'from', 'to', true);
|
|
1519
|
-
expect(result).toEqual(expectedHashMap);
|
|
1520
|
-
});
|
|
1521
|
-
// Tests that the function correctly generates a hashMap from a valid array of objects with 'from' and 'to' keys
|
|
1522
|
-
it("should correctly generate a hashMap from a valid array of objects with 'from' and 'to' keys", () => {
|
|
1523
|
-
const arrays = [
|
|
1524
|
-
{ from: 'prop1', to: 'val1' },
|
|
1525
|
-
{ from: 'prop1', to: 'val2' },
|
|
1526
|
-
{ from: 'prop2', to: 'val2' },
|
|
1527
|
-
];
|
|
1528
|
-
const expectedHashMap = {
|
|
1529
|
-
prop1: new Set(['val1', 'val2']),
|
|
1530
|
-
prop2: new Set(['val2']),
|
|
1531
|
-
};
|
|
1532
|
-
const result = (0, misc_1.getHashFromArrayWithDuplicate)(arrays);
|
|
1533
|
-
expect(result).toEqual(expectedHashMap);
|
|
1534
|
-
});
|
|
1535
|
-
});
|
|
1536
|
-
describe('getValueFromPropertiesOrTraits', () => {
|
|
1537
|
-
// Tests that the function returns the value of the key from properties if it exists.
|
|
1538
|
-
it('should return the value of the key from properties when it exists', () => {
|
|
1539
|
-
const message = {
|
|
1540
|
-
properties: {
|
|
1541
|
-
key: 'value',
|
|
1542
|
-
},
|
|
1543
|
-
traits: {},
|
|
1544
|
-
context: {
|
|
1545
|
-
traits: {},
|
|
1546
|
-
},
|
|
1547
|
-
};
|
|
1548
|
-
const key = 'key';
|
|
1549
|
-
const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
|
|
1550
|
-
expect(result).toBe('value');
|
|
1551
|
-
});
|
|
1552
|
-
// Tests that the function returns the value of the key from traits if it exists.
|
|
1553
|
-
it('should return the value of the key from traits when it exists', () => {
|
|
1554
|
-
const message = {
|
|
1555
|
-
properties: {},
|
|
1556
|
-
traits: {
|
|
1557
|
-
key: 'value',
|
|
1558
|
-
},
|
|
1559
|
-
context: {
|
|
1560
|
-
traits: {},
|
|
1561
|
-
},
|
|
1562
|
-
};
|
|
1563
|
-
const key = 'key';
|
|
1564
|
-
const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
|
|
1565
|
-
expect(result).toBe('value');
|
|
1566
|
-
});
|
|
1567
|
-
// Tests that the function returns the value of the key from context.traits if it exists.
|
|
1568
|
-
it('should return the value of the key from context.traits when it exists', () => {
|
|
1569
|
-
const message = {
|
|
1570
|
-
properties: {},
|
|
1571
|
-
traits: {},
|
|
1572
|
-
context: {
|
|
1573
|
-
traits: {
|
|
1574
|
-
key: 'value',
|
|
1575
|
-
},
|
|
1576
|
-
},
|
|
1577
|
-
};
|
|
1578
|
-
const key = 'key';
|
|
1579
|
-
const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
|
|
1580
|
-
expect(result).toBe('value');
|
|
1581
|
-
});
|
|
1582
|
-
// Tests that the function returns null if the message is null.
|
|
1583
|
-
it('should return null when the message is null', () => {
|
|
1584
|
-
const message = null;
|
|
1585
|
-
const key = 'key';
|
|
1586
|
-
const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
|
|
1587
|
-
expect(result).toBeNull();
|
|
1588
|
-
});
|
|
1589
|
-
// Tests that the function returns null if the key is null.
|
|
1590
|
-
it('should return null when the key is null', () => {
|
|
1591
|
-
const message = {
|
|
1592
|
-
properties: {},
|
|
1593
|
-
traits: {},
|
|
1594
|
-
context: {
|
|
1595
|
-
traits: {},
|
|
1596
|
-
},
|
|
1597
|
-
};
|
|
1598
|
-
const key = null;
|
|
1599
|
-
const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
|
|
1600
|
-
expect(result).toBeNull();
|
|
1601
|
-
});
|
|
1602
|
-
// Tests that the function returns null if the key does not exist in any of the keySets.
|
|
1603
|
-
it('should return null when the key does not exist in any of the keySets', () => {
|
|
1604
|
-
const message = {
|
|
1605
|
-
properties: {},
|
|
1606
|
-
traits: {},
|
|
1607
|
-
context: {
|
|
1608
|
-
traits: {},
|
|
1609
|
-
},
|
|
1610
|
-
};
|
|
1611
|
-
const key = 'nonexistentKey';
|
|
1612
|
-
const result = (0, misc_1.getValueFromPropertiesOrTraits)({ message, key });
|
|
1613
|
-
expect(result).toBeNull();
|
|
1614
|
-
});
|
|
1615
|
-
});
|
|
1616
|
-
describe('flattenJson', () => {
|
|
1617
|
-
// Tests that flattenJson function correctly flattens a simple JSON object with no nested objects or arrays.
|
|
1618
|
-
it('should correctly flatten a simple JSON object', () => {
|
|
1619
|
-
const data = { name: 'John', age: 30, city: 'New York' };
|
|
1620
|
-
const expectedResult = { name: 'John', age: 30, city: 'New York' };
|
|
1621
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1622
|
-
expect(result).toEqual(expectedResult);
|
|
1623
|
-
});
|
|
1624
|
-
// Tests that flattenJson function correctly flattens a JSON object with nested objects and arrays.
|
|
1625
|
-
it('should correctly flatten a JSON object with nested objects and arrays', () => {
|
|
1626
|
-
const data = {
|
|
1627
|
-
name: 'John',
|
|
1628
|
-
age: 30,
|
|
1629
|
-
address: {
|
|
1630
|
-
street: '123 Main St',
|
|
1631
|
-
city: 'New York',
|
|
1632
|
-
country: 'USA',
|
|
1633
|
-
},
|
|
1634
|
-
hobbies: ['reading', 'painting'],
|
|
1635
|
-
};
|
|
1636
|
-
const expectedResult = {
|
|
1637
|
-
name: 'John',
|
|
1638
|
-
age: 30,
|
|
1639
|
-
'address.street': '123 Main St',
|
|
1640
|
-
'address.city': 'New York',
|
|
1641
|
-
'address.country': 'USA',
|
|
1642
|
-
'hobbies[0]': 'reading',
|
|
1643
|
-
'hobbies[1]': 'painting',
|
|
1644
|
-
};
|
|
1645
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1646
|
-
expect(result).toEqual(expectedResult);
|
|
1647
|
-
});
|
|
1648
|
-
// Tests that flattenJson function correctly flattens a JSON object with null and undefined values.
|
|
1649
|
-
it('should correctly flatten a JSON object with null and undefined values', () => {
|
|
1650
|
-
const data = { name: null, age: undefined, city: 'New York' };
|
|
1651
|
-
const expectedResult = { name: null, age: undefined, city: 'New York' };
|
|
1652
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1653
|
-
expect(result).toEqual(expectedResult);
|
|
1654
|
-
});
|
|
1655
|
-
// Tests that flattenJson function correctly flattens a JSON object with empty arrays and objects.
|
|
1656
|
-
it('should correctly flatten a JSON object with empty arrays and objects', () => {
|
|
1657
|
-
const data = { name: [], age: {}, city: 'New York' };
|
|
1658
|
-
const expectedResult = { name: [], age: {}, city: 'New York' };
|
|
1659
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1660
|
-
expect(result).toEqual(expectedResult);
|
|
1661
|
-
});
|
|
1662
|
-
// // Need to fix this test
|
|
1663
|
-
// // Tests that flattenJson function handles circular references in a JSON object correctly.
|
|
1664
|
-
// it('should handle circular references in a JSON object correctly', () => {
|
|
1665
|
-
// const data = { name: 'John', age: 30 };
|
|
1666
|
-
// data['self'] = data;
|
|
1667
|
-
// const expectedResult = { name: 'John', age: 30, self: '[Circular]' };
|
|
1668
|
-
// const result = flattenJson(data);
|
|
1669
|
-
// expect(result).toEqual(expectedResult);
|
|
1670
|
-
// });
|
|
1671
|
-
// Tests that flattenJson function correctly flattens a JSON object with keys containing special characters.
|
|
1672
|
-
it('should correctly flatten a JSON object with keys containing special characters', () => {
|
|
1673
|
-
const data = { 'name.first': 'John', 'name.last': 'Doe', 'age@': 30 };
|
|
1674
|
-
const expectedResult = { 'name.first': 'John', 'name.last': 'Doe', 'age@': 30 };
|
|
1675
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1676
|
-
expect(result).toEqual(expectedResult);
|
|
1677
|
-
});
|
|
1678
|
-
// Test that the flattenJson function correctly flattens a JSON object with non-string keys.
|
|
1679
|
-
it('should correctly flatten a JSON object with non-string keys', () => {
|
|
1680
|
-
const data = { 1: 'one', 2: 'two', 3: 'three' };
|
|
1681
|
-
const expectedResult = { '1': 'one', '2': 'two', '3': 'three' };
|
|
1682
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1683
|
-
expect(result).toEqual(expectedResult);
|
|
1684
|
-
});
|
|
1685
|
-
// Tests that flattenJson function correctly flattens a JSON object with keys containing the separator character.
|
|
1686
|
-
it('should correctly flatten a JSON object with keys containing the separator character', () => {
|
|
1687
|
-
const data = { 'name.first': 'John', 'name.last': 'Doe', age: 30, city: 'New York' };
|
|
1688
|
-
const expectedResult = {
|
|
1689
|
-
'name.first': 'John',
|
|
1690
|
-
'name.last': 'Doe',
|
|
1691
|
-
age: 30,
|
|
1692
|
-
city: 'New York',
|
|
1693
|
-
};
|
|
1694
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1695
|
-
expect(result).toEqual(expectedResult);
|
|
1696
|
-
});
|
|
1697
|
-
// The test objective is to verify that the flattenJson function correctly flattens a JSON object with keys that are reserved words.
|
|
1698
|
-
it('should correctly flatten a JSON object with reserved word keys', () => {
|
|
1699
|
-
const data = { class: 'Math', function: 'add', return: 'result' };
|
|
1700
|
-
const expectedResult = { class: 'Math', function: 'add', return: 'result' };
|
|
1701
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1702
|
-
expect(result).toEqual(expectedResult);
|
|
1703
|
-
});
|
|
1704
|
-
// The test objective is to verify that the 'flattenJson' function correctly flattens a JSON object with deeply nested objects and arrays.
|
|
1705
|
-
it('should correctly flatten a JSON object with deeply nested objects and arrays', () => {
|
|
1706
|
-
const data = {
|
|
1707
|
-
name: 'John',
|
|
1708
|
-
age: 30,
|
|
1709
|
-
address: {
|
|
1710
|
-
street: '123 Main St',
|
|
1711
|
-
city: 'New York',
|
|
1712
|
-
state: 'NY',
|
|
1713
|
-
zip: '10001',
|
|
1714
|
-
},
|
|
1715
|
-
hobbies: ['reading', 'painting', 'cooking'],
|
|
1716
|
-
friends: [
|
|
1717
|
-
{
|
|
1718
|
-
name: 'Jane',
|
|
1719
|
-
age: 28,
|
|
1720
|
-
address: {
|
|
1721
|
-
street: '456 Elm St',
|
|
1722
|
-
city: 'Los Angeles',
|
|
1723
|
-
state: 'CA',
|
|
1724
|
-
zip: '90001',
|
|
1725
|
-
},
|
|
1726
|
-
hobbies: ['hiking', 'photography'],
|
|
1727
|
-
},
|
|
1728
|
-
{
|
|
1729
|
-
name: 'Mike',
|
|
1730
|
-
age: 32,
|
|
1731
|
-
address: {
|
|
1732
|
-
street: '789 Oak St',
|
|
1733
|
-
city: 'Chicago',
|
|
1734
|
-
state: 'IL',
|
|
1735
|
-
zip: '60007',
|
|
1736
|
-
},
|
|
1737
|
-
hobbies: ['running', 'gaming'],
|
|
1738
|
-
},
|
|
1739
|
-
],
|
|
1740
|
-
};
|
|
1741
|
-
const expectedResult = {
|
|
1742
|
-
name: 'John',
|
|
1743
|
-
age: 30,
|
|
1744
|
-
'address.street': '123 Main St',
|
|
1745
|
-
'address.city': 'New York',
|
|
1746
|
-
'address.state': 'NY',
|
|
1747
|
-
'address.zip': '10001',
|
|
1748
|
-
'hobbies[0]': 'reading',
|
|
1749
|
-
'hobbies[1]': 'painting',
|
|
1750
|
-
'hobbies[2]': 'cooking',
|
|
1751
|
-
'friends[0].name': 'Jane',
|
|
1752
|
-
'friends[0].age': 28,
|
|
1753
|
-
'friends[0].address.street': '456 Elm St',
|
|
1754
|
-
'friends[0].address.city': 'Los Angeles',
|
|
1755
|
-
'friends[0].address.state': 'CA',
|
|
1756
|
-
'friends[0].address.zip': '90001',
|
|
1757
|
-
'friends[0].hobbies[0]': 'hiking',
|
|
1758
|
-
'friends[0].hobbies[1]': 'photography',
|
|
1759
|
-
'friends[1].name': 'Mike',
|
|
1760
|
-
'friends[1].age': 32,
|
|
1761
|
-
'friends[1].address.street': '789 Oak St',
|
|
1762
|
-
'friends[1].address.city': 'Chicago',
|
|
1763
|
-
'friends[1].address.state': 'IL',
|
|
1764
|
-
'friends[1].address.zip': '60007',
|
|
1765
|
-
'friends[1].hobbies[0]': 'running',
|
|
1766
|
-
'friends[1].hobbies[1]': 'gaming',
|
|
1767
|
-
};
|
|
1768
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1769
|
-
expect(result).toEqual(expectedResult);
|
|
1770
|
-
});
|
|
1771
|
-
// The test objective is to verify that the 'flattenJson' function correctly flattens a JSON object with non-ASCII characters in keys and values.
|
|
1772
|
-
it('should correctly flatten a JSON object with non-ASCII characters in keys and values', () => {
|
|
1773
|
-
const data = {
|
|
1774
|
-
name: 'John',
|
|
1775
|
-
age: 30,
|
|
1776
|
-
city: 'New York',
|
|
1777
|
-
address: { street: '123 Main St', city: 'San Francisco' },
|
|
1778
|
-
};
|
|
1779
|
-
const expectedResult = {
|
|
1780
|
-
name: 'John',
|
|
1781
|
-
age: 30,
|
|
1782
|
-
city: 'New York',
|
|
1783
|
-
'address.street': '123 Main St',
|
|
1784
|
-
'address.city': 'San Francisco',
|
|
1785
|
-
};
|
|
1786
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1787
|
-
expect(result).toEqual(expectedResult);
|
|
1788
|
-
});
|
|
1789
|
-
// The test objective is to verify that the flattenJson function correctly flattens a JSON object with deeply nested arrays and objects, including null and undefined values.
|
|
1790
|
-
it('should correctly flatten a JSON object with deeply nested arrays and objects with null and undefined values', () => {
|
|
1791
|
-
const data = {
|
|
1792
|
-
name: 'John',
|
|
1793
|
-
age: 30,
|
|
1794
|
-
city: 'New York',
|
|
1795
|
-
address: {
|
|
1796
|
-
street: '123 Main St',
|
|
1797
|
-
zip: 12345,
|
|
1798
|
-
country: 'USA',
|
|
1799
|
-
coordinates: {
|
|
1800
|
-
latitude: 40.7128,
|
|
1801
|
-
longitude: -74.006,
|
|
1802
|
-
},
|
|
1803
|
-
},
|
|
1804
|
-
hobbies: ['reading', 'painting', 'swimming'],
|
|
1805
|
-
friends: [
|
|
1806
|
-
{ name: 'Jane', age: 28 },
|
|
1807
|
-
{ name: 'Mike', age: 32 },
|
|
1808
|
-
{ name: 'Sarah', age: 27 },
|
|
1809
|
-
],
|
|
1810
|
-
pet: null,
|
|
1811
|
-
favoriteColor: undefined,
|
|
1812
|
-
};
|
|
1813
|
-
const expectedResult = {
|
|
1814
|
-
name: 'John',
|
|
1815
|
-
age: 30,
|
|
1816
|
-
city: 'New York',
|
|
1817
|
-
'address.street': '123 Main St',
|
|
1818
|
-
'address.zip': 12345,
|
|
1819
|
-
'address.country': 'USA',
|
|
1820
|
-
'address.coordinates.latitude': 40.7128,
|
|
1821
|
-
'address.coordinates.longitude': -74.006,
|
|
1822
|
-
'hobbies[0]': 'reading',
|
|
1823
|
-
'hobbies[1]': 'painting',
|
|
1824
|
-
'hobbies[2]': 'swimming',
|
|
1825
|
-
'friends[0].name': 'Jane',
|
|
1826
|
-
'friends[0].age': 28,
|
|
1827
|
-
'friends[1].name': 'Mike',
|
|
1828
|
-
'friends[1].age': 32,
|
|
1829
|
-
'friends[2].name': 'Sarah',
|
|
1830
|
-
'friends[2].age': 27,
|
|
1831
|
-
pet: null,
|
|
1832
|
-
favoriteColor: undefined,
|
|
1833
|
-
};
|
|
1834
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1835
|
-
expect(result).toEqual(expectedResult);
|
|
1836
|
-
});
|
|
1837
|
-
// Tests that flattenJson function correctly flattens a JSON object with arrays containing objects with different nesting levels.
|
|
1838
|
-
it('should correctly flatten a JSON object with arrays containing objects with different nesting levels', () => {
|
|
1839
|
-
const data = {
|
|
1840
|
-
name: 'John',
|
|
1841
|
-
age: 30,
|
|
1842
|
-
city: 'New York',
|
|
1843
|
-
hobbies: [
|
|
1844
|
-
{ name: 'Reading', type: 'Indoor' },
|
|
1845
|
-
{ name: 'Running', type: 'Outdoor' },
|
|
1846
|
-
{ name: 'Cooking', type: 'Indoor' },
|
|
1847
|
-
],
|
|
1848
|
-
friends: [
|
|
1849
|
-
{ name: 'Alice', age: 28 },
|
|
1850
|
-
{ name: 'Bob', age: 32 },
|
|
1851
|
-
{ name: 'Charlie', age: 27 },
|
|
1852
|
-
],
|
|
1853
|
-
};
|
|
1854
|
-
const expectedResult = {
|
|
1855
|
-
name: 'John',
|
|
1856
|
-
age: 30,
|
|
1857
|
-
city: 'New York',
|
|
1858
|
-
'hobbies[0].name': 'Reading',
|
|
1859
|
-
'hobbies[0].type': 'Indoor',
|
|
1860
|
-
'hobbies[1].name': 'Running',
|
|
1861
|
-
'hobbies[1].type': 'Outdoor',
|
|
1862
|
-
'hobbies[2].name': 'Cooking',
|
|
1863
|
-
'hobbies[2].type': 'Indoor',
|
|
1864
|
-
'friends[0].name': 'Alice',
|
|
1865
|
-
'friends[0].age': 28,
|
|
1866
|
-
'friends[1].name': 'Bob',
|
|
1867
|
-
'friends[1].age': 32,
|
|
1868
|
-
'friends[2].name': 'Charlie',
|
|
1869
|
-
'friends[2].age': 27,
|
|
1870
|
-
};
|
|
1871
|
-
const result = (0, misc_1.flattenJson)(data);
|
|
1872
|
-
expect(result).toEqual(expectedResult);
|
|
1873
|
-
});
|
|
1874
|
-
});
|
|
1875
|
-
describe('generateRandomString', () => {
|
|
1876
|
-
const testCases = [
|
|
1877
|
-
{
|
|
1878
|
-
name: 'should generate a random string of the specified length',
|
|
1879
|
-
length: 8,
|
|
1880
|
-
expectedLength: 8,
|
|
1881
|
-
},
|
|
1882
|
-
{
|
|
1883
|
-
name: 'should generate a random string of the default length',
|
|
1884
|
-
expectedLength: 10,
|
|
1885
|
-
},
|
|
1886
|
-
];
|
|
1887
|
-
(0, tests_1.filter)(testCases).forEach((testCase) => {
|
|
1888
|
-
it(testCase.name, () => {
|
|
1889
|
-
const result = (0, misc_1.generateRandomString)(testCase.length);
|
|
1890
|
-
expect(result.length).toBe(testCase.expectedLength);
|
|
1891
|
-
});
|
|
1892
|
-
});
|
|
1893
|
-
});
|
|
1894
|
-
describe('getOffsetInSec', () => {
|
|
1895
|
-
// Tests that the function returns the offset value in seconds for a valid timezone string
|
|
1896
|
-
it('should return the offset value in seconds for a valid timezone string', () => {
|
|
1897
|
-
const offset = (0, misc_1.getOffsetInSec)('Asia/Kolkata');
|
|
1898
|
-
expect(offset).toBe(19800);
|
|
1899
|
-
});
|
|
1900
|
-
// Tests that the function returns 0 for the timezone string 'UTC'
|
|
1901
|
-
it('should return 0 for the timezone string "UTC"', () => {
|
|
1902
|
-
const offset = (0, misc_1.getOffsetInSec)('UTC');
|
|
1903
|
-
expect(offset).toBe(0);
|
|
1904
|
-
});
|
|
1905
|
-
// Tests that the function returns 0 for the timezone string 'Etc/UTC'
|
|
1906
|
-
it('should return 0 for the timezone string "Etc/UTC"', () => {
|
|
1907
|
-
const offset = (0, misc_1.getOffsetInSec)('Etc/UTC');
|
|
1908
|
-
expect(offset).toBe(0);
|
|
1909
|
-
});
|
|
1910
|
-
// Tests that the function returns undefined for an invalid timezone string
|
|
1911
|
-
it('should return undefined for an invalid timezone string', () => {
|
|
1912
|
-
const offset = (0, misc_1.getOffsetInSec)('Invalid/Timezone');
|
|
1913
|
-
expect(offset).toBeUndefined();
|
|
1914
|
-
});
|
|
1915
|
-
// Tests that the function returns the undefined offset value for the timezone string '+05:30' invalid timezone string
|
|
1916
|
-
it('should return the undefined offset value for the timezone string "+05:30"', () => {
|
|
1917
|
-
const offset = (0, misc_1.getOffsetInSec)('+05:30');
|
|
1918
|
-
expect(offset).toBe(undefined);
|
|
1919
|
-
});
|
|
1920
|
-
// Tests that the function returns the correct offset value for the timezone string 'America/New_York'
|
|
1921
|
-
it('should return the correct offset value for the timezone string "America/New_York"', () => {
|
|
1922
|
-
const offset = (0, misc_1.getOffsetInSec)('Asia/Calcutta');
|
|
1923
|
-
expect(offset).toBe(19800);
|
|
1924
|
-
});
|
|
1925
|
-
});
|
|
1926
|
-
describe('formatTimeStamp', () => {
|
|
1927
|
-
// Tests that the function returns the timestamp in milliseconds when no format is provided.
|
|
1928
|
-
it('should return the timestamp in milliseconds when no format is provided', () => {
|
|
1929
|
-
const dateStr = '2022-01-01T00:00:00.000Z';
|
|
1930
|
-
const result = (0, misc_1.formatTimeStamp)(dateStr);
|
|
1931
|
-
expect(result).toBe(1640995200000);
|
|
1932
|
-
});
|
|
1933
|
-
// Tests that the function returns the timestamp formatted according to the moment format when format is provided.
|
|
1934
|
-
it('should return the timestamp formatted according to the moment format when format is provided', () => {
|
|
1935
|
-
const dateStr = '2022-01-01T00:00:00.000Z';
|
|
1936
|
-
const format = 'YYYY-MM-DD';
|
|
1937
|
-
const result = (0, misc_1.formatTimeStamp)(dateStr, format);
|
|
1938
|
-
expect(result).toBe('2022-01-01');
|
|
1939
|
-
});
|
|
1940
|
-
// Tests that the function throws an error when an invalid date string is provided.
|
|
1941
|
-
it('should throw an error when an invalid date string is provided', () => {
|
|
1942
|
-
const dateStr = 'invalid-date';
|
|
1943
|
-
expect((0, misc_1.formatTimeStamp)(dateStr)).toBeNaN();
|
|
1944
|
-
});
|
|
1945
|
-
// Tests that the function returns NaN when an invalid date string is provided and no format is provided.
|
|
1946
|
-
it('should return NaN when an invalid date string is provided and no format is provided', () => {
|
|
1947
|
-
const dateStr = 'invalid-date';
|
|
1948
|
-
const result = (0, misc_1.formatTimeStamp)(dateStr);
|
|
1949
|
-
expect(result).toBeNaN();
|
|
1950
|
-
});
|
|
1951
|
-
// Tests that the function returns NaN when an empty string is provided as the date string and no format is provided.
|
|
1952
|
-
it('should return NaN when an empty string is provided as the date string and no format is provided', () => {
|
|
1953
|
-
const dateStr = '';
|
|
1954
|
-
const result = (0, misc_1.formatTimeStamp)(dateStr);
|
|
1955
|
-
expect(result).toBeNaN();
|
|
1956
|
-
});
|
|
1957
|
-
// Tests that the function returns NaN when an invalid format is provided.
|
|
1958
|
-
it('should return NaN when an invalid format is provided', () => {
|
|
1959
|
-
const dateStr = '2022-01-01T00:00:00.000Z';
|
|
1960
|
-
const format = 'invalidFormat';
|
|
1961
|
-
const result = (0, misc_1.formatTimeStamp)(dateStr, format);
|
|
1962
|
-
expect(result).toEqual('invam1/1/2022i6For0amt');
|
|
1963
|
-
});
|
|
1964
|
-
// Tests that the function returns the timestamp in milliseconds when a valid timestamp string is provided instead of a date string.
|
|
1965
|
-
it('should return the timestamp in milliseconds when a valid timestamp string is provided instead of a date string', () => {
|
|
1966
|
-
const dateStr = '2022-01-01T00:00:00.000Z';
|
|
1967
|
-
const result = (0, misc_1.formatTimeStamp)(dateStr);
|
|
1968
|
-
expect(result).toBe(1640995200000);
|
|
1969
|
-
});
|
|
1970
|
-
});
|
|
1971
|
-
describe('hashToSha256', () => {
|
|
1972
|
-
// Tests that hashToSha256 returns the SHA256 hash of a string input
|
|
1973
|
-
it('should return the SHA256 hash of a string input', () => {
|
|
1974
|
-
const input = 'test string';
|
|
1975
|
-
const expectedOutput = 'd5579c46dfcc7f18207013e65b44e4cb4e2c2298f4ac457ba8f82743f31e930b';
|
|
1976
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
1977
|
-
expect(output).toBe(expectedOutput);
|
|
1978
|
-
});
|
|
1979
|
-
// Tests that hashToSha256 returns the SHA256 hash of a Buffer input
|
|
1980
|
-
it('should return the SHA256 hash of a Buffer input', () => {
|
|
1981
|
-
const input = Buffer.from('test buffer');
|
|
1982
|
-
const expectedOutput = '525ef5f7baf56528b48770922e98e800310d3685681d34ee592902aa252458b3';
|
|
1983
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
1984
|
-
expect(output).toBe(expectedOutput);
|
|
1985
|
-
});
|
|
1986
|
-
// Tests that hashToSha256 returns the SHA256 hash of an empty number array input
|
|
1987
|
-
it('should return the SHA256 hash of an empty number array input', () => {
|
|
1988
|
-
const input = [];
|
|
1989
|
-
const expectedOutput = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
|
|
1990
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
1991
|
-
expect(output).toBe(expectedOutput);
|
|
1992
|
-
});
|
|
1993
|
-
// Tests that hashToSha256 returns the SHA256 hash of an empty Buffer input
|
|
1994
|
-
it('should return the SHA256 hash of an empty Buffer input', () => {
|
|
1995
|
-
const input = Buffer.from([]);
|
|
1996
|
-
const expectedOutput = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
|
|
1997
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
1998
|
-
expect(output).toBe(expectedOutput);
|
|
1999
|
-
});
|
|
2000
|
-
// Tests that hashToSha256 returns the SHA256 hash of an empty string input
|
|
2001
|
-
it('should return the SHA256 hash of an empty string input', () => {
|
|
2002
|
-
const input = '';
|
|
2003
|
-
const expectedOutput = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
|
|
2004
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
2005
|
-
expect(output).toBe(expectedOutput);
|
|
2006
|
-
});
|
|
2007
|
-
// Tests that hashToSha256 returns the SHA256 hash of a number array input
|
|
2008
|
-
it('should return the SHA256 hash of a number array input', () => {
|
|
2009
|
-
const input = [1, 2, 3, 4, 5];
|
|
2010
|
-
const expectedOutput = '74f81fe167d99b4cb41d6d0ccda82278caee9f3e2f25d5e5a3936ff3dcec60d0';
|
|
2011
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
2012
|
-
expect(output).toBe(expectedOutput);
|
|
2013
|
-
});
|
|
2014
|
-
// Tests that hashToSha256 returns the SHA256 hash of a non-ASCII string input
|
|
2015
|
-
it('should return the SHA256 hash of a non-ASCII string input', () => {
|
|
2016
|
-
const input = '你好世界';
|
|
2017
|
-
const expectedOutput = '508d69dc21bf5d2f804014b1688953a12d5dfde71be6cd954177980d5d1741bb';
|
|
2018
|
-
const output = (0, misc_1.hashToSha256)(input);
|
|
2019
|
-
expect(output).toBe(expectedOutput);
|
|
2020
|
-
});
|
|
2021
|
-
});
|
|
2022
|
-
describe('generateUUID', () => {
|
|
2023
|
-
// Tests that generateUUID function returns a UUID string
|
|
2024
|
-
it('should return a UUID string', () => {
|
|
2025
|
-
const uuid = (0, misc_1.generateUUID)();
|
|
2026
|
-
expect(typeof uuid).toBe('string');
|
|
2027
|
-
});
|
|
2028
|
-
// Tests that generateUUID function generates a unique UUID each time it is called
|
|
2029
|
-
it('should generate a unique UUID each time it is called', () => {
|
|
2030
|
-
const uuid1 = (0, misc_1.generateUUID)();
|
|
2031
|
-
const uuid2 = (0, misc_1.generateUUID)();
|
|
2032
|
-
expect(uuid1).not.toBe(uuid2);
|
|
2033
|
-
});
|
|
2034
|
-
// Tests that generateUUID function returns a UUID string with length 36
|
|
2035
|
-
it('should return a UUID string with length 36', () => {
|
|
2036
|
-
const uuid = (0, misc_1.generateUUID)();
|
|
2037
|
-
expect(uuid.length).toBe(36);
|
|
2038
|
-
});
|
|
2039
|
-
// Tests that generateUUID function returns a UUID string with 4 dashes
|
|
2040
|
-
it('should return a UUID string with 4 dashes', () => {
|
|
2041
|
-
const uuid = (0, misc_1.generateUUID)();
|
|
2042
|
-
const dashCount = (uuid.match(/-/g) || []).length;
|
|
2043
|
-
expect(dashCount).toBe(4);
|
|
2044
|
-
});
|
|
2045
|
-
});
|
|
2046
|
-
describe('toString', () => {
|
|
2047
|
-
it('should return the same string when input is a string', () => {
|
|
2048
|
-
const input = 'test string';
|
|
2049
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2050
|
-
expect(result).toBe(input);
|
|
2051
|
-
});
|
|
2052
|
-
it('should return "null" when input is null', () => {
|
|
2053
|
-
const input = null;
|
|
2054
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2055
|
-
expect(result).toBe('null');
|
|
2056
|
-
});
|
|
2057
|
-
it('should return JSON string when input is a custom object', () => {
|
|
2058
|
-
const input = { key: 'value', anotherKey: 123 };
|
|
2059
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2060
|
-
expect(result).toBe(JSON.stringify(input));
|
|
2061
|
-
});
|
|
2062
|
-
it('should throw an error when input has circular references', () => {
|
|
2063
|
-
const circularObj = {};
|
|
2064
|
-
circularObj.self = circularObj;
|
|
2065
|
-
expect(() => (0, misc_1.convertToString)(circularObj)).toThrow(TypeError);
|
|
2066
|
-
});
|
|
2067
|
-
it('should convert boolean true to JSON string', () => {
|
|
2068
|
-
const input = true;
|
|
2069
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2070
|
-
expect(result).toBe('true');
|
|
2071
|
-
});
|
|
2072
|
-
it('should convert array to JSON string when input is an array', () => {
|
|
2073
|
-
const input = [1, 2, 3];
|
|
2074
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2075
|
-
expect(result).toBe(JSON.stringify(input));
|
|
2076
|
-
});
|
|
2077
|
-
it('should convert a number to a JSON string', () => {
|
|
2078
|
-
const input = 123;
|
|
2079
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2080
|
-
expect(result).toBe('123');
|
|
2081
|
-
});
|
|
2082
|
-
it('should correctly handle strings with special characters', () => {
|
|
2083
|
-
const input = 'special!@#$%^&*()_+{}:"<>?';
|
|
2084
|
-
const result = (0, misc_1.convertToString)(input);
|
|
2085
|
-
expect(result).toBe(input);
|
|
2086
|
-
});
|
|
2087
|
-
it('should correctly convert large data structures to string', () => {
|
|
2088
|
-
const largeObject = {
|
|
2089
|
-
key1: 'value1',
|
|
2090
|
-
key2: Array(1000).fill('value2'),
|
|
2091
|
-
key3: { nestedKey: 'nestedValue' },
|
|
2092
|
-
};
|
|
2093
|
-
const result = (0, misc_1.convertToString)(largeObject);
|
|
2094
|
-
expect(result).toBe('{"key1":"value1","key2":["value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2","value2"],"key3":{"nestedKey":"nestedValue"}}');
|
|
2095
|
-
});
|
|
2096
|
-
});
|
|
2097
|
-
describe('uuidv5', () => {
|
|
2098
|
-
it('should generate the same UUID for the same input', () => {
|
|
2099
|
-
const input = 'test-value';
|
|
2100
|
-
const uuid1 = (0, misc_1.uuidv5)(input);
|
|
2101
|
-
const uuid2 = (0, misc_1.uuidv5)(input);
|
|
2102
|
-
expect(uuid1).toBe(uuid2);
|
|
2103
|
-
});
|
|
2104
|
-
it('should generate different UUIDs for different inputs', () => {
|
|
2105
|
-
const uuid1 = (0, misc_1.uuidv5)('first-value');
|
|
2106
|
-
const uuid2 = (0, misc_1.uuidv5)('second-value');
|
|
2107
|
-
expect(uuid1).not.toBe(uuid2);
|
|
2108
|
-
});
|
|
2109
|
-
it('should return a valid UUID v5', () => {
|
|
2110
|
-
expect((0, misc_1.uuidv5)('valid-test')).toBe('49843169-ee91-53d4-82ae-02dd676c92ae');
|
|
2111
|
-
});
|
|
2112
|
-
it('should handle empty string inputs', () => {
|
|
2113
|
-
expect((0, misc_1.uuidv5)('')).toBe('1c7fcf13-74af-5595-8ee9-d72be6c1ac42');
|
|
2114
|
-
});
|
|
2115
|
-
});
|
|
2116
|
-
describe('flattenQueryParams', () => {
|
|
2117
|
-
const testCases = [
|
|
2118
|
-
{
|
|
2119
|
-
name: 'flatten array values to first elements',
|
|
2120
|
-
input: {
|
|
2121
|
-
key1: ['value1'],
|
|
2122
|
-
key2: ['value2'],
|
|
2123
|
-
key3: [123],
|
|
2124
|
-
},
|
|
2125
|
-
expected: {
|
|
2126
|
-
key1: 'value1',
|
|
2127
|
-
key2: 'value2',
|
|
2128
|
-
key3: 123,
|
|
2129
|
-
},
|
|
2130
|
-
},
|
|
2131
|
-
{
|
|
2132
|
-
name: 'handle null input',
|
|
2133
|
-
input: null,
|
|
2134
|
-
expected: {},
|
|
2135
|
-
},
|
|
2136
|
-
{
|
|
2137
|
-
name: 'handle undefined input',
|
|
2138
|
-
input: undefined,
|
|
2139
|
-
expected: {},
|
|
2140
|
-
},
|
|
2141
|
-
{
|
|
2142
|
-
name: 'handle empty object',
|
|
2143
|
-
input: {},
|
|
2144
|
-
expected: {},
|
|
2145
|
-
},
|
|
2146
|
-
{
|
|
2147
|
-
name: 'ignore null/undefined array elements',
|
|
2148
|
-
input: {
|
|
2149
|
-
key1: [undefined],
|
|
2150
|
-
key2: [null],
|
|
2151
|
-
key3: [undefined, 'value'],
|
|
2152
|
-
key4: [null, 'value'],
|
|
2153
|
-
},
|
|
2154
|
-
expected: {
|
|
2155
|
-
key3: [undefined, 'value'],
|
|
2156
|
-
key4: [null, 'value'],
|
|
2157
|
-
},
|
|
2158
|
-
},
|
|
2159
|
-
{
|
|
2160
|
-
name: 'handle mixed type values in arrays',
|
|
2161
|
-
input: {
|
|
2162
|
-
number: [42],
|
|
2163
|
-
string: ['test'],
|
|
2164
|
-
boolean: [true],
|
|
2165
|
-
object: [{ nested: 'value' }],
|
|
2166
|
-
date: [new Date('2024-01-01')],
|
|
2167
|
-
},
|
|
2168
|
-
expected: {
|
|
2169
|
-
number: 42,
|
|
2170
|
-
string: 'test',
|
|
2171
|
-
boolean: true,
|
|
2172
|
-
object: { nested: 'value' },
|
|
2173
|
-
date: new Date('2024-01-01'),
|
|
2174
|
-
},
|
|
2175
|
-
},
|
|
2176
|
-
{
|
|
2177
|
-
name: 'handle empty arrays',
|
|
2178
|
-
input: {
|
|
2179
|
-
key1: [],
|
|
2180
|
-
key2: ['value'],
|
|
2181
|
-
key3: [],
|
|
2182
|
-
},
|
|
2183
|
-
expected: {
|
|
2184
|
-
key2: 'value',
|
|
2185
|
-
},
|
|
2186
|
-
},
|
|
2187
|
-
{
|
|
2188
|
-
name: 'keep non-array values unchanged',
|
|
2189
|
-
input: {
|
|
2190
|
-
string: 'direct string',
|
|
2191
|
-
number: 42,
|
|
2192
|
-
boolean: true,
|
|
2193
|
-
object: { test: 'value' },
|
|
2194
|
-
array: ['first', 'second'],
|
|
2195
|
-
},
|
|
2196
|
-
expected: {
|
|
2197
|
-
string: 'direct string',
|
|
2198
|
-
number: 42,
|
|
2199
|
-
boolean: true,
|
|
2200
|
-
object: { test: 'value' },
|
|
2201
|
-
array: ['first', 'second'],
|
|
2202
|
-
},
|
|
2203
|
-
},
|
|
2204
|
-
{
|
|
2205
|
-
name: 'handle mixed array and non-array values',
|
|
2206
|
-
input: {
|
|
2207
|
-
arrayValue: ['first'],
|
|
2208
|
-
emptyArray: [],
|
|
2209
|
-
directValue: 'string',
|
|
2210
|
-
nullValue: null,
|
|
2211
|
-
undefinedValue: undefined,
|
|
2212
|
-
},
|
|
2213
|
-
expected: {
|
|
2214
|
-
arrayValue: 'first',
|
|
2215
|
-
directValue: 'string',
|
|
2216
|
-
},
|
|
2217
|
-
},
|
|
2218
|
-
{
|
|
2219
|
-
name: 'handle nested arrays',
|
|
2220
|
-
input: {
|
|
2221
|
-
nested: [
|
|
2222
|
-
[1, 2],
|
|
2223
|
-
[3, 4],
|
|
2224
|
-
],
|
|
2225
|
-
mixed: [['a', 'b'], 'c'],
|
|
2226
|
-
},
|
|
2227
|
-
expected: {
|
|
2228
|
-
nested: [
|
|
2229
|
-
[1, 2],
|
|
2230
|
-
[3, 4],
|
|
2231
|
-
],
|
|
2232
|
-
mixed: [['a', 'b'], 'c'],
|
|
2233
|
-
},
|
|
2234
|
-
},
|
|
2235
|
-
{
|
|
2236
|
-
name: 'handle special values in arrays',
|
|
2237
|
-
input: {
|
|
2238
|
-
nan: [NaN],
|
|
2239
|
-
infinity: [Infinity],
|
|
2240
|
-
negInfinity: [-Infinity],
|
|
2241
|
-
zero: [0],
|
|
2242
|
-
negZero: [-0],
|
|
2243
|
-
},
|
|
2244
|
-
expected: {
|
|
2245
|
-
nan: NaN,
|
|
2246
|
-
infinity: Infinity,
|
|
2247
|
-
negInfinity: -Infinity,
|
|
2248
|
-
zero: 0,
|
|
2249
|
-
negZero: -0,
|
|
2250
|
-
},
|
|
2251
|
-
},
|
|
2252
|
-
];
|
|
2253
|
-
testCases.forEach(({ name, input, expected }) => {
|
|
2254
|
-
it(`should ${name}`, () => {
|
|
2255
|
-
expect((0, misc_1.flattenQueryParams)(input)).toEqual(expected);
|
|
2256
|
-
});
|
|
2257
|
-
});
|
|
2258
|
-
});
|
|
2259
|
-
});
|
|
2260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL21pc2MudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQWtDZ0I7QUFDaEIsbUNBQStDO0FBRS9DLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLHFGQUFxRjtRQUNyRixFQUFFLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxFQUFFO1lBQzFFLE1BQU0sQ0FBQyxJQUFBLGdCQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxzRkFBc0Y7UUFDdEYsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxNQUFNLENBQUMsSUFBQSxnQkFBUyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgscUZBQXFGO1FBQ3JGLEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7WUFDMUUsTUFBTSxDQUFDLElBQUEsZ0JBQVMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILDhFQUE4RTtRQUM5RSxFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1lBQ25FLE1BQU0sQ0FBQyxJQUFBLGdCQUFTLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCwrRUFBK0U7UUFDL0UsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLENBQUMsSUFBQSxnQkFBUyxFQUFDLElBQUksQ0FB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RUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFxQixFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxxR0FBcUc7UUFDckcsRUFBRSxDQUFDLG9GQUFvRixFQUFFLEdBQUcsRUFBRTtZQUM1RixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFxQixFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxvR0FBb0c7UUFDcEcsRUFBRSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtZQUMzRixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFFBQVEs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QUcsRUFBRTtZQUN4SSxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNGLE1BQU0sTUFBTSxHQUFHLElBQUEsaUJBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCwySUFBMkk7UUFDM0ksRUFBRSxDQUFDLDBIQUEwSCxFQUFFLEdBQUcsRUFBRTtZQUNsSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGlCQUFVLEVBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCwySUFBMkk7UUFDM0ksRUFBRSxDQUFDLDBIQUEwSCxFQUFFLEdBQUcsRUFBRTtZQUNsSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDakQsTUFBTSxNQUFNLEdBQUcs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QUNaO2FBQ0Y7U0FDRixDQUFDO1FBRUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQzlDLEVBQUUsQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLElBQUEseUJBQWtCLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBiYXNlNjRDb252ZXJ0b3IsXG4gIGZsYXR0ZW5NYXAsXG4gIGdldFR5cGUsXG4gIGlzQmxhbmssXG4gIGlzRGVmaW5lZCxcbiAgaXNEZWZpbmVkQW5kTm90TnVsbCxcbiAgaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5LFxuICBpc05vdEVtcHR5LFxuICBpc05vdE51bGwsXG4gIGlzUHJpbWl0aXZlLFxuICBpc1ZhbGlkVXJsLFxuICByZW1vdmVOdWxsVmFsdWVzLFxuICByZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMsXG4gIHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFZhbHVlcyxcbiAgc3RyaXBUcmFpbGluZ1NsYXNoLFxuICBpc09iamVjdCxcbiAgaXNFbXB0eSxcbiAgaXNFbXB0eU9iamVjdCxcbiAgaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5LFxuICByZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludCxcbiAgZ2V0SGFzaEZyb21BcnJheSxcbiAgZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUsXG4gIGZsYXR0ZW5Kc29uLFxuICBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMsXG4gIGdldE9mZnNldEluU2VjLFxuICBmb3JtYXRUaW1lU3RhbXAsXG4gIGhhc2hUb1NoYTI1NixcbiAgZ2VuZXJhdGVVVUlELFxuICBjb252ZXJ0VG9TdHJpbmcsXG4gIHV1aWR2NSxcbiAgZ2VuZXJhdGVSYW5kb21TdHJpbmcsXG4gIGZsYXR0ZW5RdWVyeVBhcmFtcyxcbn0gZnJvbSAnLi9taXNjJztcbmltcG9ydCB7IEJhc2VUZXN0Q2FzZSwgZmlsdGVyIH0gZnJvbSAnLi90ZXN0cyc7XG5cbmRlc2NyaWJlKCdtaXNjJywgKCkgPT4ge1xuICBkZXNjcmliZSgnaXNEZWZpbmVkJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgZGVmaW5lZCB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBkZWZpbmVkIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoNSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIG5vbi1udWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG5vbi1udWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoJ2hlbGxvJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKCcnKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbnVtYmVyIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG51bWJlciBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKDEwKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgYm9vbGVhbiBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBib29sZWFuIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQodHJ1ZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gYW4gdW5kZWZpbmVkIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gYW4gdW5kZWZpbmVkIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQodW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBudWxsIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBudWxsIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQobnVsbCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKHt9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKFtdKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIE5hTiBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gTmFOIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoTmFOKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZCgoKSA9PiB7fSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIHN5bWJvbCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBzeW1ib2wgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZChTeW1ib2woKSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUbyB2ZXJpZnkgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgTWFwIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgTWFwIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkKG1hcCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgb2JqZWN0aXZlIG9mIHRoaXMgdGVzdCBpcyB0byB2ZXJpZnkgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgU2V0IG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IFNldCBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2V0T2JqID0gbmV3IFNldCgpO1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZChzZXRPYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG9iamVjdGl2ZSBvZiB0aGlzIHRlc3QgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IFdlYWtNYXAgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgV2Vha01hcCBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgZW1wdHlXZWFrTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIGV4cGVjdChpc0RlZmluZWQoZW1wdHlXZWFrTWFwKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzTm90RW1wdHknLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgdHJ1ZSBmb3Igbm9uLWVtcHR5IGFycmF5c1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgaW5wdXQgaXMgYSBub24tZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KFsxLCAyLCAzXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIGVtcHR5IGFycmF5c1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eShbXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIHRydWUgZm9yIG5vbi1lbXB0eSBvYmplY3RzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KHsga2V5OiAndmFsdWUnIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBlbXB0eSBvYmplY3RzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eSh7fSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIHRydWUgZm9yIG5vbi1lbXB0eSBzdHJpbmdzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KCdoZWxsbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBlbXB0eSBzdHJpbmdzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eSgnJyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3RFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBub24temVybyBudW1iZXJzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYSBub24temVybyBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KDQyKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIHplcm9cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpbnB1dCBpcyB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eSgwKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpbnB1dCBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNOb3RFbXB0eShudWxsKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIHVuZGVmaW5lZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTm90RW1wdHkodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIE5hTlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGlucHV0IGlzIE5hTicsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTm90RW1wdHkoTmFOKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdEVtcHR5IHJldHVybnMgZmFsc2UgZm9yIGZhbHNlIGJvb2xlYW5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpbnB1dCBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTm90RW1wdHkoZmFsc2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90RW1wdHkgcmV0dXJucyBmYWxzZSBmb3IgdHJ1ZSBib29sZWFuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaW5wdXQgaXMgYSB0cnVlIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc05vdEVtcHR5KHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc05vdE51bGwnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gYSBub24tbnVsbCB2YWx1ZSBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tbnVsbCB2YWx1ZSBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKCd0ZXN0JykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhIHRydXRoeSB2YWx1ZSBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSB0cnV0aHkgdmFsdWUgaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbCh0cnVlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwoJycpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gYSBudW1iZXIgaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgbnVtYmVyIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwoMTIzKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGEgYm9vbGVhbiB2YWx1ZSBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwodHJ1ZSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIGZhbHNlIHdoZW4gbnVsbCBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG51bGwgaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChudWxsKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIGZhbHNlIHdoZW4gdW5kZWZpbmVkIGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdW5kZWZpbmVkIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwodW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IG9iamVjdCBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKHt9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKFtdKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNOb3ROdWxsIHJldHVybnMgdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbCgoKSA9PiB7fSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBOYU4gaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIE5hTiBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNOb3ROdWxsKE5hTikpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhIHN5bWJvbCBpcyBwYXNzZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBzeW1ib2wgaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChTeW1ib2woKSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzTm90TnVsbCByZXR1cm5zIHRydWUgd2hlbiBhIGZ1bmN0aW9uIGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIGZ1bmN0aW9uIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05vdE51bGwoKCkgPT4ge30pKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gTmFOIGlzIHBhc3NlZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBOYU4gaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChOYU4pKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc05vdE51bGwgcmV0dXJucyB0cnVlIHdoZW4gYSBzeW1ib2wgaXMgcGFzc2VkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgc3ltYm9sIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbCgpO1xuICAgICAgZXhwZWN0KGlzTm90TnVsbChzeW1ib2wpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNEZWZpbmVkQW5kTm90TnVsbCcsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZEFuZE5vdE51bGwoJ3Rlc3QnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIHN0cmluZyB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBzdHJpbmcgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCgndGVzdCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbnVtYmVyIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG51bWJlciB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWRBbmROb3ROdWxsKDEyMyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIGJvb2xlYW4gdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhbiBvYmplY3QgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIG9iamVjdCB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWRBbmROb3ROdWxsKHsga2V5OiAndmFsdWUnIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGFycmF5IHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBhcnJheSB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWRBbmROb3ROdWxsKFsxLCAyLCAzXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhbiBlbXB0eSBzdHJpbmcgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCgnJyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYW4gZW1wdHkgYXJyYXkgdmFsdWUgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFuIGVtcHR5IGFycmF5IHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZEFuZE5vdE51bGwoW10pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGFuIGVtcHR5IG9iamVjdCB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYW4gZW1wdHkgb2JqZWN0IHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZEFuZE5vdE51bGwoe30pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gbnVsbCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG51bGwgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbChudWxsKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gTmFOIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBOYU4gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkQW5kTm90TnVsbChOYU4pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eScsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBwYXNzZWQgYSBub24tZW1wdHkgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHBhc3NlZCBhIG5vbi1lbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KCdoZWxsbycpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGEgbm9uLWVtcHR5IG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBwYXNzZWQgYSBub24tZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSh7IG5hbWU6ICdKb2huJywgYWdlOiAyNSB9KSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhIG5vbi1lbXB0eSBhcnJheVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBwYXNzZWQgYSBub24tZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KFsxLCAyLCAzXSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gcGFzc2VkIGEgYm9vbGVhbiB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIGEgYm9vbGVhbiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkodHJ1ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIHBhc3NlZCBhIG51bWJlciB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIGEgbnVtYmVyIHZhbHVlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSg0MikpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIHBhc3NlZCBhbiBlbXB0eSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHBhc3NlZCBhbiBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KCcnKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gcGFzc2VkIGFuIGVtcHR5IG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkoe30pKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBwYXNzZWQgYW4gZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHBhc3NlZCBhbiBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkoW10pKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBwYXNzZWQgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFzc2VkIG51bGwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNEZWZpbmVkQW5kTm90TnVsbEFuZE5vdEVtcHR5KG51bGwpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBwYXNzZWQgdW5kZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBwYXNzZWQgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSh1bmRlZmluZWQpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhIHN0cmluZyB3aXRoIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHBhc3NlZCBhIHN0cmluZyB3aXRoIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSgnICAgJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggb25seSBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIG9ubHkgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSh7IHByb3AxOiBudWxsLCBwcm9wMjogdW5kZWZpbmVkIH0pKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNCbGFuaycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyB0cnVlIGZvciBhbiBlbXB0eSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQmxhbmsoJycpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgdHJ1ZSBmb3IgYW4gZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsdWUgaXMgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayhbXSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYW4gZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKHt9KSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuaygnaGVsbG8nKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbHVlIGlzIGEgbm9uLWVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQmxhbmsoWzEsIDIsIDNdKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayh7IGtleTogJ3ZhbHVlJyB9KSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyB0cnVlIGZvciBhIG51bGwgdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKG51bGwpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgdHJ1ZSBmb3IgYW4gdW5kZWZpbmVkIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKHVuZGVmaW5lZCkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzQmxhbmsgcmV0dXJucyBmYWxzZSBmb3IgYSBib29sZWFuIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayh0cnVlKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNCbGFuayhmYWxzZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgZmFsc2UgZm9yIGEgbnVtYmVyIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIG51bWJlcicsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0JsYW5rKDEyMykpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQmxhbmsoMCkpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQmxhbmsoLTEpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNCbGFuayByZXR1cm5zIGZhbHNlIGZvciBhIHdoaXRlc3BhY2Ugc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIHdoaXRlc3BhY2Ugc3RyaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQmxhbmsoJyAgICcpKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChpc0JsYW5rKCdcXHQnKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNCbGFuaygnXFxuJykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0JsYW5rIHJldHVybnMgZmFsc2UgZm9yIE5hTiB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB2YWx1ZSBpcyBOYU4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNCbGFuayhOYU4pKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZVVuZGVmaW5lZFZhbHVlcycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCBpZiBpdCBpcyBub3QgYW4gb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHdoZW4gdGhlIGlucHV0IGlzIG5vdCBhbiBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IDEyMztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyBpZiBhbGwgdmFsdWVzIGFyZSBkZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGFsbCB2YWx1ZXMgYXJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogMSwgYjogJ2hlbGxvJywgYzogdHJ1ZSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlVW5kZWZpbmVkVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzIGlmIHNvbWUgdmFsdWVzIGFyZSBkZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgdmFsdWVzIGFyZSBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IDEsIGI6IHVuZGVmaW5lZCwgYzogdHJ1ZSB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IDEsIGM6IHRydWUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBpZiB0aGUgaW5wdXQgaXMgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgaW5wdXQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGlucHV0IGlzIHVuZGVmaW5lZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIHRoZSBpbnB1dCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSB1bmRlZmluZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzIHdoZW4gc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxLCBjOiB1bmRlZmluZWQgfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBudWxsXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IDEsIGM6IG51bGwgfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSwgYzogbnVsbCB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgZW1wdHkgc3RyaW5ncycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IDEsIGM6ICcnIH0sIGQ6IDIgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0geyBhOiB7IGI6IDEsIGM6ICcnIH0sIGQ6IDIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyBpZiBzb21lIG5lc3RlZCB2YWx1ZXMgYXJlIGZhbHNlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxLCBjOiBmYWxzZSB9LCBkOiAyIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogeyBiOiAxLCBjOiBmYWxzZSB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSB6ZXJvXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIHNvbWUgbmVzdGVkIHZhbHVlcyBhcmUgemVybycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IDEsIGM6IDAgfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSwgYzogMCB9LCBkOiAyIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVVbmRlZmluZWRWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXMgaWYgc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBOYU5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgdmFsdWVzIHdoZW4gc29tZSBuZXN0ZWQgdmFsdWVzIGFyZSBOYU4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxLCBjOiBOYU4gfSwgZDogMiB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSwgYzogTmFOIH0sIGQ6IDIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZU51bGxWYWx1ZXMnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gZW1wdHkgb2JqZWN0IGFzIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHdoZW4gaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7fTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gb2JqZWN0IHdpdGggbm8gbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBpbnB1dCBoYXMgbm8gbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogMSwgYjogJ2hlbGxvJywgYzogWzEsIDIsIDNdIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogMSwgYjogJ2hlbGxvJywgYzogWzEsIDIsIDNdIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgbnVsbCBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBpbnB1dCBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBudWxsO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBudWxsO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlTnVsbFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBoYW5kbGVzIHVuZGVmaW5lZCBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIGlucHV0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYSBzdHJpbmcgYXMgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2hlbiBpbnB1dCBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2hlbGxvJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ2hlbGxvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZU51bGxWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhIG51bWJlciBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG51bWJlciB3aGVuIGlucHV0IGlzIGEgbnVtYmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAxMjM7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IDEyMztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZU51bGxWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBhcnJheSBhcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIGFycmF5IHdoZW4gaW5wdXQgaXMgYW4gYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAyLCAzXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0geyAnMCc6IDEsICcxJzogMiwgJzInOiAzIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gb2JqZWN0IHdpdGggb25seSBudWxsIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIGlucHV0IGhhcyBvbmx5IG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IG51bGwsIGI6IG51bGwsIGM6IG51bGwgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gb2JqZWN0IHdpdGggbmVzdGVkIG51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgbmVzdGVkIG51bGwgdmFsdWVzIGZyb20gdGhlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBhOiB7IGI6IG51bGwgfSwgYzogeyBkOiB7IGU6IG51bGwgfSB9IH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYToge30sIGM6IHsgZDoge30gfSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlTnVsbFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBvYmplY3Qgd2l0aCBuZXN0ZWQgbm9uLW51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHdoZW4gaW5wdXQgaGFzIG5lc3RlZCBub24tbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogeyBiOiAxIH0sIGM6IHsgZDogeyBlOiAnaGVsbG8nIH0gfSB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYjogMSB9LCBjOiB7IGQ6IHsgZTogJ2hlbGxvJyB9IH0gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZU51bGxWYWx1ZXMoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBvYmplY3Qgd2l0aCBtaXhlZCBuZXN0ZWQgbnVsbCBhbmQgbm9uLW51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgbmVzdGVkIG51bGwgdmFsdWVzIGFuZCBrZWVwIG5vbi1udWxsIHZhbHVlcyBpbiB0aGUgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IHsgYjogbnVsbCwgYzogMSB9LCBkOiB7IGU6IG51bGwsIGY6ICdoZWxsbycgfSB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IHsgYzogMSB9LCBkOiB7IGY6ICdoZWxsbycgfSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVtb3ZlTnVsbFZhbHVlcyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlcyBhbmQgZmFsc3kgbm9uLW51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgbnVsbCB2YWx1ZXMgYW5kIGtlZXAgZmFsc3kgbm9uLW51bGwgdmFsdWVzIGluIHRoZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogbnVsbCwgYjogZmFsc2UsIGM6IDAsIGQ6ICcnIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYjogZmFsc2UsIGM6IDAsIGQ6ICcnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZW1vdmVOdWxsVmFsdWVzKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlVW5kZWZpbmVkQW5kTnVsbFZhbHVlcycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCB3aGVuIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggZGVmaW5lZCBhbmQgbm90IG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiAndGVzdCcsIGM6IHRydWUgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsVmFsdWVzKG9iaikpLnRvRXF1YWwob2JqKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9iamVjdCB3aXRob3V0IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIGRlZmluZWQgYW5kIG51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIG9iamVjdCB3aXRob3V0IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIGRlZmluZWQgYW5kIG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiBudWxsLCBjOiAndGVzdCcsIGQ6IG51bGwgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0geyBhOiAxLCBjOiAndGVzdCcgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsVmFsdWVzKG9iaikpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiBwYXNzZWQgYW4gZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHdoZW4gcGFzc2VkIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbCh7fSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCB1bmRlZmluZWQgYW5kIG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHVuZGVmaW5lZCBhbmQgbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgb2JqZWN0IHdpdGhvdXQgdW5kZWZpbmVkIGFuZCBudWxsIHZhbHVlcyB3aGVuIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgYW5kIG51bGwgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiB1bmRlZmluZWQsIGM6ICd0ZXN0JywgZDogbnVsbCB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IDEsIGM6ICd0ZXN0JyB9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIHdoZW4gcGFzc2VkIGEgbm9uLW9iamVjdCB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIHdoZW4gcGFzc2VkIGEgbm9uLW9iamVjdCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gMTIzO1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXModmFsdWUpKS50b0VxdWFsKHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0IHdpdGggbmVzdGVkIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlcyB3aGVuIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBuZXN0ZWQgcHJvcGVydGllcyBjb250YWluaW5nIGRlZmluZWQgYW5kIG5vdCBudWxsIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB3aXRoIG5lc3RlZCBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXMgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggbmVzdGVkIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6IDEsIGI6IHsgYzogJ3Rlc3QnLCBkOiB0cnVlIH0sIGU6ICd0ZXN0JyB9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbChvYmopO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgZGVmaW5lZCBhbmQgbm90IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgZGVmaW5lZCBhbmQgbm90IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBub3QgbnVsbCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6IDEsIGI6ICd0ZXN0JywgYzogdHJ1ZSB9O1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxWYWx1ZXMob2JqKSkudG9FcXVhbChvYmopO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2JqZWN0IHdpdGhvdXQgbnVsbCB2YWx1ZXMgd2hlbiBwYXNzZWQgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBjb250YWluaW5nIGRlZmluZWQgYW5kIG51bGwgdmFsdWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIG9iamVjdCB3aXRob3V0IG51bGwgdmFsdWVzIHdoZW4gcGFzc2VkIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgY29udGFpbmluZyBkZWZpbmVkIGFuZCBudWxsIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHsgYTogMSwgYjogbnVsbCwgYzogJ3Rlc3QnLCBkOiBudWxsIH07XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogMSwgYzogJ3Rlc3QnIH07XG4gICAgICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkQW5kTnVsbFZhbHVlcyhvYmopKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcycsICgpID0+IHtcbiAgICAvLyBUT0RPOiBORUVEIFRPIEZJWCBUSElTIFRFU1RTXG4gICAgLy8gLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBvYmplY3Qgd2hlbiBhbGwgdmFsdWVzIGFyZSBkZWZpbmVkLCBub3QgbnVsbCwgYW5kIG5vdCBlbXB0eVxuICAgIC8vIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB3aGVuIGFsbCB2YWx1ZXMgYXJlIGRlZmluZWQsIG5vdCBudWxsLCBhbmQgbm90IGVtcHR5JywgKCkgPT4ge1xuICAgIC8vICAgY29uc3Qgb2JqID0ge1xuICAgIC8vICAgICBwcm9wMTogJ3ZhbHVlMScsXG4gICAgLy8gICAgIHByb3AyOiAxMjMsXG4gICAgLy8gICAgIHByb3AzOiBbMSwgMiwgM10sXG4gICAgLy8gICAgIHByb3A0OiB7IG5lc3RlZFByb3A6ICduZXN0ZWRWYWx1ZScgfSxcbiAgICAvLyAgIH07XG4gICAgLy8gICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkQW5kTnVsbEFuZEVtcHR5VmFsdWVzKG9iaikpLnRvRXF1YWwob2JqKTtcbiAgICAvLyB9KTtcblxuICAgIC8vIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0IHdoZW4gYWxsIHZhbHVlcyBhcmUgZGVmaW5lZCBhbmQgbm90IG51bGxcbiAgICAvLyBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBhbGwgdmFsdWVzIGFyZSBkZWZpbmVkIGFuZCBub3QgbnVsbCcsICgpID0+IHtcbiAgICAvLyAgIGNvbnN0IG9iaiA9IHtcbiAgICAvLyAgICAgcHJvcDE6ICd2YWx1ZTEnLFxuICAgIC8vICAgICBwcm9wMjogMTIzLFxuICAgIC8vICAgICBwcm9wMzogWzEsIDIsIDNdLFxuICAgIC8vICAgICBwcm9wNDogeyBuZXN0ZWRQcm9wOiAnbmVzdGVkVmFsdWUnIH0sXG4gICAgLy8gICB9O1xuICAgIC8vICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcyhvYmopKS50b0VxdWFsKG9iaik7XG4gICAgLy8gfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IG9iamVjdCB3aGVuIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkQW5kTnVsbEFuZEVtcHR5VmFsdWVzKG9iaikpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxsIHdoZW4gdGhlIGlucHV0IGlzIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gdGhlIGlucHV0IGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBudWxsO1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcyhvYmopKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgaW5wdXQgaXMgdW5kZWZpbmVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHVuZGVmaW5lZDtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMob2JqKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgb2JqZWN0IGhhcyBvbmx5IGVtcHR5IHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIHRoZSBpbnB1dCBvYmplY3QgaGFzIG9ubHkgZW1wdHkgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBwcm9wMTogJycsXG4gICAgICAgIHByb3AyOiAnICAgICcsXG4gICAgICAgIHByb3AzOiBbXSxcbiAgICAgICAgcHJvcDQ6IHt9LFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMob2JqKSkudG9FcXVhbCh7IHByb3AyOiAnICAgICcgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IG9iamVjdCBhbmQgZG9lcyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIG5ldyBvYmplY3QgYW5kIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgcHJvcDE6ICd2YWx1ZTEnLFxuICAgICAgICBwcm9wMjogbnVsbCxcbiAgICAgICAgcHJvcDM6ICcnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbW92ZVVuZGVmaW5lZEFuZE51bGxBbmRFbXB0eVZhbHVlcyhvYmopO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7IHByb3AxOiAndmFsdWUxJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKG9iaik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmbGF0dGVuTWFwJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IGlmIGl0IGlzIG5vdCBhbiBhcnJheSBvciBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgaW5wdXQgd2hlbiBpdCBpcyBub3QgYW4gYXJyYXkgb3Igb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSA1O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbk1hcChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5XG4gICAgLy8gT25seSAxIGxldmVsIG9mIGZsYXR0ZW5pbmcgaXMgcGVyZm9ybWVkXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbGF0dGVuZWQgYXJyYXkgd2hlbiB0aGUgaW5wdXQgaXMgYW4gYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCBbMiwgM10sIFs0LCBbNSwgNl1dXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbMSwgMiwgMywgNCwgWzUsIDZdXSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhdHRlbmVkIGFycmF5IGlmIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBhcnJheSB2YWx1ZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGZsYXR0ZW5lZCBhcnJheSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBhcnJheSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogWzEsIDJdLCBiOiBbMywgNF0gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbMSwgMiwgMywgNF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgYXJyYXlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gW107XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uIHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIG51bGwgdmFsdWUgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggbnVsbCB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGFycmF5IHdpdGggbnVsbCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIG51bGwgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFtudWxsXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbbnVsbF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlIGlmIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGggbnVsbCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBudWxsIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB7IGE6IG51bGwgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbbnVsbF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIHVuZGVmaW5lZCB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCB1bmRlZmluZWQgdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRoIHVuZGVmaW5lZCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIHVuZGVmaW5lZCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gW3VuZGVmaW5lZF07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW3VuZGVmaW5lZF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgdmFsdWUgaWYgdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHVuZGVmaW5lZCB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29sbGVjdGlvbiB3aXRoIHVuZGVmaW5lZCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogdW5kZWZpbmVkIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW3VuZGVmaW5lZF0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIE5hTiB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCBOYU4gdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRoIE5hTiB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIE5hTiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gW05hTl07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW05hTl0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBOYU4gdmFsdWUgaWYgdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIE5hTiB2YWx1ZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29sbGVjdGlvbiB3aXRoIE5hTiB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBOYU4gdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgYTogTmFOIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW05hTl0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZyB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCBlbXB0eSBzdHJpbmcgdmFsdWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZyB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gWycnXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbJyddKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzIGlmIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGZsYXR0ZW5lZCBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgd2hlbiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBbMSwgJ3R3bycsIHRydWUsIHsgbmFtZTogJ0pvaG4nIH1dO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbk1hcChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKFsxLCAndHdvJywgdHJ1ZSwgeyBuYW1lOiAnSm9obicgfV0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZsYXR0ZW5lZCBjb2xsZWN0aW9uIHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcyBpZiB0aGUgaW5wdXQgaXMgYW4gb2JqZWN0IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxhdHRlbmVkIGNvbGxlY3Rpb24gd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzIHdoZW4gdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDI1LCBpc1N0dWRlbnQ6IHRydWUsIGhvYmJpZXM6IFsncmVhZGluZycsICdwYWludGluZyddIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWydKb2huJywgMjUsIHRydWUsICdyZWFkaW5nJywgJ3BhaW50aW5nJ10pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZsYXR0ZW5lZCBhcnJheSB3aXRoIG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHMgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxhdHRlbmVkIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0cyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCBbMiwgWzMsIDRdXSwgeyBuYW1lOiAnSm9obicsIGFnZTogMjUgfV07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWzEsIDIsIFszLCA0XSwgeyBuYW1lOiAnSm9obicsIGFnZTogMjUgfV0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZsYXR0ZW5lZCBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgaWYgdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxhdHRlbmVkIGFycmF5IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJheSB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAndHdvJywgdHJ1ZSwgeyBuYW1lOiAnSm9obicgfV07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuTWFwKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWzEsICd0d28nLCB0cnVlLCB7IG5hbWU6ICdKb2huJyB9XSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhdHRlbmVkIGNvbGxlY3Rpb24gd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzIGlmIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbGF0dGVuZWQgY29sbGVjdGlvbiB3aXRoIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgd2hlbiB0aGUgaW5wdXQgaXMgYW4gb2JqZWN0IHdpdGggdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0geyBuYW1lOiAnSm9obicsIGFnZTogMjUsIGlzU3R1ZGVudDogdHJ1ZSwgaG9iYmllczogWydyZWFkaW5nJywgJ3BhaW50aW5nJ10gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbJ0pvaG4nLCAyNSwgdHJ1ZSwgJ3JlYWRpbmcnLCAncGFpbnRpbmcnXSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhdHRlbmVkIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0cyBpZiB0aGUgaW5wdXQgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbGF0dGVuZWQgYXJyYXkgd2l0aCBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzIHdoZW4gdGhlIGlucHV0IGlzIGFuIGFycmF5IHdpdGggbmVzdGVkIGFycmF5cyBhbmQgb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gWzEsIFsyLCBbMywgNF1dLCB7IG5hbWU6ICdKb2huJywgYWdlOiAyNSB9XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5NYXAoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbMSwgMiwgWzMsIDRdLCB7IG5hbWU6ICdKb2huJywgYWdlOiAyNSB9XSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdiYXNlNjRDb252ZXJ0b3InLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gZW1wdHkgc3RyaW5nIGlucHV0IGFuZCByZXR1cm5zIGFuIGVtcHR5IGJhc2U2NCBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBiYXNlNjQgc3RyaW5nIHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJyc7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICcnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZTY0Q29udmVydG9yKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYSBzdHJpbmcgaW5wdXQgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBhbmQgY29udmVydHMgaXQgdG8gYmFzZTY0IGZvcm1hdFxuICAgIGl0KCdzaG91bGQgY29udmVydCBhIHN0cmluZyB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHRvIGJhc2U2NCBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICfjgZPjgpPjgavjgaHjga8nO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnNDRHVDQ0S1Q0NEdyNDRHaDQ0R3YnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZTY0Q29udmVydG9yKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYSBzdHJpbmcgaW5wdXQgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGNvbnZlcnRzIGl0IHRvIGJhc2U2NCBmb3JtYXRcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgYSBzdHJpbmcgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gYmFzZTY0IGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJyFAIyQlXiYqKCknO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnSVVBakpDVmVKaW9vS1E9PSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBiYXNlNjRDb252ZXJ0b3IoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhIHN0cmluZyBpbnB1dCB3aXRoIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhbmQgY29udmVydHMgaXQgdG8gYmFzZTY0IGZvcm1hdFxuICAgIGl0KCdzaG91bGQgY29udmVydCBhIHN0cmluZyB3aXRoIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiYXNlNjQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnICAgSGVsbG8gV29ybGQgICAnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnSUNBZ1NHVnNiRzhnVjI5eWJHUWdJQ0E9JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2U2NENvbnZlcnRvcihpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBoYW5kbGVzIGEgc3RyaW5nIGlucHV0IHdpdGggbGluZSBicmVha3MgYW5kIGNvbnZlcnRzIGl0IHRvIGJhc2U2NCBmb3JtYXRcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgYSBzdHJpbmcgd2l0aCBsaW5lIGJyZWFrcyB0byBiYXNlNjQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnSGVsbG9cXG5Xb3JsZCc7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICdTR1ZzYkc4S1YyOXliR1E9JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2U2NENvbnZlcnRvcihpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRVcmwnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgcmV0dXJucyBhIFVSTCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20nO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZUluc3RhbmNlT2YoVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYSB2YWxpZCBVUkwgb2JqZWN0IHJldHVybnMgdGhlIHNhbWUgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCdodHRwczovL3d3dy5leGFtcGxlLmNvbScpO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKT8udG9KU09OKCkpLnRvQmUodXJsLnRvSlNPTigpKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYSBVUkwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzIHJldHVybnMgYSBVUkwgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tP3BhcmFtMT12YWx1ZTEmcGFyYW0yPXZhbHVlMic7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGEgaGFzaCByZXR1cm5zIGEgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVVJMIG9iamVjdCB3aGVuIGdpdmVuIGEgVVJMIHdpdGggYSBoYXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tI3NlY3Rpb24xJztcbiAgICAgIGV4cGVjdChpc1ZhbGlkVXJsKHVybCkpLnRvQmVJbnN0YW5jZU9mKFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGEgVVJMIHdpdGggYSBwb3J0IHJldHVybnMgYSBVUkwgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBhIHBvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb206ODA4MCc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHJldHVybnMgYSBVUkwgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL3VzZXJuYW1lOnBhc3N3b3JkQGV4YW1wbGUuY29tJztcbiAgICAgIGV4cGVjdChpc1ZhbGlkVXJsKHVybCkpLnRvQmVJbnN0YW5jZU9mKFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGFuIGVtcHR5IHN0cmluZyByZXR1cm5zIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gZ2l2ZW4gYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJyc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHRlc3Qgb2JqZWN0aXZlIGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiAnaXNWYWxpZFVybCcgcmV0dXJucyBudWxsIHdoZW4gZ2l2ZW4gYW4gaW52YWxpZCBVUkwgc3RyaW5nLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBnaXZlbiBhbiBpbnZhbGlkIFVSTCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaW52YWxpZC11cmwnO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYW4gVVJMIHdpdGggYSBkaWZmZXJlbnQgcHJvdG9jb2wgcmV0dXJucyB2YWxpZCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBVUkwgb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCBhIGRpZmZlcmVudCBwcm90b2NvbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdmdHA6Ly93d3cuZXhhbXBsZS5jb20nO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZUluc3RhbmNlT2YoVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgYW4gaW52YWxpZCBVUkwgd2l0aCBhbiBpbnZhbGlkIHBvcnQgcmV0dXJucyBudWxsXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIGdpdmVuIGEgVVJMIHdpdGggYW4gaW52YWxpZCBwb3J0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tOmFiYyc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGludmFsaWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHJldHVybnMgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0IHdoZW4gZ2l2ZW4gYSBVUkwgd2l0aCB1c2VybmFtZSBhbmQgcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly91c2VybmFtZTpwYXNzd29yZEBleGFtcGxlLmNvbSc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIFVSTCB3aXRoIGEgc3ViZG9tYWluIHJldHVybnMgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBnaXZlbiBhIFVSTCB3aXRoIGFuIGludmFsaWQgc3ViZG9tYWluJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vaW52YWxpZC5leGFtcGxlLmNvbSc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgd2l0aCBhIHBhdGggcmV0dXJucyBhIFVSTCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBzdHJpbmcgd2l0aCBhIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGF0aCc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgd2l0aCBhIHN1YmRvbWFpbiByZXR1cm5zIGEgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVVJMIG9iamVjdCB3aGVuIGdpdmVuIGEgdmFsaWQgVVJMIHN0cmluZyB3aXRoIGEgc3ViZG9tYWluJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vc3ViZG9tYWluLmV4YW1wbGUuY29tJztcbiAgICAgIGV4cGVjdChpc1ZhbGlkVXJsKHVybCkpLnRvQmVJbnN0YW5jZU9mKFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGEgdmFsaWQgVVJMIHN0cmluZyByZXR1cm5zIGEgVVJMIG9iamVjdFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVVJMIG9iamVjdCB3aGVuIGdpdmVuIGEgdmFsaWQgVVJMIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL3d3dy5leGFtcGxlLmNvbSc7XG4gICAgICBleHBlY3QoaXNWYWxpZFVybCh1cmwpKS50b0JlSW5zdGFuY2VPZihVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBhIHZhbGlkIFVSTCBzdHJpbmcgcmV0dXJucyBhIFVSTCBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVSTCBvYmplY3Qgd2hlbiBnaXZlbiBhIHZhbGlkIFVSTCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20nO1xuICAgICAgZXhwZWN0KGlzVmFsaWRVcmwodXJsKSkudG9CZUluc3RhbmNlT2YoVVJMKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmlwVHJhaWxpbmdTbGFzaCcsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHN0cmluZyBpZiBpdCBkb2VzIG5vdCBlbmQgd2l0aCAnLydcbiAgICBpdChcInNob3VsZCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nIHdoZW4gaXQgZG9lcyBub3QgZW5kIHdpdGggJy8nXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2V4YW1wbGUnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgdHJhaWxpbmcgJy8nIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGl0XG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIHRoZSB0cmFpbGluZyAnLycgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggaXRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgb25seSBvbmUgdHJhaWxpbmcgJy8nIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIG11bHRpcGxlXG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIG9ubHkgb25lIHRyYWlsaW5nICcvJyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBtdWx0aXBsZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICdleGFtcGxlLy8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUvJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICcnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJycpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgaXQgY29udGFpbnMgb25seSAnLydcbiAgICBpdChcInNob3VsZCByZXR1cm4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgY29udGFpbnMgb25seSAnLydcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwVHJhaWxpbmdTbGFzaChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgc3RyaW5nIGlmIGl0IGRvZXMgbm90IGVuZCB3aXRoICcvJ1xuICAgIGl0KFwic2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2hlbiBpdCBkb2VzIG5vdCBlbmQgd2l0aCAnLydcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdHJpcFRyYWlsaW5nU2xhc2goaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBmcm9tIGEgc3RyaW5nIGlmIGl0IGV4aXN0c1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRoZSB0cmFpbGluZyBzbGFzaCB3aGVuIGl0IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2V4YW1wbGUvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwVHJhaWxpbmdTbGFzaChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdleGFtcGxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBmcm9tIGEgc3RyaW5nIGlmIGl0IGV4aXN0c1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRoZSB0cmFpbGluZyBzbGFzaCB3aGVuIGl0IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2V4YW1wbGUvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwVHJhaWxpbmdTbGFzaChpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdleGFtcGxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZW1vdmVzIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBhIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgd2hlbiB0aGV5IGV4aXN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIGZyb20gYSBzdHJpbmcgaWYgaXQgZXhpc3RzXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgdGhlIHRyYWlsaW5nIHNsYXNoIHdoZW4gaXQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIGZyb20gYSBzdHJpbmcgaWYgaXQgZW5kcyB3aXRoICcvJ1xuICAgIGl0KFwic2hvdWxkIHJlbW92ZSB0aGUgdHJhaWxpbmcgc2xhc2ggd2hlbiB0aGUgc3RyaW5nIGVuZHMgd2l0aCAnLydcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnZXhhbXBsZS8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaXBUcmFpbGluZ1NsYXNoKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2V4YW1wbGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzUHJpbWl0aXZlJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgaXNQcmltaXRpdmUgcmV0dXJucyB0cnVlIGZvciBhIHByaW1pdGl2ZSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKCdoZWxsbycpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNQcmltaXRpdmUgcmV0dXJucyB0cnVlIGZvciBhIHByaW1pdGl2ZSBudW1iZXJcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlIG51bWJlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKDEyMyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIHRydWUgZm9yIGEgcHJpbWl0aXZlIGJvb2xlYW5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc1ByaW1pdGl2ZSh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzUHJpbWl0aXZlIHJldHVybnMgdHJ1ZSBmb3IgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgYXJndW1lbnQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKG51bGwpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNQcmltaXRpdmUgcmV0dXJucyB0cnVlIGZvciB1bmRlZmluZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIGZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIG5vbi1wcmltaXRpdmUgd3JhcHBlciBjbGFzcyAoRGF0ZSlcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBhIG5vbi1wcmltaXRpdmUgd3JhcHBlciBjbGFzcyAoRGF0ZSknLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc1ByaW1pdGl2ZShuZXcgRGF0ZSgpKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIGZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIGN1c3RvbSBjbGFzc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGEgY3VzdG9tIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY2xhc3MgQ3VzdG9tQ2xhc3Mge31cbiAgICAgIGNvbnN0IGFyZyA9IG5ldyBDdXN0b21DbGFzcygpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNQcmltaXRpdmUoYXJnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIGZhbHNlIGZvciBhIGZ1bmN0aW9uIHdpdGggcHJvcGVydGllc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gd2l0aCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnVuYyA9ICgpID0+IHt9O1xuICAgICAgZnVuYy5wcm9wZXJ0eSA9ICd2YWx1ZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc1ByaW1pdGl2ZShmdW5jKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc1ByaW1pdGl2ZSByZXR1cm5zIHRydWUgZm9yIGEgc3ltYm9sXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHN5bWJvbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzUHJpbWl0aXZlKFN5bWJvbCgndGVzdCcpKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRUeXBlJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHN0cmluZyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0cmluZyB3aGVuIHRoZSBpbnB1dCBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ2hlbGxvJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnc3RyaW5nJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdldFR5cGUgcmV0dXJucyB0aGUgY29ycmVjdCB0eXBlIGZvciBudW1iZXIgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudW1iZXIgd2hlbiB0aGUgaW5wdXQgaXMgYSBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IDQyO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VHlwZShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdudW1iZXInKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zIHRoZSBjb3JyZWN0IHR5cGUgZm9yIGJvb2xlYW4gaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBib29sZWFuIHdoZW4gdGhlIGlucHV0IGlzIGEgYm9vbGVhbiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRUeXBlKHRydWUpKS50b0JlKCdib29sZWFuJyk7XG4gICAgICBleHBlY3QoZ2V0VHlwZShmYWxzZSkpLnRvQmUoJ2Jvb2xlYW4nKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zICdOVUxMJyB3aGVuIHRoZSBpbnB1dCBpcyBudWxsXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuICdOVUxMJyB3aGVuIHRoZSBpbnB1dCBpcyBudWxsXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnTlVMTCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgJ29iamVjdCcgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0IHdoZW4gdGhlIGlucHV0IGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgdGhlIGNvcnJlY3QgdHlwZSBmb3IgZnVuY3Rpb24gaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmdW5jdGlvbiB3aGVuIHRoZSBpbnB1dCBpcyBhIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAoKSA9PiB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zIHRoZSBjb3JyZWN0IHR5cGUgZm9yIGJpZ2ludCBpbnB1dFxuICAgIGl0KFwic2hvdWxkIHJldHVybiAnYmlnaW50JyB3aGVuIHRoZSBpbnB1dCBpcyBhIGJpZ2ludFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IEJpZ0ludCgxMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2JpZ2ludCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgJ3N5bWJvbCcgd2hlbiB0aGUgaW5wdXQgaXMgYSBzeW1ib2xcbiAgICBpdChcInNob3VsZCByZXR1cm4gJ3N5bWJvbCcgd2hlbiB0aGUgaW5wdXQgaXMgYSBzeW1ib2xcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBTeW1ib2woJ3Rlc3QnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnc3ltYm9sJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdldFR5cGUgcmV0dXJucyAndW5kZWZpbmVkJyB3aGVuIHRoZSBpbnB1dCBpcyB1bmRlZmluZWRcbiAgICBpdChcInNob3VsZCByZXR1cm4gJ05VTEwnIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnTlVMTCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYXJyb3cgZnVuY3Rpb24gaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmdW5jdGlvbiB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhcnJvdyBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gKCkgPT4ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdldFR5cGUgcmV0dXJucyAnb2JqZWN0JyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0IHdoZW4gdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRUeXBlKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIG9iamVjdCB0aGUgY29ycmVjdCB0eXBlIGZvciBjbGFzcyBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG9iamVjdCB3aGVuIHRoZSBpbnB1dCBpcyBhIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY2xhc3MgTXlDbGFzcyB7fVxuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgTXlDbGFzcygpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VHlwZShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdvYmplY3QnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2V0VHlwZSByZXR1cm5zICdmdW5jdGlvbicgd2hlbiB0aGUgaW5wdXQgaXMgYSBnZW5lcmF0b3IgZnVuY3Rpb25cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmdW5jdGlvbiB3aGVuIHRoZSBpbnB1dCBpcyBhIGdlbmVyYXRvciBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgIGNvbnN0IGlucHV0ID0gZnVuY3Rpb24qICgpIHt9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VHlwZShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBnZXRUeXBlIHJldHVybnMgJ2Z1bmN0aW9uJyB3aGVuIHRoZSBpbnB1dCBpcyBhbiBhc3luYyBmdW5jdGlvblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZ1bmN0aW9uIHdoZW4gdGhlIGlucHV0IGlzIGFuIGFzeW5jIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBhc3luYyAoKSA9PiB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFR5cGUoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzT2JqZWN0JywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW4gb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0ge307XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhIGZ1bmN0aW9uXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHZhbHVlIGlzIGEgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICgpID0+IHt9O1xuICAgICAgZXhwZWN0KGlzT2JqZWN0KHZhbHVlKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIG51bGxcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG51bGw7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIHVuZGVmaW5lZFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdmFsdWUgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGFuIGFycmF5XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gW107XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGEgc3RyaW5nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gJ3Rlc3QnO1xuICAgICAgZXhwZWN0KGlzT2JqZWN0KHZhbHVlKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZvciBhIG51bWJlclxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdmFsdWUgaXMgYSBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IDEyMztcbiAgICAgIGV4cGVjdChpc09iamVjdCh2YWx1ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgYSBib29sZWFuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRydWU7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGEgc3ltYm9sXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBhIHN5bWJvbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gU3ltYm9sKCk7XG4gICAgICBleHBlY3QoaXNPYmplY3QodmFsdWUpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgdmFsdWUgaXMgTmFOXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB2YWx1ZSBpcyBOYU4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IE5hTjtcbiAgICAgIGV4cGVjdChpc09iamVjdCh2YWx1ZSkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNFbXB0eScsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHkgcmV0dXJucyB0cnVlIGZvciBhbiBlbXB0eSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eSByZXR1cm5zIHRydWUgZm9yIGFuIGVtcHR5IGFycmF5XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGlucHV0IGlzIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBbXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGlucHV0IGlzIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0VtcHR5KGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gaW5wdXQgaXMgYSBub24tZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnaGVsbG8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNFbXB0eShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eSByZXR1cm5zIGZhbHNlIGZvciBhIG5vbi1lbXB0eSBhcnJheVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gaW5wdXQgaXMgYSBub24tZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAyLCAzXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHkgcmV0dXJucyBmYWxzZSBmb3IgYSBub24tZW1wdHkgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBpbnB1dCBpcyBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsga2V5OiAndmFsdWUnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0VtcHR5KGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5IHJldHVybnMgdHJ1ZSBmb3IgbnVsbCBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBpbnB1dCBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBudWxsO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNFbXB0eShpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHRlc3Qgb2JqZWN0aXZlIGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiAnaXNFbXB0eScgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGlucHV0IGlzIHVuZGVmaW5lZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0VtcHR5KGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHkgcmV0dXJucyBmYWxzZSBmb3IgTmFOIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBpbnB1dCBpcyBOYU4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IE5hTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0IHRoYXQgdGhlIGZ1bmN0aW9uICdpc0VtcHR5JyByZXR1cm5zIHRydWUgd2hlbiB0aGUgaW5wdXQgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBpbnB1dCBpcyBhIHdoaXRlc3BhY2Ugc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnICAgJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRW1wdHkoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzRW1wdHlPYmplY3QnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgdHJ1ZSBmb3IgYW4gZW1wdHkgb2JqZWN0IHt9XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IG9iamVjdCB7YTogJzEnfVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBhIG5vbi1lbXB0eSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6ICcxJyB9O1xuICAgICAgZXhwZWN0KGlzRW1wdHlPYmplY3Qob2JqKSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGlzRW1wdHlPYmplY3QgcmV0dXJucyB0cnVlIGZvciBhbiBlbXB0eSBhcnJheSBbXVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChhcnIpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IGFycmF5IFsxLCAyLCAzXVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBhIG5vbi1lbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGFyciA9IFsxLCAyLCAzXTtcbiAgICAgIGV4cGVjdChpc0VtcHR5T2JqZWN0KGFycikpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgdHJ1ZSBmb3IgYW4gZW1wdHkgc3RyaW5nICcnXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0gJyc7XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBpc0VtcHR5T2JqZWN0IHJldHVybnMgZmFsc2UgZm9yIGEgbm9uLWVtcHR5IHN0cmluZyAnaGVsbG8nXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGEgbm9uLWVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9ICdoZWxsbyc7XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaXNFbXB0eU9iamVjdCByZXR1cm5zIHRydWUgZm9yIG51bWJlclxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIG51bWJlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IDI7XG4gICAgICBleHBlY3QoaXNFbXB0eU9iamVjdChvYmopKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5JywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbm9uLWVtcHR5IHN0cmluZyBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSgndGVzdCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgbm9uLWVtcHR5IG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tZW1wdHkgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSh7IGtleTogJ3ZhbHVlJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBhIG5vbi1lbXB0eSBhcnJheSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBub24tZW1wdHkgYXJyYXkgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KFsxLCAyLCAzXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gYSBub24temVybyBudW1iZXIgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGEgbm9uLXplcm8gbnVtYmVyIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSgxMjMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGEgYm9vbGVhbiB2YWx1ZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBib29sZWFuIHZhbHVlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSgnJyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIGZhbHNlIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBmYWxzZSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWROb3ROdWxsTm90RW1wdHkoZmFsc2UpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIDAgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIDAgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KDApO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBOYU4gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBOYU4gaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KE5hTik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB1bmRlZmluZWQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBudWxsIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gbnVsbCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBpc0RlZmluZWROb3ROdWxsTm90RW1wdHkobnVsbCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnRcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eShbXSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBhbiBlbXB0eSBvYmplY3QgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5KHt9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlVW5kZWZpbmVkTnVsbEVtcHR5RXhjbEJvb2xJbnQnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBvYmplY3QgaWYgaXQgZG9lcyBub3QgY29udGFpbiB1bmRlZmluZWQsIG51bGwsIGVtcHR5LCBib29sZWFuLCBvciBpbnRlZ2VyIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCB3aGVuIGl0IGRvZXMgbm90IGNvbnRhaW4gdW5kZWZpbmVkLCBudWxsLCBlbXB0eSwgYm9vbGVhbiwgb3IgaW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGE6IDEsIGI6ICd0ZXN0JywgYzogeyBkOiAnbmVzdGVkJyB9IH07XG4gICAgICBleHBlY3QocmVtb3ZlVW5kZWZpbmVkTnVsbEVtcHR5RXhjbEJvb2xJbnQob2JqKSkudG9FcXVhbChvYmopO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB1bmRlZmluZWQsIG51bGwsIGVtcHR5LCBib29sZWFuLCBvciBpbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBvYmplY3QgYW5kIHJldHVybnMgdGhlIGNsZWFuZWQgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSwgYm9vbGVhbiwgb3IgaW50ZWdlciB2YWx1ZXMgZnJvbSB0aGUgb2JqZWN0IGFuZCByZXR1cm4gdGhlIGNsZWFuZWQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBhOiAxLCBiOiB1bmRlZmluZWQsIGM6IG51bGwsIGQ6ICcnLCBlOiB7fSwgZjogdHJ1ZSwgZzogMCB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IGE6IDEsIGY6IHRydWUsIGc6IDAgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludChvYmopKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBpbnB1dCBpcyB1bmRlZmluZWRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2hlbiB0aGUgaW5wdXQgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZE51bGxFbXB0eUV4Y2xCb29sSW50KHVuZGVmaW5lZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBpZiB0aGUgaW5wdXQgaXMgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgaW5wdXQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludChudWxsKSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnB1dCBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgaW5wdXQgaXMgYW4gZW1wdHkgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlbW92ZVVuZGVmaW5lZE51bGxFbXB0eUV4Y2xCb29sSW50KHt9KSkudG9FcXVhbCh7fSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgaW5wdXQgY29udGFpbnMgb25seSB1bmRlZmluZWQsIG51bGwsIGVtcHR5LCBib29sZWFuLCBvciBpbnRlZ2VyIHZhbHVlc1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgdmFsaWQgb2JqZWN0IHdoZW4gdGhlIGlucHV0IGNvbnRhaW5zIG9ubHkgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSwgYm9vbGVhbiBvciBpbnRlZ2VyIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHsgYTogdW5kZWZpbmVkLCBiOiBudWxsLCBjOiAnJywgZDoge30sIGU6IHRydWUsIGY6IDAgfTtcbiAgICAgIGV4cGVjdChyZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludChvYmopKS50b0VxdWFsKHsgZTogdHJ1ZSwgZjogMCB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEhhc2hGcm9tQXJyYXknLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiBnaXZlbiBhbiBlbXB0eSBhcnJheVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIGdpdmVuIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW107XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRIYXNoRnJvbUFycmF5KGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBoYXNoTWFwIHdpdGggY29ycmVjdCBrZXktdmFsdWUgcGFpcnMgd2hlbiBnaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggJ2Zyb20nIGFuZCAndG8nIHByb3BlcnRpZXNcbiAgICBpdChcInNob3VsZCByZXR1cm4gYSBoYXNoTWFwIHdpdGggY29ycmVjdCBrZXktdmFsdWUgcGFpcnMgd2hlbiBnaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggJ2Zyb20nIGFuZCAndG8nIHByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206ICdBJywgdG86ICcxJyB9LFxuICAgICAgICB7IGZyb206ICdCJywgdG86ICcyJyB9LFxuICAgICAgICB7IGZyb206ICdDJywgdG86ICczJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoeyBhOiAnMScsIGI6ICcyJywgYzogJzMnIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qgd2hlbiBnaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggZW1wdHkgJ2Zyb20nIHByb3BlcnR5XG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCB3aGVuIGdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBlbXB0eSAnZnJvbScgcHJvcGVydHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206ICcnLCB0bzogJzEnIH0sXG4gICAgICAgIHsgZnJvbTogJycsIHRvOiAnMicgfSxcbiAgICAgICAgeyBmcm9tOiAnJywgdG86ICczJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhc2hNYXAgd2l0aCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgJ2Zyb20nIHByb3BlcnR5IHdoZW4gZ2l2ZW4gYW4gYXJyYXkgd2l0aCBkdXBsaWNhdGUgJ2Zyb20nIHByb3BlcnRpZXNcbiAgICBpdChcInNob3VsZCByZXR1cm4gYSBoYXNoTWFwIHdpdGggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhICdmcm9tJyBwcm9wZXJ0eSB3aGVuIGdpdmVuIGFuIGFycmF5IHdpdGggZHVwbGljYXRlICdmcm9tJyBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAnQScsIHRvOiAnMScgfSxcbiAgICAgICAgeyBmcm9tOiAnQicsIHRvOiAnMicgfSxcbiAgICAgICAgeyBmcm9tOiAnQScsIHRvOiAnMycgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRIYXNoRnJvbUFycmF5KGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgYTogJzMnLCBiOiAnMicgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFzaE1hcCB3aXRoIG9ubHkgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhICdmcm9tJyBwcm9wZXJ0eSB3aGVuIGdpdmVuIGFuIGFycmF5IHdpdGggZHVwbGljYXRlICdmcm9tJyBwcm9wZXJ0aWVzIGFuZCBkaWZmZXJlbnQgJ3RvJyB2YWx1ZXNcbiAgICBpdChcInNob3VsZCByZXR1cm4gYSBoYXNoTWFwIHdpdGggb25seSB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgJ2Zyb20nIHByb3BlcnR5IHdoZW4gZ2l2ZW4gYW4gYXJyYXkgd2l0aCBkdXBsaWNhdGUgJ2Zyb20nIHByb3BlcnRpZXMgYW5kIGRpZmZlcmVudCAndG8nIHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ0EnLCB0bzogJzEnIH0sXG4gICAgICAgIHsgZnJvbTogJ0InLCB0bzogJzInIH0sXG4gICAgICAgIHsgZnJvbTogJ0EnLCB0bzogJzMnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheShhcnJheXMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7IGE6ICczJywgYjogJzInIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhc2hNYXAgd2l0aCBjb3JyZWN0IGtleS12YWx1ZSBwYWlycyB3aGVuIGdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBub24tc3RyaW5nICdmcm9tJyBhbmQgJ3RvJyBwcm9wZXJ0aWVzXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIGEgaGFzaE1hcCB3aXRoIGNvcnJlY3Qga2V5LXZhbHVlIHBhaXJzIHdoZW4gZ2l2ZW4gYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5vbi1zdHJpbmcgJ2Zyb20nIGFuZCAndG8nIHByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206IDEsIHRvOiB0cnVlIH0sXG4gICAgICAgIHsgZnJvbTogbnVsbCwgdG86IHVuZGVmaW5lZCB9LFxuICAgICAgICB7IGZyb206IFsxLCAyLCAzXSwgdG86IHsgYTogJ0EnLCBiOiAnQicgfSB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoeyAnMSc6IHRydWUsIG51bGw6IHVuZGVmaW5lZCwgJzEsMiwzJzogeyBhOiAnQScsIGI6ICdCJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29udmVydHMgdGhlICdmcm9tJyBwcm9wZXJ0eSB0byBsb3dlcmNhc2UgaW4gdGhlIGhhc2hNYXAgd2hlbiB0aGUgaXNMb3dlckNhc2UgcGFyYW1ldGVyIGlzIHRydWVcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgXCJmcm9tXCIgcHJvcGVydHkgdG8gbG93ZXJjYXNlIGluIGhhc2hNYXAgd2hlbiBpc0xvd2VyQ2FzZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW1xuICAgICAgICB7IGZyb206ICdWQUxVRTEnLCB0bzogJ1ZhbHVlMScgfSxcbiAgICAgICAgeyBmcm9tOiAnVkFMVUUyJywgdG86ICdWYWx1ZTInIH0sXG4gICAgICAgIHsgZnJvbTogJ1ZBTFVFMycsIHRvOiAnVmFsdWUzJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgICB2YWx1ZTE6ICdWYWx1ZTEnLFxuICAgICAgICB2YWx1ZTI6ICdWYWx1ZTInLFxuICAgICAgICB2YWx1ZTM6ICdWYWx1ZTMnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXkoYXJyYXlzLCAnZnJvbScsICd0bycsIHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRIYXNoRnJvbUFycmF5V2l0aER1cGxpY2F0ZScsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzXG4gICAgaXQoXCJzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMScsICd2YWwyJ10pLFxuICAgICAgICBwcm9wMjogbmV3IFNldChbJ3ZhbDInXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoTWFwIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG9ubHkgb25lIG9iamVjdFxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBvbmx5IG9uZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH1dO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0geyBwcm9wMTogbmV3IFNldChbJ3ZhbDEnXSkgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB1bmlxdWUgJ2Zyb20nIGtleXNcbiAgICBpdChcInNob3VsZCBjb3JyZWN0bHkgZ2VuZXJhdGUgYSBoYXNoTWFwIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHVuaXF1ZSAnZnJvbScga2V5c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwxJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDMnLCB0bzogJ3ZhbDMnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge1xuICAgICAgICBwcm9wMTogbmV3IFNldChbJ3ZhbDEnXSksXG4gICAgICAgIHByb3AyOiBuZXcgU2V0KFsndmFsMiddKSxcbiAgICAgICAgcHJvcDM6IG5ldyBTZXQoWyd2YWwzJ10pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB1bmlxdWUgJ3RvJyBrZXlzXG4gICAgaXQoXCJzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB1bmlxdWUgJ3RvJyBrZXlzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AyJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMycsIHRvOiAndmFsMycgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMSddKSxcbiAgICAgICAgcHJvcDI6IG5ldyBTZXQoWyd2YWwyJ10pLFxuICAgICAgICBwcm9wMzogbmV3IFNldChbJ3ZhbDMnXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgaGFzaE1hcCB3aGVuIGdpdmVuIGFuIGVtcHR5IGFycmF5XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgaGFzaE1hcCB3aGVuIGdpdmVuIGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYXJyYXlzID0gW107XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgaGFuZGxlcyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggZW1wdHkgJ2Zyb20nIGtleXNcbiAgICBpdChcInNob3VsZCBjb3JyZWN0bHkgaGFuZGxlIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBlbXB0eSAnZnJvbScga2V5c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJycsIHRvOiAndmFsMScgfSxcbiAgICAgICAgeyBmcm9tOiAnJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICcnLCB0bzogJ3ZhbDMnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge307XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRIYXNoRnJvbUFycmF5V2l0aER1cGxpY2F0ZShhcnJheXMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZEhhc2hNYXApO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGhhbmRsZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGVtcHR5ICd0bycga2V5c1xuICAgIGl0KFwic2hvdWxkIHJldHVybiBhbiBlbXB0eSBoYXNoTWFwIHdoZW4gdGhlICd0bycga2V5IGlzIGVtcHR5IGluIGFsbCBvYmplY3RzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJycgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDInLCB0bzogJycgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDMnLCB0bzogJycgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7IHByb3AxOiBuZXcgU2V0KFsnJ10pLCBwcm9wMjogbmV3IFNldChbJyddKSwgcHJvcDM6IG5ldyBTZXQoWycnXSkgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzIHdoZW4gaXNMb3dlckNhc2UgaXMgc2V0IHRvIGZhbHNlXG4gICAgaXQoXCJzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICdmcm9tJyBhbmQgJ3RvJyBrZXlzIHdoZW4gaXNMb3dlckNhc2UgaXMgc2V0IHRvIGZhbHNlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMScsICd2YWwyJ10pLFxuICAgICAgICBwcm9wMjogbmV3IFNldChbJ3ZhbDInXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzLCAnZnJvbScsICd0bycsIGZhbHNlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoTWFwIGZyb20gYSB2YWxpZCBhcnJheSBvZiBvYmplY3RzIHdpdGggY3VzdG9tIGZyb21LZXkgYW5kIHRvS2V5IHZhbHVlc1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGdlbmVyYXRlIGEgaGFzaE1hcCBmcm9tIGEgdmFsaWQgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGN1c3RvbSBmcm9tS2V5IGFuZCB0b0tleSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwxJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMScsIHRvOiAndmFsMicgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDInLCB0bzogJ3ZhbDInIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge1xuICAgICAgICBwcm9wMTogbmV3IFNldChbJ3ZhbDEnLCAndmFsMiddKSxcbiAgICAgICAgcHJvcDI6IG5ldyBTZXQoWyd2YWwyJ10pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cywgJ2Zyb20nLCAndG8nKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRIYXNoTWFwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBoYXNoTWFwIGZyb20gYSB2YWxpZCBhcnJheSBvZiBvYmplY3RzIHdpdGggJ2Zyb20nIGFuZCAndG8nIGtleXMgd2hlbiBpc0xvd2VyQ2FzZSBpcyBzZXQgdG8gdHJ1ZVxuICAgIGl0KFwic2hvdWxkIGNvcnJlY3RseSBnZW5lcmF0ZSBhIGhhc2hNYXAgZnJvbSBhIHZhbGlkIGFycmF5IG9mIG9iamVjdHMgd2l0aCAnZnJvbScgYW5kICd0bycga2V5cyB3aGVuIGlzTG93ZXJDYXNlIGlzIHNldCB0byB0cnVlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5cyA9IFtcbiAgICAgICAgeyBmcm9tOiAncHJvcDEnLCB0bzogJ3ZhbDEnIH0sXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwyJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMicsIHRvOiAndmFsMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZEhhc2hNYXAgPSB7XG4gICAgICAgIHByb3AxOiBuZXcgU2V0KFsndmFsMScsICd2YWwyJ10pLFxuICAgICAgICBwcm9wMjogbmV3IFNldChbJ3ZhbDInXSksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0SGFzaEZyb21BcnJheVdpdGhEdXBsaWNhdGUoYXJyYXlzLCAnZnJvbScsICd0bycsIHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZEhhc2hNYXApO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gY29ycmVjdGx5IGdlbmVyYXRlcyBhIGhhc2hNYXAgZnJvbSBhIHZhbGlkIGFycmF5IG9mIG9iamVjdHMgd2l0aCAnZnJvbScgYW5kICd0bycga2V5c1xuICAgIGl0KFwic2hvdWxkIGNvcnJlY3RseSBnZW5lcmF0ZSBhIGhhc2hNYXAgZnJvbSBhIHZhbGlkIGFycmF5IG9mIG9iamVjdHMgd2l0aCAnZnJvbScgYW5kICd0bycga2V5c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheXMgPSBbXG4gICAgICAgIHsgZnJvbTogJ3Byb3AxJywgdG86ICd2YWwxJyB9LFxuICAgICAgICB7IGZyb206ICdwcm9wMScsIHRvOiAndmFsMicgfSxcbiAgICAgICAgeyBmcm9tOiAncHJvcDInLCB0bzogJ3ZhbDInIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIYXNoTWFwID0ge1xuICAgICAgICBwcm9wMTogbmV3IFNldChbJ3ZhbDEnLCAndmFsMiddKSxcbiAgICAgICAgcHJvcDI6IG5ldyBTZXQoWyd2YWwyJ10pLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhhc2hGcm9tQXJyYXlXaXRoRHVwbGljYXRlKGFycmF5cyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkSGFzaE1hcCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGtleSBmcm9tIHByb3BlcnRpZXMgaWYgaXQgZXhpc3RzLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGZyb20gcHJvcGVydGllcyB3aGVuIGl0IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB0cmFpdHM6IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleSA9ICdrZXknO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VmFsdWVGcm9tUHJvcGVydGllc09yVHJhaXRzKHsgbWVzc2FnZSwga2V5IH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsdWUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBrZXkgZnJvbSB0cmFpdHMgaWYgaXQgZXhpc3RzLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGZyb20gdHJhaXRzIHdoZW4gaXQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHRyYWl0czoge1xuICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5ID0gJ2tleSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMoeyBtZXNzYWdlLCBrZXkgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCd2YWx1ZScpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGtleSBmcm9tIGNvbnRleHQudHJhaXRzIGlmIGl0IGV4aXN0cy5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGtleSBmcm9tIGNvbnRleHQudHJhaXRzIHdoZW4gaXQgZXhpc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB0cmFpdHM6IHtcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleSA9ICdrZXknO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0VmFsdWVGcm9tUHJvcGVydGllc09yVHJhaXRzKHsgbWVzc2FnZSwga2V5IH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndmFsdWUnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBpZiB0aGUgbWVzc2FnZSBpcyBudWxsLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgbWVzc2FnZSBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IG51bGw7XG4gICAgICBjb25zdCBrZXkgPSAna2V5JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFZhbHVlRnJvbVByb3BlcnRpZXNPclRyYWl0cyh7IG1lc3NhZ2UsIGtleSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwgaWYgdGhlIGtleSBpcyBudWxsLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUga2V5IGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgdHJhaXRzOiB7fSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFZhbHVlRnJvbVByb3BlcnRpZXNPclRyYWl0cyh7IG1lc3NhZ2UsIGtleSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgb2YgdGhlIGtleVNldHMuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gYW55IG9mIHRoZSBrZXlTZXRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIHRyYWl0czoge30sXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB0cmFpdHM6IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleSA9ICdub25leGlzdGVudEtleSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMoeyBtZXNzYWdlLCBrZXkgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmxhdHRlbkpzb24nLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBzaW1wbGUgSlNPTiBvYmplY3Qgd2l0aCBubyBuZXN0ZWQgb2JqZWN0cyBvciBhcnJheXMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIHNpbXBsZSBKU09OIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCwgY2l0eTogJ05ldyBZb3JrJyB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCwgY2l0eTogJ05ldyBZb3JrJyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbkpzb24oZGF0YSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZmxhdHRlbkpzb24gZnVuY3Rpb24gY29ycmVjdGx5IGZsYXR0ZW5zIGEgSlNPTiBvYmplY3Qgd2l0aCBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIG5lc3RlZCBvYmplY3RzIGFuZCBhcnJheXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgICBzdHJlZXQ6ICcxMjMgTWFpbiBTdCcsXG4gICAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgICBjb3VudHJ5OiAnVVNBJyxcbiAgICAgICAgfSxcbiAgICAgICAgaG9iYmllczogWydyZWFkaW5nJywgJ3BhaW50aW5nJ10sXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgJ2FkZHJlc3Muc3RyZWV0JzogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgJ2FkZHJlc3MuY2l0eSc6ICdOZXcgWW9yaycsXG4gICAgICAgICdhZGRyZXNzLmNvdW50cnknOiAnVVNBJyxcbiAgICAgICAgJ2hvYmJpZXNbMF0nOiAncmVhZGluZycsXG4gICAgICAgICdob2JiaWVzWzFdJzogJ3BhaW50aW5nJyxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIG51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIEpTT04gb2JqZWN0IHdpdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IG5hbWU6IG51bGwsIGFnZTogdW5kZWZpbmVkLCBjaXR5OiAnTmV3IFlvcmsnIH07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHsgbmFtZTogbnVsbCwgYWdlOiB1bmRlZmluZWQsIGNpdHk6ICdOZXcgWW9yaycgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGggZW1wdHkgYXJyYXlzIGFuZCBvYmplY3RzLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIGVtcHR5IGFycmF5cyBhbmQgb2JqZWN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IG5hbWU6IFtdLCBhZ2U6IHt9LCBjaXR5OiAnTmV3IFlvcmsnIH07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHsgbmFtZTogW10sIGFnZToge30sIGNpdHk6ICdOZXcgWW9yaycgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyAvLyBOZWVkIHRvIGZpeCB0aGlzIHRlc3RcbiAgICAvLyAvLyBUZXN0cyB0aGF0IGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGhhbmRsZXMgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiBhIEpTT04gb2JqZWN0IGNvcnJlY3RseS5cbiAgICAvLyBpdCgnc2hvdWxkIGhhbmRsZSBjaXJjdWxhciByZWZlcmVuY2VzIGluIGEgSlNPTiBvYmplY3QgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZGF0YSA9IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH07XG4gICAgLy8gICBkYXRhWydzZWxmJ10gPSBkYXRhO1xuICAgIC8vICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCwgc2VsZjogJ1tDaXJjdWxhcl0nIH07XG4gICAgLy8gICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAvLyAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIC8vIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIGtleXMgY29udGFpbmluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIEpTT04gb2JqZWN0IHdpdGgga2V5cyBjb250YWluaW5nIHNwZWNpYWwgY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7ICduYW1lLmZpcnN0JzogJ0pvaG4nLCAnbmFtZS5sYXN0JzogJ0RvZScsICdhZ2VAJzogMzAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0geyAnbmFtZS5maXJzdCc6ICdKb2huJywgJ25hbWUubGFzdCc6ICdEb2UnLCAnYWdlQCc6IDMwIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdCB0aGF0IHRoZSBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIG5vbi1zdHJpbmcga2V5cy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCBub24tc3RyaW5nIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0geyAxOiAnb25lJywgMjogJ3R3bycsIDM6ICd0aHJlZScgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0geyAnMSc6ICdvbmUnLCAnMic6ICd0d28nLCAnMyc6ICd0aHJlZScgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGgga2V5cyBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIGtleXMgY29udGFpbmluZyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7ICduYW1lLmZpcnN0JzogJ0pvaG4nLCAnbmFtZS5sYXN0JzogJ0RvZScsIGFnZTogMzAsIGNpdHk6ICdOZXcgWW9yaycgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICAnbmFtZS5maXJzdCc6ICdKb2huJyxcbiAgICAgICAgJ25hbWUubGFzdCc6ICdEb2UnLFxuICAgICAgICBhZ2U6IDMwLFxuICAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGVzdCBvYmplY3RpdmUgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGgga2V5cyB0aGF0IGFyZSByZXNlcnZlZCB3b3Jkcy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCByZXNlcnZlZCB3b3JkIGtleXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0geyBjbGFzczogJ01hdGgnLCBmdW5jdGlvbjogJ2FkZCcsIHJldHVybjogJ3Jlc3VsdCcgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0geyBjbGFzczogJ01hdGgnLCBmdW5jdGlvbjogJ2FkZCcsIHJldHVybjogJ3Jlc3VsdCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGVzdCBvYmplY3RpdmUgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlICdmbGF0dGVuSnNvbicgZnVuY3Rpb24gY29ycmVjdGx5IGZsYXR0ZW5zIGEgSlNPTiBvYmplY3Qgd2l0aCBkZWVwbHkgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCBkZWVwbHkgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgIHN0cmVldDogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICAgICAgICAgIHN0YXRlOiAnTlknLFxuICAgICAgICAgIHppcDogJzEwMDAxJyxcbiAgICAgICAgfSxcbiAgICAgICAgaG9iYmllczogWydyZWFkaW5nJywgJ3BhaW50aW5nJywgJ2Nvb2tpbmcnXSxcbiAgICAgICAgZnJpZW5kczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdKYW5lJyxcbiAgICAgICAgICAgIGFnZTogMjgsXG4gICAgICAgICAgICBhZGRyZXNzOiB7XG4gICAgICAgICAgICAgIHN0cmVldDogJzQ1NiBFbG0gU3QnLFxuICAgICAgICAgICAgICBjaXR5OiAnTG9zIEFuZ2VsZXMnLFxuICAgICAgICAgICAgICBzdGF0ZTogJ0NBJyxcbiAgICAgICAgICAgICAgemlwOiAnOTAwMDEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvYmJpZXM6IFsnaGlraW5nJywgJ3Bob3RvZ3JhcGh5J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnTWlrZScsXG4gICAgICAgICAgICBhZ2U6IDMyLFxuICAgICAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgICAgICBzdHJlZXQ6ICc3ODkgT2FrIFN0JyxcbiAgICAgICAgICAgICAgY2l0eTogJ0NoaWNhZ28nLFxuICAgICAgICAgICAgICBzdGF0ZTogJ0lMJyxcbiAgICAgICAgICAgICAgemlwOiAnNjAwMDcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvYmJpZXM6IFsncnVubmluZycsICdnYW1pbmcnXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgICdhZGRyZXNzLnN0cmVldCc6ICcxMjMgTWFpbiBTdCcsXG4gICAgICAgICdhZGRyZXNzLmNpdHknOiAnTmV3IFlvcmsnLFxuICAgICAgICAnYWRkcmVzcy5zdGF0ZSc6ICdOWScsXG4gICAgICAgICdhZGRyZXNzLnppcCc6ICcxMDAwMScsXG4gICAgICAgICdob2JiaWVzWzBdJzogJ3JlYWRpbmcnLFxuICAgICAgICAnaG9iYmllc1sxXSc6ICdwYWludGluZycsXG4gICAgICAgICdob2JiaWVzWzJdJzogJ2Nvb2tpbmcnLFxuICAgICAgICAnZnJpZW5kc1swXS5uYW1lJzogJ0phbmUnLFxuICAgICAgICAnZnJpZW5kc1swXS5hZ2UnOiAyOCxcbiAgICAgICAgJ2ZyaWVuZHNbMF0uYWRkcmVzcy5zdHJlZXQnOiAnNDU2IEVsbSBTdCcsXG4gICAgICAgICdmcmllbmRzWzBdLmFkZHJlc3MuY2l0eSc6ICdMb3MgQW5nZWxlcycsXG4gICAgICAgICdmcmllbmRzWzBdLmFkZHJlc3Muc3RhdGUnOiAnQ0EnLFxuICAgICAgICAnZnJpZW5kc1swXS5hZGRyZXNzLnppcCc6ICc5MDAwMScsXG4gICAgICAgICdmcmllbmRzWzBdLmhvYmJpZXNbMF0nOiAnaGlraW5nJyxcbiAgICAgICAgJ2ZyaWVuZHNbMF0uaG9iYmllc1sxXSc6ICdwaG90b2dyYXBoeScsXG4gICAgICAgICdmcmllbmRzWzFdLm5hbWUnOiAnTWlrZScsXG4gICAgICAgICdmcmllbmRzWzFdLmFnZSc6IDMyLFxuICAgICAgICAnZnJpZW5kc1sxXS5hZGRyZXNzLnN0cmVldCc6ICc3ODkgT2FrIFN0JyxcbiAgICAgICAgJ2ZyaWVuZHNbMV0uYWRkcmVzcy5jaXR5JzogJ0NoaWNhZ28nLFxuICAgICAgICAnZnJpZW5kc1sxXS5hZGRyZXNzLnN0YXRlJzogJ0lMJyxcbiAgICAgICAgJ2ZyaWVuZHNbMV0uYWRkcmVzcy56aXAnOiAnNjAwMDcnLFxuICAgICAgICAnZnJpZW5kc1sxXS5ob2JiaWVzWzBdJzogJ3J1bm5pbmcnLFxuICAgICAgICAnZnJpZW5kc1sxXS5ob2JiaWVzWzFdJzogJ2dhbWluZycsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmxhdHRlbkpzb24oZGF0YSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSB0ZXN0IG9iamVjdGl2ZSBpcyB0byB2ZXJpZnkgdGhhdCB0aGUgJ2ZsYXR0ZW5Kc29uJyBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGtleXMgYW5kIHZhbHVlcy5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBmbGF0dGVuIGEgSlNPTiBvYmplY3Qgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBrZXlzIGFuZCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gICAgICAgIGFkZHJlc3M6IHsgc3RyZWV0OiAnMTIzIE1haW4gU3QnLCBjaXR5OiAnU2FuIEZyYW5jaXNjbycgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ0pvaG4nLFxuICAgICAgICBhZ2U6IDMwLFxuICAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICAgICAgICAnYWRkcmVzcy5zdHJlZXQnOiAnMTIzIE1haW4gU3QnLFxuICAgICAgICAnYWRkcmVzcy5jaXR5JzogJ1NhbiBGcmFuY2lzY28nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdGVzdCBvYmplY3RpdmUgaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIGZsYXR0ZW5Kc29uIGZ1bmN0aW9uIGNvcnJlY3RseSBmbGF0dGVucyBhIEpTT04gb2JqZWN0IHdpdGggZGVlcGx5IG5lc3RlZCBhcnJheXMgYW5kIG9iamVjdHMsIGluY2x1ZGluZyBudWxsIGFuZCB1bmRlZmluZWQgdmFsdWVzLlxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGZsYXR0ZW4gYSBKU09OIG9iamVjdCB3aXRoIGRlZXBseSBuZXN0ZWQgYXJyYXlzIGFuZCBvYmplY3RzIHdpdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgIHN0cmVldDogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgICB6aXA6IDEyMzQ1LFxuICAgICAgICAgIGNvdW50cnk6ICdVU0EnLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB7XG4gICAgICAgICAgICBsYXRpdHVkZTogNDAuNzEyOCxcbiAgICAgICAgICAgIGxvbmdpdHVkZTogLTc0LjAwNixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBob2JiaWVzOiBbJ3JlYWRpbmcnLCAncGFpbnRpbmcnLCAnc3dpbW1pbmcnXSxcbiAgICAgICAgZnJpZW5kczogW1xuICAgICAgICAgIHsgbmFtZTogJ0phbmUnLCBhZ2U6IDI4IH0sXG4gICAgICAgICAgeyBuYW1lOiAnTWlrZScsIGFnZTogMzIgfSxcbiAgICAgICAgICB7IG5hbWU6ICdTYXJhaCcsIGFnZTogMjcgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGV0OiBudWxsLFxuICAgICAgICBmYXZvcml0ZUNvbG9yOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgJ2FkZHJlc3Muc3RyZWV0JzogJzEyMyBNYWluIFN0JyxcbiAgICAgICAgJ2FkZHJlc3MuemlwJzogMTIzNDUsXG4gICAgICAgICdhZGRyZXNzLmNvdW50cnknOiAnVVNBJyxcbiAgICAgICAgJ2FkZHJlc3MuY29vcmRpbmF0ZXMubGF0aXR1ZGUnOiA0MC43MTI4LFxuICAgICAgICAnYWRkcmVzcy5jb29yZGluYXRlcy5sb25naXR1ZGUnOiAtNzQuMDA2LFxuICAgICAgICAnaG9iYmllc1swXSc6ICdyZWFkaW5nJyxcbiAgICAgICAgJ2hvYmJpZXNbMV0nOiAncGFpbnRpbmcnLFxuICAgICAgICAnaG9iYmllc1syXSc6ICdzd2ltbWluZycsXG4gICAgICAgICdmcmllbmRzWzBdLm5hbWUnOiAnSmFuZScsXG4gICAgICAgICdmcmllbmRzWzBdLmFnZSc6IDI4LFxuICAgICAgICAnZnJpZW5kc1sxXS5uYW1lJzogJ01pa2UnLFxuICAgICAgICAnZnJpZW5kc1sxXS5hZ2UnOiAzMixcbiAgICAgICAgJ2ZyaWVuZHNbMl0ubmFtZSc6ICdTYXJhaCcsXG4gICAgICAgICdmcmllbmRzWzJdLmFnZSc6IDI3LFxuICAgICAgICBwZXQ6IG51bGwsXG4gICAgICAgIGZhdm9yaXRlQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBmbGF0dGVuSnNvbihkYXRhKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBmbGF0dGVuSnNvbiBmdW5jdGlvbiBjb3JyZWN0bHkgZmxhdHRlbnMgYSBKU09OIG9iamVjdCB3aXRoIGFycmF5cyBjb250YWluaW5nIG9iamVjdHMgd2l0aCBkaWZmZXJlbnQgbmVzdGluZyBsZXZlbHMuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZmxhdHRlbiBhIEpTT04gb2JqZWN0IHdpdGggYXJyYXlzIGNvbnRhaW5pbmcgb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBuZXN0aW5nIGxldmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG5hbWU6ICdKb2huJyxcbiAgICAgICAgYWdlOiAzMCxcbiAgICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAgICAgICAgaG9iYmllczogW1xuICAgICAgICAgIHsgbmFtZTogJ1JlYWRpbmcnLCB0eXBlOiAnSW5kb29yJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ1J1bm5pbmcnLCB0eXBlOiAnT3V0ZG9vcicgfSxcbiAgICAgICAgICB7IG5hbWU6ICdDb29raW5nJywgdHlwZTogJ0luZG9vcicgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZnJpZW5kczogW1xuICAgICAgICAgIHsgbmFtZTogJ0FsaWNlJywgYWdlOiAyOCB9LFxuICAgICAgICAgIHsgbmFtZTogJ0JvYicsIGFnZTogMzIgfSxcbiAgICAgICAgICB7IG5hbWU6ICdDaGFybGllJywgYWdlOiAyNyB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnSm9obicsXG4gICAgICAgIGFnZTogMzAsXG4gICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gICAgICAgICdob2JiaWVzWzBdLm5hbWUnOiAnUmVhZGluZycsXG4gICAgICAgICdob2JiaWVzWzBdLnR5cGUnOiAnSW5kb29yJyxcbiAgICAgICAgJ2hvYmJpZXNbMV0ubmFtZSc6ICdSdW5uaW5nJyxcbiAgICAgICAgJ2hvYmJpZXNbMV0udHlwZSc6ICdPdXRkb29yJyxcbiAgICAgICAgJ2hvYmJpZXNbMl0ubmFtZSc6ICdDb29raW5nJyxcbiAgICAgICAgJ2hvYmJpZXNbMl0udHlwZSc6ICdJbmRvb3InLFxuICAgICAgICAnZnJpZW5kc1swXS5uYW1lJzogJ0FsaWNlJyxcbiAgICAgICAgJ2ZyaWVuZHNbMF0uYWdlJzogMjgsXG4gICAgICAgICdmcmllbmRzWzFdLm5hbWUnOiAnQm9iJyxcbiAgICAgICAgJ2ZyaWVuZHNbMV0uYWdlJzogMzIsXG4gICAgICAgICdmcmllbmRzWzJdLm5hbWUnOiAnQ2hhcmxpZScsXG4gICAgICAgICdmcmllbmRzWzJdLmFnZSc6IDI3LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZsYXR0ZW5Kc29uKGRhdGEpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZVJhbmRvbVN0cmluZycsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q2FzZXM6IEJhc2VUZXN0Q2FzZVtdID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIGdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCcsXG4gICAgICAgIGxlbmd0aDogOCxcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGg6IDgsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIGdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyBvZiB0aGUgZGVmYXVsdCBsZW5ndGgnLFxuICAgICAgICBleHBlY3RlZExlbmd0aDogMTAsXG4gICAgICB9LFxuICAgIF07XG4gICAgZmlsdGVyKHRlc3RDYXNlcykuZm9yRWFjaCgodGVzdENhc2UpID0+IHtcbiAgICAgIGl0KHRlc3RDYXNlLm5hbWUsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2VuZXJhdGVSYW5kb21TdHJpbmcodGVzdENhc2UubGVuZ3RoKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLnRvQmUodGVzdENhc2UuZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRPZmZzZXRJblNlYycsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgYSB2YWxpZCB0aW1lem9uZSBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgb2Zmc2V0IHZhbHVlIGluIHNlY29uZHMgZm9yIGEgdmFsaWQgdGltZXpvbmUgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0T2Zmc2V0SW5TZWMoJ0FzaWEvS29sa2F0YScpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZSgxOTgwMCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgZm9yIHRoZSB0aW1lem9uZSBzdHJpbmcgJ1VUQydcbiAgICBpdCgnc2hvdWxkIHJldHVybiAwIGZvciB0aGUgdGltZXpvbmUgc3RyaW5nIFwiVVRDXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnVVRDJyk7XG4gICAgICBleHBlY3Qob2Zmc2V0KS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIGZvciB0aGUgdGltZXpvbmUgc3RyaW5nICdFdGMvVVRDJ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIDAgZm9yIHRoZSB0aW1lem9uZSBzdHJpbmcgXCJFdGMvVVRDXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnRXRjL1VUQycpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZSgwKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkIGZvciBhbiBpbnZhbGlkIHRpbWV6b25lIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgYW4gaW52YWxpZCB0aW1lem9uZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnSW52YWxpZC9UaW1lem9uZScpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5kZWZpbmVkIG9mZnNldCB2YWx1ZSBmb3IgdGhlIHRpbWV6b25lIHN0cmluZyAnKzA1OjMwJyBpbnZhbGlkIHRpbWV6b25lIHN0cmluZ1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB1bmRlZmluZWQgb2Zmc2V0IHZhbHVlIGZvciB0aGUgdGltZXpvbmUgc3RyaW5nIFwiKzA1OjMwXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnKzA1OjMwJyk7XG4gICAgICBleHBlY3Qob2Zmc2V0KS50b0JlKHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb3JyZWN0IG9mZnNldCB2YWx1ZSBmb3IgdGhlIHRpbWV6b25lIHN0cmluZyAnQW1lcmljYS9OZXdfWW9yaydcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBvZmZzZXQgdmFsdWUgZm9yIHRoZSB0aW1lem9uZSBzdHJpbmcgXCJBbWVyaWNhL05ld19Zb3JrXCInLCAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnQXNpYS9DYWxjdXR0YScpO1xuICAgICAgZXhwZWN0KG9mZnNldCkudG9CZSgxOTgwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmb3JtYXRUaW1lU3RhbXAnLCAoKSA9PiB7XG4gICAgLy8gVGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyB3aGVuIG5vIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyB3aGVuIG5vIGZvcm1hdCBpcyBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGVTdHIgPSAnMjAyMi0wMS0wMVQwMDowMDowMC4wMDBaJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdFRpbWVTdGFtcChkYXRlU3RyKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoMTY0MDk5NTIwMDAwMCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lc3RhbXAgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgbW9tZW50IGZvcm1hdCB3aGVuIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdGltZXN0YW1wIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIG1vbWVudCBmb3JtYXQgd2hlbiBmb3JtYXQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJzIwMjItMDEtMDFUMDA6MDA6MDAuMDAwWic7XG4gICAgICBjb25zdCBmb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJzIwMjItMDEtMDEnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHRocm93cyBhbiBlcnJvciB3aGVuIGFuIGludmFsaWQgZGF0ZSBzdHJpbmcgaXMgcHJvdmlkZWQuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIGFuIGludmFsaWQgZGF0ZSBzdHJpbmcgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJ2ludmFsaWQtZGF0ZSc7XG4gICAgICBleHBlY3QoZm9ybWF0VGltZVN0YW1wKGRhdGVTdHIpKS50b0JlTmFOKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIE5hTiB3aGVuIGFuIGludmFsaWQgZGF0ZSBzdHJpbmcgaXMgcHJvdmlkZWQgYW5kIG5vIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBOYU4gd2hlbiBhbiBpbnZhbGlkIGRhdGUgc3RyaW5nIGlzIHByb3ZpZGVkIGFuZCBubyBmb3JtYXQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJ2ludmFsaWQtZGF0ZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0cik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTmFOKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIE5hTiB3aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBwcm92aWRlZCBhcyB0aGUgZGF0ZSBzdHJpbmcgYW5kIG5vIGZvcm1hdCBpcyBwcm92aWRlZC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBOYU4gd2hlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcHJvdmlkZWQgYXMgdGhlIGRhdGUgc3RyaW5nIGFuZCBubyBmb3JtYXQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJyc7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0cik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTmFOKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIE5hTiB3aGVuIGFuIGludmFsaWQgZm9ybWF0IGlzIHByb3ZpZGVkLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIE5hTiB3aGVuIGFuIGludmFsaWQgZm9ybWF0IGlzIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZVN0ciA9ICcyMDIyLTAxLTAxVDAwOjAwOjAwLjAwMFonO1xuICAgICAgY29uc3QgZm9ybWF0ID0gJ2ludmFsaWRGb3JtYXQnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZm9ybWF0VGltZVN0YW1wKGRhdGVTdHIsIGZvcm1hdCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKCdpbnZhbTEvMS8yMDIyaTZGb3IwYW10Jyk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzIHdoZW4gYSB2YWxpZCB0aW1lc3RhbXAgc3RyaW5nIGlzIHByb3ZpZGVkIGluc3RlYWQgb2YgYSBkYXRlIHN0cmluZy5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyB3aGVuIGEgdmFsaWQgdGltZXN0YW1wIHN0cmluZyBpcyBwcm92aWRlZCBpbnN0ZWFkIG9mIGEgZGF0ZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gJzIwMjItMDEtMDFUMDA6MDA6MDAuMDAwWic7XG4gICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUaW1lU3RhbXAoZGF0ZVN0cik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDE2NDA5OTUyMDAwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFzaFRvU2hhMjU2JywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgaGFzaFRvU2hhMjU2IHJldHVybnMgdGhlIFNIQTI1NiBoYXNoIG9mIGEgc3RyaW5nIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIFNIQTI1NiBoYXNoIG9mIGEgc3RyaW5nIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAndGVzdCBzdHJpbmcnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnZDU1NzljNDZkZmNjN2YxODIwNzAxM2U2NWI0NGU0Y2I0ZTJjMjI5OGY0YWM0NTdiYThmODI3NDNmMzFlOTMwYic7XG4gICAgICBjb25zdCBvdXRwdXQgPSBoYXNoVG9TaGEyNTYoaW5wdXQpO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZShleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGhhc2hUb1NoYTI1NiByZXR1cm5zIHRoZSBTSEEyNTYgaGFzaCBvZiBhIEJ1ZmZlciBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBTSEEyNTYgaGFzaCBvZiBhIEJ1ZmZlciBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oJ3Rlc3QgYnVmZmVyJyk7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICc1MjVlZjVmN2JhZjU2NTI4YjQ4NzcwOTIyZTk4ZTgwMDMxMGQzNjg1NjgxZDM0ZWU1OTI5MDJhYTI1MjQ1OGIzJztcbiAgICAgIGNvbnN0IG91dHB1dCA9IGhhc2hUb1NoYTI1NihpbnB1dCk7XG4gICAgICBleHBlY3Qob3V0cHV0KS50b0JlKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgaGFzaFRvU2hhMjU2IHJldHVybnMgdGhlIFNIQTI1NiBoYXNoIG9mIGFuIGVtcHR5IG51bWJlciBhcnJheSBpbnB1dFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBTSEEyNTYgaGFzaCBvZiBhbiBlbXB0eSBudW1iZXIgYXJyYXkgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dDogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gJ2UzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUnO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gaGFzaFRvU2hhMjU2KGlucHV0KTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBoYXNoVG9TaGEyNTYgcmV0dXJucyB0aGUgU0hBMjU2IGhhc2ggb2YgYW4gZW1wdHkgQnVmZmVyIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIFNIQTI1NiBoYXNoIG9mIGFuIGVtcHR5IEJ1ZmZlciBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oW10pO1xuICAgICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSAnZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NSc7XG4gICAgICBjb25zdCBvdXRwdXQgPSBoYXNoVG9TaGEyNTYoaW5wdXQpO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZShleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGhhc2hUb1NoYTI1NiByZXR1cm5zIHRoZSBTSEEyNTYgaGFzaCBvZiBhbiBlbXB0eSBzdHJpbmcgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgU0hBMjU2IGhhc2ggb2YgYW4gZW1wdHkgc3RyaW5nIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gJ2UzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUnO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gaGFzaFRvU2hhMjU2KGlucHV0KTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBoYXNoVG9TaGEyNTYgcmV0dXJucyB0aGUgU0hBMjU2IGhhc2ggb2YgYSBudW1iZXIgYXJyYXkgaW5wdXRcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgU0hBMjU2IGhhc2ggb2YgYSBudW1iZXIgYXJyYXkgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gJzc0ZjgxZmUxNjdkOTliNGNiNDFkNmQwY2NkYTgyMjc4Y2FlZTlmM2UyZjI1ZDVlNWEzOTM2ZmYzZGNlYzYwZDAnO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gaGFzaFRvU2hhMjU2KGlucHV0KTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoZXhwZWN0ZWRPdXRwdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCBoYXNoVG9TaGEyNTYgcmV0dXJucyB0aGUgU0hBMjU2IGhhc2ggb2YgYSBub24tQVNDSUkgc3RyaW5nIGlucHV0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIFNIQTI1NiBoYXNoIG9mIGEgbm9uLUFTQ0lJIHN0cmluZyBpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ+S9oOWlveS4lueVjCc7XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9ICc1MDhkNjlkYzIxYmY1ZDJmODA0MDE0YjE2ODg5NTNhMTJkNWRmZGU3MWJlNmNkOTU0MTc3OTgwZDVkMTc0MWJiJztcbiAgICAgIGNvbnN0IG91dHB1dCA9IGhhc2hUb1NoYTI1NihpbnB1dCk7XG4gICAgICBleHBlY3Qob3V0cHV0KS50b0JlKGV4cGVjdGVkT3V0cHV0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlVVVJRCcsICgpID0+IHtcbiAgICAvLyBUZXN0cyB0aGF0IGdlbmVyYXRlVVVJRCBmdW5jdGlvbiByZXR1cm5zIGEgVVVJRCBzdHJpbmdcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVVSUQgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgZXhwZWN0KHR5cGVvZiB1dWlkKS50b0JlKCdzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2VuZXJhdGVVVUlEIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIHVuaXF1ZSBVVUlEIGVhY2ggdGltZSBpdCBpcyBjYWxsZWRcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgdW5pcXVlIFVVSUQgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQxID0gZ2VuZXJhdGVVVUlEKCk7XG4gICAgICBjb25zdCB1dWlkMiA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgZXhwZWN0KHV1aWQxKS5ub3QudG9CZSh1dWlkMik7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0IGdlbmVyYXRlVVVJRCBmdW5jdGlvbiByZXR1cm5zIGEgVVVJRCBzdHJpbmcgd2l0aCBsZW5ndGggMzZcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIFVVSUQgc3RyaW5nIHdpdGggbGVuZ3RoIDM2JywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgZXhwZWN0KHV1aWQubGVuZ3RoKS50b0JlKDM2KTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgZ2VuZXJhdGVVVUlEIGZ1bmN0aW9uIHJldHVybnMgYSBVVUlEIHN0cmluZyB3aXRoIDQgZGFzaGVzXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBVVUlEIHN0cmluZyB3aXRoIDQgZGFzaGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgICAgY29uc3QgZGFzaENvdW50ID0gKHV1aWQubWF0Y2goLy0vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGV4cGVjdChkYXNoQ291bnQpLnRvQmUoNCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b1N0cmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2hlbiBpbnB1dCBpcyBhIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gJ3Rlc3Qgc3RyaW5nJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1N0cmluZyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIFwibnVsbFwiIHdoZW4gaW5wdXQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1N0cmluZyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdudWxsJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gSlNPTiBzdHJpbmcgd2hlbiBpbnB1dCBpcyBhIGN1c3RvbSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHsga2V5OiAndmFsdWUnLCBhbm90aGVyS2V5OiAxMjMgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1N0cmluZyhpbnB1dCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKEpTT04uc3RyaW5naWZ5KGlucHV0KSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIGlucHV0IGhhcyBjaXJjdWxhciByZWZlcmVuY2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2lyY3VsYXJPYmo6IGFueSA9IHt9O1xuICAgICAgY2lyY3VsYXJPYmouc2VsZiA9IGNpcmN1bGFyT2JqO1xuICAgICAgZXhwZWN0KCgpID0+IGNvbnZlcnRUb1N0cmluZyhjaXJjdWxhck9iaikpLnRvVGhyb3coVHlwZUVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBib29sZWFuIHRydWUgdG8gSlNPTiBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IHRydWU7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9TdHJpbmcoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndHJ1ZScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBhcnJheSB0byBKU09OIHN0cmluZyB3aGVuIGlucHV0IGlzIGFuIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBbMSwgMiwgM107XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9TdHJpbmcoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShKU09OLnN0cmluZ2lmeShpbnB1dCkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBhIG51bWJlciB0byBhIEpTT04gc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAxMjM7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9TdHJpbmcoaW5wdXQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnMTIzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIHN0cmluZ3Mgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9ICdzcGVjaWFsIUAjJCVeJiooKV8re306XCI8Pj8nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRvU3RyaW5nKGlucHV0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoaW5wdXQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGxhcmdlT2JqZWN0ID0ge1xuICAgICAgICBrZXkxOiAndmFsdWUxJyxcbiAgICAgICAga2V5MjogQXJyYXkoMTAwMCkuZmlsbCgndmFsdWUyJyksXG4gICAgICAgIGtleTM6IHsgbmVzdGVkS2V5OiAnbmVzdGVkVmFsdWUnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRvU3RyaW5nKGxhcmdlT2JqZWN0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXG4gICAgICAgICd7XCJrZXkxXCI6XCJ2YWx1ZTFcIixcImtleTJcIjpbXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIixcInZhbHVlMlwiLFwidmFsdWUyXCIsXCJ2YWx1ZTJcIl0sXCJrZXkzXCI6e1wibmVzdGVkS2V5XCI6XCJuZXN0ZWRWYWx1ZVwifX0nLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3V1aWR2NScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIFVVSUQgZm9yIHRoZSBzYW1lIGlucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSAndGVzdC12YWx1ZSc7XG4gICAgICBjb25zdCB1dWlkMSA9IHV1aWR2NShpbnB1dCk7XG4gICAgICBjb25zdCB1dWlkMiA9IHV1aWR2NShpbnB1dCk7XG5cbiAgICAgIGV4cGVjdCh1dWlkMSkudG9CZSh1dWlkMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGRpZmZlcmVudCBVVUlEcyBmb3IgZGlmZmVyZW50IGlucHV0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQxID0gdXVpZHY1KCdmaXJzdC12YWx1ZScpO1xuICAgICAgY29uc3QgdXVpZDIgPSB1dWlkdjUoJ3NlY29uZC12YWx1ZScpO1xuICAgICAgZXhwZWN0KHV1aWQxKS5ub3QudG9CZSh1dWlkMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIFVVSUQgdjUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodXVpZHY1KCd2YWxpZC10ZXN0JykpLnRvQmUoJzQ5ODQzMTY5LWVlOTEtNTNkNC04MmFlLTAyZGQ2NzZjOTJhZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgc3RyaW5nIGlucHV0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1dWlkdjUoJycpKS50b0JlKCcxYzdmY2YxMy03NGFmLTU1OTUtOGVlOS1kNzJiZTZjMWFjNDInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZsYXR0ZW5RdWVyeVBhcmFtcycsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q2FzZXM6IGFueSA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsYXR0ZW4gYXJyYXkgdmFsdWVzIHRvIGZpcnN0IGVsZW1lbnRzJyxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBrZXkxOiBbJ3ZhbHVlMSddLFxuICAgICAgICAgIGtleTI6IFsndmFsdWUyJ10sXG4gICAgICAgICAga2V5MzogWzEyM10sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAga2V5MTogJ3ZhbHVlMScsXG4gICAgICAgICAga2V5MjogJ3ZhbHVlMicsXG4gICAgICAgICAga2V5MzogMTIzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBudWxsIGlucHV0JyxcbiAgICAgICAgaW5wdXQ6IG51bGwsXG4gICAgICAgIGV4cGVjdGVkOiB7fSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdoYW5kbGUgdW5kZWZpbmVkIGlucHV0JyxcbiAgICAgICAgaW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZXhwZWN0ZWQ6IHt9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBlbXB0eSBvYmplY3QnLFxuICAgICAgICBpbnB1dDoge30sXG4gICAgICAgIGV4cGVjdGVkOiB7fSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpZ25vcmUgbnVsbC91bmRlZmluZWQgYXJyYXkgZWxlbWVudHMnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGtleTE6IFt1bmRlZmluZWRdLFxuICAgICAgICAgIGtleTI6IFtudWxsXSxcbiAgICAgICAgICBrZXkzOiBbdW5kZWZpbmVkLCAndmFsdWUnXSxcbiAgICAgICAgICBrZXk0OiBbbnVsbCwgJ3ZhbHVlJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAga2V5MzogW3VuZGVmaW5lZCwgJ3ZhbHVlJ10sXG4gICAgICAgICAga2V5NDogW251bGwsICd2YWx1ZSddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBtaXhlZCB0eXBlIHZhbHVlcyBpbiBhcnJheXMnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIG51bWJlcjogWzQyXSxcbiAgICAgICAgICBzdHJpbmc6IFsndGVzdCddLFxuICAgICAgICAgIGJvb2xlYW46IFt0cnVlXSxcbiAgICAgICAgICBvYmplY3Q6IFt7IG5lc3RlZDogJ3ZhbHVlJyB9XSxcbiAgICAgICAgICBkYXRlOiBbbmV3IERhdGUoJzIwMjQtMDEtMDEnKV0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAgbnVtYmVyOiA0MixcbiAgICAgICAgICBzdHJpbmc6ICd0ZXN0JyxcbiAgICAgICAgICBib29sZWFuOiB0cnVlLFxuICAgICAgICAgIG9iamVjdDogeyBuZXN0ZWQ6ICd2YWx1ZScgfSxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMScpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBlbXB0eSBhcnJheXMnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGtleTE6IFtdLFxuICAgICAgICAgIGtleTI6IFsndmFsdWUnXSxcbiAgICAgICAgICBrZXkzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWQ6IHtcbiAgICAgICAgICBrZXkyOiAndmFsdWUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2tlZXAgbm9uLWFycmF5IHZhbHVlcyB1bmNoYW5nZWQnLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIHN0cmluZzogJ2RpcmVjdCBzdHJpbmcnLFxuICAgICAgICAgIG51bWJlcjogNDIsXG4gICAgICAgICAgYm9vbGVhbjogdHJ1ZSxcbiAgICAgICAgICBvYmplY3Q6IHsgdGVzdDogJ3ZhbHVlJyB9LFxuICAgICAgICAgIGFycmF5OiBbJ2ZpcnN0JywgJ3NlY29uZCddLFxuICAgICAgICB9LFxuICAgICAgICBleHBlY3RlZDoge1xuICAgICAgICAgIHN0cmluZzogJ2RpcmVjdCBzdHJpbmcnLFxuICAgICAgICAgIG51bWJlcjogNDIsXG4gICAgICAgICAgYm9vbGVhbjogdHJ1ZSxcbiAgICAgICAgICBvYmplY3Q6IHsgdGVzdDogJ3ZhbHVlJyB9LFxuICAgICAgICAgIGFycmF5OiBbJ2ZpcnN0JywgJ3NlY29uZCddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBtaXhlZCBhcnJheSBhbmQgbm9uLWFycmF5IHZhbHVlcycsXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgYXJyYXlWYWx1ZTogWydmaXJzdCddLFxuICAgICAgICAgIGVtcHR5QXJyYXk6IFtdLFxuICAgICAgICAgIGRpcmVjdFZhbHVlOiAnc3RyaW5nJyxcbiAgICAgICAgICBudWxsVmFsdWU6IG51bGwsXG4gICAgICAgICAgdW5kZWZpbmVkVmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWQ6IHtcbiAgICAgICAgICBhcnJheVZhbHVlOiAnZmlyc3QnLFxuICAgICAgICAgIGRpcmVjdFZhbHVlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdoYW5kbGUgbmVzdGVkIGFycmF5cycsXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgbmVzdGVkOiBbXG4gICAgICAgICAgICBbMSwgMl0sXG4gICAgICAgICAgICBbMywgNF0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaXhlZDogW1snYScsICdiJ10sICdjJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAgbmVzdGVkOiBbXG4gICAgICAgICAgICBbMSwgMl0sXG4gICAgICAgICAgICBbMywgNF0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaXhlZDogW1snYScsICdiJ10sICdjJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaGFuZGxlIHNwZWNpYWwgdmFsdWVzIGluIGFycmF5cycsXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgbmFuOiBbTmFOXSxcbiAgICAgICAgICBpbmZpbml0eTogW0luZmluaXR5XSxcbiAgICAgICAgICBuZWdJbmZpbml0eTogWy1JbmZpbml0eV0sXG4gICAgICAgICAgemVybzogWzBdLFxuICAgICAgICAgIG5lZ1plcm86IFstMF0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkOiB7XG4gICAgICAgICAgbmFuOiBOYU4sXG4gICAgICAgICAgaW5maW5pdHk6IEluZmluaXR5LFxuICAgICAgICAgIG5lZ0luZmluaXR5OiAtSW5maW5pdHksXG4gICAgICAgICAgemVybzogMCxcbiAgICAgICAgICBuZWdaZXJvOiAtMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7IG5hbWUsIGlucHV0LCBleHBlY3RlZCB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkICR7bmFtZX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChmbGF0dGVuUXVlcnlQYXJhbXMoaW5wdXQpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|