@speleotica/frcsdata 3.0.1 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/FrcsPlotFile.js +5 -1
  2. package/FrcsPlotShot.js +5 -1
  3. package/FrcsShot.d.ts +25 -4
  4. package/FrcsShot.js +4 -5
  5. package/FrcsSurveyFile.js +5 -1
  6. package/FrcsTrip.js +5 -1
  7. package/FrcsTripSummary.js +5 -1
  8. package/FrcsTripSummaryFile.js +5 -1
  9. package/es/FrcsPlotFile.js +5 -1
  10. package/es/FrcsPlotShot.js +5 -1
  11. package/es/FrcsShot.js +5 -6
  12. package/es/FrcsSurveyFile.js +5 -1
  13. package/es/FrcsTrip.js +5 -1
  14. package/es/FrcsTripSummary.js +5 -1
  15. package/es/FrcsTripSummaryFile.js +5 -1
  16. package/es/formatFrcsShot.js +75 -0
  17. package/es/formatFrcsShot.spec.js +141 -0
  18. package/es/index.js +24 -28
  19. package/es/node/index.js +2 -10
  20. package/es/node/parseFrcsPlotFile.spec.js +1 -5
  21. package/es/node/parseFrcsSurveyFile.spec.js +115 -69
  22. package/es/node/parseFrcsTripSummaryFile.spec.js +1 -5
  23. package/es/parseFrcsPlotFile.js +1 -26
  24. package/es/parseFrcsSurveyFile.js +75 -103
  25. package/es/parseFrcsTripSummaryFile.js +1 -12
  26. package/es/string/index.js +2 -9
  27. package/es/string/parseFrcsPlotFile.spec.js +1 -5
  28. package/es/string/parseFrcsSurveyFile.spec.js +205 -109
  29. package/formatFrcsShot.d.ts +3 -0
  30. package/formatFrcsShot.js +72 -0
  31. package/formatFrcsShot.spec.js +139 -0
  32. package/index.d.ts +2 -1
  33. package/index.js +24 -28
  34. package/node/index.js +1 -9
  35. package/node/parseFrcsPlotFile.spec.js +165 -180
  36. package/node/parseFrcsSurveyFile.spec.js +270 -235
  37. package/node/parseFrcsTripSummaryFile.spec.js +83 -106
  38. package/package.json +15 -15
  39. package/parseFrcsPlotFile.js +224 -318
  40. package/parseFrcsSurveyFile.js +422 -431
  41. package/parseFrcsTripSummaryFile.js +102 -142
  42. package/string/index.js +10 -27
  43. package/string/parseFrcsPlotFile.spec.js +165 -180
  44. package/string/parseFrcsSurveyFile.spec.js +545 -541
  45. package/yarn.lock +1285 -702
@@ -4,106 +4,86 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = parseFrcsSurveyFile;
7
-
8
7
  var _parseSegment = require("parse-segment");
9
-
10
8
  var _unitized = require("@speleotica/unitized");
11
-
12
9
  var _FrcsShot = require("./FrcsShot");
13
-
14
10
  function parseNumber(s, unit) {
15
11
  const value = parseFloat(s);
16
12
  if (isNaN(value)) return null;
17
13
  return new _unitized.UnitizedNumber(value, unit);
18
14
  }
19
-
20
15
  function parseAzimuth(s, unit) {
21
16
  const parsed = parseNumber(s, unit);
22
17
  return (parsed === null || parsed === void 0 ? void 0 : parsed.get(_unitized.Angle.degrees)) === 360 ? _unitized.Unitize.degrees(0) : parsed;
23
18
  }
24
-
25
19
  function parseKind(kind) {
26
20
  switch (kind) {
27
21
  case 'H':
28
22
  return _FrcsShot.FrcsShotKind.Horizontal;
29
-
30
23
  case 'D':
31
24
  return _FrcsShot.FrcsShotKind.Diagonal;
32
-
33
25
  default:
34
26
  return _FrcsShot.FrcsShotKind.Normal;
35
27
  }
36
28
  }
37
-
38
29
  function parseLengthUnit(unit) {
39
30
  switch (unit) {
40
31
  case 'FI':
41
32
  return _unitized.Length.inches;
42
-
33
+ case 'FF':
43
34
  case 'FT':
44
35
  return _unitized.Length.feet;
45
-
36
+ case 'MT':
46
37
  case 'M ':
47
38
  return _unitized.Length.meters;
48
39
  }
49
-
50
40
  return null;
51
41
  }
52
-
53
42
  function parseAngleUnit(unit) {
54
43
  switch (unit) {
55
44
  case 'D':
56
45
  return _unitized.Angle.degrees;
57
-
58
46
  case 'G':
59
47
  return _unitized.Angle.gradians;
60
-
61
48
  case 'M':
62
49
  return _unitized.Angle.milsNATO;
63
50
  }
64
-
65
51
  return null;
66
- } // determines if a cell contains a valid station name.
67
-
52
+ }
68
53
 
54
+ // determines if a cell contains a valid station name.
69
55
  function isValidStation(s) {
70
56
  return /^\s*\S+\s*$/.test(s);
71
- } // determines if a cell contains a valid unsigned integer.
72
-
73
-
57
+ }
58
+ // determines if a cell contains a valid unsigned integer.
74
59
  function isValidUInt(s) {
75
60
  return /^\s*[0-9]+\s*$/.test(s);
76
- } // determines if a cell contains a valid float.
77
-
78
-
61
+ }
62
+ // determines if a cell contains a valid float.
79
63
  function isValidFloat(s) {
80
64
  return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
81
- } // determines if a cell contains a valid unsigned float or whitespace.
82
-
83
-
65
+ }
66
+ // determines if a cell contains a valid unsigned float or whitespace.
84
67
  function isValidOptFloat(s) {
85
68
  return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
86
- } // determines if a cell contains a valid unsigned float or whitespace.
87
-
88
-
69
+ }
70
+ // determines if a cell contains a valid unsigned float or whitespace.
89
71
  function isValidOptUFloat(s) {
90
72
  return /^\s*[0-9]*(\.[0-9]*)?\s*$/.test(s);
91
- } // determines if a cell contains a valid unsigned float.
92
-
93
-
73
+ }
74
+ // determines if a cell contains a valid unsigned float.
94
75
  function isValidUFloat(s) {
95
76
  return /^\s*([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
96
- } // determines if a cell contains a valid inclination or whitespace.
97
-
98
-
77
+ }
78
+ // determines if a cell contains a valid inclination or whitespace.
99
79
  function isValidOptInclination(s) {
100
80
  return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
101
81
  }
102
-
103
82
  function parseLrud(s, unit) {
104
83
  const value = parseFloat(s);
105
84
  return !Number.isFinite(value) || value < 0 ? null : new _unitized.UnitizedNumber(value, unit);
106
85
  }
86
+
107
87
  /**
108
88
  * Parses a raw cdata.fr survey file. These look like so:
109
89
  *
@@ -149,9 +129,8 @@ FI B DD
149
129
  ...</pre>
150
130
  *
151
131
  */
152
-
153
-
154
- async function parseFrcsSurveyFile(file, // eslint-disable-line @typescript-eslint/no-explicit-any
132
+ async function parseFrcsSurveyFile(file,
133
+ // eslint-disable-line @typescript-eslint/no-explicit-any
155
134
  lines) {
156
135
  let cave = null;
157
136
  let location = null;
@@ -168,20 +147,16 @@ lines) {
168
147
  let trip = null;
169
148
  let inBlockComment = false;
170
149
  let section;
171
-
172
150
  function getComment() {
173
151
  if (!commentLines) return null;
174
152
  const comment = commentLines.join('\n').trim();
175
153
  commentLines = null;
176
154
  return comment || null;
177
155
  }
178
-
179
156
  let lineNumber = 0;
180
-
181
157
  for await (const line of lines) {
182
158
  let errored = false;
183
159
  const thisLineNumber = lineNumber;
184
-
185
160
  const error = (message, startColumn, endColumn) => {
186
161
  errored = true;
187
162
  errors.push(new _parseSegment.SegmentParseError(message, new _parseSegment.Segment({
@@ -191,34 +166,25 @@ lines) {
191
166
  startCol: 0
192
167
  }).substring(startColumn, endColumn)));
193
168
  };
194
-
195
169
  const validate = (startColumn, endColumn, fieldName, validator) => {
196
170
  const field = line.substring(startColumn, endColumn);
197
-
198
171
  if (!validator(field)) {
199
172
  error((field.trim() ? 'Invalid ' : 'Missing ') + fieldName, startColumn, endColumn);
200
173
  }
201
-
202
174
  return field;
203
175
  };
204
-
205
176
  lineNumber++;
206
-
207
177
  if (lineNumber === 1) {
208
178
  const match = /^\s*([^,]+)(,(.*))?/.exec(line);
209
-
210
179
  if (match) {
211
180
  cave = match[1].trim();
212
-
213
181
  if (match[3]) {
214
182
  location = match[3].trim();
215
183
  }
216
184
  }
217
185
  }
218
-
219
186
  if (line.charAt(0) === ' ' && line.charAt(1) === '*') {
220
187
  inTripComment = !inTripComment;
221
-
222
188
  if (inTripComment) {
223
189
  section = undefined;
224
190
  tripComment = [];
@@ -231,7 +197,6 @@ lines) {
231
197
  tripName = line && line.trim();
232
198
  } else if (lineNumber === tripCommentStartLine + 2) {
233
199
  const match = /^(.+?)\s*[-.]\s*(\d+)\/(\d+)\/(\d+)$/.exec(line && line.trim());
234
-
235
200
  if (match) {
236
201
  let k = 1;
237
202
  const team = match[k++];
@@ -244,9 +209,7 @@ lines) {
244
209
  } else if (lineNumber > 1) {
245
210
  tripComment.push(line);
246
211
  }
247
-
248
212
  const match = /^\*\*\*([^*])\*\*\*/.exec(line);
249
-
250
213
  if (match) {
251
214
  section = match[1].trim();
252
215
  }
@@ -262,39 +225,30 @@ lines) {
262
225
  // FT CC DD
263
226
  // 01234567
264
227
  let distanceUnit = parseLengthUnit(line.slice(0, 2));
265
-
266
228
  if (!distanceUnit) {
267
229
  distanceUnit = _unitized.Length.feet;
268
230
  error('Invalid distance unit', 0, 2);
269
231
  }
270
-
271
232
  let azimuthUnit = parseAngleUnit(line[6]);
272
-
273
233
  if (!azimuthUnit) {
274
234
  azimuthUnit = _unitized.Angle.degrees;
275
235
  error('Invalid azimuth unit', 6, 7);
276
236
  }
277
-
278
237
  let inclinationUnit = parseAngleUnit(line[7]);
279
-
280
238
  if (!inclinationUnit) {
281
239
  inclinationUnit = _unitized.Angle.degrees;
282
240
  error('Invalid inclination unit', 7, 8);
283
241
  }
284
-
285
242
  const backsightAzimuthCorrected = line[3] === 'C';
286
243
  const backsightInclinationCorrected = line[4] === 'C';
287
244
  const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-';
288
245
  const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-';
289
-
290
246
  if (!/[-CB ]/.test(line[3])) {
291
247
  error('Invalid backsight azimuth type', 3, 4);
292
248
  }
293
-
294
249
  if (!/[-CB ]/.test(line[4])) {
295
250
  error('Invalid backsight inclination type', 4, 5);
296
251
  }
297
-
298
252
  trip = {
299
253
  header: {
300
254
  name: tripName || '',
@@ -325,16 +279,19 @@ lines) {
325
279
  distanceUnit
326
280
  } = trip.header;
327
281
  const inches = distanceUnit === _unitized.Length.inches;
328
- if (inches) distanceUnit = _unitized.Length.feet; // rigorously check the values in all the columns to make sure this
282
+ if (inches) distanceUnit = _unitized.Length.feet;
283
+
284
+ // rigorously check the values in all the columns to make sure this
329
285
  // is really a survey shot line, just in case any stray comments are
330
286
  // not properly delimited.
331
- // from station name
332
287
 
288
+ // from station name
333
289
  if (!/\S/.test(line.substring(5, 10))) continue;
334
- const fromStr = validate(5, 10, 'from station', isValidStation); // Sadly I have found negative LRUD values in Chip's format and apparently
290
+ const fromStr = validate(5, 10, 'from station', isValidStation);
291
+
292
+ // Sadly I have found negative LRUD values in Chip's format and apparently
335
293
  // his program doesn't fail on them, so I have to accept them here
336
294
  // isValidOptFloat instead of isValidOptUFloat
337
-
338
295
  const lStr = validate(40, 43, 'left', isValidOptFloat);
339
296
  const rStr = validate(43, 46, 'right', isValidOptFloat);
340
297
  const uStr = validate(46, 49, 'up', isValidOptFloat);
@@ -343,10 +300,10 @@ lines) {
343
300
  const up = parseLrud(uStr, distanceUnit);
344
301
  const down = parseLrud(dStr, distanceUnit);
345
302
  const left = parseLrud(lStr, distanceUnit);
346
- const right = parseLrud(rStr, distanceUnit); // to station name
303
+ const right = parseLrud(rStr, distanceUnit);
347
304
 
305
+ // to station name
348
306
  const toStr = line.substring(0, 5);
349
-
350
307
  if (!toStr.trim()) {
351
308
  const shot = {
352
309
  from: fromStr.trim(),
@@ -357,22 +314,34 @@ lines) {
357
314
  backsightAzimuth: null,
358
315
  frontsightInclination: null,
359
316
  backsightInclination: null,
360
- left,
361
- right,
362
- up,
363
- down,
317
+ fromLruds: {
318
+ left,
319
+ right,
320
+ up,
321
+ down
322
+ },
364
323
  excludeDistance: true,
365
324
  comment: getComment()
366
325
  };
367
326
  shots.push(shot);
368
327
  continue;
369
328
  }
370
-
371
329
  if (!isValidStation(toStr)) {
372
330
  error('Invalid station name', 0, 5);
373
- } // azimuth and inclination
374
-
331
+ }
332
+ const fromLrudMatch = new RegExp(`^\\s+${fromStr.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}((\\s+(\\d+(\\.\\d*)?|\\.\\d+)){4})`).exec(line.substring(52));
333
+ let fromLruds;
334
+ if (fromLrudMatch) {
335
+ const [left, right, up, down] = fromLrudMatch[1].trim().split(/\s+/g).map(s => parseLrud(s, distanceUnit));
336
+ fromLruds = {
337
+ left,
338
+ right,
339
+ up,
340
+ down
341
+ };
342
+ }
375
343
 
344
+ // azimuth and inclination
376
345
  const azmFsStr = validate(19, 25, 'azimuth', isValidOptUFloat);
377
346
  const azmBsStr = validate(25, 30, 'azimuth', isValidOptUFloat);
378
347
  const incFsStr = line.substring(30, 35);
@@ -384,43 +353,46 @@ lines) {
384
353
  let verticalDistance;
385
354
  let frontsightInclination;
386
355
  let backsightInclination;
387
- let excludeDistance; // parse distance
356
+ let excludeDistance;
357
+ let isSplay;
388
358
 
359
+ // parse distance
389
360
  if (inches) {
390
361
  const feetStr = line.substring(10, 14);
391
- const inchesStr = line.substring(14, 17); // feet and inches are not both optional
392
-
362
+ const inchesStr = line.substring(14, 17);
363
+ // feet and inches are not both optional
393
364
  if (!isValidUInt(feetStr) && !isValidUInt(inchesStr)) {
394
365
  const invalid = feetStr.trim() || inchesStr.trim();
395
366
  error(invalid ? 'Invalid distance' : 'Missing distance', 10, 17);
396
367
  continue;
397
- } // sometimes inches are omitted, hence the || 0...I'm assuming it's possible
398
- // for feet to be omitted as well
399
-
368
+ }
400
369
 
370
+ // sometimes inches are omitted, hence the || 0...I'm assuming it's possible
371
+ // for feet to be omitted as well
401
372
  distance = _unitized.Unitize.inches(parseFloat(inchesStr) || 0).add(_unitized.Unitize.feet(parseFloat(feetStr) || 0));
402
- kind = parseKind(line[17]); // NOTE there are two columns around here that can contain a *.
373
+ kind = parseKind(line[17]);
374
+ // NOTE there are two columns around here that can contain a *.
403
375
  // I think they might represent different values, but thisis confused by
404
376
  // the fact that for ft/in shots, if there is a D or H flag it occupies the
405
377
  // first column that can contain a * for decimal feet shots
406
-
407
- excludeDistance = line[18] === '*';
378
+ excludeDistance = line[18] === '*' || line[18] === 's';
379
+ isSplay = line[18] === 's';
408
380
  } else {
409
381
  // decimal feet are not optional
410
382
  const feetStr = validate(10, 16, 'distance', isValidUFloat);
411
383
  distance = new _unitized.UnitizedNumber(parseFloat(feetStr), distanceUnit);
412
384
  kind = parseKind(line[16]);
413
- excludeDistance = line[17] === '*';
385
+ excludeDistance = line[17] === '*' || line[17] === 's';
386
+ isSplay = line[17] === 's';
414
387
  }
415
-
416
388
  if (kind !== _FrcsShot.FrcsShotKind.Normal) {
417
389
  validate(30, 35, 'vertical-distance', isValidFloat);
418
- } // convert horizontal and diagonal shots to standard
390
+ }
391
+
392
+ // convert horizontal and diagonal shots to standard
419
393
  // in this case incFs is the vertical offset between stations
420
394
  // fortunately it appears we can always count on incFs being specified
421
395
  // and incBs not being specified for these types of shots
422
-
423
-
424
396
  if (kind === _FrcsShot.FrcsShotKind.Horizontal) {
425
397
  // distance is horizontal offset and incFsStr is vertical offset
426
398
  horizontalDistance = distance;
@@ -439,21 +411,18 @@ lines) {
439
411
  backsightInclination = null;
440
412
  } else {
441
413
  // frontsight inclination
442
- validate(30, 35, 'inclination', isValidOptInclination); // frontsight inclination
443
-
414
+ validate(30, 35, 'inclination', isValidOptInclination);
415
+ // frontsight inclination
444
416
  validate(35, 40, 'inclination', isValidOptInclination);
445
417
  frontsightInclination = parseNumber(incFsStr, inclinationUnit);
446
418
  backsightInclination = parseNumber(incBsStr, inclinationUnit);
447
419
  }
448
-
449
420
  if (errored) continue;
450
421
  const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit);
451
422
  const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit);
452
-
453
423
  if (!frontsightInclination && !backsightInclination) {
454
424
  frontsightInclination = _unitized.Unitize.degrees(0);
455
425
  }
456
-
457
426
  const shot = {
458
427
  from: fromStr.trim(),
459
428
  to: toStr.trim(),
@@ -463,19 +432,22 @@ lines) {
463
432
  backsightAzimuth,
464
433
  frontsightInclination,
465
434
  backsightInclination,
466
- left,
467
- right,
468
- up,
469
- down,
435
+ toLruds: {
436
+ left,
437
+ right,
438
+ up,
439
+ down
440
+ },
470
441
  excludeDistance,
471
442
  comment: getComment()
472
443
  };
444
+ if (isSplay) shot.isSplay = true;
445
+ if (fromLruds) shot.fromLruds = fromLruds;
473
446
  if (horizontalDistance) shot.horizontalDistance = horizontalDistance;
474
447
  if (verticalDistance) shot.verticalDistance = verticalDistance;
475
448
  shots.push(shot);
476
449
  }
477
450
  }
