UNPKG

143 kBJavaScriptView Raw
1/**
2 * @license
3 * Copyright 2017 Google LLC. All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 * =============================================================================
16 */
17import * as tf from '../../index';
18import { ALL_ENVS, describeWithFlags } from '../../jasmine_util';
19import { expectArraysClose } from '../../test_util';
20describeWithFlags('resizeBilinear', ALL_ENVS, () => {
21 it('simple alignCorners=false', async () => {
22 const input = tf.tensor3d([2, 2, 4, 4], [2, 2, 1]);
23 const output = input.resizeBilinear([3, 3], false);
24 expectArraysClose(await output.data(), [2, 2, 2, 10 / 3, 10 / 3, 10 / 3, 4, 4, 4]);
25 });
26 it('5x5-bilinear, no change in shape', async () => {
27 const image = tf.ones([1, 5, 5, 3]);
28 const alignCorners = false;
29 const output = tf.image.resizeBilinear(image, [5, 5], alignCorners);
30 expect(output.shape).toEqual([1, 5, 5, 3]);
31 expect(output.dtype).toBe('float32');
32 expectArraysClose(await output.data(), await image.data());
33 });
34 it('simple alignCorners=true', async () => {
35 const input = tf.tensor3d([2, 2, 4, 4], [2, 2, 1]);
36 const output = input.resizeBilinear([3, 3], true);
37 expectArraysClose(await output.data(), [2, 2, 2, 3, 3, 3, 4, 4, 4]);
38 });
39 it('works when rows are copied', async () => {
40 const input = tf.tensor3d([
41 1.56324531, 2.13817752, 1.44398421, 1.07632684, 0.59306785,
42 -0.36970865, 1.62451879, 1.8367334, 1.13944798, 2.01993218,
43 2.01919952, 2.67524054
44 ], [2, 3, 2]);
45 const output = input.resizeBilinear([4, 3], false);
46 expectArraysClose(await output.data(), [
47 1.5632453, 2.13817763, 1.44398415, 1.07632685, 0.59306782, -0.36970866,
48 1.59388208, 1.98745549, 1.2917161, 1.54812956, 1.30613375, 1.15276587,
49 1.62451875, 1.83673334, 1.13944793, 2.01993227, 2.01919961, 2.67524052,
50 1.62451875, 1.83673334, 1.13944793, 2.01993227, 2.01919961, 2.67524052
51 ]);
52 });
53 it('works for ints', async () => {
54 const input = tf.tensor3d([1, 2, 3, 4, 5], [1, 5, 1], 'int32');
55 const output = input.resizeBilinear([1, 10], false);
56 expect(output.shape).toEqual([1, 10, 1]);
57 expect(output.dtype).toBe('float32');
58 expectArraysClose(await output.data(), [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5]);
59 });
60 it('matches tensorflow w/ random numbers alignCorners=false, ' +
61 'halfPixelCenters=true', async () => {
62 const input = tf.tensor3d([
63 1.19074044, 0.91373104, 2.01611669, -0.52270832, 0.38725395,
64 1.30809779, 0.61835143, 3.49600659, 2.09230986, 0.56473997,
65 0.03823943, 1.19864896
66 ], [2, 3, 2]);
67 const output = input.resizeBilinear([4, 5], false, true);
68 expectArraysClose(await output.data(), [
69 1.1907405, 0.913731, 1.520891, 0.3391553, 2.0161166, -0.5227083,
70 1.0387988, 0.5757756, 0.3872539, 1.3080978, 1.0476432, 1.5592999,
71 1.442652, 0.8352414, 2.0351648, -0.2508462, 0.9940659, 0.6681031,
72 0.3000003, 1.2807356, 0.7614487, 2.8504376, 1.2861738, 1.8274136,
73 2.0732617, 0.2928779, 0.9046002, 0.8527579, 0.125493, 1.2260112,
74 0.6183515, 3.4960065, 1.2079349, 2.3234997, 2.09231, 0.5647399,
75 0.8598673, 0.9450854, 0.0382394, 1.1986489
76 ]);
77 });
78 it('batch of 2, simple, alignCorners=false, ' +
79 'halfPixelCenters=true', async () => {
80 const input = tf.tensor4d([2, 2, 4, 4, 3, 3, 5, 5], [2, 2, 2, 1]);
81 const output = input.resizeBilinear([3, 3], false /* alignCorners */, true);
82 expectArraysClose(await output.data(), [2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 5, 5, 5]);
83 });
84 it('target width = 1, alignCorners=false, ' +
85 'halfPixelCenters=true', async () => {
86 const input = tf.tensor3d([
87 [
88 [120.68856811523438, 134.51638793945312, 83.03671264648438],
89 [121.58008575439453, 113.28836059570312, 136.3172149658203],
90 [79.38370513916016, 101.87127685546875, 104.54979705810547],
91 [96.31678771972656, 111.77168273925781, 83.73509979248047]
92 ],
93 [
94 [119.45088195800781, 88.98846435546875, 97.47553253173828],
95 [117.5562973022461, 108.26356506347656, 99.62212371826172],
96 [136.62701416015625, 94.10433197021484, 80.97366333007812],
97 [83.61205291748047, 90.60148620605469, 81.82512664794922]
98 ],
99 [
100 [103.0362777709961, 123.1098403930664, 125.62944030761719],
101 [92.2915267944336, 103.15729522705078, 119.18060302734375],
102 [102.93293762207031, 117.821044921875, 99.40152740478516],
103 [96.32952117919922, 105.80963134765625, 104.8491439819336]
104 ],
105 [
106 [104.87507629394531, 134.0189208984375, 111.02627563476562],
107 [85.4534683227539, 107.68426513671875, 103.03722381591797],
108 [89.70533752441406, 98.25298309326172, 78.42916870117188],
109 [113.6744613647461, 95.8189697265625, 122.75005340576172]
110 ]
111 ]);
112 const output = input.resizeBilinear([3, 1], false, true);
113 const expected = [
114 104.917, 106.514, 115.411, 112.352, 105.837, 99.7945, 89.2515, 104.222,
115 93.8262
116 ];
117 expectArraysClose(await output.data(), expected);
118 expect(output.shape).toEqual([3, 1, 3]);
119 });
120 it('matches tensorflow w/ random numbers alignCorners=false', async () => {
121 const input = tf.tensor3d([
122 1.19074044, 0.91373104, 2.01611669, -0.52270832, 0.38725395,
123 1.30809779, 0.61835143, 3.49600659, 2.09230986, 0.56473997,
124 0.03823943, 1.19864896
125 ], [2, 3, 2]);
126 const output = input.resizeBilinear([4, 5], false);
127 expectArraysClose(await output.data(), [
128 1.19074047, 0.91373104, 1.68596613, 0.05186744, 1.69034398, -0.15654698,
129 0.7130264, 0.94193673, 0.38725394, 1.30809784, 0.9045459, 2.20486879,
130 1.59434628, 0.89455694, 1.68591988, 0.26748738, 0.58103991, 1.00690198,
131 0.21274668, 1.25337338, 0.6183514, 3.49600649, 1.50272655, 1.73724651,
132 1.68149579, 0.69152176, 0.44905344, 1.07186723, 0.03823943, 1.19864893,
133 0.6183514, 3.49600649, 1.50272655, 1.73724651, 1.68149579, 0.69152176,
134 0.44905344, 1.07186723, 0.03823943, 1.19864893
135 ]);
136 });
137 it('matches tensorflow w/ random numbers alignCorners=true', async () => {
138 const input = tf.tensor3d([
139 1.56324531, 2.13817752, 1.44398421, 1.07632684, 0.59306785,
140 -0.36970865, 1.62451879, 1.8367334, 1.13944798, 2.01993218,
141 2.01919952, 2.67524054
142 ], [2, 3, 2]);
143 const output = input.resizeBilinear([4, 5], true);
144 expectArraysClose(await output.data(), [
145 1.5632453, 2.13817763, 1.50361478, 1.60725224, 1.44398427, 1.07632685,
146 1.01852608, 0.35330909, 0.59306782, -0.36970866, 1.58366978, 2.03769612,
147 1.46307099, 1.71427906, 1.3424722, 1.39086199, 1.20545864, 1.01806819,
148 1.06844509, 0.6452744, 1.60409427, 1.93721485, 1.42252707, 1.82130599,
149 1.24096, 1.70539713, 1.3923912, 1.68282723, 1.54382229, 1.66025746,
150 1.62451875, 1.83673346, 1.38198328, 1.92833281, 1.13944793, 2.01993227,
151 1.57932377, 2.34758639, 2.01919961, 2.67524052
152 ]);
153 });
154 it('batch of 2, simple, alignCorners=true', async () => {
155 const input = tf.tensor4d([2, 2, 4, 4, 3, 3, 5, 5], [2, 2, 2, 1]);
156 const output = input.resizeBilinear([3, 3], true /* alignCorners */);
157 expectArraysClose(await output.data(), [2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 5, 5, 5]);
158 });
159 it('target width = 1, alignCorners=true', async () => {
160 const input = tf.tensor3d([
161 [
162 [120.68856811523438, 134.51638793945312, 83.03671264648438],
163 [121.58008575439453, 113.28836059570312, 136.3172149658203],
164 [79.38370513916016, 101.87127685546875, 104.54979705810547],
165 [96.31678771972656, 111.77168273925781, 83.73509979248047]
166 ],
167 [
168 [119.45088195800781, 88.98846435546875, 97.47553253173828],
169 [117.5562973022461, 108.26356506347656, 99.62212371826172],
170 [136.62701416015625, 94.10433197021484, 80.97366333007812],
171 [83.61205291748047, 90.60148620605469, 81.82512664794922]
172 ],
173 [
174 [103.0362777709961, 123.1098403930664, 125.62944030761719],
175 [92.2915267944336, 103.15729522705078, 119.18060302734375],
176 [102.93293762207031, 117.821044921875, 99.40152740478516],
177 [96.32952117919922, 105.80963134765625, 104.8491439819336]
178 ],
179 [
180 [104.87507629394531, 134.0189208984375, 111.02627563476562],
181 [85.4534683227539, 107.68426513671875, 103.03722381591797],
182 [89.70533752441406, 98.25298309326172, 78.42916870117188],
183 [113.6744613647461, 95.8189697265625, 122.75005340576172]
184 ]
185 ]);
186 const output = input.resizeBilinear([3, 1], true);
187 const expected = [
188 120.68857, 134.51639, 83.03671, 111.243576, 106.04915, 111.55249,
189 104.87508, 134.01892, 111.026276
190 ];
191 expectArraysClose(await output.data(), expected);
192 expect(output.shape).toEqual([3, 1, 3]);
193 });
194 it('target height = 1, alignCorners=true', async () => {
195 const input = tf.tensor3d([
196 [
197 [120.68856811523438, 134.51638793945312, 83.03671264648438],
198 [121.58008575439453, 113.28836059570312, 136.3172149658203],
199 [79.38370513916016, 101.87127685546875, 104.54979705810547],
200 [96.31678771972656, 111.77168273925781, 83.73509979248047]
201 ],
202 [
203 [119.45088195800781, 88.98846435546875, 97.47553253173828],
204 [117.5562973022461, 108.26356506347656, 99.62212371826172],
205 [136.62701416015625, 94.10433197021484, 80.97366333007812],
206 [83.61205291748047, 90.60148620605469, 81.82512664794922]
207 ],
208 [
209 [103.0362777709961, 123.1098403930664, 125.62944030761719],
210 [92.2915267944336, 103.15729522705078, 119.18060302734375],
211 [102.93293762207031, 117.821044921875, 99.40152740478516],
212 [96.32952117919922, 105.80963134765625, 104.8491439819336]
213 ],
214 [
215 [104.87507629394531, 134.0189208984375, 111.02627563476562],
216 [85.4534683227539, 107.68426513671875, 103.03722381591797],
217 [89.70533752441406, 98.25298309326172, 78.42916870117188],
218 [113.6744613647461, 95.8189697265625, 122.75005340576172]
219 ]
220 ]);
221 const output = input.resizeBilinear([1, 3], true);
222 const expected = [
223 120.68857, 134.51639, 83.03671, 100.481895, 107.57982, 120.4335, 96.31679,
224 111.77168, 83.7351
225 ];
226 expectArraysClose(await output.data(), expected);
227 expect(output.shape).toEqual([1, 3, 3]);
228 });
229 it('throws when passed a non-tensor', () => {
230 const e = /Argument 'images' passed to 'resizeBilinear' must be a Tensor/;
231 expect(() => tf.image.resizeBilinear({}, [
232 1, 1
233 ])).toThrowError(e);
234 });
235 it('accepts a tensor-like object', async () => {
236 const input = [[[2], [2]], [[4], [4]]]; // 2x2x1
237 const output = tf.image.resizeBilinear(input, [3, 3], false);
238 expectArraysClose(await output.data(), [2, 2, 2, 10 / 3, 10 / 3, 10 / 3, 4, 4, 4]);
239 });
240});
241describeWithFlags('resizeBilinear gradients', ALL_ENVS, () => {
242 it('greyscale: upscale, same aspect ratio', async () => {
243 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
244 const dy = tf.tensor3d([
245 [[1.0], [2.0], [3.0], [4.0]], [[5.0], [6.0], [7.0], [8.0]],
246 [[9.0], [10.0], [11.0], [12.0]], [[13.0], [14.0], [15.0], [16.0]]
247 ]);
248 const size = [4, 4];
249 const alignCorners = false;
250 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
251 const output = g(input, dy);
252 const expected = [6.0, 17.0, 38.0, 75.0];
253 expectArraysClose(await output.data(), expected);
254 });
255 it('with clones, greyscale: upscale, same aspect ratio', async () => {
256 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
257 const dy = tf.tensor3d([
258 [[1.0], [2.0], [3.0], [4.0]], [[5.0], [6.0], [7.0], [8.0]],
259 [[9.0], [10.0], [11.0], [12.0]], [[13.0], [14.0], [15.0], [16.0]]
260 ]);
261 const size = [4, 4];
262 const alignCorners = false;
263 const g = tf.grad((i) => tf.image.resizeBilinear(i.clone(), size, alignCorners).clone());
264 const output = g(input, dy);
265 const expected = [6.0, 17.0, 38.0, 75.0];
266 expectArraysClose(await output.data(), expected);
267 });
268 it('greyscale: upscale, same aspect ratio, align corners', async () => {
269 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
270 const dy = tf.tensor3d([
271 [[1.0], [2.0], [3.0], [4.0]], [[5.0], [6.0], [7.0], [8.0]],
272 [[9.0], [10.0], [11.0], [12.0]], [[13.0], [14.0], [15.0], [16.0]]
273 ]);
274 const size = [4, 4];
275 const alignCorners = true;
276 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
277 const output = g(input, dy);
278 const expected = [17.333330154418945, 23.999998092651367, 44.0, 50.66666793823242];
279 expectArraysClose(await output.data(), expected);
280 });
281 it('greyscale: upscale, taller than wider', async () => {
282 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
283 const dy = tf.tensor3d([
284 [[1.0], [2.0], [3.0], [4.0]], [[5.0], [6.0], [7.0], [8.0]],
285 [[9.0], [10.0], [11.0], [12.0]], [[13.0], [14.0], [15.0], [16.0]],
286 [[17.0], [18.0], [19.0], [20.0]], [[21.0], [22.0], [23.0], [24.0]],
287 [[25.0], [26.0], [27.0], [28.0]], [[29.0], [30.0], [31.0], [32.0]],
288 [[33.0], [34.0], [35.0], [36.0]]
289 ]);
290 const size = [9, 4];
291 const alignCorners = false;
292 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
293 const output = g(input, dy);
294 const expected = [
295 25.55555534362793, 55.5555534362793, 208.44444274902344, 376.4444274902344
296 ];
297 expectArraysClose(await output.data(), expected);
298 });
299 it('greyscale: upscale, taller than wider, align corners', async () => {
300 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
301 const dy = tf.tensor3d([
302 [[1.0], [2.0], [3.0], [4.0]], [[5.0], [6.0], [7.0], [8.0]],
303 [[9.0], [10.0], [11.0], [12.0]], [[13.0], [14.0], [15.0], [16.0]],
304 [[17.0], [18.0], [19.0], [20.0]], [[21.0], [22.0], [23.0], [24.0]],
305 [[25.0], [26.0], [27.0], [28.0]], [[29.0], [30.0], [31.0], [32.0]],
306 [[33.0], [34.0], [35.0], [36.0]]
307 ]);
308 const size = [9, 4];
309 const alignCorners = true;
310 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
311 const output = g(input, dy);
312 const expected = [99.0, 114.0, 219.00001525878906, 233.99998474121094];
313 expectArraysClose(await output.data(), expected);
314 });
315 it('greyscale: upscale, wider than taller', async () => {
316 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
317 const dy = tf.tensor3d([
318 [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0], [7.0]],
319 [[8.0], [9.0], [10.0], [11.0], [12.0], [13.0], [14.0]],
320 [[15.0], [16.0], [17.0], [18.0], [19.0], [20.0], [21.0]],
321 [[22.0], [23.0], [24.0], [25.0], [26.0], [27.0], [28.0]]
322 ]);
323 const size = [4, 7];
324 const alignCorners = false;
325 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
326 const output = g(input, dy);
327 const expected = [
328 14.428570747375488, 52.07142639160156, 98.71427917480469,
329 240.78573608398438
330 ];
331 expectArraysClose(await output.data(), expected);
332 });
333 it('greyscale: upscale, wider than taller, align corners', async () => {
334 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
335 const dy = tf.tensor3d([
336 [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0], [7.0]],
337 [[8.0], [9.0], [10.0], [11.0], [12.0], [13.0], [14.0]],
338 [[15.0], [16.0], [17.0], [18.0], [19.0], [20.0], [21.0]],
339 [[22.0], [23.0], [24.0], [25.0], [26.0], [27.0], [28.0]]
340 ]);
341 const size = [4, 7];
342 const alignCorners = true;
343 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
344 const output = g(input, dy);
345 const expected = [51.33332824707031, 70.0, 133.0, 151.66668701171875];
346 expectArraysClose(await output.data(), expected);
347 });
348 // Downscale
349 it('greyscale: downscale, same aspect ratio', async () => {
350 const input = tf.tensor3d([
351 [[100.0], [50.0], [25.0], [10.0]], [[60.0], [20.0], [80.0], [20.0]],
352 [[40.0], [15.0], [200.0], [203.0]], [[40.0], [10.0], [230.0], [200.0]]
353 ]);
354 const dy = tf.tensor3d([[[1.0], [2.0]], [[3.0], [4.0]]]);
355 const size = [2, 2];
356 const alignCorners = false;
357 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
358 const output = g(input, dy);
359 const expected = [
360 1.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0,
361 0.0
362 ];
363 expectArraysClose(await output.data(), expected);
364 });
365 it('greyscale: downscale, same aspect ratio, align corners', async () => {
366 const input = tf.tensor3d([
367 [[100.0], [50.0], [25.0], [10.0]], [[60.0], [20.0], [80.0], [20.0]],
368 [[40.0], [15.0], [200.0], [203.0]], [[40.0], [10.0], [230.0], [200.0]]
369 ]);
370 const dy = tf.tensor3d([[[1.0], [2.0]], [[3.0], [4.0]]]);
371 const size = [2, 2];
372 const alignCorners = true;
373 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
374 const output = g(input, dy);
375 const expected = [
376 1.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0,
377 4.0
378 ];
379 expectArraysClose(await output.data(), expected);
380 });
381 it('greyscale: downscale, taller than wider', async () => {
382 const input = tf.tensor3d([
383 [[100.0], [50.0], [25.0], [10.0]], [[60.0], [20.0], [80.0], [20.0]],
384 [[40.0], [15.0], [200.0], [203.0]], [[40.0], [10.0], [230.0], [200.0]]
385 ]);
386 const dy = tf.tensor3d([[[1.0], [2.0]], [[3.0], [4.0]], [[5.0], [6.0]]]);
387 const size = [3, 2];
388 const alignCorners = false;
389 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
390 const output = g(input, dy);
391 const expected = [
392 1.0, 0.0, 2.0, 0.0, 1.9999998807907104, 0.0, 2.6666665077209473, 0.0,
393 2.6666665077209473, 0.0, 3.3333330154418945, 0.0, 3.333333730697632, 0.0,
394 4.000000476837158, 0.0
395 ];
396 expectArraysClose(await output.data(), expected);
397 });
398 it('greyscale: downscale, taller than wider, align corners', async () => {
399 const input = tf.tensor3d([
400 [[100.0], [50.0], [25.0], [10.0]], [[60.0], [20.0], [80.0], [20.0]],
401 [[40.0], [15.0], [200.0], [203.0]], [[40.0], [10.0], [230.0], [200.0]]
402 ]);
403 const dy = tf.tensor3d([[[1.0], [2.0]], [[3.0], [4.0]], [[5.0], [6.0]]]);
404 const size = [3, 2];
405 const alignCorners = true;
406 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
407 const output = g(input, dy);
408 const expected = [
409 1.0, 0.0, 0.0, 2.0, 1.5, 0.0, 0.0, 2.0, 1.5, 0.0, 0.0, 2.0, 5.0, 0.0, 0.0,
410 6.0
411 ];
412 expectArraysClose(await output.data(), expected);
413 });
414 it('greyscale: downscale, wider than taller', async () => {
415 const input = tf.tensor3d([
416 [[100.0], [50.0], [25.0], [10.0]], [[60.0], [20.0], [80.0], [20.0]],
417 [[40.0], [15.0], [200.0], [203.0]], [[40.0], [10.0], [230.0], [200.0]]
418 ]);
419 const dy = tf.tensor3d([[[1.0], [2.0], [3.0]], [[4.0], [5.0], [6.0]]]);
420 const size = [2, 3];
421 const alignCorners = false;
422 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
423 const output = g(input, dy);
424 const expected = [
425 1.0, 1.3333332538604736, 1.6666665077209473, 2.000000238418579, 0.0, 0.0,
426 0.0, 0.0, 4.0, 3.3333330154418945, 3.6666665077209473, 4.000000476837158,
427 0.0, 0.0, 0.0, 0.0
428 ];
429 expectArraysClose(await output.data(), expected);
430 });
431 it('greyscale: downscale, wider than taller, align corners', async () => {
432 const input = tf.tensor3d([
433 [[100.0], [50.0], [25.0], [10.0]], [[60.0], [20.0], [80.0], [20.0]],
434 [[40.0], [15.0], [200.0], [203.0]], [[40.0], [10.0], [230.0], [200.0]]
435 ]);
436 const dy = tf.tensor3d([[[1.0], [2.0], [3.0]], [[4.0], [5.0], [6.0]]]);
437 const size = [2, 3];
438 const alignCorners = true;
439 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
440 const output = g(input, dy);
441 const expected = [
442 1.0, 1.0, 1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 2.5, 2.5,
443 6.0
444 ];
445 expectArraysClose(await output.data(), expected);
446 });
447 // No Op
448 it('greyscale: same size', async () => {
449 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
450 const dy = tf.tensor3d([[[1.0], [2.0]], [[3.0], [4.0]]]);
451 const size = [2, 2];
452 const alignCorners = false;
453 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
454 const output = g(input, dy);
455 const expected = [1.0, 2.0, 3.0, 4.0];
456 expectArraysClose(await output.data(), expected);
457 });
458 it('greyscale: same size, align corners', async () => {
459 const input = tf.tensor3d([[[100.0], [50.0]], [[60.0], [20.0]]]);
460 const dy = tf.tensor3d([[[1.0], [2.0]], [[3.0], [4.0]]]);
461 const size = [2, 2];
462 const alignCorners = true;
463 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
464 const output = g(input, dy);
465 const expected = [1.0, 2.0, 3.0, 4.0];
466 expectArraysClose(await output.data(), expected);
467 });
468 // 3 channel upscale
469 it('color: upscale, wider than taller', async () => {
470 const input = tf.tensor3d([
471 [
472 [115.11029815673828, 111.90936279296875, 66.87433624267578],
473 [72.03849029541016, 81.86637878417969, 119.53585815429688]
474 ],
475 [
476 [68.555419921875, 97.49642181396484, 116.90741729736328],
477 [128.69467163085938, 86.78314208984375, 104.3116683959961]
478 ]
479 ]);
480 const dy = tf.tensor3d([
481 [
482 [1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0],
483 [13.0, 14.0, 15.0]
484 ],
485 [
486 [16.0, 17.0, 18.0], [19.0, 20.0, 21.0], [22.0, 23.0, 24.0],
487 [25.0, 26.0, 27.0], [28.0, 29.0, 30.0]
488 ],
489 [
490 [31.0, 32.0, 33.0], [34.0, 35.0, 36.0], [37.0, 38.0, 39.0],
491 [40.0, 41.0, 42.0], [43.0, 44.0, 45.0]
492 ]
493 ]);
494 const size = [3, 5];
495 const alignCorners = false;
496 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
497 const output = g(input, dy);
498 const expected = [
499 15.399999618530273, 17.799999237060547, 20.19999885559082,
500 56.26666259765625, 60.533329010009766, 64.79999542236328,
501 80.00000762939453, 83.0, 86.0, 178.33334350585938, 183.66668701171875,
502 189.00001525878906
503 ];
504 expectArraysClose(await output.data(), expected);
505 });
506 it('color: upscale, wider than taller, align corners', async () => {
507 const input = tf.tensor3d([
508 [
509 [115.11029815673828, 111.90936279296875, 66.87433624267578],
510 [72.03849029541016, 81.86637878417969, 119.53585815429688]
511 ],
512 [
513 [68.555419921875, 97.49642181396484, 116.90741729736328],
514 [128.69467163085938, 86.78314208984375, 104.3116683959961]
515 ]
516 ]);
517 const dy = tf.tensor3d([
518 [
519 [1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0],
520 [13.0, 14.0, 15.0]
521 ],
522 [
523 [16.0, 17.0, 18.0], [19.0, 20.0, 21.0], [22.0, 23.0, 24.0],
524 [25.0, 26.0, 27.0], [28.0, 29.0, 30.0]
525 ],
526 [
527 [31.0, 32.0, 33.0], [34.0, 35.0, 36.0], [37.0, 38.0, 39.0],
528 [40.0, 41.0, 42.0], [43.0, 44.0, 45.0]
529 ]
530 ]);
531 const size = [3, 5];
532 const alignCorners = true;
533 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
534 const output = g(input, dy);
535 const expected = [
536 33.75, 37.5, 41.25, 56.25, 60.0, 63.75, 108.75, 112.5, 116.25, 131.25,
537 135.0, 138.75
538 ];
539 expectArraysClose(await output.data(), expected);
540 });
541 // 3 channel downscale
542 it('color: downscale, taller than wider', async () => {
543 const input = tf.tensor3d([
544 [
545 [120.68856811523438, 134.51638793945312, 83.03671264648438],
546 [121.58008575439453, 113.28836059570312, 136.3172149658203],
547 [79.38370513916016, 101.87127685546875, 104.54979705810547],
548 [96.31678771972656, 111.77168273925781, 83.73509979248047]
549 ],
550 [
551 [119.45088195800781, 88.98846435546875, 97.47553253173828],
552 [117.5562973022461, 108.26356506347656, 99.62212371826172],
553 [136.62701416015625, 94.10433197021484, 80.97366333007812],
554 [83.61205291748047, 90.60148620605469, 81.82512664794922]
555 ],
556 [
557 [103.0362777709961, 123.1098403930664, 125.62944030761719],
558 [92.2915267944336, 103.15729522705078, 119.18060302734375],
559 [102.93293762207031, 117.821044921875, 99.40152740478516],
560 [96.32952117919922, 105.80963134765625, 104.8491439819336]
561 ],
562 [
563 [104.87507629394531, 134.0189208984375, 111.02627563476562],
564 [85.4534683227539, 107.68426513671875, 103.03722381591797],
565 [89.70533752441406, 98.25298309326172, 78.42916870117188],
566 [113.6744613647461, 95.8189697265625, 122.75005340576172]
567 ]
568 ]);
569 const dy = tf.tensor3d([[[1.0, 2.0, 3.0]], [[4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0]]]);
570 const size = [3, 1];
571 const alignCorners = false;
572 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
573 const output = g(input, dy);
574 const expected = [
575 1.0,
576 2.0,
577 3.0,
578 0.0,
579 0.0,
580 0.0,
581 0.0,
582 0.0,
583 0.0,
584 0.0,
585 0.0,
586 0.0,
587 2.6666665077209473,
588 3.3333330154418945,
589 3.999999761581421,
590 0.0,
591 0.0,
592 0.0,
593 0.0,
594 0.0,
595 0.0,
596 0.0,
597 0.0,
598 0.0,
599 3.666666269302368,
600 4.3333330154418945,
601 4.999999523162842,
602 0.0,
603 0.0,
604 0.0,
605 0.0,
606 0.0,
607 0.0,
608 0.0,
609 0.0,
610 0.0,
611 4.6666669845581055,
612 5.333333969116211,
613 6.000000953674316,
614 0.0,
615 0.0,
616 0.0,
617 0.0,
618 0.0,
619 0.0,
620 0.0,
621 0.0,
622 0.0
623 ];
624 expectArraysClose(await output.data(), expected);
625 });
626 it('color: downscale, width = 1, align corners', async () => {
627 const input = tf.tensor3d([
628 [
629 [120.68856811523438, 134.51638793945312, 83.03671264648438],
630 [121.58008575439453, 113.28836059570312, 136.3172149658203],
631 [79.38370513916016, 101.87127685546875, 104.54979705810547],
632 [96.31678771972656, 111.77168273925781, 83.73509979248047]
633 ],
634 [
635 [119.45088195800781, 88.98846435546875, 97.47553253173828],
636 [117.5562973022461, 108.26356506347656, 99.62212371826172],
637 [136.62701416015625, 94.10433197021484, 80.97366333007812],
638 [83.61205291748047, 90.60148620605469, 81.82512664794922]
639 ],
640 [
641 [103.0362777709961, 123.1098403930664, 125.62944030761719],
642 [92.2915267944336, 103.15729522705078, 119.18060302734375],
643 [102.93293762207031, 117.821044921875, 99.40152740478516],
644 [96.32952117919922, 105.80963134765625, 104.8491439819336]
645 ],
646 [
647 [104.87507629394531, 134.0189208984375, 111.02627563476562],
648 [85.4534683227539, 107.68426513671875, 103.03722381591797],
649 [89.70533752441406, 98.25298309326172, 78.42916870117188],
650 [113.6744613647461, 95.8189697265625, 122.75005340576172]
651 ]
652 ]);
653 const dy = tf.tensor3d([[[1.0, 2.0, 3.0]], [[4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0]]]);
654 const size = [3, 1];
655 const alignCorners = true;
656 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
657 const output = g(input, dy);
658 const expected = [
659 1.0, 2.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
660 2.0, 2.5, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
661 2.0, 2.5, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
662 7.0, 8.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
663 ];
664 expectArraysClose(await output.data(), expected);
665 });
666 it('color: downscale, height = 1, align corners', async () => {
667 const input = tf.tensor3d([
668 [
669 [120.68856811523438, 134.51638793945312, 83.03671264648438],
670 [121.58008575439453, 113.28836059570312, 136.3172149658203],
671 [79.38370513916016, 101.87127685546875, 104.54979705810547],
672 [96.31678771972656, 111.77168273925781, 83.73509979248047]
673 ],
674 [
675 [119.45088195800781, 88.98846435546875, 97.47553253173828],
676 [117.5562973022461, 108.26356506347656, 99.62212371826172],
677 [136.62701416015625, 94.10433197021484, 80.97366333007812],
678 [83.61205291748047, 90.60148620605469, 81.82512664794922]
679 ],
680 [
681 [103.0362777709961, 123.1098403930664, 125.62944030761719],
682 [92.2915267944336, 103.15729522705078, 119.18060302734375],
683 [102.93293762207031, 117.821044921875, 99.40152740478516],
684 [96.32952117919922, 105.80963134765625, 104.8491439819336]
685 ],
686 [
687 [104.87507629394531, 134.0189208984375, 111.02627563476562],
688 [85.4534683227539, 107.68426513671875, 103.03722381591797],
689 [89.70533752441406, 98.25298309326172, 78.42916870117188],
690 [113.6744613647461, 95.8189697265625, 122.75005340576172]
691 ]
692 ]);
693 const dy = tf.tensor3d([[[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]]);
694 const size = [1, 3];
695 const alignCorners = true;
696 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
697 const output = g(input, dy);
698 const expected = [
699 1., 2., 3., 2., 2.5, 3., 2., 2.5, 3., 7., 8., 9., 0., 0., 0., 0.,
700 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
701 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
702 ];
703 expectArraysClose(await output.data(), expected);
704 });
705 it('color: downscale, taller than wider, align corners', async () => {
706 const input = tf.tensor3d([
707 [
708 [120.68856811523438, 134.51638793945312, 83.03671264648438],
709 [121.58008575439453, 113.28836059570312, 136.3172149658203],
710 [79.38370513916016, 101.87127685546875, 104.54979705810547],
711 [96.31678771972656, 111.77168273925781, 83.73509979248047]
712 ],
713 [
714 [119.45088195800781, 88.98846435546875, 97.47553253173828],
715 [117.5562973022461, 108.26356506347656, 99.62212371826172],
716 [136.62701416015625, 94.10433197021484, 80.97366333007812],
717 [83.61205291748047, 90.60148620605469, 81.82512664794922]
718 ],
719 [
720 [103.0362777709961, 123.1098403930664, 125.62944030761719],
721 [92.2915267944336, 103.15729522705078, 119.18060302734375],
722 [102.93293762207031, 117.821044921875, 99.40152740478516],
723 [96.32952117919922, 105.80963134765625, 104.8491439819336]
724 ],
725 [
726 [104.87507629394531, 134.0189208984375, 111.02627563476562],
727 [85.4534683227539, 107.68426513671875, 103.03722381591797],
728 [89.70533752441406, 98.25298309326172, 78.42916870117188],
729 [113.6744613647461, 95.8189697265625, 122.75005340576172]
730 ]
731 ]);
732 const dy = tf.tensor3d([
733 [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]],
734 [[13.0, 14.0, 15.0], [16.0, 17.0, 18.0]]
735 ]);
736 const size = [3, 2];
737 const alignCorners = true;
738 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
739 const output = g(input, dy);
740 const expected = [
741 1.0, 2.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 5.0, 6.0,
742 3.5, 4.0, 4.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 5.5, 6.0,
743 3.5, 4.0, 4.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 5.5, 6.0,
744 13.0, 14.0, 15.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 17.0, 18.0
745 ];
746 expectArraysClose(await output.data(), expected);
747 });
748 // 3 channel no-op
749 it('color: same size', async () => {
750 const input = tf.tensor3d([
751 [
752 [115.11029815673828, 111.90936279296875, 66.87433624267578],
753 [72.03849029541016, 81.86637878417969, 119.53585815429688]
754 ],
755 [
756 [68.555419921875, 97.49642181396484, 116.90741729736328],
757 [128.69467163085938, 86.78314208984375, 104.3116683959961]
758 ]
759 ]);
760 const dy = tf.tensor3d([
761 [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]
762 ]);
763 const size = [2, 2];
764 const alignCorners = false;
765 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
766 const output = g(input, dy);
767 const expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0];
768 expectArraysClose(await output.data(), expected);
769 });
770 it('color: same size, align corners', async () => {
771 const input = tf.tensor3d([
772 [
773 [115.11029815673828, 111.90936279296875, 66.87433624267578],
774 [72.03849029541016, 81.86637878417969, 119.53585815429688]
775 ],
776 [
777 [68.555419921875, 97.49642181396484, 116.90741729736328],
778 [128.69467163085938, 86.78314208984375, 104.3116683959961]
779 ]
780 ]);
781 const dy = tf.tensor3d([
782 [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]
783 ]);
784 const size = [2, 2];
785 const alignCorners = true;
786 const g = tf.grad((i) => tf.image.resizeBilinear(i, size, alignCorners));
787 const output = g(input, dy);
788 const expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0];
789 expectArraysClose(await output.data(), expected);
790 });
791});
792//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9yZXNpemVfYmlsaW5lYXJfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUNqRCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsaUJBQWlCLENBQ2IsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEQsTUFBTSxLQUFLLEdBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEQsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FDckI7WUFDRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUMxRCxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVO1lBQzFELFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLEVBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5ELGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JDLFNBQVMsRUFBRyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxVQUFVO1lBQ3ZFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFHLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUN0RSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDdEUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO1NBQ3ZFLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdCQUFnQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsaUJBQWlCLENBQ2IsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJEQUEyRDtRQUN2RCx1QkFBdUIsRUFDM0IsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUNyQjtZQUNFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVU7WUFDM0QsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDMUQsVUFBVSxFQUFFLFVBQVU7U0FDdkIsRUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXpELGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JDLFNBQVMsRUFBRSxRQUFRLEVBQUcsUUFBUSxFQUFHLFNBQVMsRUFBRyxTQUFTLEVBQUUsQ0FBQyxTQUFTO1lBQ2xFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxTQUFTLEVBQUUsU0FBUztZQUNqRSxRQUFRLEVBQUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztZQUNqRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUcsU0FBUyxFQUFFLFNBQVM7WUFDakUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFHLFFBQVEsRUFBRyxTQUFTO1lBQ2pFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRyxPQUFPLEVBQUksU0FBUztZQUNqRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRU4sRUFBRSxDQUFDLDBDQUEwQztRQUN0Qyx1QkFBdUIsRUFDM0IsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxNQUFNLE1BQU0sR0FDUixLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRSxpQkFBaUIsQ0FDYixNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFDbkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFFTixFQUFFLENBQUMsd0NBQXdDO1FBQ3BDLHVCQUF1QixFQUMzQixLQUFLLElBQUksRUFBRTtRQUNULE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEI7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDM0QsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDM0QsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDM0QsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQzthQUMzRDtZQUNEO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7YUFDMUQ7WUFDRDtnQkFDRSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDO2dCQUN6RCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztnQkFDM0QsQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDekQsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQzthQUMxRDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXpELE1BQU0sUUFBUSxHQUFHO1lBQ2YsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU87WUFDdEUsT0FBTztTQUNSLENBQUM7UUFDRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVOLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUNyQjtZQUNFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVU7WUFDM0QsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDMUQsVUFBVSxFQUFFLFVBQVU7U0FDdkIsRUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLFVBQVU7WUFDdkUsU0FBUyxFQUFHLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRyxVQUFVO1lBQ3RFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUN0RSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDdEUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO1lBQ3RFLFNBQVMsRUFBRyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUN0RSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3RFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQ3JCO1lBQ0UsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDMUQsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUMxRCxVQUFVLEVBQUUsVUFBVTtTQUN2QixFQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRCxpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQyxTQUFTLEVBQUcsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUcsVUFBVSxFQUFFLFVBQVU7WUFDdkUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7WUFDdkUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUcsVUFBVSxFQUFHLFVBQVUsRUFBRSxVQUFVO1lBQ3ZFLFVBQVUsRUFBRSxTQUFTLEVBQUcsVUFBVSxFQUFFLFVBQVUsRUFBRyxVQUFVLEVBQUUsVUFBVTtZQUN2RSxPQUFPLEVBQUssVUFBVSxFQUFFLFNBQVMsRUFBRyxVQUFVLEVBQUcsVUFBVSxFQUFFLFVBQVU7WUFDdkUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFHLFVBQVUsRUFBRSxVQUFVO1lBQ3ZFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7U0FDL0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVyRSxpQkFBaUIsQ0FDYixNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFDbkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QjtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDMUQsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQzthQUMxRDtZQUNEO2dCQUNFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzFELENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzFELENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQ3pELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7WUFDRDtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2dCQUMzRCxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2dCQUN6RCxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixDQUFDO2FBQzFEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRCxNQUFNLFFBQVEsR0FBRztZQUNmLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUztZQUNoRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVU7U0FDakMsQ0FBQztRQUNGLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEI7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDM0QsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDM0QsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDM0QsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQzthQUMzRDtZQUNEO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7YUFDMUQ7WUFDRDtnQkFDRSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDO2dCQUN6RCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztnQkFDM0QsQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDekQsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQzthQUMxRDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEQsTUFBTSxRQUFRLEdBQUc7WUFDZixTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRO1lBQ3pFLFNBQVMsRUFBRSxPQUFPO1NBQ25CLENBQUM7UUFDRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxDQUFDLEdBQUcsK0RBQStELENBQUM7UUFDMUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQWlCLEVBQUU7WUFDdEQsQ0FBQyxFQUFFLENBQUM7U0FDTCxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDNUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLFFBQVE7UUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELGlCQUFpQixDQUNiLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxpQkFBaUIsQ0FBQywwQkFBMEIsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO0lBQzNELEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLEdBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFeEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXpDLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsRSxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUNmLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFekMsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xFLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQ1YsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUV0RSxpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLEdBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFeEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRztZQUNmLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQjtTQUMzRSxDQUFDO1FBRUYsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFdkUsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLEdBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFeEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRztZQUNmLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQjtZQUN4RCxrQkFBa0I7U0FDbkIsQ0FBQztRQUVGLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pELENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFdEUsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZO0lBRVosRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RSxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RCxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQ3pFLEdBQUc7U0FDSixDQUFDO1FBRUYsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZFLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUc7WUFDZixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDekUsR0FBRztTQUNKLENBQUM7UUFFRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RSxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxHQUFHO1lBQ3BFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsR0FBRztZQUN4RSxpQkFBaUIsRUFBRSxHQUFHO1NBQ3ZCLENBQUM7UUFFRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RSxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQ3pFLEdBQUc7U0FDSixDQUFDO1FBRUYsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZFLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RSxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsR0FBRyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQ3hFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQjtZQUN4RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1NBQ25CLENBQUM7UUFFRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZFLE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUc7WUFDZixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDekUsR0FBRztTQUNKLENBQUM7UUFFRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVE7SUFFUixFQUFFLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekQsTUFBTSxJQUFJLEdBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFeEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXRDLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25ELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV0QyxpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILG9CQUFvQjtJQUNwQixFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QjtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQ3hELENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3JCO2dCQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQ3JFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7YUFDbkI7WUFDRDtnQkFDRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQzFELENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ3ZDO1lBQ0Q7Z0JBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUMxRCxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzthQUN2QztTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUc7WUFDZixrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUI7WUFDekQsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCO1lBQ3hELGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCO1lBQ3JFLGtCQUFrQjtTQUNuQixDQUFDO1FBRUYsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QjtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQ3hELENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3JCO2dCQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQ3JFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7YUFDbkI7WUFDRDtnQkFDRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQzFELENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ3ZDO1lBQ0Q7Z0JBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUMxRCxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzthQUN2QztTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQ3JFLEtBQUssRUFBRSxNQUFNO1NBQ2QsQ0FBQztRQUVGLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsc0JBQXNCO0lBRXRCLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzNELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7WUFDRDtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2dCQUMxRCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMxRCxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2dCQUMxRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2FBQzFEO1lBQ0Q7Z0JBQ0UsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDekQsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQzthQUMzRDtZQUNEO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzNELENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQ3pELENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7YUFDMUQ7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FDSixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUc7WUFDZixHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7U0FDSixDQUFDO1FBRUYsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QjtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDMUQsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQzthQUMxRDtZQUNEO2dCQUNFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzFELENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzFELENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQ3pELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7WUFDRDtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2dCQUMzRCxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2dCQUN6RCxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixDQUFDO2FBQzFEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEdBQ0osRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQzFELEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUMxRCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDMUQsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1NBQzNELENBQUM7UUFDRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzNELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7WUFDRDtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2dCQUMxRCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMxRCxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2dCQUMxRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2FBQzFEO1lBQ0Q7Z0JBQ0UsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDekQsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQzthQUMzRDtZQUNEO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzNELENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQ3pELENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7YUFDMUQ7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRSxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNoRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ2hFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7U0FDakUsQ0FBQztRQUNGLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEI7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDM0QsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQztnQkFDM0QsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDM0QsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQzthQUMzRDtZQUNEO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzFELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7YUFDMUQ7WUFDRDtnQkFDRSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUMxRCxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDO2dCQUN6RCxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztnQkFDM0QsQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztnQkFDMUQsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztnQkFDekQsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQzthQUMxRDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDckIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6QyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHO1lBQ2YsR0FBRyxFQUFHLEdBQUcsRUFBRyxHQUFHLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFHLEdBQUcsRUFBRyxHQUFHO1lBQy9ELEdBQUcsRUFBRyxHQUFHLEVBQUcsR0FBRyxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRyxHQUFHLEVBQUcsR0FBRztZQUMvRCxHQUFHLEVBQUcsR0FBRyxFQUFHLEdBQUcsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUcsR0FBRyxFQUFHLEdBQUc7WUFDL0QsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO1NBQ2pFLENBQUM7UUFDRixpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILGtCQUFrQjtJQUVsQixFQUFFLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QjtnQkFDRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDO2dCQUMzRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO2FBQzNEO1lBQ0Q7Z0JBQ0UsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7Z0JBQ3hELENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7YUFDM0Q7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMxRSxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUNWLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxpQkFBaUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCO2dCQUNFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUM7YUFDM0Q7WUFDRDtnQkFDRSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztnQkFDeEQsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQzthQUMzRDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDckIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFFLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDYixDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQ1YsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHRmIGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7QUxMX0VOVlMsIGRlc2NyaWJlV2l0aEZsYWdzfSBmcm9tICcuLi8uLi9qYXNtaW5lX3V0aWwnO1xuaW1wb3J0IHtleHBlY3RBcnJheXNDbG9zZX0gZnJvbSAnLi4vLi4vdGVzdF91dGlsJztcblxuZGVzY3JpYmVXaXRoRmxhZ3MoJ3Jlc2l6ZUJpbGluZWFyJywgQUxMX0VOVlMsICgpID0+IHtcbiAgaXQoJ3NpbXBsZSBhbGlnbkNvcm5lcnM9ZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbMiwgMiwgNCwgNF0sIFsyLCAyLCAxXSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gaW5wdXQucmVzaXplQmlsaW5lYXIoWzMsIDNdLCBmYWxzZSk7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShcbiAgICAgICAgYXdhaXQgb3V0cHV0LmRhdGEoKSwgWzIsIDIsIDIsIDEwIC8gMywgMTAgLyAzLCAxMCAvIDMsIDQsIDQsIDRdKTtcbiAgfSk7XG5cbiAgaXQoJzV4NS1iaWxpbmVhciwgbm8gY2hhbmdlIGluIHNoYXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGltYWdlOiB0Zi5UZW5zb3I0RCA9IHRmLm9uZXMoWzEsIDUsIDUsIDNdKTtcblxuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IG91dHB1dCA9IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGltYWdlLCBbNSwgNV0sIGFsaWduQ29ybmVycyk7XG5cbiAgICBleHBlY3Qob3V0cHV0LnNoYXBlKS50b0VxdWFsKFsxLCA1LCA1LCAzXSk7XG4gICAgZXhwZWN0KG91dHB1dC5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGF3YWl0IGltYWdlLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdzaW1wbGUgYWxpZ25Db3JuZXJzPXRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbMiwgMiwgNCwgNF0sIFsyLCAyLCAxXSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gaW5wdXQucmVzaXplQmlsaW5lYXIoWzMsIDNdLCB0cnVlKTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIFsyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0XSk7XG4gIH0pO1xuXG4gIGl0KCd3b3JrcyB3aGVuIHJvd3MgYXJlIGNvcGllZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFxuICAgICAgICBbXG4gICAgICAgICAgMS41NjMyNDUzMSwgMi4xMzgxNzc1MiwgMS40NDM5ODQyMSwgMS4wNzYzMjY4NCwgMC41OTMwNjc4NSxcbiAgICAgICAgICAtMC4zNjk3MDg2NSwgMS42MjQ1MTg3OSwgMS44MzY3MzM0LCAxLjEzOTQ0Nzk4LCAyLjAxOTkzMjE4LFxuICAgICAgICAgIDIuMDE5MTk5NTIsIDIuNjc1MjQwNTRcbiAgICAgICAgXSxcbiAgICAgICAgWzIsIDMsIDJdKTtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnB1dC5yZXNpemVCaWxpbmVhcihbNCwgM10sIGZhbHNlKTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIFtcbiAgICAgIDEuNTYzMjQ1MywgIDIuMTM4MTc3NjMsIDEuNDQzOTg0MTUsIDEuMDc2MzI2ODUsIDAuNTkzMDY3ODIsIC0wLjM2OTcwODY2LFxuICAgICAgMS41OTM4ODIwOCwgMS45ODc0NTU0OSwgMS4yOTE3MTYxLCAgMS41NDgxMjk1NiwgMS4zMDYxMzM3NSwgMS4xNTI3NjU4NyxcbiAgICAgIDEuNjI0NTE4NzUsIDEuODM2NzMzMzQsIDEuMTM5NDQ3OTMsIDIuMDE5OTMyMjcsIDIuMDE5MTk5NjEsIDIuNjc1MjQwNTIsXG4gICAgICAxLjYyNDUxODc1LCAxLjgzNjczMzM0LCAxLjEzOTQ0NzkzLCAyLjAxOTkzMjI3LCAyLjAxOTE5OTYxLCAyLjY3NTI0MDUyXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCd3b3JrcyBmb3IgaW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0LCA1XSwgWzEsIDUsIDFdLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnB1dC5yZXNpemVCaWxpbmVhcihbMSwgMTBdLCBmYWxzZSk7XG5cbiAgICBleHBlY3Qob3V0cHV0LnNoYXBlKS50b0VxdWFsKFsxLCAxMCwgMV0pO1xuICAgIGV4cGVjdChvdXRwdXQuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShcbiAgICAgICAgYXdhaXQgb3V0cHV0LmRhdGEoKSwgWzEsIDEuNSwgMiwgMi41LCAzLCAzLjUsIDQsIDQuNSwgNSwgNV0pO1xuICB9KTtcblxuICBpdCgnbWF0Y2hlcyB0ZW5zb3JmbG93IHcvIHJhbmRvbSBudW1iZXJzIGFsaWduQ29ybmVycz1mYWxzZSwgJyArXG4gICAgICAgICAnaGFsZlBpeGVsQ2VudGVycz10cnVlJyxcbiAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoXG4gICAgICAgICAgIFtcbiAgICAgICAgICAgICAxLjE5MDc0MDQ0LCAwLjkxMzczMTA0LCAyLjAxNjExNjY5LCAtMC41MjI3MDgzMiwgMC4zODcyNTM5NSxcbiAgICAgICAgICAgICAxLjMwODA5Nzc5LCAwLjYxODM1MTQzLCAzLjQ5NjAwNjU5LCAyLjA5MjMwOTg2LCAwLjU2NDczOTk3LFxuICAgICAgICAgICAgIDAuMDM4MjM5NDMsIDEuMTk4NjQ4OTZcbiAgICAgICAgICAgXSxcbiAgICAgICAgICAgWzIsIDMsIDJdKTtcbiAgICAgICBjb25zdCBvdXRwdXQgPSBpbnB1dC5yZXNpemVCaWxpbmVhcihbNCwgNV0sIGZhbHNlLCB0cnVlKTtcblxuICAgICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIFtcbiAgICAgICAgIDEuMTkwNzQwNSwgMC45MTM3MzEsICAxLjUyMDg5MSwgIDAuMzM5MTU1MywgIDIuMDE2MTE2NiwgLTAuNTIyNzA4MyxcbiAgICAgICAgIDEuMDM4Nzk4OCwgMC41NzU3NzU2LCAwLjM4NzI1MzksIDEuMzA4MDk3OCwgIDEuMDQ3NjQzMiwgMS41NTkyOTk5LFxuICAgICAgICAgMS40NDI2NTIsICAwLjgzNTI0MTQsIDIuMDM1MTY0OCwgLTAuMjUwODQ2MiwgMC45OTQwNjU5LCAwLjY2ODEwMzEsXG4gICAgICAgICAwLjMwMDAwMDMsIDEuMjgwNzM1NiwgMC43NjE0NDg3LCAyLjg1MDQzNzYsICAxLjI4NjE3MzgsIDEuODI3NDEzNixcbiAgICAgICAgIDIuMDczMjYxNywgMC4yOTI4Nzc5LCAwLjkwNDYwMDIsIDAuODUyNzU3OSwgIDAuMTI1NDkzLCAgMS4yMjYwMTEyLFxuICAgICAgICAgMC42MTgzNTE1LCAzLjQ5NjAwNjUsIDEuMjA3OTM0OSwgMi4zMjM0OTk3LCAgMi4wOTIzMSwgICAwLjU2NDczOTksXG4gICAgICAgICAwLjg1OTg2NzMsIDAuOTQ1MDg1NCwgMC4wMzgyMzk0LCAxLjE5ODY0ODlcbiAgICAgICBdKTtcbiAgICAgfSk7XG5cbiAgaXQoJ2JhdGNoIG9mIDIsIHNpbXBsZSwgYWxpZ25Db3JuZXJzPWZhbHNlLCAnICtcbiAgICAgICAgICdoYWxmUGl4ZWxDZW50ZXJzPXRydWUnLFxuICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3I0ZChbMiwgMiwgNCwgNCwgMywgMywgNSwgNV0sIFsyLCAyLCAyLCAxXSk7XG4gICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgICAgaW5wdXQucmVzaXplQmlsaW5lYXIoWzMsIDNdLCBmYWxzZSAvKiBhbGlnbkNvcm5lcnMgKi8sIHRydWUpO1xuXG4gICAgICAgZXhwZWN0QXJyYXlzQ2xvc2UoXG4gICAgICAgICAgIGF3YWl0IG91dHB1dC5kYXRhKCksXG4gICAgICAgICAgIFsyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1XSk7XG4gICAgIH0pO1xuXG4gIGl0KCd0YXJnZXQgd2lkdGggPSAxLCBhbGlnbkNvcm5lcnM9ZmFsc2UsICcgK1xuICAgICAgICAgJ2hhbGZQaXhlbENlbnRlcnM9dHJ1ZScsXG4gICAgIGFzeW5jICgpID0+IHtcbiAgICAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgICAgIFtcbiAgICAgICAgICAgWzEyMC42ODg1NjgxMTUyMzQzOCwgMTM0LjUxNjM4NzkzOTQ1MzEyLCA4My4wMzY3MTI2NDY0ODQzOF0sXG4gICAgICAgICAgIFsxMjEuNTgwMDg1NzU0Mzk0NTMsIDExMy4yODgzNjA1OTU3MDMxMiwgMTM2LjMxNzIxNDk2NTgyMDNdLFxuICAgICAgICAgICBbNzkuMzgzNzA1MTM5MTYwMTYsIDEwMS44NzEyNzY4NTU0Njg3NSwgMTA0LjU0OTc5NzA1ODEwNTQ3XSxcbiAgICAgICAgICAgWzk2LjMxNjc4NzcxOTcyNjU2LCAxMTEuNzcxNjgyNzM5MjU3ODEsIDgzLjczNTA5OTc5MjQ4MDQ3XVxuICAgICAgICAgXSxcbiAgICAgICAgIFtcbiAgICAgICAgICAgWzExOS40NTA4ODE5NTgwMDc4MSwgODguOTg4NDY0MzU1NDY4NzUsIDk3LjQ3NTUzMjUzMTczODI4XSxcbiAgICAgICAgICAgWzExNy41NTYyOTczMDIyNDYxLCAxMDguMjYzNTY1MDYzNDc2NTYsIDk5LjYyMjEyMzcxODI2MTcyXSxcbiAgICAgICAgICAgWzEzNi42MjcwMTQxNjAxNTYyNSwgOTQuMTA0MzMxOTcwMjE0ODQsIDgwLjk3MzY2MzMzMDA3ODEyXSxcbiAgICAgICAgICAgWzgzLjYxMjA1MjkxNzQ4MDQ3LCA5MC42MDE0ODYyMDYwNTQ2OSwgODEuODI1MTI2NjQ3OTQ5MjJdXG4gICAgICAgICBdLFxuICAgICAgICAgW1xuICAgICAgICAgICBbMTAzLjAzNjI3Nzc3MDk5NjEsIDEyMy4xMDk4NDAzOTMwNjY0LCAxMjUuNjI5NDQwMzA3NjE3MTldLFxuICAgICAgICAgICBbOTIuMjkxNTI2Nzk0NDMzNiwgMTAzLjE1NzI5NTIyNzA1MDc4LCAxMTkuMTgwNjAzMDI3MzQzNzVdLFxuICAgICAgICAgICBbMTAyLjkzMjkzNzYyMjA3MDMxLCAxMTcuODIxMDQ0OTIxODc1LCA5OS40MDE1Mjc0MDQ3ODUxNl0sXG4gICAgICAgICAgIFs5Ni4zMjk1MjExNzkxOTkyMiwgMTA1LjgwOTYzMTM0NzY1NjI1LCAxMDQuODQ5MTQzOTgxOTMzNl1cbiAgICAgICAgIF0sXG4gICAgICAgICBbXG4gICAgICAgICAgIFsxMDQuODc1MDc2MjkzOTQ1MzEsIDEzNC4wMTg5MjA4OTg0Mzc1LCAxMTEuMDI2Mjc1NjM0NzY1NjJdLFxuICAgICAgICAgICBbODUuNDUzNDY4MzIyNzUzOSwgMTA3LjY4NDI2NTEzNjcxODc1LCAxMDMuMDM3MjIzODE1OTE3OTddLFxuICAgICAgICAgICBbODkuNzA1MzM3NTI0NDE0MDYsIDk4LjI1Mjk4MzA5MzI2MTcyLCA3OC40MjkxNjg3MDExNzE4OF0sXG4gICAgICAgICAgIFsxMTMuNjc0NDYxMzY0NzQ2MSwgOTUuODE4OTY5NzI2NTYyNSwgMTIyLjc1MDA1MzQwNTc2MTcyXVxuICAgICAgICAgXVxuICAgICAgIF0pO1xuXG4gICAgICAgY29uc3Qgb3V0cHV0ID0gaW5wdXQucmVzaXplQmlsaW5lYXIoWzMsIDFdLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgICAgIDEwNC45MTcsIDEwNi41MTQsIDExNS40MTEsIDExMi4zNTIsIDEwNS44MzcsIDk5Ljc5NDUsIDg5LjI1MTUsIDEwNC4yMjIsXG4gICAgICAgICA5My44MjYyXG4gICAgICAgXTtcbiAgICAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gICAgICAgZXhwZWN0KG91dHB1dC5zaGFwZSkudG9FcXVhbChbMywgMSwgM10pO1xuICAgICB9KTtcblxuICBpdCgnbWF0Y2hlcyB0ZW5zb3JmbG93IHcvIHJhbmRvbSBudW1iZXJzIGFsaWduQ29ybmVycz1mYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFxuICAgICAgICBbXG4gICAgICAgICAgMS4xOTA3NDA0NCwgMC45MTM3MzEwNCwgMi4wMTYxMTY2OSwgLTAuNTIyNzA4MzIsIDAuMzg3MjUzOTUsXG4gICAgICAgICAgMS4zMDgwOTc3OSwgMC42MTgzNTE0MywgMy40OTYwMDY1OSwgMi4wOTIzMDk4NiwgMC41NjQ3Mzk5NyxcbiAgICAgICAgICAwLjAzODIzOTQzLCAxLjE5ODY0ODk2XG4gICAgICAgIF0sXG4gICAgICAgIFsyLCAzLCAyXSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gaW5wdXQucmVzaXplQmlsaW5lYXIoWzQsIDVdLCBmYWxzZSk7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBbXG4gICAgICAxLjE5MDc0MDQ3LCAwLjkxMzczMTA0LCAxLjY4NTk2NjEzLCAwLjA1MTg2NzQ0LCAxLjY5MDM0Mzk4LCAtMC4xNTY1NDY5OCxcbiAgICAgIDAuNzEzMDI2NCwgIDAuOTQxOTM2NzMsIDAuMzg3MjUzOTQsIDEuMzA4MDk3ODQsIDAuOTA0NTQ1OSwgIDIuMjA0ODY4NzksXG4gICAgICAxLjU5NDM0NjI4LCAwLjg5NDU1Njk0LCAxLjY4NTkxOTg4LCAwLjI2NzQ4NzM4LCAwLjU4MTAzOTkxLCAxLjAwNjkwMTk4LFxuICAgICAgMC4yMTI3NDY2OCwgMS4yNTMzNzMzOCwgMC42MTgzNTE0LCAgMy40OTYwMDY0OSwgMS41MDI3MjY1NSwgMS43MzcyNDY1MSxcbiAgICAgIDEuNjgxNDk1NzksIDAuNjkxNTIxNzYsIDAuNDQ5MDUzNDQsIDEuMDcxODY3MjMsIDAuMDM4MjM5NDMsIDEuMTk4NjQ4OTMsXG4gICAgICAwLjYxODM1MTQsICAzLjQ5NjAwNjQ5LCAxLjUwMjcyNjU1LCAxLjczNzI0NjUxLCAxLjY4MTQ5NTc5LCAwLjY5MTUyMTc2LFxuICAgICAgMC40NDkwNTM0NCwgMS4wNzE4NjcyMywgMC4wMzgyMzk0MywgMS4xOTg2NDg5M1xuICAgIF0pO1xuICB9KTtcblxuICBpdCgnbWF0Y2hlcyB0ZW5zb3JmbG93IHcvIHJhbmRvbSBudW1iZXJzIGFsaWduQ29ybmVycz10cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoXG4gICAgICAgIFtcbiAgICAgICAgICAxLjU2MzI0NTMxLCAyLjEzODE3NzUyLCAxLjQ0Mzk4NDIxLCAxLjA3NjMyNjg0LCAwLjU5MzA2Nzg1LFxuICAgICAgICAgIC0wLjM2OTcwODY1LCAxLjYyNDUxODc5LCAxLjgzNjczMzQsIDEuMTM5NDQ3OTgsIDIuMDE5OTMyMTgsXG4gICAgICAgICAgMi4wMTkxOTk1MiwgMi42NzUyNDA1NFxuICAgICAgICBdLFxuICAgICAgICBbMiwgMywgMl0pO1xuICAgIGNvbnN0IG91dHB1dCA9IGlucHV0LnJlc2l6ZUJpbGluZWFyKFs0LCA1XSwgdHJ1ZSk7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBbXG4gICAgICAxLjU2MzI0NTMsICAyLjEzODE3NzYzLCAxLjUwMzYxNDc4LCAxLjYwNzI1MjI0LCAgMS40NDM5ODQyNywgMS4wNzYzMjY4NSxcbiAgICAgIDEuMDE4NTI2MDgsIDAuMzUzMzA5MDksIDAuNTkzMDY3ODIsIC0wLjM2OTcwODY2LCAxLjU4MzY2OTc4LCAyLjAzNzY5NjEyLFxuICAgICAgMS40NjMwNzA5OSwgMS43MTQyNzkwNiwgMS4zNDI0NzIyLCAgMS4zOTA4NjE5OSwgIDEuMjA1NDU4NjQsIDEuMDE4MDY4MTksXG4gICAgICAxLjA2ODQ0NTA5LCAwLjY0NTI3NDQsICAxLjYwNDA5NDI3LCAxLjkzNzIxNDg1LCAgMS40MjI1MjcwNywgMS44MjEzMDU5OSxcbiAgICAgIDEuMjQwOTYsICAgIDEuNzA1Mzk3MTMsIDEuMzkyMzkxMiwgIDEuNjgyODI3MjMsICAxLjU0MzgyMjI5LCAxLjY2MDI1NzQ2LFxuICAgICAgMS42MjQ1MTg3NSwgMS44MzY3MzM0NiwgMS4zODE5ODMyOCwgMS45MjgzMzI4MSwgIDEuMTM5NDQ3OTMsIDIuMDE5OTMyMjcsXG4gICAgICAxLjU3OTMyMzc3LCAyLjM0NzU4NjM5LCAyLjAxOTE5OTYxLCAyLjY3NTI0MDUyXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdiYXRjaCBvZiAyLCBzaW1wbGUsIGFsaWduQ29ybmVycz10cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yNGQoWzIsIDIsIDQsIDQsIDMsIDMsIDUsIDVdLCBbMiwgMiwgMiwgMV0pO1xuICAgIGNvbnN0IG91dHB1dCA9IGlucHV0LnJlc2l6ZUJpbGluZWFyKFszLCAzXSwgdHJ1ZSAvKiBhbGlnbkNvcm5lcnMgKi8pO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoXG4gICAgICAgIGF3YWl0IG91dHB1dC5kYXRhKCksXG4gICAgICAgIFsyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1XSk7XG4gIH0pO1xuXG4gIGl0KCd0YXJnZXQgd2lkdGggPSAxLCBhbGlnbkNvcm5lcnM9dHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzEyMC42ODg1NjgxMTUyMzQzOCwgMTM0LjUxNjM4NzkzOTQ1MzEyLCA4My4wMzY3MTI2NDY0ODQzOF0sXG4gICAgICAgIFsxMjEuNTgwMDg1NzU0Mzk0NTMsIDExMy4yODgzNjA1OTU3MDMxMiwgMTM2LjMxNzIxNDk2NTgyMDNdLFxuICAgICAgICBbNzkuMzgzNzA1MTM5MTYwMTYsIDEwMS44NzEyNzY4NTU0Njg3NSwgMTA0LjU0OTc5NzA1ODEwNTQ3XSxcbiAgICAgICAgWzk2LjMxNjc4NzcxOTcyNjU2LCAxMTEuNzcxNjgyNzM5MjU3ODEsIDgzLjczNTA5OTc5MjQ4MDQ3XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzExOS40NTA4ODE5NTgwMDc4MSwgODguOTg4NDY0MzU1NDY4NzUsIDk3LjQ3NTUzMjUzMTczODI4XSxcbiAgICAgICAgWzExNy41NTYyOTczMDIyNDYxLCAxMDguMjYzNTY1MDYzNDc2NTYsIDk5LjYyMjEyMzcxODI2MTcyXSxcbiAgICAgICAgWzEzNi42MjcwMTQxNjAxNTYyNSwgOTQuMTA0MzMxOTcwMjE0ODQsIDgwLjk3MzY2MzMzMDA3ODEyXSxcbiAgICAgICAgWzgzLjYxMjA1MjkxNzQ4MDQ3LCA5MC42MDE0ODYyMDYwNTQ2OSwgODEuODI1MTI2NjQ3OTQ5MjJdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMTAzLjAzNjI3Nzc3MDk5NjEsIDEyMy4xMDk4NDAzOTMwNjY0LCAxMjUuNjI5NDQwMzA3NjE3MTldLFxuICAgICAgICBbOTIuMjkxNTI2Nzk0NDMzNiwgMTAzLjE1NzI5NTIyNzA1MDc4LCAxMTkuMTgwNjAzMDI3MzQzNzVdLFxuICAgICAgICBbMTAyLjkzMjkzNzYyMjA3MDMxLCAxMTcuODIxMDQ0OTIxODc1LCA5OS40MDE1Mjc0MDQ3ODUxNl0sXG4gICAgICAgIFs5Ni4zMjk1MjExNzkxOTkyMiwgMTA1LjgwOTYzMTM0NzY1NjI1LCAxMDQuODQ5MTQzOTgxOTMzNl1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxMDQuODc1MDc2MjkzOTQ1MzEsIDEzNC4wMTg5MjA4OTg0Mzc1LCAxMTEuMDI2Mjc1NjM0NzY1NjJdLFxuICAgICAgICBbODUuNDUzNDY4MzIyNzUzOSwgMTA3LjY4NDI2NTEzNjcxODc1LCAxMDMuMDM3MjIzODE1OTE3OTddLFxuICAgICAgICBbODkuNzA1MzM3NTI0NDE0MDYsIDk4LjI1Mjk4MzA5MzI2MTcyLCA3OC40MjkxNjg3MDExNzE4OF0sXG4gICAgICAgIFsxMTMuNjc0NDYxMzY0NzQ2MSwgOTUuODE4OTY5NzI2NTYyNSwgMTIyLjc1MDA1MzQwNTc2MTcyXVxuICAgICAgXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gaW5wdXQucmVzaXplQmlsaW5lYXIoWzMsIDFdLCB0cnVlKTtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgICAgMTIwLjY4ODU3LCAxMzQuNTE2MzksIDgzLjAzNjcxLCAxMTEuMjQzNTc2LCAxMDYuMDQ5MTUsIDExMS41NTI0OSxcbiAgICAgIDEwNC44NzUwOCwgMTM0LjAxODkyLCAxMTEuMDI2Mjc2XG4gICAgXTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gICAgZXhwZWN0KG91dHB1dC5zaGFwZSkudG9FcXVhbChbMywgMSwgM10pO1xuICB9KTtcblxuICBpdCgndGFyZ2V0IGhlaWdodCA9IDEsIGFsaWduQ29ybmVycz10cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1xuICAgICAgICBbMTIwLjY4ODU2ODExNTIzNDM4LCAxMzQuNTE2Mzg3OTM5NDUzMTIsIDgzLjAzNjcxMjY0NjQ4NDM4XSxcbiAgICAgICAgWzEyMS41ODAwODU3NTQzOTQ1MywgMTEzLjI4ODM2MDU5NTcwMzEyLCAxMzYuMzE3MjE0OTY1ODIwM10sXG4gICAgICAgIFs3OS4zODM3MDUxMzkxNjAxNiwgMTAxLjg3MTI3Njg1NTQ2ODc1LCAxMDQuNTQ5Nzk3MDU4MTA1NDddLFxuICAgICAgICBbOTYuMzE2Nzg3NzE5NzI2NTYsIDExMS43NzE2ODI3MzkyNTc4MSwgODMuNzM1MDk5NzkyNDgwNDddXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMTE5LjQ1MDg4MTk1ODAwNzgxLCA4OC45ODg0NjQzNTU0Njg3NSwgOTcuNDc1NTMyNTMxNzM4MjhdLFxuICAgICAgICBbMTE3LjU1NjI5NzMwMjI0NjEsIDEwOC4yNjM1NjUwNjM0NzY1NiwgOTkuNjIyMTIzNzE4MjYxNzJdLFxuICAgICAgICBbMTM2LjYyNzAxNDE2MDE1NjI1LCA5NC4xMDQzMzE5NzAyMTQ4NCwgODAuOTczNjYzMzMwMDc4MTJdLFxuICAgICAgICBbODMuNjEyMDUyOTE3NDgwNDcsIDkwLjYwMTQ4NjIwNjA1NDY5LCA4MS44MjUxMjY2NDc5NDkyMl1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxMDMuMDM2Mjc3NzcwOTk2MSwgMTIzLjEwOTg0MDM5MzA2NjQsIDEyNS42Mjk0NDAzMDc2MTcxOV0sXG4gICAgICAgIFs5Mi4yOTE1MjY3OTQ0MzM2LCAxMDMuMTU3Mjk1MjI3MDUwNzgsIDExOS4xODA2MDMwMjczNDM3NV0sXG4gICAgICAgIFsxMDIuOTMyOTM3NjIyMDcwMzEsIDExNy44MjEwNDQ5MjE4NzUsIDk5LjQwMTUyNzQwNDc4NTE2XSxcbiAgICAgICAgWzk2LjMyOTUyMTE3OTE5OTIyLCAxMDUuODA5NjMxMzQ3NjU2MjUsIDEwNC44NDkxNDM5ODE5MzM2XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzEwNC44NzUwNzYyOTM5NDUzMSwgMTM0LjAxODkyMDg5ODQzNzUsIDExMS4wMjYyNzU2MzQ3NjU2Ml0sXG4gICAgICAgIFs4NS40NTM0NjgzMjI3NTM5LCAxMDcuNjg0MjY1MTM2NzE4NzUsIDEwMy4wMzcyMjM4MTU5MTc5N10sXG4gICAgICAgIFs4OS43MDUzMzc1MjQ0MTQwNiwgOTguMjUyOTgzMDkzMjYxNzIsIDc4LjQyOTE2ODcwMTE3MTg4XSxcbiAgICAgICAgWzExMy42NzQ0NjEzNjQ3NDYxLCA5NS44MTg5Njk3MjY1NjI1LCAxMjIuNzUwMDUzNDA1NzYxNzJdXG4gICAgICBdXG4gICAgXSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBpbnB1dC5yZXNpemVCaWxpbmVhcihbMSwgM10sIHRydWUpO1xuXG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAxMjAuNjg4NTcsIDEzNC41MTYzOSwgODMuMDM2NzEsIDEwMC40ODE4OTUsIDEwNy41Nzk4MiwgMTIwLjQzMzUsIDk2LjMxNjc5LFxuICAgICAgMTExLjc3MTY4LCA4My43MzUxXG4gICAgXTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gICAgZXhwZWN0KG91dHB1dC5zaGFwZSkudG9FcXVhbChbMSwgMywgM10pO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gcGFzc2VkIGEgbm9uLXRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBlID0gL0FyZ3VtZW50ICdpbWFnZXMnIHBhc3NlZCB0byAncmVzaXplQmlsaW5lYXInIG11c3QgYmUgYSBUZW5zb3IvO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcih7fSBhcyB0Zi5UZW5zb3IzRCwgW1xuICAgICAgMSwgMVxuICAgIF0pKS50b1Rocm93RXJyb3IoZSk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGEgdGVuc29yLWxpa2Ugb2JqZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gW1tbMl0sIFsyXV0sIFtbNF0sIFs0XV1dOyAgLy8gMngyeDFcbiAgICBjb25zdCBvdXRwdXQgPSB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpbnB1dCwgWzMsIDNdLCBmYWxzZSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoXG4gICAgICAgIGF3YWl0IG91dHB1dC5kYXRhKCksIFsyLCAyLCAyLCAxMCAvIDMsIDEwIC8gMywgMTAgLyAzLCA0LCA0LCA0XSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCdyZXNpemVCaWxpbmVhciBncmFkaWVudHMnLCBBTExfRU5WUywgKCkgPT4ge1xuICBpdCgnZ3JleXNjYWxlOiB1cHNjYWxlLCBzYW1lIGFzcGVjdCByYXRpbycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtbWzEwMC4wXSwgWzUwLjBdXSwgW1s2MC4wXSwgWzIwLjBdXV0pO1xuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1sxLjBdLCBbMi4wXSwgWzMuMF0sIFs0LjBdXSwgW1s1LjBdLCBbNi4wXSwgWzcuMF0sIFs4LjBdXSxcbiAgICAgIFtbOS4wXSwgWzEwLjBdLCBbMTEuMF0sIFsxMi4wXV0sIFtbMTMuMF0sIFsxNC4wXSwgWzE1LjBdLCBbMTYuMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzQsIDRdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gWzYuMCwgMTcuMCwgMzguMCwgNzUuMF07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCd3aXRoIGNsb25lcywgZ3JleXNjYWxlOiB1cHNjYWxlLCBzYW1lIGFzcGVjdCByYXRpbycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtbWzEwMC4wXSwgWzUwLjBdXSwgW1s2MC4wXSwgWzIwLjBdXV0pO1xuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1sxLjBdLCBbMi4wXSwgWzMuMF0sIFs0LjBdXSwgW1s1LjBdLCBbNi4wXSwgWzcuMF0sIFs4LjBdXSxcbiAgICAgIFtbOS4wXSwgWzEwLjBdLCBbMTEuMF0sIFsxMi4wXV0sIFtbMTMuMF0sIFsxNC4wXSwgWzE1LjBdLCBbMTYuMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzQsIDRdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+XG4gICAgICAgICAgICB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLmNsb25lKCksIHNpemUsIGFsaWduQ29ybmVycykuY2xvbmUoKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbNi4wLCAxNy4wLCAzOC4wLCA3NS4wXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2dyZXlzY2FsZTogdXBzY2FsZSwgc2FtZSBhc3BlY3QgcmF0aW8sIGFsaWduIGNvcm5lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbW1sxMDAuMF0sIFs1MC4wXV0sIFtbNjAuMF0sIFsyMC4wXV1dKTtcbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMS4wXSwgWzIuMF0sIFszLjBdLCBbNC4wXV0sIFtbNS4wXSwgWzYuMF0sIFs3LjBdLCBbOC4wXV0sXG4gICAgICBbWzkuMF0sIFsxMC4wXSwgWzExLjBdLCBbMTIuMF1dLCBbWzEzLjBdLCBbMTQuMF0sIFsxNS4wXSwgWzE2LjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFs0LCA0XTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSB0cnVlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID1cbiAgICAgICAgWzE3LjMzMzMzMDE1NDQxODk0NSwgMjMuOTk5OTk4MDkyNjUxMzY3LCA0NC4wLCA1MC42NjY2Njc5MzgyMzI0Ml07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdncmV5c2NhbGU6IHVwc2NhbGUsIHRhbGxlciB0aGFuIHdpZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoW1tbMTAwLjBdLCBbNTAuMF1dLCBbWzYwLjBdLCBbMjAuMF1dXSk7XG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbXG4gICAgICBbWzEuMF0sIFsyLjBdLCBbMy4wXSwgWzQuMF1dLCBbWzUuMF0sIFs2LjBdLCBbNy4wXSwgWzguMF1dLFxuICAgICAgW1s5LjBdLCBbMTAuMF0sIFsxMS4wXSwgWzEyLjBdXSwgW1sxMy4wXSwgWzE0LjBdLCBbMTUuMF0sIFsxNi4wXV0sXG4gICAgICBbWzE3LjBdLCBbMTguMF0sIFsxOS4wXSwgWzIwLjBdXSwgW1syMS4wXSwgWzIyLjBdLCBbMjMuMF0sIFsyNC4wXV0sXG4gICAgICBbWzI1LjBdLCBbMjYuMF0sIFsyNy4wXSwgWzI4LjBdXSwgW1syOS4wXSwgWzMwLjBdLCBbMzEuMF0sIFszMi4wXV0sXG4gICAgICBbWzMzLjBdLCBbMzQuMF0sIFszNS4wXSwgWzM2LjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFs5LCA0XTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSBmYWxzZTtcbiAgICBjb25zdCBnID0gdGYuZ3JhZChcbiAgICAgICAgKGk6IHRmLlRlbnNvcjNEKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLCBzaXplLCBhbGlnbkNvcm5lcnMpKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGcoaW5wdXQsIGR5KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgIDI1LjU1NTU1NTM0MzYyNzkzLCA1NS41NTU1NTM0MzYyNzkzLCAyMDguNDQ0NDQyNzQ5MDIzNDQsIDM3Ni40NDQ0Mjc0OTAyMzQ0XG4gICAgXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2dyZXlzY2FsZTogdXBzY2FsZSwgdGFsbGVyIHRoYW4gd2lkZXIsIGFsaWduIGNvcm5lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbW1sxMDAuMF0sIFs1MC4wXV0sIFtbNjAuMF0sIFsyMC4wXV1dKTtcbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMS4wXSwgWzIuMF0sIFszLjBdLCBbNC4wXV0sIFtbNS4wXSwgWzYuMF0sIFs3LjBdLCBbOC4wXV0sXG4gICAgICBbWzkuMF0sIFsxMC4wXSwgWzExLjBdLCBbMTIuMF1dLCBbWzEzLjBdLCBbMTQuMF0sIFsxNS4wXSwgWzE2LjBdXSxcbiAgICAgIFtbMTcuMF0sIFsxOC4wXSwgWzE5LjBdLCBbMjAuMF1dLCBbWzIxLjBdLCBbMjIuMF0sIFsyMy4wXSwgWzI0LjBdXSxcbiAgICAgIFtbMjUuMF0sIFsyNi4wXSwgWzI3LjBdLCBbMjguMF1dLCBbWzI5LjBdLCBbMzAuMF0sIFszMS4wXSwgWzMyLjBdXSxcbiAgICAgIFtbMzMuMF0sIFszNC4wXSwgWzM1LjBdLCBbMzYuMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzksIDRdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IHRydWU7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbOTkuMCwgMTE0LjAsIDIxOS4wMDAwMTUyNTg3ODkwNiwgMjMzLjk5OTk4NDc0MTIxMDk0XTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2dyZXlzY2FsZTogdXBzY2FsZSwgd2lkZXIgdGhhbiB0YWxsZXInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbW1sxMDAuMF0sIFs1MC4wXV0sIFtbNjAuMF0sIFsyMC4wXV1dKTtcbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMS4wXSwgWzIuMF0sIFszLjBdLCBbNC4wXSwgWzUuMF0sIFs2LjBdLCBbNy4wXV0sXG4gICAgICBbWzguMF0sIFs5LjBdLCBbMTAuMF0sIFsxMS4wXSwgWzEyLjBdLCBbMTMuMF0sIFsxNC4wXV0sXG4gICAgICBbWzE1LjBdLCBbMTYuMF0sIFsxNy4wXSwgWzE4LjBdLCBbMTkuMF0sIFsyMC4wXSwgWzIxLjBdXSxcbiAgICAgIFtbMjIuMF0sIFsyMy4wXSwgWzI0LjBdLCBbMjUuMF0sIFsyNi4wXSwgWzI3LjBdLCBbMjguMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzQsIDddO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgICAgMTQuNDI4NTcwNzQ3Mzc1NDg4LCA1Mi4wNzE0MjYzOTE2MDE1NiwgOTguNzE0Mjc5MTc0ODA0NjksXG4gICAgICAyNDAuNzg1NzM2MDgzOTg0MzhcbiAgICBdO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgb3V0cHV0LmRhdGEoKSwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnZ3JleXNjYWxlOiB1cHNjYWxlLCB3aWRlciB0aGFuIHRhbGxlciwgYWxpZ24gY29ybmVycycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtbWzEwMC4wXSwgWzUwLjBdXSwgW1s2MC4wXSwgWzIwLjBdXV0pO1xuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1sxLjBdLCBbMi4wXSwgWzMuMF0sIFs0LjBdLCBbNS4wXSwgWzYuMF0sIFs3LjBdXSxcbiAgICAgIFtbOC4wXSwgWzkuMF0sIFsxMC4wXSwgWzExLjBdLCBbMTIuMF0sIFsxMy4wXSwgWzE0LjBdXSxcbiAgICAgIFtbMTUuMF0sIFsxNi4wXSwgWzE3LjBdLCBbMTguMF0sIFsxOS4wXSwgWzIwLjBdLCBbMjEuMF1dLFxuICAgICAgW1syMi4wXSwgWzIzLjBdLCBbMjQuMF0sIFsyNS4wXSwgWzI2LjBdLCBbMjcuMF0sIFsyOC4wXV1cbiAgICBdKTtcblxuICAgIGNvbnN0IHNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbNCwgN107XG4gICAgY29uc3QgYWxpZ25Db3JuZXJzID0gdHJ1ZTtcbiAgICBjb25zdCBnID0gdGYuZ3JhZChcbiAgICAgICAgKGk6IHRmLlRlbnNvcjNEKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLCBzaXplLCBhbGlnbkNvcm5lcnMpKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGcoaW5wdXQsIGR5KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFs1MS4zMzMzMjgyNDcwNzAzMSwgNzAuMCwgMTMzLjAsIDE1MS42NjY2ODcwMTE3MTg3NV07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIC8vIERvd25zY2FsZVxuXG4gIGl0KCdncmV5c2NhbGU6IGRvd25zY2FsZSwgc2FtZSBhc3BlY3QgcmF0aW8nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbXG4gICAgICBbWzEwMC4wXSwgWzUwLjBdLCBbMjUuMF0sIFsxMC4wXV0sIFtbNjAuMF0sIFsyMC4wXSwgWzgwLjBdLCBbMjAuMF1dLFxuICAgICAgW1s0MC4wXSwgWzE1LjBdLCBbMjAwLjBdLCBbMjAzLjBdXSwgW1s0MC4wXSwgWzEwLjBdLCBbMjMwLjBdLCBbMjAwLjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbW1sxLjBdLCBbMi4wXV0sIFtbMy4wXSwgWzQuMF1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzIsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgICAgMS4wLCAwLjAsIDIuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDMuMCwgMC4wLCA0LjAsIDAuMCwgMC4wLCAwLjAsIDAuMCxcbiAgICAgIDAuMFxuICAgIF07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdncmV5c2NhbGU6IGRvd25zY2FsZSwgc2FtZSBhc3BlY3QgcmF0aW8sIGFsaWduIGNvcm5lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbXG4gICAgICBbWzEwMC4wXSwgWzUwLjBdLCBbMjUuMF0sIFsxMC4wXV0sIFtbNjAuMF0sIFsyMC4wXSwgWzgwLjBdLCBbMjAuMF1dLFxuICAgICAgW1s0MC4wXSwgWzE1LjBdLCBbMjAwLjBdLCBbMjAzLjBdXSwgW1s0MC4wXSwgWzEwLjBdLCBbMjMwLjBdLCBbMjAwLjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbW1sxLjBdLCBbMi4wXV0sIFtbMy4wXSwgWzQuMF1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzIsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IHRydWU7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAxLjAsIDAuMCwgMC4wLCAyLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAzLjAsIDAuMCwgMC4wLFxuICAgICAgNC4wXG4gICAgXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2dyZXlzY2FsZTogZG93bnNjYWxlLCB0YWxsZXIgdGhhbiB3aWRlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMTAwLjBdLCBbNTAuMF0sIFsyNS4wXSwgWzEwLjBdXSwgW1s2MC4wXSwgWzIwLjBdLCBbODAuMF0sIFsyMC4wXV0sXG4gICAgICBbWzQwLjBdLCBbMTUuMF0sIFsyMDAuMF0sIFsyMDMuMF1dLCBbWzQwLjBdLCBbMTAuMF0sIFsyMzAuMF0sIFsyMDAuMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtbWzEuMF0sIFsyLjBdXSwgW1szLjBdLCBbNC4wXV0sIFtbNS4wXSwgWzYuMF1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzMsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgICAgMS4wLCAwLjAsIDIuMCwgMC4wLCAxLjk5OTk5OTg4MDc5MDcxMDQsIDAuMCwgMi42NjY2NjY1MDc3MjA5NDczLCAwLjAsXG4gICAgICAyLjY2NjY2NjUwNzcyMDk0NzMsIDAuMCwgMy4zMzMzMzMwMTU0NDE4OTQ1LCAwLjAsIDMuMzMzMzMzNzMwNjk3NjMyLCAwLjAsXG4gICAgICA0LjAwMDAwMDQ3NjgzNzE1OCwgMC4wXG4gICAgXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2dyZXlzY2FsZTogZG93bnNjYWxlLCB0YWxsZXIgdGhhbiB3aWRlciwgYWxpZ24gY29ybmVycycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMTAwLjBdLCBbNTAuMF0sIFsyNS4wXSwgWzEwLjBdXSwgW1s2MC4wXSwgWzIwLjBdLCBbODAuMF0sIFsyMC4wXV0sXG4gICAgICBbWzQwLjBdLCBbMTUuMF0sIFsyMDAuMF0sIFsyMDMuMF1dLCBbWzQwLjBdLCBbMTAuMF0sIFsyMzAuMF0sIFsyMDAuMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtbWzEuMF0sIFsyLjBdXSwgW1szLjBdLCBbNC4wXV0sIFtbNS4wXSwgWzYuMF1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzMsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IHRydWU7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAxLjAsIDAuMCwgMC4wLCAyLjAsIDEuNSwgMC4wLCAwLjAsIDIuMCwgMS41LCAwLjAsIDAuMCwgMi4wLCA1LjAsIDAuMCwgMC4wLFxuICAgICAgNi4wXG4gICAgXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2dyZXlzY2FsZTogZG93bnNjYWxlLCB3aWRlciB0aGFuIHRhbGxlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMTAwLjBdLCBbNTAuMF0sIFsyNS4wXSwgWzEwLjBdXSwgW1s2MC4wXSwgWzIwLjBdLCBbODAuMF0sIFsyMC4wXV0sXG4gICAgICBbWzQwLjBdLCBbMTUuMF0sIFsyMDAuMF0sIFsyMDMuMF1dLCBbWzQwLjBdLCBbMTAuMF0sIFsyMzAuMF0sIFsyMDAuMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtbWzEuMF0sIFsyLjBdLCBbMy4wXV0sIFtbNC4wXSwgWzUuMF0sIFs2LjBdXV0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFsyLCAzXTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSBmYWxzZTtcbiAgICBjb25zdCBnID0gdGYuZ3JhZChcbiAgICAgICAgKGk6IHRmLlRlbnNvcjNEKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLCBzaXplLCBhbGlnbkNvcm5lcnMpKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGcoaW5wdXQsIGR5KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgIDEuMCwgMS4zMzMzMzMyNTM4NjA0NzM2LCAxLjY2NjY2NjUwNzcyMDk0NzMsIDIuMDAwMDAwMjM4NDE4NTc5LCAwLjAsIDAuMCxcbiAgICAgIDAuMCwgMC4wLCA0LjAsIDMuMzMzMzMzMDE1NDQxODk0NSwgMy42NjY2NjY1MDc3MjA5NDczLCA0LjAwMDAwMDQ3NjgzNzE1OCxcbiAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMFxuICAgIF07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdncmV5c2NhbGU6IGRvd25zY2FsZSwgd2lkZXIgdGhhbiB0YWxsZXIsIGFsaWduIGNvcm5lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbXG4gICAgICBbWzEwMC4wXSwgWzUwLjBdLCBbMjUuMF0sIFsxMC4wXV0sIFtbNjAuMF0sIFsyMC4wXSwgWzgwLjBdLCBbMjAuMF1dLFxuICAgICAgW1s0MC4wXSwgWzE1LjBdLCBbMjAwLjBdLCBbMjAzLjBdXSwgW1s0MC4wXSwgWzEwLjBdLCBbMjMwLjBdLCBbMjAwLjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbW1sxLjBdLCBbMi4wXSwgWzMuMF1dLCBbWzQuMF0sIFs1LjBdLCBbNi4wXV1dKTtcblxuICAgIGNvbnN0IHNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbMiwgM107XG4gICAgY29uc3QgYWxpZ25Db3JuZXJzID0gdHJ1ZTtcbiAgICBjb25zdCBnID0gdGYuZ3JhZChcbiAgICAgICAgKGk6IHRmLlRlbnNvcjNEKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLCBzaXplLCBhbGlnbkNvcm5lcnMpKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGcoaW5wdXQsIGR5KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgIDEuMCwgMS4wLCAxLjAsIDMuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDQuMCwgMi41LCAyLjUsXG4gICAgICA2LjBcbiAgICBdO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgb3V0cHV0LmRhdGEoKSwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICAvLyBObyBPcFxuXG4gIGl0KCdncmV5c2NhbGU6IHNhbWUgc2l6ZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtbWzEwMC4wXSwgWzUwLjBdXSwgW1s2MC4wXSwgWzIwLjBdXV0pO1xuXG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbW1sxLjBdLCBbMi4wXV0sIFtbMy4wXSwgWzQuMF1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzIsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IGZhbHNlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gWzEuMCwgMi4wLCAzLjAsIDQuMF07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdncmV5c2NhbGU6IHNhbWUgc2l6ZSwgYWxpZ24gY29ybmVycycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtbWzEwMC4wXSwgWzUwLjBdXSwgW1s2MC4wXSwgWzIwLjBdXV0pO1xuXG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbW1sxLjBdLCBbMi4wXV0sIFtbMy4wXSwgWzQuMF1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzIsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IHRydWU7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbMS4wLCAyLjAsIDMuMCwgNC4wXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgLy8gMyBjaGFubmVsIHVwc2NhbGVcbiAgaXQoJ2NvbG9yOiB1cHNjYWxlLCB3aWRlciB0aGFuIHRhbGxlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzExNS4xMTAyOTgxNTY3MzgyOCwgMTExLjkwOTM2Mjc5Mjk2ODc1LCA2Ni44NzQzMzYyNDI2NzU3OF0sXG4gICAgICAgIFs3Mi4wMzg0OTAyOTU0MTAxNiwgODEuODY2Mzc4Nzg0MTc5NjksIDExOS41MzU4NTgxNTQyOTY4OF1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFs2OC41NTU0MTk5MjE4NzUsIDk3LjQ5NjQyMTgxMzk2NDg0LCAxMTYuOTA3NDE3Mjk3MzYzMjhdLFxuICAgICAgICBbMTI4LjY5NDY3MTYzMDg1OTM4LCA4Ni43ODMxNDIwODk4NDM3NSwgMTA0LjMxMTY2ODM5NTk5NjFdXG4gICAgICBdXG4gICAgXSk7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzEuMCwgMi4wLCAzLjBdLCBbNC4wLCA1LjAsIDYuMF0sIFs3LjAsIDguMCwgOS4wXSwgWzEwLjAsIDExLjAsIDEyLjBdLFxuICAgICAgICBbMTMuMCwgMTQuMCwgMTUuMF1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxNi4wLCAxNy4wLCAxOC4wXSwgWzE5LjAsIDIwLjAsIDIxLjBdLCBbMjIuMCwgMjMuMCwgMjQuMF0sXG4gICAgICAgIFsyNS4wLCAyNi4wLCAyNy4wXSwgWzI4LjAsIDI5LjAsIDMwLjBdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMzEuMCwgMzIuMCwgMzMuMF0sIFszNC4wLCAzNS4wLCAzNi4wXSwgWzM3LjAsIDM4LjAsIDM5LjBdLFxuICAgICAgICBbNDAuMCwgNDEuMCwgNDIuMF0sIFs0My4wLCA0NC4wLCA0NS4wXVxuICAgICAgXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFszLCA1XTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSBmYWxzZTtcbiAgICBjb25zdCBnID0gdGYuZ3JhZChcbiAgICAgICAgKGk6IHRmLlRlbnNvcjNEKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLCBzaXplLCBhbGlnbkNvcm5lcnMpKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGcoaW5wdXQsIGR5KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgIDE1LjM5OTk5OTYxODUzMDI3MywgMTcuNzk5OTk5MjM3MDYwNTQ3LCAyMC4xOTk5OTg4NTU1OTA4MixcbiAgICAgIDU2LjI2NjY2MjU5NzY1NjI1LCA2MC41MzMzMjkwMTAwMDk3NjYsIDY0Ljc5OTk5NTQyMjM2MzI4LFxuICAgICAgODAuMDAwMDA3NjI5Mzk0NTMsIDgzLjAsIDg2LjAsIDE3OC4zMzMzNDM1MDU4NTkzOCwgMTgzLjY2NjY4NzAxMTcxODc1LFxuICAgICAgMTg5LjAwMDAxNTI1ODc4OTA2XG4gICAgXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbG9yOiB1cHNjYWxlLCB3aWRlciB0aGFuIHRhbGxlciwgYWxpZ24gY29ybmVycycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzExNS4xMTAyOTgxNTY3MzgyOCwgMTExLjkwOTM2Mjc5Mjk2ODc1LCA2Ni44NzQzMzYyNDI2NzU3OF0sXG4gICAgICAgIFs3Mi4wMzg0OTAyOTU0MTAxNiwgODEuODY2Mzc4Nzg0MTc5NjksIDExOS41MzU4NTgxNTQyOTY4OF1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFs2OC41NTU0MTk5MjE4NzUsIDk3LjQ5NjQyMTgxMzk2NDg0LCAxMTYuOTA3NDE3Mjk3MzYzMjhdLFxuICAgICAgICBbMTI4LjY5NDY3MTYzMDg1OTM4LCA4Ni43ODMxNDIwODk4NDM3NSwgMTA0LjMxMTY2ODM5NTk5NjFdXG4gICAgICBdXG4gICAgXSk7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzEuMCwgMi4wLCAzLjBdLCBbNC4wLCA1LjAsIDYuMF0sIFs3LjAsIDguMCwgOS4wXSwgWzEwLjAsIDExLjAsIDEyLjBdLFxuICAgICAgICBbMTMuMCwgMTQuMCwgMTUuMF1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxNi4wLCAxNy4wLCAxOC4wXSwgWzE5LjAsIDIwLjAsIDIxLjBdLCBbMjIuMCwgMjMuMCwgMjQuMF0sXG4gICAgICAgIFsyNS4wLCAyNi4wLCAyNy4wXSwgWzI4LjAsIDI5LjAsIDMwLjBdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMzEuMCwgMzIuMCwgMzMuMF0sIFszNC4wLCAzNS4wLCAzNi4wXSwgWzM3LjAsIDM4LjAsIDM5LjBdLFxuICAgICAgICBbNDAuMCwgNDEuMCwgNDIuMF0sIFs0My4wLCA0NC4wLCA0NS4wXVxuICAgICAgXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFszLCA1XTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSB0cnVlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgICAgMzMuNzUsIDM3LjUsIDQxLjI1LCA1Ni4yNSwgNjAuMCwgNjMuNzUsIDEwOC43NSwgMTEyLjUsIDExNi4yNSwgMTMxLjI1LFxuICAgICAgMTM1LjAsIDEzOC43NVxuICAgIF07XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIC8vIDMgY2hhbm5lbCBkb3duc2NhbGVcblxuICBpdCgnY29sb3I6IGRvd25zY2FsZSwgdGFsbGVyIHRoYW4gd2lkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IzZChbXG4gICAgICBbXG4gICAgICAgIFsxMjAuNjg4NTY4MTE1MjM0MzgsIDEzNC41MTYzODc5Mzk0NTMxMiwgODMuMDM2NzEyNjQ2NDg0MzhdLFxuICAgICAgICBbMTIxLjU4MDA4NTc1NDM5NDUzLCAxMTMuMjg4MzYwNTk1NzAzMTIsIDEzNi4zMTcyMTQ5NjU4MjAzXSxcbiAgICAgICAgWzc5LjM4MzcwNTEzOTE2MDE2LCAxMDEuODcxMjc2ODU1NDY4NzUsIDEwNC41NDk3OTcwNTgxMDU0N10sXG4gICAgICAgIFs5Ni4zMTY3ODc3MTk3MjY1NiwgMTExLjc3MTY4MjczOTI1NzgxLCA4My43MzUwOTk3OTI0ODA0N11cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxMTkuNDUwODgxOTU4MDA3ODEsIDg4Ljk4ODQ2NDM1NTQ2ODc1LCA5Ny40NzU1MzI1MzE3MzgyOF0sXG4gICAgICAgIFsxMTcuNTU2Mjk3MzAyMjQ2MSwgMTA4LjI2MzU2NTA2MzQ3NjU2LCA5OS42MjIxMjM3MTgyNjE3Ml0sXG4gICAgICAgIFsxMzYuNjI3MDE0MTYwMTU2MjUsIDk0LjEwNDMzMTk3MDIxNDg0LCA4MC45NzM2NjMzMzAwNzgxMl0sXG4gICAgICAgIFs4My42MTIwNTI5MTc0ODA0NywgOTAuNjAxNDg2MjA2MDU0NjksIDgxLjgyNTEyNjY0Nzk0OTIyXVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzEwMy4wMzYyNzc3NzA5OTYxLCAxMjMuMTA5ODQwMzkzMDY2NCwgMTI1LjYyOTQ0MDMwNzYxNzE5XSxcbiAgICAgICAgWzkyLjI5MTUyNjc5NDQzMzYsIDEwMy4xNTcyOTUyMjcwNTA3OCwgMTE5LjE4MDYwMzAyNzM0Mzc1XSxcbiAgICAgICAgWzEwMi45MzI5Mzc2MjIwNzAzMSwgMTE3LjgyMTA0NDkyMTg3NSwgOTkuNDAxNTI3NDA0Nzg1MTZdLFxuICAgICAgICBbOTYuMzI5NTIxMTc5MTk5MjIsIDEwNS44MDk2MzEzNDc2NTYyNSwgMTA0Ljg0OTE0Mzk4MTkzMzZdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMTA0Ljg3NTA3NjI5Mzk0NTMxLCAxMzQuMDE4OTIwODk4NDM3NSwgMTExLjAyNjI3NTYzNDc2NTYyXSxcbiAgICAgICAgWzg1LjQ1MzQ2ODMyMjc1MzksIDEwNy42ODQyNjUxMzY3MTg3NSwgMTAzLjAzNzIyMzgxNTkxNzk3XSxcbiAgICAgICAgWzg5LjcwNTMzNzUyNDQxNDA2LCA5OC4yNTI5ODMwOTMyNjE3MiwgNzguNDI5MTY4NzAxMTcxODhdLFxuICAgICAgICBbMTEzLjY3NDQ2MTM2NDc0NjEsIDk1LjgxODk2OTcyNjU2MjUsIDEyMi43NTAwNTM0MDU3NjE3Ml1cbiAgICAgIF1cbiAgICBdKTtcblxuICAgIGNvbnN0IGR5ID1cbiAgICAgICAgdGYudGVuc29yM2QoW1tbMS4wLCAyLjAsIDMuMF1dLCBbWzQuMCwgNS4wLCA2LjBdXSwgW1s3LjAsIDguMCwgOS4wXV1dKTtcblxuICAgIGNvbnN0IHNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbMywgMV07XG4gICAgY29uc3QgYWxpZ25Db3JuZXJzID0gZmFsc2U7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAxLjAsXG4gICAgICAyLjAsXG4gICAgICAzLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAyLjY2NjY2NjUwNzcyMDk0NzMsXG4gICAgICAzLjMzMzMzMzAxNTQ0MTg5NDUsXG4gICAgICAzLjk5OTk5OTc2MTU4MTQyMSxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDAuMCxcbiAgICAgIDMuNjY2NjY2MjY5MzAyMzY4LFxuICAgICAgNC4zMzMzMzMwMTU0NDE4OTQ1LFxuICAgICAgNC45OTk5OTk1MjMxNjI4NDIsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICAwLjAsXG4gICAgICA0LjY2NjY2Njk4NDU1ODEwNTUsXG4gICAgICA1LjMzMzMzMzk2OTExNjIxMSxcbiAgICAgIDYuMDAwMDAwOTUzNjc0MzE2LFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wLFxuICAgICAgMC4wXG4gICAgXTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbG9yOiBkb3duc2NhbGUsIHdpZHRoID0gMSwgYWxpZ24gY29ybmVycycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzEyMC42ODg1NjgxMTUyMzQzOCwgMTM0LjUxNjM4NzkzOTQ1MzEyLCA4My4wMzY3MTI2NDY0ODQzOF0sXG4gICAgICAgIFsxMjEuNTgwMDg1NzU0Mzk0NTMsIDExMy4yODgzNjA1OTU3MDMxMiwgMTM2LjMxNzIxNDk2NTgyMDNdLFxuICAgICAgICBbNzkuMzgzNzA1MTM5MTYwMTYsIDEwMS44NzEyNzY4NTU0Njg3NSwgMTA0LjU0OTc5NzA1ODEwNTQ3XSxcbiAgICAgICAgWzk2LjMxNjc4NzcxOTcyNjU2LCAxMTEuNzcxNjgyNzM5MjU3ODEsIDgzLjczNTA5OTc5MjQ4MDQ3XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzExOS40NTA4ODE5NTgwMDc4MSwgODguOTg4NDY0MzU1NDY4NzUsIDk3LjQ3NTUzMjUzMTczODI4XSxcbiAgICAgICAgWzExNy41NTYyOTczMDIyNDYxLCAxMDguMjYzNTY1MDYzNDc2NTYsIDk5LjYyMjEyMzcxODI2MTcyXSxcbiAgICAgICAgWzEzNi42MjcwMTQxNjAxNTYyNSwgOTQuMTA0MzMxOTcwMjE0ODQsIDgwLjk3MzY2MzMzMDA3ODEyXSxcbiAgICAgICAgWzgzLjYxMjA1MjkxNzQ4MDQ3LCA5MC42MDE0ODYyMDYwNTQ2OSwgODEuODI1MTI2NjQ3OTQ5MjJdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMTAzLjAzNjI3Nzc3MDk5NjEsIDEyMy4xMDk4NDAzOTMwNjY0LCAxMjUuNjI5NDQwMzA3NjE3MTldLFxuICAgICAgICBbOTIuMjkxNTI2Nzk0NDMzNiwgMTAzLjE1NzI5NTIyNzA1MDc4LCAxMTkuMTgwNjAzMDI3MzQzNzVdLFxuICAgICAgICBbMTAyLjkzMjkzNzYyMjA3MDMxLCAxMTcuODIxMDQ0OTIxODc1LCA5OS40MDE1Mjc0MDQ3ODUxNl0sXG4gICAgICAgIFs5Ni4zMjk1MjExNzkxOTkyMiwgMTA1LjgwOTYzMTM0NzY1NjI1LCAxMDQuODQ5MTQzOTgxOTMzNl1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxMDQuODc1MDc2MjkzOTQ1MzEsIDEzNC4wMTg5MjA4OTg0Mzc1LCAxMTEuMDI2Mjc1NjM0NzY1NjJdLFxuICAgICAgICBbODUuNDUzNDY4MzIyNzUzOSwgMTA3LjY4NDI2NTEzNjcxODc1LCAxMDMuMDM3MjIzODE1OTE3OTddLFxuICAgICAgICBbODkuNzA1MzM3NTI0NDE0MDYsIDk4LjI1Mjk4MzA5MzI2MTcyLCA3OC40MjkxNjg3MDExNzE4OF0sXG4gICAgICAgIFsxMTMuNjc0NDYxMzY0NzQ2MSwgOTUuODE4OTY5NzI2NTYyNSwgMTIyLjc1MDA1MzQwNTc2MTcyXVxuICAgICAgXVxuICAgIF0pO1xuXG4gICAgY29uc3QgZHkgPVxuICAgICAgICB0Zi50ZW5zb3IzZChbW1sxLjAsIDIuMCwgMy4wXV0sIFtbNC4wLCA1LjAsIDYuMF1dLCBbWzcuMCwgOC4wLCA5LjBdXV0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFszLCAxXTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSB0cnVlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgICAgMS4wLCAyLjAsIDMuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCxcbiAgICAgIDIuMCwgMi41LCAzLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsXG4gICAgICAyLjAsIDIuNSwgMy4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLFxuICAgICAgNy4wLCA4LjAsIDkuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMFxuICAgIF07XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgb3V0cHV0LmRhdGEoKSwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnY29sb3I6IGRvd25zY2FsZSwgaGVpZ2h0ID0gMSwgYWxpZ24gY29ybmVycycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtcbiAgICAgICAgWzEyMC42ODg1NjgxMTUyMzQzOCwgMTM0LjUxNjM4NzkzOTQ1MzEyLCA4My4wMzY3MTI2NDY0ODQzOF0sXG4gICAgICAgIFsxMjEuNTgwMDg1NzU0Mzk0NTMsIDExMy4yODgzNjA1OTU3MDMxMiwgMTM2LjMxNzIxNDk2NTgyMDNdLFxuICAgICAgICBbNzkuMzgzNzA1MTM5MTYwMTYsIDEwMS44NzEyNzY4NTU0Njg3NSwgMTA0LjU0OTc5NzA1ODEwNTQ3XSxcbiAgICAgICAgWzk2LjMxNjc4NzcxOTcyNjU2LCAxMTEuNzcxNjgyNzM5MjU3ODEsIDgzLjczNTA5OTc5MjQ4MDQ3XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzExOS40NTA4ODE5NTgwMDc4MSwgODguOTg4NDY0MzU1NDY4NzUsIDk3LjQ3NTUzMjUzMTczODI4XSxcbiAgICAgICAgWzExNy41NTYyOTczMDIyNDYxLCAxMDguMjYzNTY1MDYzNDc2NTYsIDk5LjYyMjEyMzcxODI2MTcyXSxcbiAgICAgICAgWzEzNi42MjcwMTQxNjAxNTYyNSwgOTQuMTA0MzMxOTcwMjE0ODQsIDgwLjk3MzY2MzMzMDA3ODEyXSxcbiAgICAgICAgWzgzLjYxMjA1MjkxNzQ4MDQ3LCA5MC42MDE0ODYyMDYwNTQ2OSwgODEuODI1MTI2NjQ3OTQ5MjJdXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMTAzLjAzNjI3Nzc3MDk5NjEsIDEyMy4xMDk4NDAzOTMwNjY0LCAxMjUuNjI5NDQwMzA3NjE3MTldLFxuICAgICAgICBbOTIuMjkxNTI2Nzk0NDMzNiwgMTAzLjE1NzI5NTIyNzA1MDc4LCAxMTkuMTgwNjAzMDI3MzQzNzVdLFxuICAgICAgICBbMTAyLjkzMjkzNzYyMjA3MDMxLCAxMTcuODIxMDQ0OTIxODc1LCA5OS40MDE1Mjc0MDQ3ODUxNl0sXG4gICAgICAgIFs5Ni4zMjk1MjExNzkxOTkyMiwgMTA1LjgwOTYzMTM0NzY1NjI1LCAxMDQuODQ5MTQzOTgxOTMzNl1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxMDQuODc1MDc2MjkzOTQ1MzEsIDEzNC4wMTg5MjA4OTg0Mzc1LCAxMTEuMDI2Mjc1NjM0NzY1NjJdLFxuICAgICAgICBbODUuNDUzNDY4MzIyNzUzOSwgMTA3LjY4NDI2NTEzNjcxODc1LCAxMDMuMDM3MjIzODE1OTE3OTddLFxuICAgICAgICBbODkuNzA1MzM3NTI0NDE0MDYsIDk4LjI1Mjk4MzA5MzI2MTcyLCA3OC40MjkxNjg3MDExNzE4OF0sXG4gICAgICAgIFsxMTMuNjc0NDYxMzY0NzQ2MSwgOTUuODE4OTY5NzI2NTYyNSwgMTIyLjc1MDA1MzQwNTc2MTcyXVxuICAgICAgXVxuICAgIF0pO1xuXG4gICAgY29uc3QgZHkgPSB0Zi50ZW5zb3IzZChbW1sxLiwgMi4sIDMuXSwgWzQuLCA1LiwgNi5dLCBbNy4sIDguLCA5Ll1dXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDNdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IHRydWU7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAxLiwgMi4sIDMuLCAyLiwgMi41LCAzLiwgMi4sIDIuNSwgMy4sIDcuLCA4LiwgOS4sIDAuLCAwLiwgMC4sIDAuLFxuICAgICAgMC4sIDAuLCAwLiwgMC4sIDAuLCAgMC4sIDAuLCAwLiwgIDAuLCAwLiwgMC4sIDAuLCAwLiwgMC4sIDAuLCAwLixcbiAgICAgIDAuLCAwLiwgMC4sIDAuLCAwLiwgIDAuLCAwLiwgMC4sICAwLiwgMC4sIDAuLCAwLiwgMC4sIDAuLCAwLiwgMC5cbiAgICBdO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbG9yOiBkb3duc2NhbGUsIHRhbGxlciB0aGFuIHdpZGVyLCBhbGlnbiBjb3JuZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1xuICAgICAgICBbMTIwLjY4ODU2ODExNTIzNDM4LCAxMzQuNTE2Mzg3OTM5NDUzMTIsIDgzLjAzNjcxMjY0NjQ4NDM4XSxcbiAgICAgICAgWzEyMS41ODAwODU3NTQzOTQ1MywgMTEzLjI4ODM2MDU5NTcwMzEyLCAxMzYuMzE3MjE0OTY1ODIwM10sXG4gICAgICAgIFs3OS4zODM3MDUxMzkxNjAxNiwgMTAxLjg3MTI3Njg1NTQ2ODc1LCAxMDQuNTQ5Nzk3MDU4MTA1NDddLFxuICAgICAgICBbOTYuMzE2Nzg3NzE5NzI2NTYsIDExMS43NzE2ODI3MzkyNTc4MSwgODMuNzM1MDk5NzkyNDgwNDddXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbMTE5LjQ1MDg4MTk1ODAwNzgxLCA4OC45ODg0NjQzNTU0Njg3NSwgOTcuNDc1NTMyNTMxNzM4MjhdLFxuICAgICAgICBbMTE3LjU1NjI5NzMwMjI0NjEsIDEwOC4yNjM1NjUwNjM0NzY1NiwgOTkuNjIyMTIzNzE4MjYxNzJdLFxuICAgICAgICBbMTM2LjYyNzAxNDE2MDE1NjI1LCA5NC4xMDQzMzE5NzAyMTQ4NCwgODAuOTczNjYzMzMwMDc4MTJdLFxuICAgICAgICBbODMuNjEyMDUyOTE3NDgwNDcsIDkwLjYwMTQ4NjIwNjA1NDY5LCA4MS44MjUxMjY2NDc5NDkyMl1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFsxMDMuMDM2Mjc3NzcwOTk2MSwgMTIzLjEwOTg0MDM5MzA2NjQsIDEyNS42Mjk0NDAzMDc2MTcxOV0sXG4gICAgICAgIFs5Mi4yOTE1MjY3OTQ0MzM2LCAxMDMuMTU3Mjk1MjI3MDUwNzgsIDExOS4xODA2MDMwMjczNDM3NV0sXG4gICAgICAgIFsxMDIuOTMyOTM3NjIyMDcwMzEsIDExNy44MjEwNDQ5MjE4NzUsIDk5LjQwMTUyNzQwNDc4NTE2XSxcbiAgICAgICAgWzk2LjMyOTUyMTE3OTE5OTIyLCAxMDUuODA5NjMxMzQ3NjU2MjUsIDEwNC44NDkxNDM5ODE5MzM2XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzEwNC44NzUwNzYyOTM5NDUzMSwgMTM0LjAxODkyMDg5ODQzNzUsIDExMS4wMjYyNzU2MzQ3NjU2Ml0sXG4gICAgICAgIFs4NS40NTM0NjgzMjI3NTM5LCAxMDcuNjg0MjY1MTM2NzE4NzUsIDEwMy4wMzcyMjM4MTU5MTc5N10sXG4gICAgICAgIFs4OS43MDUzMzc1MjQ0MTQwNiwgOTguMjUyOTgzMDkzMjYxNzIsIDc4LjQyOTE2ODcwMTE3MTg4XSxcbiAgICAgICAgWzExMy42NzQ0NjEzNjQ3NDYxLCA5NS44MTg5Njk3MjY1NjI1LCAxMjIuNzUwMDUzNDA1NzYxNzJdXG4gICAgICBdXG4gICAgXSk7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjNkKFtcbiAgICAgIFtbMS4wLCAyLjAsIDMuMF0sIFs0LjAsIDUuMCwgNi4wXV0sIFtbNy4wLCA4LjAsIDkuMF0sIFsxMC4wLCAxMS4wLCAxMi4wXV0sXG4gICAgICBbWzEzLjAsIDE0LjAsIDE1LjBdLCBbMTYuMCwgMTcuMCwgMTguMF1dXG4gICAgXSk7XG5cbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gWzMsIDJdO1xuICAgIGNvbnN0IGFsaWduQ29ybmVycyA9IHRydWU7XG4gICAgY29uc3QgZyA9IHRmLmdyYWQoXG4gICAgICAgIChpOiB0Zi5UZW5zb3IzRCkgPT4gdGYuaW1hZ2UucmVzaXplQmlsaW5lYXIoaSwgc2l6ZSwgYWxpZ25Db3JuZXJzKSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBnKGlucHV0LCBkeSk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAxLjAsICAyLjAsICAzLjAsICAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCA0LjAsICA1LjAsICA2LjAsXG4gICAgICAzLjUsICA0LjAsICA0LjUsICAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCA1LjAsICA1LjUsICA2LjAsXG4gICAgICAzLjUsICA0LjAsICA0LjUsICAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCA1LjAsICA1LjUsICA2LjAsXG4gICAgICAxMy4wLCAxNC4wLCAxNS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxNi4wLCAxNy4wLCAxOC4wXG4gICAgXTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIC8vIDMgY2hhbm5lbCBuby1vcFxuXG4gIGl0KCdjb2xvcjogc2FtZSBzaXplJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1xuICAgICAgICBbMTE1LjExMDI5ODE1NjczODI4LCAxMTEuOTA5MzYyNzkyOTY4NzUsIDY2Ljg3NDMzNjI0MjY3NTc4XSxcbiAgICAgICAgWzcyLjAzODQ5MDI5NTQxMDE2LCA4MS44NjYzNzg3ODQxNzk2OSwgMTE5LjUzNTg1ODE1NDI5Njg4XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzY4LjU1NTQxOTkyMTg3NSwgOTcuNDk2NDIxODEzOTY0ODQsIDExNi45MDc0MTcyOTczNjMyOF0sXG4gICAgICAgIFsxMjguNjk0NjcxNjMwODU5MzgsIDg2Ljc4MzE0MjA4OTg0Mzc1LCAxMDQuMzExNjY4Mzk1OTk2MV1cbiAgICAgIF1cbiAgICBdKTtcblxuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1sxLjAsIDIuMCwgMy4wXSwgWzQuMCwgNS4wLCA2LjBdXSwgW1s3LjAsIDguMCwgOS4wXSwgWzEwLjAsIDExLjAsIDEyLjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFsyLCAyXTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSBmYWxzZTtcbiAgICBjb25zdCBnID0gdGYuZ3JhZChcbiAgICAgICAgKGk6IHRmLlRlbnNvcjNEKSA9PiB0Zi5pbWFnZS5yZXNpemVCaWxpbmVhcihpLCBzaXplLCBhbGlnbkNvcm5lcnMpKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGcoaW5wdXQsIGR5KTtcbiAgICBjb25zdCBleHBlY3RlZCA9XG4gICAgICAgIFsxLjAsIDIuMCwgMy4wLCA0LjAsIDUuMCwgNi4wLCA3LjAsIDguMCwgOS4wLCAxMC4wLCAxMS4wLCAxMi4wXTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBvdXRwdXQuZGF0YSgpLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdjb2xvcjogc2FtZSBzaXplLCBhbGlnbiBjb3JuZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1xuICAgICAgICBbMTE1LjExMDI5ODE1NjczODI4LCAxMTEuOTA5MzYyNzkyOTY4NzUsIDY2Ljg3NDMzNjI0MjY3NTc4XSxcbiAgICAgICAgWzcyLjAzODQ5MDI5NTQxMDE2LCA4MS44NjYzNzg3ODQxNzk2OSwgMTE5LjUzNTg1ODE1NDI5Njg4XVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWzY4LjU1NTQxOTkyMTg3NSwgOTcuNDk2NDIxODEzOTY0ODQsIDExNi45MDc0MTcyOTczNjMyOF0sXG4gICAgICAgIFsxMjguNjk0NjcxNjMwODU5MzgsIDg2Ljc4MzE0MjA4OTg0Mzc1LCAxMDQuMzExNjY4Mzk1OTk2MV1cbiAgICAgIF1cbiAgICBdKTtcblxuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoW1xuICAgICAgW1sxLjAsIDIuMCwgMy4wXSwgWzQuMCwgNS4wLCA2LjBdXSwgW1s3LjAsIDguMCwgOS4wXSwgWzEwLjAsIDExLjAsIDEyLjBdXVxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFsyLCAyXTtcbiAgICBjb25zdCBhbGlnbkNvcm5lcnMgPSB0cnVlO1xuICAgIGNvbnN0IGcgPSB0Zi5ncmFkKFxuICAgICAgICAoaTogdGYuVGVuc29yM0QpID0+IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGksIHNpemUsIGFsaWduQ29ybmVycykpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gZyhpbnB1dCwgZHkpO1xuICAgIGNvbnN0IGV4cGVjdGVkID1cbiAgICAgICAgWzEuMCwgMi4wLCAzLjAsIDQuMCwgNS4wLCA2LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjAsIDExLjAsIDEyLjBdO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IG91dHB1dC5kYXRhKCksIGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcbiJdfQ==
\No newline at end of file