478
-
479
451
  return {
480
452
  cave,
481
453
  location,
@@ -483,4 +455,4 @@ lines) {
483
455
  errors
484
456
  };
485
457
  }
486
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUZyY3NTdXJ2ZXlGaWxlLnRzIl0sIm5hbWVzIjpbInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJmcm9tU3RyIiwibFN0ciIsInJTdHIiLCJ1U3RyIiwiZFN0ciIsInVwIiwiZG93biIsImxlZnQiLCJyaWdodCIsInRvU3RyIiwic2hvdCIsImZyb20iLCJ0byIsImRpc3RhbmNlIiwiZnJvbnRzaWdodEF6aW11dGgiLCJiYWNrc2lnaHRBemltdXRoIiwiZnJvbnRzaWdodEluY2xpbmF0aW9uIiwiYmFja3NpZ2h0SW5jbGluYXRpb24iLCJleGNsdWRlRGlzdGFuY2UiLCJhem1Gc1N0ciIsImF6bUJzU3RyIiwiaW5jRnNTdHIiLCJpbmNCc1N0ciIsImhvcml6b250YWxEaXN0YW5jZSIsInZlcnRpY2FsRGlzdGFuY2UiLCJmZWV0U3RyIiwiaW5jaGVzU3RyIiwiaW52YWxpZCIsImFkZCIsImgiLCJ2IiwiTWF0aCIsInNxcnQiLCJhdGFuMiIsImQiLCJhc2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7O0FBQ0E7O0FBUUE7O0FBRUEsU0FBU0EsV0FBVCxDQUNFQyxDQURGLEVBRUVDLElBRkYsRUFHNEI7QUFDMUIsUUFBTUMsS0FBSyxHQUFHQyxVQUFVLENBQUNILENBQUQsQ0FBeEI7QUFD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UUFBRCxFQUFXN0IsV0FBWCxDQUF0QztBQUNBLFlBQU15QixnQkFBZ0IsR0FBR2pILFlBQVksQ0FBQ3NILFFBQUQsRUFBVzlCLFdBQVgsQ0FBckM7O0FBRUEsVUFBSSxDQUFDMEIscUJBQUQsSUFBMEIsQ0FBQ0Msb0JBQS9CLEVBQXFEO0FBQ25ERCxRQUFBQSxxQkFBcUIsR0FBRzdHLGtCQUFRRCxPQUFSLENBQWdCLENBQWhCLENBQXhCO0FBQ0Q7O0FBRUQsWUFBTXdHLElBQWMsR0FBRztBQUNyQkMsUUFBQUEsSUFBSSxFQUFFWCxPQUFPLENBQUM5QyxJQUFSLEVBRGU7QUFFckIwRCxRQUFBQSxFQUFFLEVBQUVILEtBQUssQ0FBQ3ZELElBQU4sRUFGaUI7QUFHckI3QyxRQUFBQSxJQUhxQjtBQUlyQndHLFFBQUFBLFFBSnFCO0FBS3JCQyxRQUFBQSxpQkFMcUI7QUFNckJDLFFBQUFBLGdCQU5xQjtBQU9yQkMsUUFBQUEscUJBUHFCO0FBUXJCQyxRQUFBQSxvQkFScUI7QUFTckJWLFFBQUFBLElBVHFCO0FBVXJCQyxRQUFBQSxLQVZxQjtBQVdyQkgsUUFBQUEsRUFYcUI7QUFZckJDLFFBQUFBLElBWnFCO0FBYXJCWSxRQUFBQSxlQWJxQjtBQWNyQmxFLFFBQUFBLE9BQU8sRUFBRUQsVUFBVTtBQWRFLE9BQXZCO0FBZ0JBLFVBQUl3RSxrQkFBSixFQUF3QmIsSUFBSSxDQUFDYSxrQkFBTCxHQUEwQkEsa0JBQTFCO0FBQ3hCLFVBQUlDLGdCQUFKLEVBQXNCZCxJQUFJLENBQUNjLGdCQUFMLEdBQXdCQSxnQkFBeEI7QUFDdEJ6QixNQUFBQSxLQUFLLENBQUNwQyxJQUFOLENBQVcrQyxJQUFYO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPO0FBQ0wxRSxJQUFBQSxJQURLO0FBRUxDLElBQUFBLFFBRks7QUFHTEMsSUFBQUEsS0FISztBQUlMQyxJQUFBQTtBQUpLLEdBQVA7QUFNRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZyY3NTdXJ2ZXlGaWxlIH0gZnJvbSAnLi9GcmNzU3VydmV5RmlsZSdcbmltcG9ydCB7IEZyY3NUcmlwIH0gZnJvbSAnLi9GcmNzVHJpcCdcbmltcG9ydCB7IFNlZ21lbnQsIFNlZ21lbnRQYXJzZUVycm9yIH0gZnJvbSAncGFyc2Utc2VnbWVudCdcbmltcG9ydCB7XG4gIEFuZ2xlLFxuICBMZW5ndGgsXG4gIFVuaXQsXG4gIFVuaXRpemVkTnVtYmVyLFxuICBVbml0VHlwZSxcbiAgVW5pdGl6ZSxcbn0gZnJvbSAnQHNwZWxlb3RpY2EvdW5pdGl6ZWQnXG5pbXBvcnQgeyBGcmNzU2hvdCwgRnJjc1Nob3RLaW5kIH0gZnJvbSAnLi9GcmNzU2hvdCdcblxuZnVuY3Rpb24gcGFyc2VOdW1iZXI8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PFQ+XG4pOiBVbml0aXplZE51bWJlcjxUPiB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQocylcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuZnVuY3Rpb24gcGFyc2VBemltdXRoKFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8QW5nbGU+XG4pOiBVbml0aXplZE51bWJlcjxBbmdsZT4gfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VOdW1iZXIocywgdW5pdClcbiAgcmV0dXJuIHBhcnNlZD8uZ2V0KEFuZ2xlLmRlZ3JlZXMpID09PSAzNjAgPyBVbml0aXplLmRlZ3JlZXMoMCkgOiBwYXJzZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VLaW5kKGtpbmQ6IHN0cmluZyk6IEZyY3NTaG90S2luZCB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ0gnOlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ib3Jpem9udGFsXG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkRpYWdvbmFsXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuTm9ybWFsXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMZW5ndGhVbml0KHVuaXQ6IHN0cmluZyk6IFVuaXQ8TGVuZ3RoPiB8IG51bGwge1xuICBzd2l0Y2ggKHVuaXQpIHtcbiAgICBjYXNlICdGSSc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmluY2hlc1xuICAgIGNhc2UgJ0ZUJzpcbiAgICAgIHJldHVybiBMZW5ndGguZmVldFxuICAgIGNhc2UgJ00gJzpcbiAgICAgIHJldHVybiBMZW5ndGgubWV0ZXJzXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbmZ1bmN0aW9uIHBhcnNlQW5nbGVVbml0KHVuaXQ6IHN0cmluZyk6IFVuaXQ8QW5nbGU+IHwgbnVsbCB7XG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ0QnOlxuICAgICAgcmV0dXJuIEFuZ2xlLmRlZ3JlZXNcbiAgICBjYXNlICdHJzpcbiAgICAgIHJldHVybiBBbmdsZS5ncmFkaWFuc1xuICAgIGNhc2UgJ00nOlxuICAgICAgcmV0dXJuIEFuZ2xlLm1pbHNOQVRPXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCBzdGF0aW9uIG5hbWUuXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdGlvbihzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlxcUytcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBpbnRlZ2VyLlxuZnVuY3Rpb24gaXNWYWxpZFVJbnQoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbMC05XStcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCBmbG9hdC5cbmZ1bmN0aW9uIGlzVmFsaWRGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlstK10/KFswLTldKyhcXC5bMC05XSopP3xcXC5bMC05XSspXFxzKiQvLnRlc3Qocylcbn1cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgdW5zaWduZWQgZmxvYXQgb3Igd2hpdGVzcGFjZS5cbmZ1bmN0aW9uIGlzVmFsaWRPcHRGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlstK10/WzAtOV0qKFxcLlswLTldKik/XFxzKiQvLnRlc3Qocylcbn1cbi8vIGRldGVybWluZXMgaWYgYSBjZWxsIGNvbnRhaW5zIGEgdmFsaWQgdW5zaWduZWQgZmxvYXQgb3Igd2hpdGVzcGFjZS5cbmZ1bmN0aW9uIGlzVmFsaWRPcHRVRmxvYXQoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdC5cbmZ1bmN0aW9uIGlzVmFsaWRVRmxvYXQoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccyooWzAtOV0rKFxcLlswLTldKik/fFxcLlswLTldKylcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCBpbmNsaW5hdGlvbiBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdEluY2xpbmF0aW9uKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT9bMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuZnVuY3Rpb24gcGFyc2VMcnVkPFQgZXh0ZW5kcyBVbml0VHlwZTxUPj4oXG4gIHM6IHN0cmluZyxcbiAgdW5pdDogVW5pdDxMZW5ndGg+XG4pOiBVbml0aXplZE51bWJlcjxMZW5ndGg+IHwgbnVsbCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChzKVxuICByZXR1cm4gIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCAwXG4gICAgPyBudWxsXG4gICAgOiBuZXcgVW5pdGl6ZWROdW1iZXIodmFsdWUsIHVuaXQpXG59XG5cbi8qKlxuICogUGFyc2VzIGEgcmF3IGNkYXRhLmZyIHN1cnZleSBmaWxlLiAgVGhlc2UgbG9vayBsaWtlIHNvOlxuICpcbjxwcmU+ICAgICAgRmlzaGVyIFJpZGdlIENhdmUgU3lzdGVtLCBIYXJ0IENvLiwgS1lcbkVOVFJBTkNFIERST1BTLCBKT0UnUyBcIkkgTE9WRSBNWSBXSUZFIFRSQVZFUlNFXCIsIFRSSUNLWSBUUkFWRVJTRVxuUEVURVIgUVVJQ0ssIEtFSVRIIE9SVElaICAgLSAgMi0xNS04MVxuVGhpcyBGaWxlIGhhcyBDcnVtcHMgdGVzdCBjb25uZWN0ZWQuICAxMS8yMC8xMlxuICpcbkZUIEMgIEREICAgIEFcbiAgICAgIEFFMjAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDMgIDAgIDJcbiogICAgICAlRlNcbiogICAgIEFFMjAgICAgIDAgICAgICAgIDAgICAgICAgIDAgICAgICAgIEJ1Zy1jYW4ndCBwdXQgYmVmb3JlIHNvIHB1dCBhZnRlci1zbyBjYW4ndCBtYWtlIDIgZml4ZWQgMTAvMjgvMTJcbiBBRTE5IEFFMjAgICA5LjMgICAgNjAuMCAgNjAuMC0zNi4wICAgICAgIDIgMTIgIDAgMjBcbiBBRTE4IEFFMTkgIDI0LjUgICAgIDAuMCAgIDAuMC05MC4wICAgICAgIDYgMTAgMjUgIDBcbiBBRTE3IEFFMTggICA4LjAgICAzNTAuNSAzNTAuNSAxNy4wICAgICAgIDMgIDUgIDAgIDBcbiBBRTE2IEFFMTcgICA2LjcgICAgIDAuMCAgIDAuMC05MC4wICAgICAgIDMgIDUgIDYgIDFcbiBBRTE1IEFFMTYgIDEyLjYgICAgNzAuNSAgNzEuMC0xOC4wICAgICAgIDQgIDAgIDIgIDFcbiBBRTE0IEFFMTUgIDEwLjAgICAgMjEuNSAgMjAuMCAgNi4wICAgICAgIDUgIDUgIDAgIDNcbiBBRTEzIEFFMTQgIDI2LjggICAyODguMCAyODYuMC01MC4wICAgICAgIDAgIDcgMjAgIDVcbipcbipTSE9SVCBDQU5ZT04gQVQgVEhFIEJBU0UgT0YgVEhFIFNFQ09ORCBEUk9QXG4gQUUxMiBBRTEzICAyMC43ICAgMjM2LjAgMjM2LjAgMzQuMCAgICAgICAzICA1ICA0ICA0XG4gQUUxMSBBRTEyICAxMi40ICAgMjEwLjAgMjEwLjAgMzUuMCAgICAgICA3ICA0ICA1ICAxXG4gQUUxMCBBRTEzICAyNS43ICAgIDQwLjAgIDQwLjAgLTkuMCAgICAgICAyICAyICAzICA2XG4qXG4qQUUxMCBBVCBKT0UnUyBcIiBJIExPVkUgTVkgV0lGRSBUUkFWRVJTRSBcIlxuICBBRTkgQUUxMCAgMTcuOCAgICAzMi41ICAzMS4wIDIzLjAgICAgICAgNCAgNSAyMCAxNVxuICBBRTEgIEFFOSAgMTMuNyAgICA4Mi4wICA4Mi4wLTEzLjBcbiAgIEExICBBRTEgIDM0LjMgICAgNDYuMCAgNDguMC0xNy41XG4qXG4qU1VSVkVZIFRPIERPTUUgTkVBUiBUSEUgRU5UUkFOQ0UgRE9NRSAoQUJPVkUgVEhFIFNFQ09ORCBEUk9QKVxuICBBRDEgQUUxNSAgIDguMCAgIDIwMC4wIDIwMC4wICAwLjAgICAgICAgMyAgMSAgMSAgMVxuICBBRDIgIEFEMSAgMTcuNyAgIDE2MS4wIDE2MS4wICA3LjAgICAgICAgMSAgNCAyNSAgMVxuICBBRDMgIEFEMiAgMTAuNCAgIDE4MC4wIDE4MC4wIDUwLjAgICAgICAgNCAgMSAxNSAgNVxuICpcblRSSUNLWSBUUkFWRVJTRSBBTkQgVEhFTiBGSVJTVCBTVVJWRVkgSU4gVVBQRVIgQ1JPV0xXQVlcbkRBTiBDUk9XTCwgS0VJVEggT1JUSVosIENISVAgSE9QUEVSLCBQRVRFUiBRVUlDSywgTEFSUlkgQkVBTiAgICAxNCBGRUIgMTk4MVxuICpcbkZJIEIgIEREXG4gICBBMiAgIEExICA0OCAxMCAgMjkyLjAgMTEwLjAtNDIuMCAgICAgICA1IDEwIDM1ICA1XG4gICBBMyAgIEEyICAxMiAgNSAgMzMzLjUgMTUzLjUgMzUuMCAgICAgICAzICAxIDE1ICA1XG4gICBBNCAgIEEzICAgNCAgMiAgICAwLjAgICAwLjAgOTAuMCAgICAgICAzICAxIDEwIDEwXG4uLi48L3ByZT5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlRnJjc1N1cnZleUZpbGUoXG4gIGZpbGU6IGFueSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGxpbmVzOiBBc3luY0l0ZXJhYmxlPHN0cmluZz5cbik6IFByb21pc2U8RnJjc1N1cnZleUZpbGU+IHtcbiAgbGV0IGNhdmU6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGxldCBsb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgY29uc3QgdHJpcHM6IEFycmF5PEZyY3NUcmlwPiA9IFtdXG4gIGNvbnN0IGVycm9yczogQXJyYXk8U2VnbWVudFBhcnNlRXJyb3I+ID0gW11cblxuICBsZXQgdHJpcE5hbWVcbiAgbGV0IHRyaXBUZWFtXG4gIGxldCB0cmlwRGF0ZVxuICBsZXQgaW5UcmlwQ29tbWVudCA9IHRydWVcbiAgbGV0IHRyaXBDb21tZW50U3RhcnRMaW5lID0gMVxuICBsZXQgdHJpcENvbW1lbnRFbmRMaW5lID0gLTFcbiAgbGV0IHRyaXBDb21tZW50OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgbGV0IGNvbW1lbnRMaW5lczogQXJyYXk8c3RyaW5nPiB8IG51bGwgPSBudWxsXG4gIGxldCB0cmlwOiBGcmNzVHJpcCB8IG51bGwgPSBudWxsXG4gIGxldCBpbkJsb2NrQ29tbWVudCA9IGZhbHNlXG4gIGxldCBzZWN0aW9uXG5cbiAgZnVuY3Rpb24gZ2V0Q29tbWVudCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbW1lbnRMaW5lcykgcmV0dXJuIG51bGxcbiAgICBjb25zdCBjb21tZW50ID0gY29tbWVudExpbmVzLmpvaW4oJ1xcbicpLnRyaW0oKVxuICAgIGNvbW1lbnRMaW5lcyA9IG51bGxcbiAgICByZXR1cm4gY29tbWVudCB8fCBudWxsXG4gIH1cblxuICBsZXQgbGluZU51bWJlciA9IDBcblxuICBmb3IgYXdhaXQgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBsZXQgZXJyb3JlZCA9IGZhbHNlXG5cbiAgICBjb25zdCB0aGlzTGluZU51bWJlciA9IGxpbmVOdW1iZXJcblxuICAgIGNvbnN0IGVycm9yID0gKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgc3RhcnRDb2x1bW46IG51bWJlcixcbiAgICAgIGVuZENvbHVtbjogbnVtYmVyXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBlcnJvcmVkID0gdHJ1ZVxuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBTZWdtZW50UGFyc2VFcnJvcihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIG5ldyBTZWdtZW50KHtcbiAgICAgICAgICAgIHZhbHVlOiBsaW5lLFxuICAgICAgICAgICAgc291cmNlOiBmaWxlLFxuICAgICAgICAgICAgc3RhcnRMaW5lOiB0aGlzTGluZU51bWJlcixcbiAgICAgICAgICAgIHN0YXJ0Q29sOiAwLFxuICAgICAgICAgIH0pLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKVxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSAoXG4gICAgICBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgZW5kQ29sdW1uOiBudW1iZXIsXG4gICAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgIHZhbGlkYXRvcjogKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgICApOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKVxuICAgICAgaWYgKCF2YWxpZGF0b3IoZmllbGQpKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIChmaWVsZC50cmltKCkgPyAnSW52YWxpZCAnIDogJ01pc3NpbmcgJykgKyBmaWVsZE5hbWUsXG4gICAgICAgICAgc3RhcnRDb2x1bW4sXG4gICAgICAgICAgZW5kQ29sdW1uXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWVsZFxuICAgIH1cblxuICAgIGxpbmVOdW1iZXIrK1xuXG4gICAgaWYgKGxpbmVOdW1iZXIgPT09IDEpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXHMqKFteLF0rKSgsKC4qKSk/Ly5leGVjKGxpbmUpXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY2F2ZSA9IG1hdGNoWzFdLnRyaW0oKVxuICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICBsb2NhdGlvbiA9IG1hdGNoWzNdLnRyaW0oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUuY2hhckF0KDApID09PSAnICcgJiYgbGluZS5jaGFyQXQoMSkgPT09ICcqJykge1xuICAgICAgaW5UcmlwQ29tbWVudCA9ICFpblRyaXBDb21tZW50XG4gICAgICBpZiAoaW5UcmlwQ29tbWVudCkge1xuICAgICAgICBzZWN0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgIHRyaXBDb21tZW50ID0gW11cbiAgICAgICAgdHJpcENvbW1lbnRTdGFydExpbmUgPSBsaW5lTnVtYmVyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlwQ29tbWVudEVuZExpbmUgPSBsaW5lTnVtYmVyXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpblRyaXBDb21tZW50KSB7XG4gICAgICBpZiAobGluZU51bWJlciA9PT0gdHJpcENvbW1lbnRTdGFydExpbmUgKyAxKSB7XG4gICAgICAgIHRyaXBOYW1lID0gbGluZSAmJiBsaW5lLnRyaW0oKVxuICAgICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudFN0YXJ0TGluZSArIDIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvXiguKz8pXFxzKlstLl1cXHMqKFxcZCspXFwvKFxcZCspXFwvKFxcZCspJC8uZXhlYyhcbiAgICAgICAgICBsaW5lICYmIGxpbmUudHJpbSgpXG4gICAgICAgIClcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbGV0IGsgPSAxXG4gICAgICAgICAgY29uc3QgdGVhbSA9IG1hdGNoW2srK11cbiAgICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1hdGNoW2srK10pXG4gICAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICB0cmlwRGF0ZSA9IG5ldyBEYXRlKHllYXIgPCA3MCA/IHllYXIgKyAyMDAwIDogeWVhciwgbW9udGggLSAxLCBkYXkpXG4gICAgICAgICAgdHJpcFRlYW0gPSB0ZWFtLnNwbGl0KFxuICAgICAgICAgICAgdGVhbS5pbmRleE9mKCc7JykgPj0gMCA/IC9cXHMqO1xccyovZyA6IC9cXHMqLFxccyovZ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID4gMSkge1xuICAgICAgICB0cmlwQ29tbWVudC5wdXNoKGxpbmUpXG4gICAgICB9XG4gICAgICBjb25zdCBtYXRjaCA9IC9eXFwqXFwqXFwqKFteKl0pXFwqXFwqXFwqLy5leGVjKGxpbmUpXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgc2VjdGlvbiA9IG1hdGNoWzFdLnRyaW0oKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGluZS5jaGFyQXQoMCkgPT09ICcqJykge1xuICAgICAgaW5CbG9ja0NvbW1lbnQgPSAhaW5CbG9ja0NvbW1lbnRcbiAgICAgIGlmIChpbkJsb2NrQ29tbWVudCkgY29tbWVudExpbmVzID0gW11cbiAgICAgIGVsc2UgaWYgKGNvbW1lbnRMaW5lcykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gbGluZS5zdWJzdHJpbmcoMSkudHJpbSgpXG4gICAgICAgIGlmIChwYXJ0ICYmIGNvbW1lbnRMaW5lcykgY29tbWVudExpbmVzLnB1c2gocGFydClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluQmxvY2tDb21tZW50KSB7XG4gICAgICBpZiAoY29tbWVudExpbmVzKSBjb21tZW50TGluZXMucHVzaChsaW5lKVxuICAgIH0gZWxzZSBpZiAobGluZU51bWJlciA9PT0gdHJpcENvbW1lbnRFbmRMaW5lICsgMSkge1xuICAgICAgLy8gRlQgQ0MgRERcbiAgICAgIC8vIDAxMjM0NTY3XG4gICAgICBsZXQgZGlzdGFuY2VVbml0ID0gcGFyc2VMZW5ndGhVbml0KGxpbmUuc2xpY2UoMCwgMikpXG4gICAgICBpZiAoIWRpc3RhbmNlVW5pdCkge1xuICAgICAgICBkaXN0YW5jZVVuaXQgPSBMZW5ndGguZmVldFxuICAgICAgICBlcnJvcignSW52YWxpZCBkaXN0YW5jZSB1bml0JywgMCwgMilcbiAgICAgIH1cbiAgICAgIGxldCBhemltdXRoVW5pdCA9IHBhcnNlQW5nbGVVbml0KGxpbmVbNl0pXG4gICAgICBpZiAoIWF6aW11dGhVbml0KSB7XG4gICAgICAgIGF6aW11dGhVbml0ID0gQW5nbGUuZGVncmVlc1xuICAgICAgICBlcnJvcignSW52YWxpZCBhemltdXRoIHVuaXQnLCA2LCA3KVxuICAgICAgfVxuICAgICAgbGV0IGluY2xpbmF0aW9uVW5pdCA9IHBhcnNlQW5nbGVVbml0KGxpbmVbN10pXG4gICAgICBpZiAoIWluY2xpbmF0aW9uVW5pdCkge1xuICAgICAgICBpbmNsaW5hdGlvblVuaXQgPSBBbmdsZS5kZWdyZWVzXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGluY2xpbmF0aW9uIHVuaXQnLCA3LCA4KVxuICAgICAgfVxuICAgICAgY29uc3QgYmFja3NpZ2h0QXppbXV0aENvcnJlY3RlZCA9IGxpbmVbM10gPT09ICdDJ1xuICAgICAgY29uc3QgYmFja3NpZ2h0SW5jbGluYXRpb25Db3JyZWN0ZWQgPSBsaW5lWzRdID09PSAnQydcbiAgICAgIGNvbnN0IGhhc0JhY2tzaWdodEF6aW11dGggPSBsaW5lWzNdICE9PSAnICcgJiYgbGluZVszXSAhPT0gJy0nXG4gICAgICBjb25zdCBoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiA9IGxpbmVbNF0gIT09ICcgJyAmJiBsaW5lWzRdICE9PSAnLSdcblxuICAgICAgaWYgKCEvWy1DQiBdLy50ZXN0KGxpbmVbM10pKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGJhY2tzaWdodCBhemltdXRoIHR5cGUnLCAzLCA0KVxuICAgICAgfVxuICAgICAgaWYgKCEvWy1DQiBdLy50ZXN0KGxpbmVbNF0pKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGJhY2tzaWdodCBpbmNsaW5hdGlvbiB0eXBlJywgNCwgNSlcbiAgICAgIH1cblxuICAgICAgdHJpcCA9IHtcbiAgICAgICAgaGVhZGVyOiB7XG4gICAgICAgICAgbmFtZTogdHJpcE5hbWUgfHwgJycsXG4gICAgICAgICAgY29tbWVudDogKHRyaXBDb21tZW50ICYmIHRyaXBDb21tZW50LmpvaW4oJ1xcbicpKSB8fCBudWxsLFxuICAgICAgICAgIHNlY3Rpb24sXG4gICAgICAgICAgZGF0ZTogdHJpcERhdGUsXG4gICAgICAgICAgdGVhbTogdHJpcFRlYW0sXG4gICAgICAgICAgZGlzdGFuY2VVbml0LFxuICAgICAgICAgIGF6aW11dGhVbml0LFxuICAgICAgICAgIGluY2xpbmF0aW9uVW5pdCxcbiAgICAgICAgICBiYWNrc2lnaHRBemltdXRoQ29ycmVjdGVkLFxuICAgICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uQ29ycmVjdGVkLFxuICAgICAgICAgIGhhc0JhY2tzaWdodEF6aW11dGgsXG4gICAgICAgICAgaGFzQmFja3NpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIHNob3RzOiBbXSxcbiAgICAgIH1cbiAgICAgIHRyaXBzLnB1c2godHJpcClcbiAgICB9IGVsc2UgaWYgKHRyaXApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2hvdHMsXG4gICAgICAgIGhlYWRlcjogeyBhemltdXRoVW5pdCwgaW5jbGluYXRpb25Vbml0IH0sXG4gICAgICB9ID0gdHJpcFxuICAgICAgbGV0IHsgZGlzdGFuY2VVbml0IH0gPSB0cmlwLmhlYWRlclxuXG4gICAgICBjb25zdCBpbmNoZXMgPSBkaXN0YW5jZVVuaXQgPT09IExlbmd0aC5pbmNoZXNcbiAgICAgIGlmIChpbmNoZXMpIGRpc3RhbmNlVW5pdCA9IExlbmd0aC5mZWV0XG5cbiAgICAgIC8vIHJpZ29yb3VzbHkgY2hlY2sgdGhlIHZhbHVlcyBpbiBhbGwgdGhlIGNvbHVtbnMgdG8gbWFrZSBzdXJlIHRoaXNcbiAgICAgIC8vIGlzIHJlYWxseSBhIHN1cnZleSBzaG90IGxpbmUsIGp1c3QgaW4gY2FzZSBhbnkgc3RyYXkgY29tbWVudHMgYXJlXG4gICAgICAvLyBub3QgcHJvcGVybHkgZGVsaW1pdGVkLlxuXG4gICAgICAvLyBmcm9tIHN0YXRpb24gbmFtZVxuICAgICAgaWYgKCEvXFxTLy50ZXN0KGxpbmUuc3Vic3RyaW5nKDUsIDEwKSkpIGNvbnRpbnVlXG4gICAgICBjb25zdCBmcm9tU3RyID0gdmFsaWRhdGUoNSwgMTAsICdmcm9tIHN0YXRpb24nLCBpc1ZhbGlkU3RhdGlvbilcblxuICAgICAgLy8gU2FkbHkgSSBoYXZlIGZvdW5kIG5lZ2F0aXZlIExSVUQgdmFsdWVzIGluIENoaXAncyBmb3JtYXQgYW5kIGFwcGFyZW50bHlcbiAgICAgIC8vIGhpcyBwcm9ncmFtIGRvZXNuJ3QgZmFpbCBvbiB0aGVtLCBzbyBJIGhhdmUgdG8gYWNjZXB0IHRoZW0gaGVyZVxuICAgICAgLy8gaXNWYWxpZE9wdEZsb2F0IGluc3RlYWQgb2YgaXNWYWxpZE9wdFVGbG9hdFxuICAgICAgY29uc3QgbFN0ciA9IHZhbGlkYXRlKDQwLCA0MywgJ2xlZnQnLCBpc1ZhbGlkT3B0RmxvYXQpXG4gICAgICBjb25zdCByU3RyID0gdmFsaWRhdGUoNDMsIDQ2LCAncmlnaHQnLCBpc1ZhbGlkT3B0RmxvYXQpXG4gICAgICBjb25zdCB1U3RyID0gdmFsaWRhdGUoNDYsIDQ5LCAndXAnLCBpc1ZhbGlkT3B0RmxvYXQpXG4gICAgICBjb25zdCBkU3RyID0gdmFsaWRhdGUoNDksIDUyLCAnZG93bicsIGlzVmFsaWRPcHRGbG9hdClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHVwID0gcGFyc2VMcnVkKHVTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IGRvd24gPSBwYXJzZUxydWQoZFN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgbGVmdCA9IHBhcnNlTHJ1ZChsU3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCByaWdodCA9IHBhcnNlTHJ1ZChyU3RyLCBkaXN0YW5jZVVuaXQpXG5cbiAgICAgIC8vIHRvIHN0YXRpb24gbmFtZVxuICAgICAgY29uc3QgdG9TdHIgPSBsaW5lLnN1YnN0cmluZygwLCA1KVxuICAgICAgaWYgKCF0b1N0ci50cmltKCkpIHtcbiAgICAgICAgY29uc3Qgc2hvdDogRnJjc1Nob3QgPSB7XG4gICAgICAgICAgZnJvbTogZnJvbVN0ci50cmltKCksXG4gICAgICAgICAgdG86IG51bGwsXG4gICAgICAgICAga2luZDogRnJjc1Nob3RLaW5kLk5vcm1hbCxcbiAgICAgICAgICBkaXN0YW5jZTogbmV3IFVuaXRpemVkTnVtYmVyKDAsIGRpc3RhbmNlVW5pdCksXG4gICAgICAgICAgZnJvbnRzaWdodEF6aW11dGg6IG51bGwsXG4gICAgICAgICAgYmFja3NpZ2h0QXppbXV0aDogbnVsbCxcbiAgICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb246IG51bGwsXG4gICAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb246IG51bGwsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICByaWdodCxcbiAgICAgICAgICB1cCxcbiAgICAgICAgICBkb3duLFxuICAgICAgICAgIGV4Y2x1ZGVEaXN0YW5jZTogdHJ1ZSxcbiAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KCksXG4gICAgICAgIH1cbiAgICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKCFpc1ZhbGlkU3RhdGlvbih0b1N0cikpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgc3RhdGlvbiBuYW1lJywgMCwgNSlcbiAgICAgIH1cblxuICAgICAgLy8gYXppbXV0aCBhbmQgaW5jbGluYXRpb25cbiAgICAgIGNvbnN0IGF6bUZzU3RyID0gdmFsaWRhdGUoMTksIDI1LCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBhem1Cc1N0ciA9IHZhbGlkYXRlKDI1LCAzMCwgJ2F6aW11dGgnLCBpc1ZhbGlkT3B0VUZsb2F0KVxuICAgICAgY29uc3QgaW5jRnNTdHIgPSBsaW5lLnN1YnN0cmluZygzMCwgMzUpXG4gICAgICBjb25zdCBpbmNCc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDM1LCA0MClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGxldCBraW5kOiBGcmNzU2hvdEtpbmRcbiAgICAgIGxldCBkaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPlxuICAgICAgbGV0IGhvcml6b250YWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHZlcnRpY2FsRGlzdGFuY2U6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCB1bmRlZmluZWRcbiAgICAgIGxldCBmcm9udHNpZ2h0SW5jbGluYXRpb246IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGxcbiAgICAgIGxldCBiYWNrc2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGV4Y2x1ZGVEaXN0YW5jZTogYm9vbGVhblxuXG4gICAgICAvLyBwYXJzZSBkaXN0YW5jZVxuICAgICAgaWYgKGluY2hlcykge1xuICAgICAgICBjb25zdCBmZWV0U3RyID0gbGluZS5zdWJzdHJpbmcoMTAsIDE0KVxuICAgICAgICBjb25zdCBpbmNoZXNTdHIgPSBsaW5lLnN1YnN0cmluZygxNCwgMTcpXG4gICAgICAgIC8vIGZlZXQgYW5kIGluY2hlcyBhcmUgbm90IGJvdGggb3B0aW9uYWxcbiAgICAgICAgaWYgKCFpc1ZhbGlkVUludChmZWV0U3RyKSAmJiAhaXNWYWxpZFVJbnQoaW5jaGVzU3RyKSkge1xuICAgICAgICAgIGNvbnN0IGludmFsaWQgPSBmZWV0U3RyLnRyaW0oKSB8fCBpbmNoZXNTdHIudHJpbSgpXG4gICAgICAgICAgZXJyb3IoaW52YWxpZCA/ICdJbnZhbGlkIGRpc3RhbmNlJyA6ICdNaXNzaW5nIGRpc3RhbmNlJywgMTAsIDE3KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb21ldGltZXMgaW5jaGVzIGFyZSBvbWl0dGVkLCBoZW5jZSB0aGUgfHwgMC4uLkknbSBhc3N1bWluZyBpdCdzIHBvc3NpYmxlXG4gICAgICAgIC8vIGZvciBmZWV0IHRvIGJlIG9taXR0ZWQgYXMgd2VsbFxuICAgICAgICBkaXN0YW5jZSA9IFVuaXRpemUuaW5jaGVzKHBhcnNlRmxvYXQoaW5jaGVzU3RyKSB8fCAwKS5hZGQoXG4gICAgICAgICAgVW5pdGl6ZS5mZWV0KHBhcnNlRmxvYXQoZmVldFN0cikgfHwgMClcbiAgICAgICAgKVxuXG4gICAgICAgIGtpbmQgPSBwYXJzZUtpbmQobGluZVsxN10pXG4gICAgICAgIC8vIE5PVEUgdGhlcmUgYXJlIHR3byBjb2x1bW5zIGFyb3VuZCBoZXJlIHRoYXQgY2FuIGNvbnRhaW4gYSAqLlxuICAgICAgICAvLyBJIHRoaW5rIHRoZXkgbWlnaHQgcmVwcmVzZW50IGRpZmZlcmVudCB2YWx1ZXMsIGJ1dCB0aGlzaXMgY29uZnVzZWQgYnlcbiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCBmb3IgZnQvaW4gc2hvdHMsIGlmIHRoZXJlIGlzIGEgRCBvciBIIGZsYWcgaXQgb2NjdXBpZXMgdGhlXG4gICAgICAgIC8vIGZpcnN0IGNvbHVtbiB0aGF0IGNhbiBjb250YWluIGEgKiBmb3IgZGVjaW1hbCBmZWV0IHNob3RzXG4gICAgICAgIGV4Y2x1ZGVEaXN0YW5jZSA9IGxpbmVbMThdID09PSAnKidcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlY2ltYWwgZmVldCBhcmUgbm90IG9wdGlvbmFsXG4gICAgICAgIGNvbnN0IGZlZXRTdHIgPSB2YWxpZGF0ZSgxMCwgMTYsICdkaXN0YW5jZScsIGlzVmFsaWRVRmxvYXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHBhcnNlRmxvYXQoZmVldFN0ciksIGRpc3RhbmNlVW5pdClcbiAgICAgICAga2luZCA9IHBhcnNlS2luZChsaW5lWzE2XSlcbiAgICAgICAgZXhjbHVkZURpc3RhbmNlID0gbGluZVsxN10gPT09ICcqJ1xuICAgICAgfVxuXG4gICAgICBpZiAoa2luZCAhPT0gRnJjc1Nob3RLaW5kLk5vcm1hbCkge1xuICAgICAgICB2YWxpZGF0ZSgzMCwgMzUsICd2ZXJ0aWNhbC1kaXN0YW5jZScsIGlzVmFsaWRGbG9hdClcbiAgICAgIH1cblxuICAgICAgLy8gY29udmVydCBob3Jpem9udGFsIGFuZCBkaWFnb25hbCBzaG90cyB0byBzdGFuZGFyZFxuICAgICAgLy8gaW4gdGhpcyBjYXNlIGluY0ZzIGlzIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgYmV0d2VlbiBzdGF0aW9uc1xuICAgICAgLy8gZm9ydHVuYXRlbHkgaXQgYXBwZWFycyB3ZSBjYW4gYWx3YXlzIGNvdW50IG9uIGluY0ZzIGJlaW5nIHNwZWNpZmllZFxuICAgICAgLy8gYW5kIGluY0JzIG5vdCBiZWluZyBzcGVjaWZpZWQgZm9yIHRoZXNlIHR5cGVzIG9mIHNob3RzXG4gICAgICBpZiAoa2luZCA9PT0gRnJjc1Nob3RLaW5kLkhvcml6b250YWwpIHtcbiAgICAgICAgLy8gZGlzdGFuY2UgaXMgaG9yaXpvbnRhbCBvZmZzZXQgYW5kIGluY0ZzU3RyIGlzIHZlcnRpY2FsIG9mZnNldFxuICAgICAgICBob3Jpem9udGFsRGlzdGFuY2UgPSBkaXN0YW5jZVxuICAgICAgICBjb25zdCBoID0gaG9yaXpvbnRhbERpc3RhbmNlLmdldChkaXN0YW5jZVVuaXQpXG4gICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGluY0ZzU3RyKVxuICAgICAgICB2ZXJ0aWNhbERpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHYsIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIoTWF0aC5zcXJ0KGggKiBoICsgdiAqIHYpLCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IEFuZ2xlLmF0YW4yKFxuICAgICAgICAgIHZlcnRpY2FsRGlzdGFuY2UsXG4gICAgICAgICAgaG9yaXpvbnRhbERpc3RhbmNlXG4gICAgICAgIClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IEZyY3NTaG90S2luZC5EaWFnb25hbCkge1xuICAgICAgICAvLyBkaXN0YW5jZSBpcyBhcyB1c3VhbCwgYnV0IGluY0ZzU3RyIGlzIHZlcnRpY2FsIG9mZnNldFxuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2UuZ2V0KGRpc3RhbmNlVW5pdClcbiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoaW5jRnNTdHIpXG4gICAgICAgIHZlcnRpY2FsRGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIodiwgZGlzdGFuY2VVbml0KVxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24gPSBBbmdsZS5hc2luKHYgLyBkKVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IG51bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZyb250c2lnaHQgaW5jbGluYXRpb25cbiAgICAgICAgdmFsaWRhdGUoMzAsIDM1LCAnaW5jbGluYXRpb24nLCBpc1ZhbGlkT3B0SW5jbGluYXRpb24pXG4gICAgICAgIC8vIGZyb250c2lnaHQgaW5jbGluYXRpb25cbiAgICAgICAgdmFsaWRhdGUoMzUsIDQwLCAnaW5jbGluYXRpb24nLCBpc1ZhbGlkT3B0SW5jbGluYXRpb24pXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IHBhcnNlTnVtYmVyKGluY0ZzU3RyLCBpbmNsaW5hdGlvblVuaXQpXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gcGFyc2VOdW1iZXIoaW5jQnNTdHIsIGluY2xpbmF0aW9uVW5pdClcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcmVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBmcm9udHNpZ2h0QXppbXV0aCA9IHBhcnNlQXppbXV0aChhem1Gc1N0ciwgYXppbXV0aFVuaXQpXG4gICAgICBjb25zdCBiYWNrc2lnaHRBemltdXRoID0gcGFyc2VBemltdXRoKGF6bUJzU3RyLCBhemltdXRoVW5pdClcblxuICAgICAgaWYgKCFmcm9udHNpZ2h0SW5jbGluYXRpb24gJiYgIWJhY2tzaWdodEluY2xpbmF0aW9uKSB7XG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IFVuaXRpemUuZGVncmVlcygwKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzaG90OiBGcmNzU2hvdCA9IHtcbiAgICAgICAgZnJvbTogZnJvbVN0ci50cmltKCksXG4gICAgICAgIHRvOiB0b1N0ci50cmltKCksXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICBmcm9udHNpZ2h0QXppbXV0aCxcbiAgICAgICAgYmFja3NpZ2h0QXppbXV0aCxcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgbGVmdCxcbiAgICAgICAgcmlnaHQsXG4gICAgICAgIHVwLFxuICAgICAgICBkb3duLFxuICAgICAgICBleGNsdWRlRGlzdGFuY2UsXG4gICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgIH1cbiAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UpIHNob3QuaG9yaXpvbnRhbERpc3RhbmNlID0gaG9yaXpvbnRhbERpc3RhbmNlXG4gICAgICBpZiAodmVydGljYWxEaXN0YW5jZSkgc2hvdC52ZXJ0aWNhbERpc3RhbmNlID0gdmVydGljYWxEaXN0YW5jZVxuICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2F2ZSxcbiAgICBsb2NhdGlvbixcbiAgICB0cmlwcyxcbiAgICBlcnJvcnMsXG4gIH1cbn1cbiJdfQ==
458
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGFyc2VTZWdtZW50IiwicmVxdWlyZSIsIl91bml0aXplZCIsIl9GcmNzU2hvdCIsInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJmcm9tU3RyIiwibFN0ciIsInJTdHIiLCJ1U3RyIiwiZFN0ciIsInVwIiwiZG93biIsImxlZnQiLCJyaWdodCIsInRvU3RyIiwic2hvdCIsImZyb20iLCJ0byIsImRpc3RhbmNlIiwiZnJvbnRzaWdodEF6aW11dGgiLCJiYWNrc2lnaHRBemltdXRoIiwiZnJvbnRzaWdodEluY2xpbmF0aW9uIiwiYmFja3NpZ2h0SW5jbGluYXRpb24iLCJmcm9tTHJ1ZHMiLCJleGNsdWRlRGlzdGFuY2UiLCJmcm9tTHJ1ZE1hdGNoIiwiUmVnRXhwIiwicmVwbGFjZSIsIm1hcCIsImF6bUZzU3RyIiwiYXptQnNTdHIiLCJpbmNGc1N0ciIsImluY0JzU3RyIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwidmVydGljYWxEaXN0YW5jZSIsImlzU3BsYXkiLCJmZWV0U3RyIiwiaW5jaGVzU3RyIiwiaW52YWxpZCIsImFkZCIsImgiLCJ2IiwiTWF0aCIsInNxcnQiLCJhdGFuMiIsImQiLCJhc2luIiwidG9McnVkcyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUZyY3NTdXJ2ZXlGaWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZyY3NTdXJ2ZXlGaWxlIH0gZnJvbSAnLi9GcmNzU3VydmV5RmlsZSdcbmltcG9ydCB7IEZyY3NUcmlwIH0gZnJvbSAnLi9GcmNzVHJpcCdcbmltcG9ydCB7IFNlZ21lbnQsIFNlZ21lbnRQYXJzZUVycm9yIH0gZnJvbSAncGFyc2Utc2VnbWVudCdcbmltcG9ydCB7XG4gIEFuZ2xlLFxuICBMZW5ndGgsXG4gIFVuaXQsXG4gIFVuaXRpemVkTnVtYmVyLFxuICBVbml0VHlwZSxcbiAgVW5pdGl6ZSxcbn0gZnJvbSAnQHNwZWxlb3RpY2EvdW5pdGl6ZWQnXG5pbXBvcnQgeyBGcmNzU2hvdCwgRnJjc1Nob3RLaW5kIH0gZnJvbSAnLi9GcmNzU2hvdCdcblxuZnVuY3Rpb24gcGFyc2VOdW1iZXI8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PFQ+XG4pOiBVbml0aXplZE51bWJlcjxUPiB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQocylcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuZnVuY3Rpb24gcGFyc2VBemltdXRoKFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8QW5nbGU+XG4pOiBVbml0aXplZE51bWJlcjxBbmdsZT4gfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VOdW1iZXIocywgdW5pdClcbiAgcmV0dXJuIHBhcnNlZD8uZ2V0KEFuZ2xlLmRlZ3JlZXMpID09PSAzNjAgPyBVbml0aXplLmRlZ3JlZXMoMCkgOiBwYXJzZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VLaW5kKGtpbmQ6IHN0cmluZyk6IEZyY3NTaG90S2luZCB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ0gnOlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ib3Jpem9udGFsXG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkRpYWdvbmFsXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuTm9ybWFsXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMZW5ndGhVbml0KHVuaXQ6IHN0cmluZyk6IFVuaXQ8TGVuZ3RoPiB8IG51bGwge1xuICBzd2l0Y2ggKHVuaXQpIHtcbiAgICBjYXNlICdGSSc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmluY2hlc1xuICAgIGNhc2UgJ0ZGJzpcbiAgICBjYXNlICdGVCc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmZlZXRcbiAgICBjYXNlICdNVCc6XG4gICAgY2FzZSAnTSAnOlxuICAgICAgcmV0dXJuIExlbmd0aC5tZXRlcnNcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuZnVuY3Rpb24gcGFyc2VBbmdsZVVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxBbmdsZT4gfCBudWxsIHtcbiAgc3dpdGNoICh1bml0KSB7XG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gQW5nbGUuZGVncmVlc1xuICAgIGNhc2UgJ0cnOlxuICAgICAgcmV0dXJuIEFuZ2xlLmdyYWRpYW5zXG4gICAgY2FzZSAnTSc6XG4gICAgICByZXR1cm4gQW5nbGUubWlsc05BVE9cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHN0YXRpb24gbmFtZS5cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0aW9uKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqXFxTK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGludGVnZXIuXG5mdW5jdGlvbiBpc1ZhbGlkVUludChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT8oWzAtOV0rKFxcLlswLTldKik/fFxcLlswLTldKylcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT9bMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKihbMC05XSsoXFwuWzAtOV0qKT98XFwuWzAtOV0rKVxccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGluY2xpbmF0aW9uIG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0SW5jbGluYXRpb24oczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdP1swLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG5mdW5jdGlvbiBwYXJzZUxydWQ8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PExlbmd0aD5cbik6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCBudWxsIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHMpXG4gIHJldHVybiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDBcbiAgICA/IG51bGxcbiAgICA6IG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSByYXcgY2RhdGEuZnIgc3VydmV5IGZpbGUuICBUaGVzZSBsb29rIGxpa2Ugc286XG4gKlxuPHByZT4gICAgICBGaXNoZXIgUmlkZ2UgQ2F2ZSBTeXN0ZW0sIEhhcnQgQ28uLCBLWVxuRU5UUkFOQ0UgRFJPUFMsIEpPRSdTIFwiSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0VcIiwgVFJJQ0tZIFRSQVZFUlNFXG5QRVRFUiBRVUlDSywgS0VJVEggT1JUSVogICAtICAyLTE1LTgxXG5UaGlzIEZpbGUgaGFzIENydW1wcyB0ZXN0IGNvbm5lY3RlZC4gIDExLzIwLzEyXG4gKlxuRlQgQyAgREQgICAgQVxuICAgICAgQUUyMCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgMyAgMCAgMlxuKiAgICAgICVGU1xuKiAgICAgQUUyMCAgICAgMCAgICAgICAgMCAgICAgICAgMCAgICAgICAgQnVnLWNhbid0IHB1dCBiZWZvcmUgc28gcHV0IGFmdGVyLXNvIGNhbid0IG1ha2UgMiBmaXhlZCAxMC8yOC8xMlxuIEFFMTkgQUUyMCAgIDkuMyAgICA2MC4wICA2MC4wLTM2LjAgICAgICAgMiAxMiAgMCAyMFxuIEFFMTggQUUxOSAgMjQuNSAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgNiAxMCAyNSAgMFxuIEFFMTcgQUUxOCAgIDguMCAgIDM1MC41IDM1MC41IDE3LjAgICAgICAgMyAgNSAgMCAgMFxuIEFFMTYgQUUxNyAgIDYuNyAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgMyAgNSAgNiAgMVxuIEFFMTUgQUUxNiAgMTIuNiAgICA3MC41ICA3MS4wLTE4LjAgICAgICAgNCAgMCAgMiAgMVxuIEFFMTQgQUUxNSAgMTAuMCAgICAyMS41ICAyMC4wICA2LjAgICAgICAgNSAgNSAgMCAgM1xuIEFFMTMgQUUxNCAgMjYuOCAgIDI4OC4wIDI4Ni4wLTUwLjAgICAgICAgMCAgNyAyMCAgNVxuKlxuKlNIT1JUIENBTllPTiBBVCBUSEUgQkFTRSBPRiBUSEUgU0VDT05EIERST1BcbiBBRTEyIEFFMTMgIDIwLjcgICAyMzYuMCAyMzYuMCAzNC4wICAgICAgIDMgIDUgIDQgIDRcbiBBRTExIEFFMTIgIDEyLjQgICAyMTAuMCAyMTAuMCAzNS4wICAgICAgIDcgIDQgIDUgIDFcbiBBRTEwIEFFMTMgIDI1LjcgICAgNDAuMCAgNDAuMCAtOS4wICAgICAgIDIgIDIgIDMgIDZcbipcbipBRTEwIEFUIEpPRSdTIFwiIEkgTE9WRSBNWSBXSUZFIFRSQVZFUlNFIFwiXG4gIEFFOSBBRTEwICAxNy44ICAgIDMyLjUgIDMxLjAgMjMuMCAgICAgICA0ICA1IDIwIDE1XG4gIEFFMSAgQUU5ICAxMy43ICAgIDgyLjAgIDgyLjAtMTMuMFxuICAgQTEgIEFFMSAgMzQuMyAgICA0Ni4wICA0OC4wLTE3LjVcbipcbipTVVJWRVkgVE8gRE9NRSBORUFSIFRIRSBFTlRSQU5DRSBET01FIChBQk9WRSBUSEUgU0VDT05EIERST1ApXG4gIEFEMSBBRTE1ICAgOC4wICAgMjAwLjAgMjAwLjAgIDAuMCAgICAgICAzICAxICAxICAxXG4gIEFEMiAgQUQxICAxNy43ICAgMTYxLjAgMTYxLjAgIDcuMCAgICAgICAxICA0IDI1ICAxXG4gIEFEMyAgQUQyICAxMC40ICAgMTgwLjAgMTgwLjAgNTAuMCAgICAgICA0ICAxIDE1ICA1XG4gKlxuVFJJQ0tZIFRSQVZFUlNFIEFORCBUSEVOIEZJUlNUIFNVUlZFWSBJTiBVUFBFUiBDUk9XTFdBWVxuREFOIENST1dMLCBLRUlUSCBPUlRJWiwgQ0hJUCBIT1BQRVIsIFBFVEVSIFFVSUNLLCBMQVJSWSBCRUFOICAgIDE0IEZFQiAxOTgxXG4gKlxuRkkgQiAgRERcbiAgIEEyICAgQTEgIDQ4IDEwICAyOTIuMCAxMTAuMC00Mi4wICAgICAgIDUgMTAgMzUgIDVcbiAgIEEzICAgQTIgIDEyICA1ICAzMzMuNSAxNTMuNSAzNS4wICAgICAgIDMgIDEgMTUgIDVcbiAgIEE0ICAgQTMgICA0ICAyICAgIDAuMCAgIDAuMCA5MC4wICAgICAgIDMgIDEgMTAgMTBcbi4uLjwvcHJlPlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcGFyc2VGcmNzU3VydmV5RmlsZShcbiAgZmlsZTogYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbGluZXM6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuKTogUHJvbWlzZTxGcmNzU3VydmV5RmlsZT4ge1xuICBsZXQgY2F2ZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBjb25zdCB0cmlwczogQXJyYXk8RnJjc1RyaXA+ID0gW11cbiAgY29uc3QgZXJyb3JzOiBBcnJheTxTZWdtZW50UGFyc2VFcnJvcj4gPSBbXVxuXG4gIGxldCB0cmlwTmFtZVxuICBsZXQgdHJpcFRlYW1cbiAgbGV0IHRyaXBEYXRlXG4gIGxldCBpblRyaXBDb21tZW50ID0gdHJ1ZVxuICBsZXQgdHJpcENvbW1lbnRTdGFydExpbmUgPSAxXG4gIGxldCB0cmlwQ29tbWVudEVuZExpbmUgPSAtMVxuICBsZXQgdHJpcENvbW1lbnQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBsZXQgY29tbWVudExpbmVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IG51bGxcbiAgbGV0IHRyaXA6IEZyY3NUcmlwIHwgbnVsbCA9IG51bGxcbiAgbGV0IGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgbGV0IHNlY3Rpb25cblxuICBmdW5jdGlvbiBnZXRDb21tZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29tbWVudExpbmVzKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50TGluZXMuam9pbignXFxuJykudHJpbSgpXG4gICAgY29tbWVudExpbmVzID0gbnVsbFxuICAgIHJldHVybiBjb21tZW50IHx8IG51bGxcbiAgfVxuXG4gIGxldCBsaW5lTnVtYmVyID0gMFxuXG4gIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGxldCBlcnJvcmVkID0gZmFsc2VcblxuICAgIGNvbnN0IHRoaXNMaW5lTnVtYmVyID0gbGluZU51bWJlclxuXG4gICAgY29uc3QgZXJyb3IgPSAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgZW5kQ29sdW1uOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IFNlZ21lbnRQYXJzZUVycm9yKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbmV3IFNlZ21lbnQoe1xuICAgICAgICAgICAgdmFsdWU6IGxpbmUsXG4gICAgICAgICAgICBzb3VyY2U6IGZpbGUsXG4gICAgICAgICAgICBzdGFydExpbmU6IHRoaXNMaW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2w6IDAsXG4gICAgICAgICAgfSkuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IChcbiAgICAgIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBlbmRDb2x1bW46IG51bWJlcixcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gYm9vbGVhblxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICBpZiAoIXZhbGlkYXRvcihmaWVsZCkpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgKGZpZWxkLnRyaW0oKSA/ICdJbnZhbGlkICcgOiAnTWlzc2luZyAnKSArIGZpZWxkTmFtZSxcbiAgICAgICAgICBzdGFydENvbHVtbixcbiAgICAgICAgICBlbmRDb2x1bW5cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkXG4gICAgfVxuXG4gICAgbGluZU51bWJlcisrXG5cbiAgICBpZiAobGluZU51bWJlciA9PT0gMSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxccyooW14sXSspKCwoLiopKT8vLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjYXZlID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgIGxvY2F0aW9uID0gbWF0Y2hbM10udHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09ICcgJyAmJiBsaW5lLmNoYXJBdCgxKSA9PT0gJyonKSB7XG4gICAgICBpblRyaXBDb21tZW50ID0gIWluVHJpcENvbW1lbnRcbiAgICAgIGlmIChpblRyaXBDb21tZW50KSB7XG4gICAgICAgIHNlY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgICAgdHJpcENvbW1lbnQgPSBbXVxuICAgICAgICB0cmlwQ29tbWVudFN0YXJ0TGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXBDb21tZW50RW5kTGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluVHJpcENvbW1lbnQpIHtcbiAgICAgIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudFN0YXJ0TGluZSArIDEpIHtcbiAgICAgICAgdHJpcE5hbWUgPSBsaW5lICYmIGxpbmUudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50U3RhcnRMaW5lICsgMikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4rPylcXHMqWy0uXVxccyooXFxkKylcXC8oXFxkKylcXC8oXFxkKykkLy5leGVjKFxuICAgICAgICAgIGxpbmUgJiYgbGluZS50cmltKClcbiAgICAgICAgKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgayA9IDFcbiAgICAgICAgICBjb25zdCB0ZWFtID0gbWF0Y2hbaysrXVxuICAgICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIHRyaXBEYXRlID0gbmV3IERhdGUoeWVhciA8IDcwID8geWVhciArIDIwMDAgOiB5ZWFyLCBtb250aCAtIDEsIGRheSlcbiAgICAgICAgICB0cmlwVGVhbSA9IHRlYW0uc3BsaXQoXG4gICAgICAgICAgICB0ZWFtLmluZGV4T2YoJzsnKSA+PSAwID8gL1xccyo7XFxzKi9nIDogL1xccyosXFxzKi9nXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPiAxKSB7XG4gICAgICAgIHRyaXBDb21tZW50LnB1c2gobGluZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXCpcXCpcXCooW14qXSlcXCpcXCpcXCovLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBzZWN0aW9uID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICBpbkJsb2NrQ29tbWVudCA9ICFpbkJsb2NrQ29tbWVudFxuICAgICAgaWYgKGluQmxvY2tDb21tZW50KSBjb21tZW50TGluZXMgPSBbXVxuICAgICAgZWxzZSBpZiAoY29tbWVudExpbmVzKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBsaW5lLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgaWYgKHBhcnQgJiYgY29tbWVudExpbmVzKSBjb21tZW50TGluZXMucHVzaChwYXJ0KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgIGlmIChjb21tZW50TGluZXMpIGNvbW1lbnRMaW5lcy5wdXNoKGxpbmUpXG4gICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudEVuZExpbmUgKyAxKSB7XG4gICAgICAvLyBGVCBDQyBERFxuICAgICAgLy8gMDEyMzQ1NjdcbiAgICAgIGxldCBkaXN0YW5jZVVuaXQgPSBwYXJzZUxlbmd0aFVuaXQobGluZS5zbGljZSgwLCAyKSlcbiAgICAgIGlmICghZGlzdGFuY2VVbml0KSB7XG4gICAgICAgIGRpc3RhbmNlVW5pdCA9IExlbmd0aC5mZWV0XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIHVuaXQnLCAwLCAyKVxuICAgICAgfVxuICAgICAgbGV0IGF6aW11dGhVbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs2XSlcbiAgICAgIGlmICghYXppbXV0aFVuaXQpIHtcbiAgICAgICAgYXppbXV0aFVuaXQgPSBBbmdsZS5kZWdyZWVzXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGF6aW11dGggdW5pdCcsIDYsIDcpXG4gICAgICB9XG4gICAgICBsZXQgaW5jbGluYXRpb25Vbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs3XSlcbiAgICAgIGlmICghaW5jbGluYXRpb25Vbml0KSB7XG4gICAgICAgIGluY2xpbmF0aW9uVW5pdCA9IEFuZ2xlLmRlZ3JlZXNcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgaW5jbGluYXRpb24gdW5pdCcsIDcsIDgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrc2lnaHRBemltdXRoQ29ycmVjdGVkID0gbGluZVszXSA9PT0gJ0MnXG4gICAgICBjb25zdCBiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCA9IGxpbmVbNF0gPT09ICdDJ1xuICAgICAgY29uc3QgaGFzQmFja3NpZ2h0QXppbXV0aCA9IGxpbmVbM10gIT09ICcgJyAmJiBsaW5lWzNdICE9PSAnLSdcbiAgICAgIGNvbnN0IGhhc0JhY2tzaWdodEluY2xpbmF0aW9uID0gbGluZVs0XSAhPT0gJyAnICYmIGxpbmVbNF0gIT09ICctJ1xuXG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVszXSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGF6aW11dGggdHlwZScsIDMsIDQpXG4gICAgICB9XG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVs0XSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGluY2xpbmF0aW9uIHR5cGUnLCA0LCA1KVxuICAgICAgfVxuXG4gICAgICB0cmlwID0ge1xuICAgICAgICBoZWFkZXI6IHtcbiAgICAgICAgICBuYW1lOiB0cmlwTmFtZSB8fCAnJyxcbiAgICAgICAgICBjb21tZW50OiAodHJpcENvbW1lbnQgJiYgdHJpcENvbW1lbnQuam9pbignXFxuJykpIHx8IG51bGwsXG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICBkYXRlOiB0cmlwRGF0ZSxcbiAgICAgICAgICB0ZWFtOiB0cmlwVGVhbSxcbiAgICAgICAgICBkaXN0YW5jZVVuaXQsXG4gICAgICAgICAgYXppbXV0aFVuaXQsXG4gICAgICAgICAgaW5jbGluYXRpb25Vbml0LFxuICAgICAgICAgIGJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQsXG4gICAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb25Db3JyZWN0ZWQsXG4gICAgICAgICAgaGFzQmFja3NpZ2h0QXppbXV0aCxcbiAgICAgICAgICBoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvdHM6IFtdLFxuICAgICAgfVxuICAgICAgdHJpcHMucHVzaCh0cmlwKVxuICAgIH0gZWxzZSBpZiAodHJpcCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaG90cyxcbiAgICAgICAgaGVhZGVyOiB7IGF6aW11dGhVbml0LCBpbmNsaW5hdGlvblVuaXQgfSxcbiAgICAgIH0gPSB0cmlwXG4gICAgICBsZXQgeyBkaXN0YW5jZVVuaXQgfSA9IHRyaXAuaGVhZGVyXG5cbiAgICAgIGNvbnN0IGluY2hlcyA9IGRpc3RhbmNlVW5pdCA9PT0gTGVuZ3RoLmluY2hlc1xuICAgICAgaWYgKGluY2hlcykgZGlzdGFuY2VVbml0ID0gTGVuZ3RoLmZlZXRcblxuICAgICAgLy8gcmlnb3JvdXNseSBjaGVjayB0aGUgdmFsdWVzIGluIGFsbCB0aGUgY29sdW1ucyB0byBtYWtlIHN1cmUgdGhpc1xuICAgICAgLy8gaXMgcmVhbGx5IGEgc3VydmV5IHNob3QgbGluZSwganVzdCBpbiBjYXNlIGFueSBzdHJheSBjb21tZW50cyBhcmVcbiAgICAgIC8vIG5vdCBwcm9wZXJseSBkZWxpbWl0ZWQuXG5cbiAgICAgIC8vIGZyb20gc3RhdGlvbiBuYW1lXG4gICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS5zdWJzdHJpbmcoNSwgMTApKSkgY29udGludWVcbiAgICAgIGNvbnN0IGZyb21TdHIgPSB2YWxpZGF0ZSg1LCAxMCwgJ2Zyb20gc3RhdGlvbicsIGlzVmFsaWRTdGF0aW9uKVxuXG4gICAgICAvLyBTYWRseSBJIGhhdmUgZm91bmQgbmVnYXRpdmUgTFJVRCB2YWx1ZXMgaW4gQ2hpcCdzIGZvcm1hdCBhbmQgYXBwYXJlbnRseVxuICAgICAgLy8gaGlzIHByb2dyYW0gZG9lc24ndCBmYWlsIG9uIHRoZW0sIHNvIEkgaGF2ZSB0byBhY2NlcHQgdGhlbSBoZXJlXG4gICAgICAvLyBpc1ZhbGlkT3B0RmxvYXQgaW5zdGVhZCBvZiBpc1ZhbGlkT3B0VUZsb2F0XG4gICAgICBjb25zdCBsU3RyID0gdmFsaWRhdGUoNDAsIDQzLCAnbGVmdCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHJTdHIgPSB2YWxpZGF0ZSg0MywgNDYsICdyaWdodCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHVTdHIgPSB2YWxpZGF0ZSg0NiwgNDksICd1cCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IGRTdHIgPSB2YWxpZGF0ZSg0OSwgNTIsICdkb3duJywgaXNWYWxpZE9wdEZsb2F0KVxuXG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgY29uc3QgdXAgPSBwYXJzZUxydWQodVN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgZG93biA9IHBhcnNlTHJ1ZChkU3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCBsZWZ0ID0gcGFyc2VMcnVkKGxTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VMcnVkKHJTdHIsIGRpc3RhbmNlVW5pdClcblxuICAgICAgLy8gdG8gc3RhdGlvbiBuYW1lXG4gICAgICBjb25zdCB0b1N0ciA9IGxpbmUuc3Vic3RyaW5nKDAsIDUpXG4gICAgICBpZiAoIXRvU3RyLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBzaG90OiBGcmNzU2hvdCA9IHtcbiAgICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgICB0bzogbnVsbCxcbiAgICAgICAgICBraW5kOiBGcmNzU2hvdEtpbmQuTm9ybWFsLFxuICAgICAgICAgIGRpc3RhbmNlOiBuZXcgVW5pdGl6ZWROdW1iZXIoMCwgZGlzdGFuY2VVbml0KSxcbiAgICAgICAgICBmcm9udHNpZ2h0QXppbXV0aDogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRBemltdXRoOiBudWxsLFxuICAgICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBmcm9tTHJ1ZHM6IHtcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHVwLFxuICAgICAgICAgICAgZG93bixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4Y2x1ZGVEaXN0YW5jZTogdHJ1ZSxcbiAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KCksXG4gICAgICAgIH1cbiAgICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKCFpc1ZhbGlkU3RhdGlvbih0b1N0cikpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgc3RhdGlvbiBuYW1lJywgMCwgNSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUxydWRNYXRjaCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeXFxcXHMrJHtmcm9tU3RyXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLFxuICAgICAgICAgICAgJ1xcXFwkJidcbiAgICAgICAgICApfSgoXFxcXHMrKFxcXFxkKyhcXFxcLlxcXFxkKik/fFxcXFwuXFxcXGQrKSl7NH0pYFxuICAgICAgKS5leGVjKGxpbmUuc3Vic3RyaW5nKDUyKSlcbiAgICAgIGxldCBmcm9tTHJ1ZHNcbiAgICAgIGlmIChmcm9tTHJ1ZE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodCwgdXAsIGRvd25dID0gZnJvbUxydWRNYXRjaFsxXVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoL1xccysvZylcbiAgICAgICAgICAubWFwKHMgPT4gcGFyc2VMcnVkKHMsIGRpc3RhbmNlVW5pdCkpXG4gICAgICAgIGZyb21McnVkcyA9IHsgbGVmdCwgcmlnaHQsIHVwLCBkb3duIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXppbXV0aCBhbmQgaW5jbGluYXRpb25cbiAgICAgIGNvbnN0IGF6bUZzU3RyID0gdmFsaWRhdGUoMTksIDI1LCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBhem1Cc1N0ciA9IHZhbGlkYXRlKDI1LCAzMCwgJ2F6aW11dGgnLCBpc1ZhbGlkT3B0VUZsb2F0KVxuICAgICAgY29uc3QgaW5jRnNTdHIgPSBsaW5lLnN1YnN0cmluZygzMCwgMzUpXG4gICAgICBjb25zdCBpbmNCc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDM1LCA0MClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGxldCBraW5kOiBGcmNzU2hvdEtpbmRcbiAgICAgIGxldCBkaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPlxuICAgICAgbGV0IGhvcml6b250YWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHZlcnRpY2FsRGlzdGFuY2U6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCB1bmRlZmluZWRcbiAgICAgIGxldCBmcm9udHNpZ2h0SW5jbGluYXRpb246IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGxcbiAgICAgIGxldCBiYWNrc2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGV4Y2x1ZGVEaXN0YW5jZTogYm9vbGVhblxuICAgICAgbGV0IGlzU3BsYXk6IGJvb2xlYW5cblxuICAgICAgLy8gcGFyc2UgZGlzdGFuY2VcbiAgICAgIGlmIChpbmNoZXMpIHtcbiAgICAgICAgY29uc3QgZmVldFN0ciA9IGxpbmUuc3Vic3RyaW5nKDEwLCAxNClcbiAgICAgICAgY29uc3QgaW5jaGVzU3RyID0gbGluZS5zdWJzdHJpbmcoMTQsIDE3KVxuICAgICAgICAvLyBmZWV0IGFuZCBpbmNoZXMgYXJlIG5vdCBib3RoIG9wdGlvbmFsXG4gICAgICAgIGlmICghaXNWYWxpZFVJbnQoZmVldFN0cikgJiYgIWlzVmFsaWRVSW50KGluY2hlc1N0cikpIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkID0gZmVldFN0ci50cmltKCkgfHwgaW5jaGVzU3RyLnRyaW0oKVxuICAgICAgICAgIGVycm9yKGludmFsaWQgPyAnSW52YWxpZCBkaXN0YW5jZScgOiAnTWlzc2luZyBkaXN0YW5jZScsIDEwLCAxNylcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29tZXRpbWVzIGluY2hlcyBhcmUgb21pdHRlZCwgaGVuY2UgdGhlIHx8IDAuLi5JJ20gYXNzdW1pbmcgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyBmb3IgZmVldCB0byBiZSBvbWl0dGVkIGFzIHdlbGxcbiAgICAgICAgZGlzdGFuY2UgPSBVbml0aXplLmluY2hlcyhwYXJzZUZsb2F0KGluY2hlc1N0cikgfHwgMCkuYWRkKFxuICAgICAgICAgIFVuaXRpemUuZmVldChwYXJzZUZsb2F0KGZlZXRTdHIpIHx8IDApXG4gICAgICAgIClcblxuICAgICAgICBraW5kID0gcGFyc2VLaW5kKGxpbmVbMTddKVxuICAgICAgICAvLyBOT1RFIHRoZXJlIGFyZSB0d28gY29sdW1ucyBhcm91bmQgaGVyZSB0aGF0IGNhbiBjb250YWluIGEgKi5cbiAgICAgICAgLy8gSSB0aGluayB0aGV5IG1pZ2h0IHJlcHJlc2VudCBkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhpc2lzIGNvbmZ1c2VkIGJ5XG4gICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgZm9yIGZ0L2luIHNob3RzLCBpZiB0aGVyZSBpcyBhIEQgb3IgSCBmbGFnIGl0IG9jY3VwaWVzIHRoZVxuICAgICAgICAvLyBmaXJzdCBjb2x1bW4gdGhhdCBjYW4gY29udGFpbiBhICogZm9yIGRlY2ltYWwgZmVldCBzaG90c1xuICAgICAgICBleGNsdWRlRGlzdGFuY2UgPSBsaW5lWzE4XSA9PT0gJyonIHx8IGxpbmVbMThdID09PSAncydcbiAgICAgICAgaXNTcGxheSA9IGxpbmVbMThdID09PSAncydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlY2ltYWwgZmVldCBhcmUgbm90IG9wdGlvbmFsXG4gICAgICAgIGNvbnN0IGZlZXRTdHIgPSB2YWxpZGF0ZSgxMCwgMTYsICdkaXN0YW5jZScsIGlzVmFsaWRVRmxvYXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHBhcnNlRmxvYXQoZmVldFN0ciksIGRpc3RhbmNlVW5pdClcbiAgICAgICAga2luZCA9IHBhcnNlS2luZChsaW5lWzE2XSlcbiAgICAgICAgZXhjbHVkZURpc3RhbmNlID0gbGluZVsxN10gPT09ICcqJyB8fCBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICAgIGlzU3BsYXkgPSBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kICE9PSBGcmNzU2hvdEtpbmQuTm9ybWFsKSB7XG4gICAgICAgIHZhbGlkYXRlKDMwLCAzNSwgJ3ZlcnRpY2FsLWRpc3RhbmNlJywgaXNWYWxpZEZsb2F0KVxuICAgICAgfVxuXG4gICAgICAvLyBjb252ZXJ0IGhvcml6b250YWwgYW5kIGRpYWdvbmFsIHNob3RzIHRvIHN0YW5kYXJkXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgaW5jRnMgaXMgdGhlIHZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIHN0YXRpb25zXG4gICAgICAvLyBmb3J0dW5hdGVseSBpdCBhcHBlYXJzIHdlIGNhbiBhbHdheXMgY291bnQgb24gaW5jRnMgYmVpbmcgc3BlY2lmaWVkXG4gICAgICAvLyBhbmQgaW5jQnMgbm90IGJlaW5nIHNwZWNpZmllZCBmb3IgdGhlc2UgdHlwZXMgb2Ygc2hvdHNcbiAgICAgIGlmIChraW5kID09PSBGcmNzU2hvdEtpbmQuSG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBkaXN0YW5jZSBpcyBob3Jpem9udGFsIG9mZnNldCBhbmQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGhvcml6b250YWxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgIGNvbnN0IGggPSBob3Jpem9udGFsRGlzdGFuY2UuZ2V0KGRpc3RhbmNlVW5pdClcbiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoaW5jRnNTdHIpXG4gICAgICAgIHZlcnRpY2FsRGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIodiwgZGlzdGFuY2VVbml0KVxuICAgICAgICBkaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcihNYXRoLnNxcnQoaCAqIGggKyB2ICogdiksIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gQW5nbGUuYXRhbjIoXG4gICAgICAgICAgdmVydGljYWxEaXN0YW5jZSxcbiAgICAgICAgICBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgICAgKVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gRnJjc1Nob3RLaW5kLkRpYWdvbmFsKSB7XG4gICAgICAgIC8vIGRpc3RhbmNlIGlzIGFzIHVzdWFsLCBidXQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZS5nZXQoZGlzdGFuY2VVbml0KVxuICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChpbmNGc1N0cilcbiAgICAgICAgdmVydGljYWxEaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcih2LCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IEFuZ2xlLmFzaW4odiAvIGQpXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzMCwgMzUsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzNSwgNDAsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gcGFyc2VOdW1iZXIoaW5jRnNTdHIsIGluY2xpbmF0aW9uVW5pdClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBwYXJzZU51bWJlcihpbmNCc1N0ciwgaW5jbGluYXRpb25Vbml0KVxuICAgICAgfVxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZyb250c2lnaHRBemltdXRoID0gcGFyc2VBemltdXRoKGF6bUZzU3RyLCBhemltdXRoVW5pdClcbiAgICAgIGNvbnN0IGJhY2tzaWdodEF6aW11dGggPSBwYXJzZUF6aW11dGgoYXptQnNTdHIsIGF6aW11dGhVbml0KVxuXG4gICAgICBpZiAoIWZyb250c2lnaHRJbmNsaW5hdGlvbiAmJiAhYmFja3NpZ2h0SW5jbGluYXRpb24pIHtcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gVW5pdGl6ZS5kZWdyZWVzKDApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3Q6IEZyY3NTaG90ID0ge1xuICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgdG86IHRvU3RyLnRyaW0oKSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGZyb250c2lnaHRBemltdXRoLFxuICAgICAgICBiYWNrc2lnaHRBemltdXRoLFxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICB0b0xydWRzOiB7XG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICByaWdodCxcbiAgICAgICAgICB1cCxcbiAgICAgICAgICBkb3duLFxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRGlzdGFuY2UsXG4gICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgIH1cbiAgICAgIGlmIChpc1NwbGF5KSBzaG90LmlzU3BsYXkgPSB0cnVlXG4gICAgICBpZiAoZnJvbUxydWRzKSBzaG90LmZyb21McnVkcyA9IGZyb21McnVkc1xuICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSkgc2hvdC5ob3Jpem9udGFsRGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgIGlmICh2ZXJ0aWNhbERpc3RhbmNlKSBzaG90LnZlcnRpY2FsRGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlXG4gICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXZlLFxuICAgIGxvY2F0aW9uLFxuICAgIHRyaXBzLFxuICAgIGVycm9ycyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFRQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQSxTQUFTRyxXQUFXQSxDQUNsQkMsQ0FBUyxFQUNUQyxJQUFhLEVBQ2E7RUFDMUIsTUFBTUMsS0FBSyxHQUFHQyxVQUFVLENBQUNILENBQUMsQ0FBQztFQUMzQixJQUFJSSxLQUFLLENBQUNGLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUM3QixPQUFPLElBQUlHLHdCQUFjLENBQUNILEtBQUssRUFBRUQsSUFBSSxDQUFDO0FBQ3hDO0FBRUEsU0FBU0ssWUFBWUEsQ0FDbkJOLENBQVMsRUFDVEMsSUFBaUIsRUFDYTtFQUM5QixNQUFNTSxNQUFNLEdBQUdSLFdBQVcsQ0FBQ0MsQ0FBQyxFQUFFQyxJQUFJLENBQUM7RUFDbkMsT0FBTyxDQUFBTSxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRUMsR0FBRyxDQUFDQyxlQUFLLENBQUNDLE9BQU8sQ0FBQyxNQUFLLEdBQUcsR0FBR0MsaUJBQU8sQ0FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHSCxNQUFNO0FBQ3pFO0FBRUEsU0FBU0ssU0FBU0EsQ0FBQ0MsSUFBWSxFQUFnQjtFQUM3QyxRQUFRQSxJQUFJO0lBQ1YsS0FBSyxHQUFHO01BQ04sT0FBT0Msc0JBQVksQ0FBQ0MsVUFBVTtJQUNoQyxLQUFLLEdBQUc7TUFDTixPQUFPRCxzQkFBWSxDQUFDRSxRQUFRO0lBQzlCO01BQ0UsT0FBT0Ysc0JBQVksQ0FBQ0csTUFBTTtFQUM5QjtBQUNGO0FBRUEsU0FBU0MsZUFBZUEsQ0FBQ2pCLElBQVksRUFBdUI7RUFDMUQsUUFBUUEsSUFBSTtJQUNWLEtBQUssSUFBSTtNQUNQLE9BQU9rQixnQkFBTSxDQUFDQyxNQUFNO0lBQ3RCLEtBQUssSUFBSTtJQUNULEtBQUssSUFBSTtNQUNQLE9BQU9ELGdCQUFNLENBQUNFLElBQUk7SUFDcEIsS0FBSyxJQUFJO0lBQ1QsS0FBSyxJQUFJO01BQ1AsT0FBT0YsZ0JBQU0sQ0FBQ0csTUFBTTtFQUN4QjtFQUNBLE9BQU8sSUFBSTtBQUNiO0FBQ0EsU0FBU0MsY0FBY0EsQ0FBQ3RCLElBQVksRUFBc0I7RUFDeEQsUUFBUUEsSUFBSTtJQUNWLEtBQUssR0FBRztNQUNOLE9BQU9RLGVBQUssQ0FBQ0MsT0FBTztJQUN0QixLQUFLLEdBQUc7TUFDTixPQUFPRCxlQUFLLENBQUNlLFFBQVE7SUFDdkIsS0FBSyxHQUFHO01BQ04sT0FBT2YsZUFBSyxDQUFDZ0IsUUFBUTtFQUN6QjtFQUNBLE9BQU8sSUFBSTtBQUNiOztBQUVBO0FBQ0EsU0FBU0MsY0FBY0EsQ0FBQzFCLENBQVMsRUFBVztFQUMxQyxPQUFPLGFBQWEsQ0FBQzJCLElBQUksQ0FBQzNCLENBQUMsQ0FBQztBQUM5QjtBQUNBO0FBQ0EsU0FBUzRCLFdBQVdBLENBQUM1QixDQUFTLEVBQVc7RUFDdkMsT0FBTyxnQkFBZ0IsQ0FBQzJCLElBQUksQ0FBQzNCLENBQUMsQ0FBQztBQUNqQztBQUNBO0FBQ0EsU0FBUzZCLFlBQVlBLENBQUM3QixDQUFTLEVBQVc7RUFDeEMsT0FBTywyQ0FBMkMsQ0FBQzJCLElBQUksQ0FBQzNCLENBQUMsQ0FBQztBQUM1RDtBQUNBO0FBQ0EsU0FBUzhCLGVBQWVBLENBQUM5QixDQUFTLEVBQVc7RUFDM0MsT0FBTyxnQ0FBZ0MsQ0FBQzJCLElBQUksQ0FBQzNCLENBQUMsQ0FBQztBQUNqRDtBQUNBO0FBQ0EsU0FBUytCLGdCQUFnQkEsQ0FBQy9CLENBQVMsRUFBVztFQUM1QyxPQUFPLDJCQUEyQixDQUFDMkIsSUFBSSxDQUFDM0IsQ0FBQyxDQUFDO0FBQzVDO0FBQ0E7QUFDQSxTQUFTZ0MsYUFBYUEsQ0FBQ2hDLENBQVMsRUFBVztFQUN6QyxPQUFPLHNDQUFzQyxDQUFDMkIsSUFBSSxDQUFDM0IsQ0FBQyxDQUFDO0FBQ3ZEO0FBQ0E7QUFDQSxTQUFTaUMscUJBQXFCQSxDQUFDakMsQ0FBUyxFQUFXO0VBQ2pELE9BQU8sZ0NBQWdDLENBQUMyQixJQUFJLENBQUMzQixDQUFDLENBQUM7QUFDakQ7QUFDQSxTQUFTa0MsU0FBU0EsQ0FDaEJsQyxDQUFTLEVBQ1RDLElBQWtCLEVBQ2E7RUFDL0IsTUFBTUMsS0FBSyxHQUFHQyxVQUFVLENBQUNILENBQUMsQ0FBQztFQUMzQixPQUFPLENBQUNtQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ2xDLEtBQUssQ0FBQyxJQUFJQSxLQUFLLEdBQUcsQ0FBQyxHQUN2QyxJQUFJLEdBQ0osSUFBSUcsd0JBQWMsQ0FBQ0gsS0FBSyxFQUFFRCxJQUFJLENBQUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsZUFBZW9DLG1CQUFtQkEsQ0FDL0NDLElBQVM7QUFBRTtBQUNYQyxLQUE0QixFQUNIO0VBQ3pCLElBQUlDLElBQW1CLEdBQUcsSUFBSTtFQUM5QixJQUFJQyxRQUF1QixHQUFHLElBQUk7RUFDbEMsTUFBTUMsS0FBc0IsR0FBRyxFQUFFO0VBQ2pDLE1BQU1DLE1BQWdDLEdBQUcsRUFBRTtFQUUzQyxJQUFJQyxRQUFRO0VBQ1osSUFBSUMsUUFBUTtFQUNaLElBQUlDLFFBQVE7RUFDWixJQUFJQyxhQUFhLEdBQUcsSUFBSTtFQUN4QixJQUFJQyxvQkFBb0IsR0FBRyxDQUFDO0VBQzVCLElBQUlDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztFQUMzQixJQUFJQyxXQUEwQixHQUFHLEVBQUU7RUFDbkMsSUFBSUMsWUFBa0MsR0FBRyxJQUFJO0VBQzdDLElBQUlDLElBQXFCLEdBQUcsSUFBSTtFQUNoQyxJQUFJQyxjQUFjLEdBQUcsS0FBSztFQUMxQixJQUFJQyxPQUFPO0VBRVgsU0FBU0MsVUFBVUEsQ0FBQSxFQUFrQjtJQUNuQyxJQUFJLENBQUNKLFlBQVksRUFBRSxPQUFPLElBQUk7SUFDOUIsTUFBTUssT0FBTyxHQUFHTCxZQUFZLENBQUNNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7SUFDOUNQLFlBQVksR0FBRyxJQUFJO0lBQ25CLE9BQU9LLE9BQU8sSUFBSSxJQUFJO0VBQ3hCO0VBRUEsSUFBSUcsVUFBVSxHQUFHLENBQUM7RUFFbEIsV0FBVyxNQUFNQyxJQUFJLElBQUlyQixLQUFLLEVBQUU7SUFDOUIsSUFBSXNCLE9BQU8sR0FBRyxLQUFLO0lBRW5CLE1BQU1DLGNBQWMsR0FBR0gsVUFBVTtJQUVqQyxNQUFNSSxLQUFLLEdBQUdBLENBQ1pDLE9BQWUsRUFDZkMsV0FBbUIsRUFDbkJDLFNBQWlCLEtBQ1I7TUFDVEwsT0FBTyxHQUFHLElBQUk7TUFDZGxCLE1BQU0sQ0FBQ3dCLElBQUksQ0FDVCxJQUFJQywrQkFBaUIsQ0FDbkJKLE9BQU8sRUFDUCxJQUFJSyxxQkFBTyxDQUFDO1FBQ1ZuRSxLQUFLLEVBQUUwRCxJQUFJO1FBQ1hVLE1BQU0sRUFBRWhDLElBQUk7UUFDWmlDLFNBQVMsRUFBRVQsY0FBYztRQUN6QlUsUUFBUSxFQUFFO01BQ1osQ0FBQyxDQUFDLENBQUNDLFNBQVMsQ0FBQ1IsV0FBVyxFQUFFQyxTQUFTLENBQ3JDLENBQ0YsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNUSxRQUFRLEdBQUdBLENBQ2ZULFdBQW1CLEVBQ25CQyxTQUFpQixFQUNqQlMsU0FBaUIsRUFDakJDLFNBQXFDLEtBQzFCO01BQ1gsTUFBTUMsS0FBSyxHQUFHakIsSUFBSSxDQUFDYSxTQUFTLENBQUNSLFdBQVcsRUFBRUMsU0FBUyxDQUFDO01BQ3BELElBQUksQ0FBQ1UsU0FBUyxDQUFDQyxLQUFLLENBQUMsRUFBRTtRQUNyQmQsS0FBSyxDQUNILENBQUNjLEtBQUssQ0FBQ25CLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsSUFBSWlCLFNBQVMsRUFDcERWLFdBQVcsRUFDWEMsU0FDRixDQUFDO01BQ0g7TUFDQSxPQUFPVyxLQUFLO0lBQ2QsQ0FBQztJQUVEbEIsVUFBVSxFQUFFO0lBRVosSUFBSUEsVUFBVSxLQUFLLENBQUMsRUFBRTtNQUNwQixNQUFNbUIsS0FBSyxHQUFHLHFCQUFxQixDQUFDQyxJQUFJLENBQUNuQixJQUFJLENBQUM7TUFDOUMsSUFBSWtCLEtBQUssRUFBRTtRQUNUdEMsSUFBSSxHQUFHc0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDcEIsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSW9CLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtVQUNackMsUUFBUSxHQUFHcUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDcEIsSUFBSSxDQUFDLENBQUM7UUFDNUI7TUFDRjtJQUNGO0lBRUEsSUFBSUUsSUFBSSxDQUFDb0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSXBCLElBQUksQ0FBQ29CLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7TUFDcERqQyxhQUFhLEdBQUcsQ0FBQ0EsYUFBYTtNQUM5QixJQUFJQSxhQUFhLEVBQUU7UUFDakJPLE9BQU8sR0FBRzJCLFNBQVM7UUFDbkIvQixXQUFXLEdBQUcsRUFBRTtRQUNoQkYsb0JBQW9CLEdBQUdXLFVBQVU7TUFDbkMsQ0FBQyxNQUFNO1FBQ0xWLGtCQUFrQixHQUFHVSxVQUFVO01BQ2pDO0lBQ0YsQ0FBQyxNQUFNLElBQUlaLGFBQWEsRUFBRTtNQUN4QixJQUFJWSxVQUFVLEtBQUtYLG9CQUFvQixHQUFHLENBQUMsRUFBRTtRQUMzQ0osUUFBUSxHQUFHZ0IsSUFBSSxJQUFJQSxJQUFJLENBQUNGLElBQUksQ0FBQyxDQUFDO01BQ2hDLENBQUMsTUFBTSxJQUFJQyxVQUFVLEtBQUtYLG9CQUFvQixHQUFHLENBQUMsRUFBRTtRQUNsRCxNQUFNOEIsS0FBSyxHQUFHLHNDQUFzQyxDQUFDQyxJQUFJLENBQ3ZEbkIsSUFBSSxJQUFJQSxJQUFJLENBQUNGLElBQUksQ0FBQyxDQUNwQixDQUFDO1FBQ0QsSUFBSW9CLEtBQUssRUFBRTtVQUNULElBQUlJLENBQUMsR0FBRyxDQUFDO1VBQ1QsTUFBTUMsSUFBSSxHQUFHTCxLQUFLLENBQUNJLENBQUMsRUFBRSxDQUFDO1VBQ3ZCLE1BQU1FLEtBQUssR0FBR0MsUUFBUSxDQUFDUCxLQUFLLENBQUNJLENBQUMsRUFBRSxDQUFDLENBQUM7VUFDbEMsTUFBTUksR0FBRyxHQUFHRCxRQUFRLENBQUNQLEtBQUssQ0FBQ0ksQ0FBQyxFQUFFLENBQUMsQ0FBQztVQUNoQyxNQUFNSyxJQUFJLEdBQUdGLFFBQVEsQ0FBQ1AsS0FBSyxDQUFDSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1VBQ2pDcEMsUUFBUSxHQUFHLElBQUkwQyxJQUFJLENBQUNELElBQUksR0FBRyxFQUFFLEdBQUdBLElBQUksR0FBRyxJQUFJLEdBQUdBLElBQUksRUFBRUgsS0FBSyxHQUFHLENBQUMsRUFBRUUsR0FBRyxDQUFDO1VBQ25FekMsUUFBUSxHQUFHc0MsSUFBSSxDQUFDTSxLQUFLLENBQ25CTixJQUFJLENBQUNPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQ3hDLENBQUM7UUFDSDtNQUNGLENBQUMsTUFBTSxJQUFJL0IsVUFBVSxHQUFHLENBQUMsRUFBRTtRQUN6QlQsV0FBVyxDQUFDaUIsSUFBSSxDQUFDUCxJQUFJLENBQUM7TUFDeEI7TUFDQSxNQUFNa0IsS0FBSyxHQUFHLHFCQUFxQixDQUFDQyxJQUFJLENBQUNuQixJQUFJLENBQUM7TUFDOUMsSUFBSWtCLEtBQUssRUFBRTtRQUNUeEIsT0FBTyxHQUFHd0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDcEIsSUFBSSxDQUFDLENBQUM7TUFDM0I7SUFDRixDQUFDLE1BQU0sSUFBSUUsSUFBSSxDQUFDb0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtNQUNqQzNCLGNBQWMsR0FBRyxDQUFDQSxjQUFjO01BQ2hDLElBQUlBLGNBQWMsRUFBRUYsWUFBWSxHQUFHLEVBQUUsTUFDaEMsSUFBSUEsWUFBWSxFQUFFO1FBQ3JCLE1BQU13QyxJQUFJLEdBQUcvQixJQUFJLENBQUNhLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ2YsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSWlDLElBQUksSUFBSXhDLFlBQVksRUFBRUEsWUFBWSxDQUFDZ0IsSUFBSSxDQUFDd0IsSUFBSSxDQUFDO01BQ25EO0lBQ0YsQ0FBQyxNQUFNLElBQUl0QyxjQUFjLEVBQUU7TUFDekIsSUFBSUYsWUFBWSxFQUFFQSxZQUFZLENBQUNnQixJQUFJLENBQUNQLElBQUksQ0FBQztJQUMzQyxDQUFDLE1BQU0sSUFBSUQsVUFBVSxLQUFLVixrQkFBa0IsR0FBRyxDQUFDLEVBQUU7TUFDaEQ7TUFDQTtNQUNBLElBQUkyQyxZQUFZLEdBQUcxRSxlQUFlLENBQUMwQyxJQUFJLENBQUNpQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ3BELElBQUksQ0FBQ0QsWUFBWSxFQUFFO1FBQ2pCQSxZQUFZLEdBQUd6RSxnQkFBTSxDQUFDRSxJQUFJO1FBQzFCMEMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDdEM7TUFDQSxJQUFJK0IsV0FBVyxHQUFHdkUsY0FBYyxDQUFDcUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3pDLElBQUksQ0FBQ2tDLFdBQVcsRUFBRTtRQUNoQkEsV0FBVyxHQUFHckYsZUFBSyxDQUFDQyxPQUFPO1FBQzNCcUQsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDckM7TUFDQSxJQUFJZ0MsZUFBZSxHQUFHeEUsY0FBYyxDQUFDcUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzdDLElBQUksQ0FBQ21DLGVBQWUsRUFBRTtRQUNwQkEsZUFBZSxHQUFHdEYsZUFBSyxDQUFDQyxPQUFPO1FBQy9CcUQsS0FBSyxDQUFDLDBCQUEwQixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDekM7TUFDQSxNQUFNaUMseUJBQXlCLEdBQUdwQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztNQUNqRCxNQUFNcUMsNkJBQTZCLEdBQUdyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztNQUNyRCxNQUFNc0MsbUJBQW1CLEdBQUd0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztNQUM5RCxNQUFNdUMsdUJBQXVCLEdBQUd2QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztNQUVsRSxJQUFJLENBQUMsUUFBUSxDQUFDakMsSUFBSSxDQUFDaUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDM0JHLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQy9DO01BQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQ3BDLElBQUksQ0FBQ2lDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNCRyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUNuRDtNQUVBWCxJQUFJLEdBQUc7UUFDTGdELE1BQU0sRUFBRTtVQUNOQyxJQUFJLEVBQUV6RCxRQUFRLElBQUksRUFBRTtVQUNwQlksT0FBTyxFQUFHTixXQUFXLElBQUlBLFdBQVcsQ0FBQ08sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFLLElBQUk7VUFDeERILE9BQU87VUFDUGdELElBQUksRUFBRXhELFFBQVE7VUFDZHFDLElBQUksRUFBRXRDLFFBQVE7VUFDZCtDLFlBQVk7VUFDWkUsV0FBVztVQUNYQyxlQUFlO1VBQ2ZDLHlCQUF5QjtVQUN6QkMsNkJBQTZCO1VBQzdCQyxtQkFBbUI7VUFDbkJDO1FBQ0YsQ0FBQztRQUNESSxLQUFLLEVBQUU7TUFDVCxDQUFDO01BQ0Q3RCxLQUFLLENBQUN5QixJQUFJLENBQUNmLElBQUksQ0FBQztJQUNsQixDQUFDLE1BQU0sSUFBSUEsSUFBSSxFQUFFO01BQ2YsTUFBTTtRQUNKbUQsS0FBSztRQUNMSCxNQUFNLEVBQUU7VUFBRU4sV0FBVztVQUFFQztRQUFnQjtNQUN6QyxDQUFDLEdBQUczQyxJQUFJO01BQ1IsSUFBSTtRQUFFd0M7TUFBYSxDQUFDLEdBQUd4QyxJQUFJLENBQUNnRCxNQUFNO01BRWxDLE1BQU1oRixNQUFNLEdBQUd3RSxZQUFZLEtBQUt6RSxnQkFBTSxDQUFDQyxNQUFNO01BQzdDLElBQUlBLE1BQU0sRUFBRXdFLFlBQVksR0FBR3pFLGdCQUFNLENBQUNFLElBQUk7O01BRXRDO01BQ0E7TUFDQTs7TUFFQTtNQUNBLElBQUksQ0FBQyxJQUFJLENBQUNNLElBQUksQ0FBQ2lDLElBQUksQ0FBQ2EsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO01BQ3ZDLE1BQU0rQixPQUFPLEdBQUc5QixRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUVoRCxjQUFjLENBQUM7O01BRS9EO01BQ0E7TUFDQTtNQUNBLE1BQU0rRSxJQUFJLEdBQUcvQixRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUU1QyxlQUFlLENBQUM7TUFDdEQsTUFBTTRFLElBQUksR0FBR2hDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTVDLGVBQWUsQ0FBQztNQUN2RCxNQUFNNkUsSUFBSSxHQUFHakMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFNUMsZUFBZSxDQUFDO01BQ3BELE1BQU04RSxJQUFJLEdBQUdsQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUU1QyxlQUFlLENBQUM7TUFFdEQsSUFBSStCLE9BQU8sRUFBRTtNQUViLE1BQU1nRCxFQUFFLEdBQUczRSxTQUFTLENBQUN5RSxJQUFJLEVBQUVmLFlBQVksQ0FBQztNQUN4QyxNQUFNa0IsSUFBSSxHQUFHNUUsU0FBUyxDQUFDMEUsSUFBSSxFQUFFaEIsWUFBWSxDQUFDO01BQzFDLE1BQU1tQixJQUFJLEdBQUc3RSxTQUFTLENBQUN1RSxJQUFJLEVBQUViLFlBQVksQ0FBQztNQUMxQyxNQUFNb0IsS0FBSyxHQUFHOUUsU0FBUyxDQUFDd0UsSUFBSSxFQUFFZCxZQUFZLENBQUM7O01BRTNDO01BQ0EsTUFBTXFCLEtBQUssR0FBR3JELElBQUksQ0FBQ2EsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDbEMsSUFBSSxDQUFDd0MsS0FBSyxDQUFDdkQsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUNqQixNQUFNd0QsSUFBYyxHQUFHO1VBQ3JCQyxJQUFJLEVBQUVYLE9BQU8sQ0FBQzlDLElBQUksQ0FBQyxDQUFDO1VBQ3BCMEQsRUFBRSxFQUFFLElBQUk7VUFDUnZHLElBQUksRUFBRUMsc0JBQVksQ0FBQ0csTUFBTTtVQUN6Qm9HLFFBQVEsRUFBRSxJQUFJaEgsd0JBQWMsQ0FBQyxDQUFDLEVBQUV1RixZQUFZLENBQUM7VUFDN0MwQixpQkFBaUIsRUFBRSxJQUFJO1VBQ3ZCQyxnQkFBZ0IsRUFBRSxJQUFJO1VBQ3RCQyxxQkFBcUIsRUFBRSxJQUFJO1VBQzNCQyxvQkFBb0IsRUFBRSxJQUFJO1VBQzFCQyxTQUFTLEVBQUU7WUFDVFgsSUFBSTtZQUNKQyxLQUFLO1lBQ0xILEVBQUU7WUFDRkM7VUFDRixDQUFDO1VBQ0RhLGVBQWUsRUFBRSxJQUFJO1VBQ3JCbkUsT0FBTyxFQUFFRCxVQUFVLENBQUM7UUFDdEIsQ0FBQztRQUNEZ0QsS0FBSyxDQUFDcEMsSUFBSSxDQUFDK0MsSUFBSSxDQUFDO1FBQ2hCO01BQ0Y7TUFDQSxJQUFJLENBQUN4RixjQUFjLENBQUN1RixLQUFLLENBQUMsRUFBRTtRQUMxQmxELEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3JDO01BRUEsTUFBTTZELGFBQWEsR0FBRyxJQUFJQyxNQUFNLENBQzdCLFFBQU9yQixPQUFPLENBQ1o5QyxJQUFJLENBQUMsQ0FBQyxDQUNOb0UsT0FBTyxDQUNOLHFCQUFxQixFQUNyQixNQUNGLENBQUUscUNBQ04sQ0FBQyxDQUFDL0MsSUFBSSxDQUFDbkIsSUFBSSxDQUFDYSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDMUIsSUFBSWlELFNBQVM7TUFDYixJQUFJRSxhQUFhLEVBQUU7UUFDakIsTUFBTSxDQUFDYixJQUFJLEVBQUVDLEtBQUssRUFBRUgsRUFBRSxFQUFFQyxJQUFJLENBQUMsR0FBR2MsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUM3Q2xFLElBQUksQ0FBQyxDQUFDLENBQ04rQixLQUFLLENBQUMsTUFBTSxDQUFDLENBQ2JzQyxHQUFHLENBQUMvSCxDQUFDLElBQUlrQyxTQUFTLENBQUNsQyxDQUFDLEVBQUU0RixZQUFZLENBQUMsQ0FBQztRQUN2QzhCLFNBQVMsR0FBRztVQUFFWCxJQUFJO1VBQUVDLEtBQUs7VUFBRUgsRUFBRTtVQUFFQztRQUFLLENBQUM7TUFDdkM7O01BRUE7TUFDQSxNQUFNa0IsUUFBUSxHQUFHdEQsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFM0MsZ0JBQWdCLENBQUM7TUFDOUQsTUFBTWtHLFFBQVEsR0FBR3ZELFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTNDLGdCQUFnQixDQUFDO01BQzlELE1BQU1tRyxRQUFRLEdBQUd0RSxJQUFJLENBQUNhLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO01BQ3ZDLE1BQU0wRCxRQUFRLEdBQUd2RSxJQUFJLENBQUNhLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO01BRXZDLElBQUlaLE9BQU8sRUFBRTtNQUViLElBQUloRCxJQUFrQjtNQUN0QixJQUFJd0csUUFBZ0M7TUFDcEMsSUFBSWUsa0JBQXNEO01BQzFELElBQUlDLGdCQUFvRDtNQUN4RCxJQUFJYixxQkFBbUQ7TUFDdkQsSUFBSUMsb0JBQWtEO01BQ3RELElBQUlFLGVBQXdCO01BQzVCLElBQUlXLE9BQWdCOztNQUVwQjtNQUNBLElBQUlsSCxNQUFNLEVBQUU7UUFDVixNQUFNbUgsT0FBTyxHQUFHM0UsSUFBSSxDQUFDYSxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNK0QsU0FBUyxHQUFHNUUsSUFBSSxDQUFDYSxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4QztRQUNBLElBQUksQ0FBQzdDLFdBQVcsQ0FBQzJHLE9BQU8sQ0FBQyxJQUFJLENBQUMzRyxXQUFXLENBQUM0RyxTQUFTLENBQUMsRUFBRTtVQUNwRCxNQUFNQyxPQUFPLEdBQUdGLE9BQU8sQ0FBQzdFLElBQUksQ0FBQyxDQUFDLElBQUk4RSxTQUFTLENBQUM5RSxJQUFJLENBQUMsQ0FBQztVQUNsREssS0FBSyxDQUFDMEUsT0FBTyxHQUFHLGtCQUFrQixHQUFHLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7VUFDaEU7UUFDRjs7UUFFQTtRQUNBO1FBQ0FwQixRQUFRLEdBQUcxRyxpQkFBTyxDQUFDUyxNQUFNLENBQUNqQixVQUFVLENBQUNxSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQ0UsR0FBRyxDQUN2RC9ILGlCQUFPLENBQUNVLElBQUksQ0FBQ2xCLFVBQVUsQ0FBQ29JLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FDdkMsQ0FBQztRQUVEMUgsSUFBSSxHQUFHRCxTQUFTLENBQUNnRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUI7UUFDQTtRQUNBO1FBQ0E7UUFDQStELGVBQWUsR0FBRy9ELElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUlBLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHO1FBQ3REMEUsT0FBTyxHQUFHMUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUc7TUFDNUIsQ0FBQyxNQUFNO1FBQ0w7UUFDQSxNQUFNMkUsT0FBTyxHQUFHN0QsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFMUMsYUFBYSxDQUFDO1FBQzNEcUYsUUFBUSxHQUFHLElBQUloSCx3QkFBYyxDQUFDRixVQUFVLENBQUNvSSxPQUFPLENBQUMsRUFBRTNDLFlBQVksQ0FBQztRQUNoRS9FLElBQUksR0FBR0QsU0FBUyxDQUFDZ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCK0QsZUFBZSxHQUFHL0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUc7UUFDdEQwRSxPQUFPLEdBQUcxRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRztNQUM1QjtNQUVBLElBQUkvQyxJQUFJLEtBQUtDLHNCQUFZLENBQUNHLE1BQU0sRUFBRTtRQUNoQ3lELFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFN0MsWUFBWSxDQUFDO01BQ3JEOztNQUVBO01BQ0E7TUFDQTtNQUNBO01BQ0EsSUFBSWhCLElBQUksS0FBS0Msc0JBQVksQ0FBQ0MsVUFBVSxFQUFFO1FBQ3BDO1FBQ0FxSCxrQkFBa0IsR0FBR2YsUUFBUTtRQUM3QixNQUFNc0IsQ0FBQyxHQUFHUCxrQkFBa0IsQ0FBQzVILEdBQUcsQ0FBQ29GLFlBQVksQ0FBQztRQUM5QyxNQUFNZ0QsQ0FBQyxHQUFHekksVUFBVSxDQUFDK0gsUUFBUSxDQUFDO1FBQzlCRyxnQkFBZ0IsR0FBRyxJQUFJaEksd0JBQWMsQ0FBQ3VJLENBQUMsRUFBRWhELFlBQVksQ0FBQztRQUN0RHlCLFFBQVEsR0FBRyxJQUFJaEgsd0JBQWMsQ0FBQ3dJLElBQUksQ0FBQ0MsSUFBSSxDQUFDSCxDQUFDLEdBQUdBLENBQUMsR0FBR0MsQ0FBQyxHQUFHQSxDQUFDLENBQUMsRUFBRWhELFlBQVksQ0FBQztRQUNyRTRCLHFCQUFxQixHQUFHL0csZUFBSyxDQUFDc0ksS0FBSyxDQUNqQ1YsZ0JBQWdCLEVBQ2hCRCxrQkFDRixDQUFDO1FBQ0RYLG9CQUFvQixHQUFHLElBQUk7TUFDN0IsQ0FBQyxNQUFNLElBQUk1RyxJQUFJLEtBQUtDLHNCQUFZLENBQUNFLFFBQVEsRUFBRTtRQUN6QztRQUNBLE1BQU1nSSxDQUFDLEdBQUczQixRQUFRLENBQUM3RyxHQUFHLENBQUNvRixZQUFZLENBQUM7UUFDcEMsTUFBTWdELENBQUMsR0FBR3pJLFVBQVUsQ0FBQytILFFBQVEsQ0FBQztRQUM5QkcsZ0JBQWdCLEdBQUcsSUFBSWhJLHdCQUFjLENBQUN1SSxDQUFDLEVBQUVoRCxZQUFZLENBQUM7UUFDdEQ0QixxQkFBcUIsR0FBRy9HLGVBQUssQ0FBQ3dJLElBQUksQ0FBQ0wsQ0FBQyxHQUFHSSxDQUFDLENBQUM7UUFDekN2QixvQkFBb0IsR0FBRyxJQUFJO01BQzdCLENBQUMsTUFBTTtRQUNMO1FBQ0EvQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUV6QyxxQkFBcUIsQ0FBQztRQUN0RDtRQUNBeUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFekMscUJBQXFCLENBQUM7UUFDdER1RixxQkFBcUIsR0FBR3pILFdBQVcsQ0FBQ21JLFFBQVEsRUFBRW5DLGVBQWUsQ0FBQztRQUM5RDBCLG9CQUFvQixHQUFHMUgsV0FBVyxDQUFDb0ksUUFBUSxFQUFFcEMsZUFBZSxDQUFDO01BQy9EO01BQ0EsSUFBSWxDLE9BQU8sRUFBRTtNQUViLE1BQU15RCxpQkFBaUIsR0FBR2hILFlBQVksQ0FBQzBILFFBQVEsRUFBRWxDLFdBQVcsQ0FBQztNQUM3RCxNQUFNeUIsZ0JBQWdCLEdBQUdqSCxZQUFZLENBQUMySCxRQUFRLEVBQUVuQyxXQUFXLENBQUM7TUFFNUQsSUFBSSxDQUFDMEIscUJBQXFCLElBQUksQ0FBQ0Msb0JBQW9CLEVBQUU7UUFDbkRELHFCQUFxQixHQUFHN0csaUJBQU8sQ0FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUM1QztNQUVBLE1BQU13RyxJQUFjLEdBQUc7UUFDckJDLElBQUksRUFBRVgsT0FBTyxDQUFDOUMsSUFBSSxDQUFDLENBQUM7UUFDcEIwRCxFQUFFLEVBQUVILEtBQUssQ0FBQ3ZELElBQUksQ0FBQyxDQUFDO1FBQ2hCN0MsSUFBSTtRQUNKd0csUUFBUTtRQUNSQyxpQkFBaUI7UUFDakJDLGdCQUFnQjtRQUNoQkMscUJBQXFCO1FBQ3JCQyxvQkFBb0I7UUFDcEJ5QixPQUFPLEVBQUU7VUFDUG5DLElBQUk7VUFDSkMsS0FBSztVQUNMSCxFQUFFO1VBQ0ZDO1FBQ0YsQ0FBQztRQUNEYSxlQUFlO1FBQ2ZuRSxPQUFPLEVBQUVELFVBQVUsQ0FBQztNQUN0QixDQUFDO01BQ0QsSUFBSStFLE9BQU8sRUFBRXBCLElBQUksQ0FBQ29CLE9BQU8sR0FBRyxJQUFJO01BQ2hDLElBQUlaLFNBQVMsRUFBRVIsSUFBSSxDQUFDUSxTQUFTLEdBQUdBLFNBQVM7TUFDekMsSUFBSVUsa0JBQWtCLEVBQUVsQixJQUFJLENBQUNrQixrQkFBa0IsR0FBR0Esa0JBQWtCO01BQ3BFLElBQUlDLGdCQUFnQixFQUFFbkIsSUFBSSxDQUFDbUIsZ0JBQWdCLEdBQUdBLGdCQUFnQjtNQUM5RDlCLEtBQUssQ0FBQ3BDLElBQUksQ0FBQytDLElBQUksQ0FBQztJQUNsQjtFQUNGO0VBRUEsT0FBTztJQUNMMUUsSUFBSTtJQUNKQyxRQUFRO0lBQ1JDLEtBQUs7SUFDTEM7RUFDRixDQUFDO0FBQ0gifQ==