semantifold 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +2 -0
  2. package/build/src/backends/effects.js +5 -2
  3. package/build/src/backends/java.js +33 -14
  4. package/build/src/backends/javascript.js +83 -18
  5. package/build/src/backends/php.d.ts.map +1 -1
  6. package/build/src/backends/php.js +88 -16
  7. package/build/src/backends/ruby.js +37 -12
  8. package/build/src/backends/scalars.js +2 -2
  9. package/build/src/backends/shared.d.ts +2 -1
  10. package/build/src/backends/shared.d.ts.map +1 -1
  11. package/build/src/backends/shared.js +299 -42
  12. package/build/src/backends/typescript.js +83 -18
  13. package/build/src/backends/writer.d.ts +18 -4
  14. package/build/src/backends/writer.d.ts.map +1 -1
  15. package/build/src/backends/writer.js +40 -4
  16. package/build/src/frontends/java.d.ts +9 -1
  17. package/build/src/frontends/java.d.ts.map +1 -1
  18. package/build/src/frontends/java.js +90 -43
  19. package/build/src/frontends/javascript-typescript.d.ts +3 -1
  20. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  21. package/build/src/frontends/javascript-typescript.js +133 -52
  22. package/build/src/frontends/php.d.ts +13 -1
  23. package/build/src/frontends/php.d.ts.map +1 -1
  24. package/build/src/frontends/php.js +226 -59
  25. package/build/src/frontends/ruby.d.ts +4 -1
  26. package/build/src/frontends/ruby.d.ts.map +1 -1
  27. package/build/src/frontends/ruby.js +113 -37
  28. package/build/src/frontends/types.d.ts +9 -2
  29. package/build/src/frontends/types.d.ts.map +1 -1
  30. package/build/src/frontends/types.js +26 -9
  31. package/build/src/language-registry.d.ts.map +1 -1
  32. package/build/src/language-registry.js +14 -6
  33. package/build/src/mapping.d.ts.map +1 -1
  34. package/build/src/mapping.js +4 -2
  35. package/build/src/semantic/effects.d.ts.map +1 -1
  36. package/build/src/semantic/effects.js +20 -6
  37. package/build/src/semantic/lifetime.js +28 -4
  38. package/build/src/semantic/provenance.d.ts.map +1 -1
  39. package/build/src/semantic/provenance.js +61 -9
  40. package/build/src/semantic/types.d.ts +214 -23
  41. package/build/src/semantic/types.d.ts.map +1 -1
  42. package/build/src/semantic/types.js +58 -11
  43. package/build/src/semantic/validate.d.ts +31 -2
  44. package/build/src/semantic/validate.d.ts.map +1 -1
  45. package/build/src/semantic/validate.js +450 -60
  46. package/docs/adr/20261026-typed-error-handling-extension.md +55 -0
  47. package/docs/adr-bounded-subtyping.md +180 -0
  48. package/docs/adr-numeric-tower.md +156 -0
  49. package/docs/architecture.md +1 -1
  50. package/docs/language-support.md +8 -8
  51. package/docs/testing.md +5 -3
  52. package/package.json +1 -1
  53. package/src/backends/effects.js +3 -1
  54. package/src/backends/java.js +33 -14
  55. package/src/backends/javascript.js +83 -18
  56. package/src/backends/php.js +89 -16
  57. package/src/backends/ruby.js +36 -12
  58. package/src/backends/scalars.js +1 -1
  59. package/src/backends/shared.js +298 -47
  60. package/src/backends/typescript.js +83 -18
  61. package/src/backends/writer.js +41 -3
  62. package/src/frontends/java.js +95 -43
  63. package/src/frontends/javascript-typescript.js +145 -53
  64. package/src/frontends/php.js +243 -58
  65. package/src/frontends/ruby.js +117 -35
  66. package/src/frontends/types.js +26 -8
  67. package/src/language-registry.js +13 -5
  68. package/src/mapping.js +3 -1
  69. package/src/semantic/effects.js +18 -5
  70. package/src/semantic/lifetime.js +29 -3
  71. package/src/semantic/provenance.js +60 -14
  72. package/src/semantic/types.js +62 -10
  73. package/src/semantic/validate.js +481 -61
@@ -9,9 +9,23 @@ import { validateResourceLifetimes } from "./lifetime.js";
9
9
  const task005Languages = new Set(["php", "ruby", "javascript", "typescript", "java", "c", "dart", "zig"]);
10
10
  /** @typedef {Map<string, import("./types.js").RecordDeclaration>} RecordRegistry */
11
11
  /** @typedef {Map<string, import("./types.js").ClassDeclaration>} ClassRegistry */
12
+ /** @typedef {Map<string, import("./types.js").InterfaceDeclaration>} InterfaceRegistry */
12
13
  /** @typedef {Map<string, import("./types.js").ErrorDeclaration>} ErrorRegistry */
14
+ /**
15
+ * @typedef InterfaceContractMember
16
+ * @property {string} interfaceId - Declaring interface identity.
17
+ * @property {string} methodId - Declaring interface method identity.
18
+ * @property {string} name - Contract method name.
19
+ * @property {import("./types.js").Parameter[]} parameters - Source-ordered contract parameters.
20
+ * @property {import("./types.js").SemanticFunctionReturnType} returnType - Contract return type.
21
+ * @property {import("./types.js").SourceLocation} location - Declaring method source location.
22
+ */
13
23
  /** @type {WeakMap<RecordRegistry, ClassRegistry>} */
14
24
  const referenceClassesByRecordRegistry = new WeakMap();
25
+ /** @type {WeakMap<RecordRegistry, InterfaceRegistry>} */
26
+ const interfacesByRecordRegistry = new WeakMap();
27
+ /** @type {WeakMap<import("./types.js").InterfaceDeclaration, InterfaceContractMember[]>} */
28
+ const flattenedInterfaceCache = new WeakMap();
15
29
  /** @type {WeakMap<RecordRegistry, Set<string>>} */
16
30
  const resourceIdsByRecordRegistry = new WeakMap();
17
31
  /**
@@ -44,7 +58,7 @@ const resourceIdsByRecordRegistry = new WeakMap();
44
58
  * Enforces the coherent release-candidate semantic subset after adaptation.
45
59
  * @param {import("./types.js").SemanticModule} module - Adapted semantic module.
46
60
  * @param {import("./types.js").SemanticLanguage} language - Source language.
47
- * @param {{classes?: Map<string, import("./types.js").ClassDeclaration>, functions?: Map<string, import("./types.js").FunctionDeclaration>, records?: Map<string, import("./types.js").RecordDeclaration>, errors?: Map<string, import("./types.js").ErrorDeclaration>, callEffects?: Map<string, Set<string>>}} [visible] - Program imports visible during validation.
61
+ * @param {{classes?: Map<string, import("./types.js").ClassDeclaration>, functions?: Map<string, import("./types.js").FunctionDeclaration>, interfaces?: Map<string, import("./types.js").InterfaceDeclaration>, records?: Map<string, import("./types.js").RecordDeclaration>, errors?: Map<string, import("./types.js").ErrorDeclaration>, callEffects?: Map<string, Set<string>>}} [visible] - Program imports visible during validation.
48
62
  * @returns {import("./types.js").SemanticModule} Validated module.
49
63
  */
50
64
  export function validateParsedModule(module, language, visible = {}) {
@@ -100,7 +114,7 @@ function normalizeParsedOwnedReferences(module, visibleClasses = new Map()) {
100
114
  * Validates scalar types and bindings for a caller-supplied semantic module before emission.
101
115
  * @param {import("./types.js").SemanticModule} module - Semantic module.
102
116
  * @param {import("./types.js").BackendLanguage} language - Backend language or binary target.
103
- * @param {{classes?: Map<string, import("./types.js").ClassDeclaration>, functions?: Map<string, import("./types.js").FunctionDeclaration>, records?: Map<string, import("./types.js").RecordDeclaration>, errors?: Map<string, import("./types.js").ErrorDeclaration>, callEffects?: Map<string, Set<string>>}} [visible] - Resolved program imports.
117
+ * @param {{classes?: Map<string, import("./types.js").ClassDeclaration>, functions?: Map<string, import("./types.js").FunctionDeclaration>, interfaces?: Map<string, import("./types.js").InterfaceDeclaration>, records?: Map<string, import("./types.js").RecordDeclaration>, errors?: Map<string, import("./types.js").ErrorDeclaration>, callEffects?: Map<string, Set<string>>}} [visible] - Resolved program imports.
104
118
  * @returns {void}
105
119
  */
106
120
  export function validateBackendTypes(module, language, visible = {}) {
@@ -145,7 +159,7 @@ function validateBlockShape(block, detail, fail) {
145
159
  fail(`${detail} without Block`, block?.location ?? /** @type {never} */ (undefined));
146
160
  }
147
161
  for (const statement of block.statements) {
148
- if (!["AssignmentStatement", "BreakStatement", "ContinueStatement", "ExpressionStatement", "ForEachMapStatement", "ForEachStatement", "IfStatement", "LocalDeclaration", "PrivateFieldWriteStatement", "PrintStatement", "RaiseStatement", "ReturnStatement", "TryStatement", "WhileStatement"].includes(statement.kind)) {
162
+ if (!["AssignmentStatement", "BreakStatement", "ContinueStatement", "ExpressionStatement", "ForEachMapStatement", "ForEachStatement", "IfStatement", "LocalDeclaration", "PrivateFieldWriteStatement", "PrintStatement", "RaiseStatement", "RethrowStatement", "ReturnStatement", "TryStatement", "WhileStatement"].includes(statement.kind)) {
149
163
  fail(`${detail} statement ${statement.kind}`, statement.location);
150
164
  }
151
165
  if (statement.kind == "IfStatement") {
@@ -158,7 +172,18 @@ function validateBlockShape(block, detail, fail) {
158
172
  }
159
173
  if (statement.kind == "TryStatement") {
160
174
  validateBlockShape(statement.body, "try body", fail);
161
- validateBlockShape(statement.catchBody, "catch body", fail);
175
+ if (!Array.isArray(statement.handlers) || (statement.handlers.length == 0 && !statement.finallyBody)) {
176
+ fail(`${detail} try without an ordered handler list`, statement.location);
177
+ }
178
+ for (const handler of statement.handlers ?? []) {
179
+ if (!handler || handler.kind != "CatchHandler" ||
180
+ Object.keys(handler).filter((key) => key != "sourceProvenance").sort().join(",") != "catchBinding,catchBody,catchType,kind,location") {
181
+ fail(`${detail} malformed catch handler`, handler?.location ?? statement.location);
182
+ }
183
+ validateBlockShape(handler.catchBody, "catch body", fail);
184
+ }
185
+ if (statement.finallyBody)
186
+ validateBlockShape(statement.finallyBody, "finally body", fail);
162
187
  }
163
188
  }
164
189
  }
@@ -168,12 +193,14 @@ function validateBlockShape(block, detail, fail) {
168
193
  * @param {string} language - Source or backend language identity.
169
194
  * @param {SemanticFail} fail - Diagnostic callback.
170
195
  * @param {boolean} normalizeOperations - Whether to replace transient frontend operation intent.
171
- * @param {{classes?: Map<string, import("./types.js").ClassDeclaration>, functions?: Map<string, import("./types.js").FunctionDeclaration>, records?: Map<string, import("./types.js").RecordDeclaration>, errors?: Map<string, import("./types.js").ErrorDeclaration>, callEffects?: Map<string, Set<string>>}} [visible] - Program imports visible during validation.
196
+ * @param {{classes?: Map<string, import("./types.js").ClassDeclaration>, functions?: Map<string, import("./types.js").FunctionDeclaration>, interfaces?: Map<string, import("./types.js").InterfaceDeclaration>, records?: Map<string, import("./types.js").RecordDeclaration>, errors?: Map<string, import("./types.js").ErrorDeclaration>, callEffects?: Map<string, Set<string>>}} [visible] - Program imports visible during validation.
172
197
  * @returns {void}
173
198
  */
174
199
  function validateModuleTypes(module, language, fail, normalizeOperations, visible = {}) {
175
- const classes = registerClassDeclarations(module.classes ?? [], fail, normalizeOperations, visible.classes);
200
+ const interfaces = registerInterfaceDeclarations(module.interfaces ?? [], fail, normalizeOperations, visible.interfaces);
201
+ const classes = registerClassDeclarations(module.classes ?? [], fail, normalizeOperations, visible.classes, interfaces);
176
202
  const records = validateRecordDeclarations(module.records ?? [], fail, normalizeOperations, visible.records, classes);
203
+ interfacesByRecordRegistry.set(records, interfaces);
177
204
  const errors = validateErrorDeclarations(module.errors ?? [], fail, normalizeOperations, visible.errors);
178
205
  /** @type {Map<string, import("./types.js").FunctionDeclaration>} */
179
206
  const functions = new Map(visible.functions ?? []);
@@ -207,13 +234,14 @@ function validateModuleTypes(module, language, fail, normalizeOperations, visibl
207
234
  const loopOwners = prepareLoopIdentities(module, normalizeOperations, fail);
208
235
  const reservedValueNames = new Set([
209
236
  ...functions.keys(),
237
+ ...[...interfaces.values()].map((declaration) => declaration.name),
210
238
  ...[...records.values()].map((declaration) => declaration.name),
211
239
  ...[...classes.values()].map((declaration) => declaration.name),
212
240
  ...[...errors.values()].map((declaration) => declaration.name),
213
241
  ...capabilityResources.map(({ name }) => name)
214
242
  ]);
215
243
  const nominalNames = new Set();
216
- for (const declaration of [...module.records ?? [], ...module.classes ?? [], ...module.errors ?? []]) {
244
+ for (const declaration of [...module.interfaces ?? [], ...module.records ?? [], ...module.classes ?? [], ...module.errors ?? []]) {
217
245
  if (nominalNames.has(declaration.name)) {
218
246
  fail("DUPLICATE_BINDING", `Duplicate nominal declaration '${declaration.name}'.`, roleLocation(declaration, "name"));
219
247
  }
@@ -227,6 +255,9 @@ function validateModuleTypes(module, language, fail, normalizeOperations, visibl
227
255
  }
228
256
  const localFunctionNames = new Set(module.functions.map(({ name }) => name));
229
257
  const callEffects = inferCallEffects(functions, visible.callEffects, localFunctionNames);
258
+ for (const declaration of module.classes ?? []) {
259
+ validateInterfaceContracts(declaration, interfaces, records, fail, normalizeOperations);
260
+ }
230
261
  for (const declaration of module.classes ?? []) {
231
262
  validateClassDeclaration(declaration, functions, records, errors, callEffects, reservedValueNames, fail, normalizeOperations, loopOwners);
232
263
  }
@@ -287,7 +318,10 @@ function prepareLoopIdentities(module, normalizeOperations, fail) {
287
318
  }
288
319
  else if (statement.kind == "TryStatement") {
289
320
  visit(statement.body, owner, active);
290
- visit(statement.catchBody, owner, active);
321
+ for (const handler of statement.handlers ?? [])
322
+ visit(handler.catchBody, owner, active);
323
+ if (statement.finallyBody)
324
+ visit(statement.finallyBody, owner, active);
291
325
  }
292
326
  }
293
327
  }
@@ -313,9 +347,10 @@ export function moduleUncheckedErrorEffects(module, visible = {}) {
313
347
  * @param {SemanticFail} fail - Diagnostic callback.
314
348
  * @param {boolean} normalizeOperations - Whether parser-authored identities are assigned.
315
349
  * @param {Map<string, import("./types.js").ClassDeclaration>} [visibleClasses] - Imported classes by identity.
350
+ * @param {Map<string, import("./types.js").InterfaceDeclaration>} [interfaces] - Interface declarations by identity.
316
351
  * @returns {ClassRegistry} Classes by stable identity.
317
352
  */
318
- function registerClassDeclarations(declarations, fail, normalizeOperations, visibleClasses = new Map()) {
353
+ function registerClassDeclarations(declarations, fail, normalizeOperations, visibleClasses = new Map(), interfaces = new Map()) {
319
354
  if (!Array.isArray(declarations)) {
320
355
  return fail("TYPE_MISMATCH", "Reference class declarations must be an ordered array.", /** @type {never} */ (undefined));
321
356
  }
@@ -396,9 +431,208 @@ function registerClassDeclarations(declarations, fail, normalizeOperations, visi
396
431
  }
397
432
  methodNames.add(method.name);
398
433
  }
434
+ if (declaration.implements !== undefined) {
435
+ if (!Array.isArray(declaration.implements)) {
436
+ fail("UNKNOWN_INTERFACE", `Class '${declaration.name}' has a malformed interface implementation set.`, declaration.location);
437
+ }
438
+ for (const implemented of declaration.implements) {
439
+ if (!implemented || implemented.kind != "InterfaceType" || typeof implemented.declarationId != "string" ||
440
+ !interfaces.has(implemented.declarationId)) {
441
+ fail("UNKNOWN_INTERFACE", `Class '${declaration.name}' implements unknown interface '${String(implemented?.declarationId)}'.`, declaration.location);
442
+ }
443
+ }
444
+ }
399
445
  }
400
446
  return classes;
401
447
  }
448
+ /**
449
+ * Checks the exact total override contract for one implementing class.
450
+ * @param {import("./types.js").ClassDeclaration} declaration - Class declaration.
451
+ * @param {InterfaceRegistry} interfaces - Interfaces by identity.
452
+ * @param {RecordRegistry} records - Record declarations by identity.
453
+ * @param {SemanticFail} fail - Diagnostic callback.
454
+ * @param {boolean} normalizeOperations - Whether resolved facts are assigned.
455
+ * @returns {void}
456
+ */
457
+ function validateInterfaceContracts(declaration, interfaces, records, fail, normalizeOperations) {
458
+ const implemented = declaration.implements ?? [];
459
+ if (implemented.length == 0)
460
+ return;
461
+ /** @type {InterfaceContractMember[]} */
462
+ const required = [];
463
+ for (const reference of implemented) {
464
+ for (const member of flattenedInterfaceMembers(reference.declarationId, interfaces, fail, new Set(), declaration.location)) {
465
+ if (required.some((candidate) => candidate.name == member.name))
466
+ continue;
467
+ required.push(member);
468
+ }
469
+ }
470
+ /** @type {Map<string, {parameterTypes: import("./types.js").SemanticValueType[], returnType: import("./types.js").SemanticFunctionReturnType}>} */
471
+ const contractSignatures = new Map();
472
+ for (const member of required) {
473
+ contractSignatures.set(member.name, {
474
+ parameterTypes: member.parameters.map((parameter) => validateValueTypeReference(parameter.type, parameter.location, fail, undefined, records)),
475
+ returnType: validateReturnTypeReference(member.returnType, member.location, fail, records)
476
+ });
477
+ }
478
+ /** @type {Map<string, InterfaceContractMember>} */
479
+ const satisfied = new Map();
480
+ for (const method of declaration.methods) {
481
+ const member = required.find((candidate) => candidate.name == method.name);
482
+ if (!member)
483
+ continue;
484
+ if (satisfied.has(member.name)) {
485
+ fail("INTERFACE_MEMBER_DUPLICATE", `Class '${declaration.name}' supplies method '${method.name}' more than once for interface contract membership.`, roleLocation(method, "name"));
486
+ }
487
+ const methodParameterTypes = method.parameters.map((parameter) => validateValueTypeReference(parameter.type, parameter.location, fail, undefined, records));
488
+ const methodReturnType = validateReturnTypeReference(method.returnType, method.location, fail, records);
489
+ const contract = contractSignatures.get(member.name);
490
+ if (!contract || methodParameterTypes.length != contract.parameterTypes.length ||
491
+ methodParameterTypes.some((type, index) => !sameType(type, contract.parameterTypes[index])) ||
492
+ !sameType(methodReturnType, contract.returnType)) {
493
+ fail("INTERFACE_MEMBER_SIGNATURE_MISMATCH", `Class '${declaration.name}' method '${method.name}' must exactly match interface '${interfaces.get(member.interfaceId)?.name}' signature ${interfaceSignatureDescription(member)}.`, roleLocation(method, "name"));
494
+ }
495
+ satisfied.set(member.name, member);
496
+ if (normalizeOperations)
497
+ method.implements = { interfaceId: member.interfaceId, methodId: member.methodId };
498
+ }
499
+ for (const member of required) {
500
+ if (satisfied.has(member.name))
501
+ continue;
502
+ fail("INTERFACE_MEMBER_MISSING", `Class '${declaration.name}' does not implement interface '${interfaces.get(member.interfaceId)?.name}' method '${member.name}'.`, declaration.location);
503
+ }
504
+ }
505
+ /**
506
+ * Formats one flattened interface signature for diagnostics.
507
+ * @param {InterfaceContractMember} member - Flattened member.
508
+ * @returns {string} Stable signature spelling.
509
+ */
510
+ function interfaceSignatureDescription(member) {
511
+ return `${member.name}(${member.parameters.map((parameter) => typeDescription(parameter.type)).join(", ")}): ${typeDescription(member.returnType)}`;
512
+ }
513
+ /**
514
+ * Registers interface declarations, their closed extends DAG, and their flattened signature sets.
515
+ * @param {unknown} declarations - Candidate ordered interface declarations.
516
+ * @param {SemanticFail} fail - Diagnostic callback.
517
+ * @param {boolean} normalizeOperations - Whether parser-authored identities are assigned.
518
+ * @param {InterfaceRegistry} [visibleInterfaces] - Imported interface declarations by identity.
519
+ * @returns {InterfaceRegistry} Validated interfaces by identity.
520
+ */
521
+ function registerInterfaceDeclarations(declarations, fail, normalizeOperations, visibleInterfaces = new Map()) {
522
+ if (!Array.isArray(declarations)) {
523
+ return fail("TYPE_MISMATCH", "Interface declarations must be an ordered array.", /** @type {never} */ (undefined));
524
+ }
525
+ /** @type {InterfaceRegistry} */
526
+ const interfaces = new Map(visibleInterfaces);
527
+ const names = new Set([...visibleInterfaces.values()].map(({ name }) => name));
528
+ for (let interfaceIndex = 0; interfaceIndex < declarations.length; interfaceIndex += 1) {
529
+ const declaration = /** @type {import("./types.js").InterfaceDeclaration} */ (declarations[interfaceIndex]);
530
+ if (!declaration || declaration.kind != "InterfaceDeclaration" || !Array.isArray(declaration.methods) ||
531
+ (declaration.extends !== undefined && !Array.isArray(declaration.extends))) {
532
+ return fail("DUPLICATE_INTERFACE", "Malformed or invalid interface declaration.", declaration?.location);
533
+ }
534
+ if (normalizeOperations)
535
+ declaration.id = `interface:${interfaceIndex}`;
536
+ if (typeof declaration.id != "string" || !/^(?:[a-z][a-z0-9._-]*#)?interface:[0-9]+$/u.test(declaration.id) ||
537
+ interfaces.has(declaration.id) || typeof declaration.name != "string" || declaration.name.length == 0 ||
538
+ names.has(declaration.name)) {
539
+ fail("DUPLICATE_INTERFACE", `Duplicate or invalid interface '${String(declaration.name)}'.`, roleLocation(declaration, "name"));
540
+ }
541
+ names.add(declaration.name);
542
+ interfaces.set(declaration.id, declaration);
543
+ const methodNames = new Set();
544
+ for (let methodIndex = 0; methodIndex < declaration.methods.length; methodIndex += 1) {
545
+ const method = declaration.methods[methodIndex];
546
+ const expectedId = `${declaration.id}:method:${methodIndex}`;
547
+ if (!method || method.kind != "InterfaceMethodDeclaration" || !Array.isArray(method.parameters) ||
548
+ Reflect.get(method, "body") !== undefined) {
549
+ fail("INTERFACE_MEMBER_DUPLICATE", "Malformed or invalid interface method declaration.", method?.location ?? declaration.location);
550
+ }
551
+ if (normalizeOperations)
552
+ method.id = expectedId;
553
+ if (method.id != expectedId || typeof method.name != "string" || method.name.length == 0 || methodNames.has(method.name)) {
554
+ fail("INTERFACE_MEMBER_DUPLICATE", `Duplicate or invalid interface method '${String(method.name)}'.`, roleLocation(method, "name"));
555
+ }
556
+ methodNames.add(method.name);
557
+ }
558
+ }
559
+ for (const declaration of interfaces.values()) {
560
+ for (const parent of declaration.extends ?? []) {
561
+ if (!parent || parent.kind != "InterfaceType" || typeof parent.declarationId != "string" ||
562
+ !interfaces.has(parent.declarationId)) {
563
+ fail("UNKNOWN_INTERFACE", `Unknown interface parent '${String(parent?.declarationId)}'.`, declaration.location);
564
+ }
565
+ }
566
+ flattenedInterfaceMembers(/** @type {string} */ (declaration.id), interfaces, fail);
567
+ }
568
+ return interfaces;
569
+ }
570
+ /**
571
+ * Flattens one interface's transitive signature set: parents first in declaration order, then its own methods.
572
+ * @param {string} interfaceId - Interface identity.
573
+ * @param {InterfaceRegistry} interfaces - Interfaces by identity.
574
+ * @param {SemanticFail} fail - Diagnostic callback.
575
+ * @param {Set<string>} [active] - Active extends path.
576
+ * @param {import("./types.js").SourceLocation} [fallbackLocation] - Location for a missing-parent diagnostic.
577
+ * @returns {InterfaceContractMember[]} Flattened members.
578
+ */
579
+ function flattenedInterfaceMembers(interfaceId, interfaces, fail, active = new Set(), fallbackLocation = undefined) {
580
+ const declaration = interfaces.get(interfaceId);
581
+ if (!declaration)
582
+ return fail("UNKNOWN_INTERFACE", `Unknown interface declaration '${interfaceId}'.`, /** @type {import("./types.js").SourceLocation} */ (fallbackLocation));
583
+ if (active.has(interfaceId)) {
584
+ return fail("INTERFACE_CYCLE", `Interface '${declaration.name}' extends itself through a cycle.`, declaration.location);
585
+ }
586
+ const cached = flattenedInterfaceCache.get(declaration);
587
+ if (cached)
588
+ return cached;
589
+ active.add(interfaceId);
590
+ /** @type {InterfaceContractMember[]} */
591
+ const members = [];
592
+ for (const parent of declaration.extends ?? []) {
593
+ for (const member of flattenedInterfaceMembers(parent.declarationId, interfaces, fail, active)) {
594
+ const inherited = members.find((candidate) => candidate.name == member.name);
595
+ if (inherited) {
596
+ if (!sameInterfaceSignature(inherited, member)) {
597
+ fail("INTERFACE_MEMBER_DUPLICATE", `Interface '${declaration.name}' inherits conflicting signatures for '${member.name}'.`, declaration.location);
598
+ }
599
+ continue;
600
+ }
601
+ members.push(member);
602
+ }
603
+ }
604
+ for (const method of declaration.methods) {
605
+ const inherited = members.find((candidate) => candidate.name == method.name);
606
+ if (inherited) {
607
+ if (!sameInterfaceSignature(inherited, method)) {
608
+ fail("INTERFACE_MEMBER_DUPLICATE", `Interface '${declaration.name}' redeclares inherited method '${method.name}' with a different signature.`, roleLocation(method, "name"));
609
+ }
610
+ continue;
611
+ }
612
+ members.push({
613
+ interfaceId: /** @type {string} */ (declaration.id),
614
+ location: method.location,
615
+ methodId: /** @type {string} */ (method.id),
616
+ name: method.name,
617
+ parameters: method.parameters,
618
+ returnType: method.returnType
619
+ });
620
+ }
621
+ active.delete(interfaceId);
622
+ flattenedInterfaceCache.set(declaration, members);
623
+ return members;
624
+ }
625
+ /**
626
+ * Compares two flattened interface signatures exactly.
627
+ * @param {{parameters: import("./types.js").Parameter[], returnType: import("./types.js").SemanticFunctionReturnType}} left - First signature.
628
+ * @param {{parameters: import("./types.js").Parameter[], returnType: import("./types.js").SemanticFunctionReturnType}} right - Second signature.
629
+ * @returns {boolean} Whether the signatures are identical.
630
+ */
631
+ function sameInterfaceSignature(left, right) {
632
+ return left.parameters.length == right.parameters.length &&
633
+ left.parameters.every((parameter, index) => sameTypeIdentity(typeIdentity(parameter.type), typeIdentity(right.parameters[index].type))) &&
634
+ sameTypeIdentity(typeIdentity(left.returnType), typeIdentity(right.returnType));
635
+ }
402
636
  /**
403
637
  * Validates exact construction, private state, and method bodies for one class.
404
638
  * @param {import("./types.js").ClassDeclaration} declaration - Class declaration.
@@ -692,11 +926,11 @@ function validateBlock(block, scope, returnType, functions, records, errors, cal
692
926
  statement.initializer = normalizeOwnedMove(statement.initializer, declaredType, normalizeOperations, fail);
693
927
  const initializerType = inferValueExpressionType(statement.initializer, scope, functions, records, fail, normalizeOperations, "an initializer", declaredType);
694
928
  scope.pending.delete(statement.name);
695
- if (!sameType(initializerType, declaredType)) {
929
+ if (!assignableType(initializerType, declaredType, records)) {
696
930
  if (initializerType.kind == "OptionalType" && declaredType.kind != "OptionalType") {
697
931
  fail("FAILURE_ABSENCE_CONFLATION", "Optional absence cannot be coerced into a value or typed failure.", statement.initializer.location);
698
932
  }
699
- fail("TYPE_MISMATCH", `Initializer type ${typeDescription(initializerType)}; expected ${typeDescription(declaredType)}.`, statement.initializer.location);
933
+ fail(nominalMismatchCode(declaredType), `Initializer type ${typeDescription(initializerType)}; expected ${typeDescription(declaredType)}.`, statement.initializer.location);
700
934
  }
701
935
  declareBinding(statement.name, {
702
936
  knownValue: knownValueForExpression(statement.initializer, scope),
@@ -718,8 +952,8 @@ function validateBlock(block, scope, returnType, functions, records, errors, cal
718
952
  if (!binding.mutable) {
719
953
  fail("IMMUTABLE_ASSIGNMENT", `Cannot assign to immutable binding '${statement.target.name}'.`, statement.target.location);
720
954
  }
721
- if (!sameType(expressionType, binding.type)) {
722
- fail("TYPE_MISMATCH", `Assignment type ${typeDescription(expressionType)}; expected ${typeDescription(binding.type)}.`, statement.expression.location);
955
+ if (!assignableType(expressionType, binding.type, records)) {
956
+ fail(nominalMismatchCode(binding.type), `Assignment type ${typeDescription(expressionType)}; expected ${typeDescription(binding.type)}.`, statement.expression.location);
723
957
  }
724
958
  binding.knownValue = knownValueForExpression(statement.expression, scope);
725
959
  scope.presenceProofs.delete(binding);
@@ -800,8 +1034,8 @@ function validateBlock(block, scope, returnType, functions, records, errors, cal
800
1034
  }
801
1035
  statement.expression = normalizeOwnedMove(statement.expression, returnType, normalizeOperations, fail);
802
1036
  const actualType = inferValueExpressionType(statement.expression, scope, functions, records, fail, normalizeOperations, "a returned value", returnType);
803
- if (!sameType(actualType, returnType)) {
804
- fail("TYPE_MISMATCH", `Return type ${typeDescription(actualType)}; expected ${typeDescription(returnType)}.`, statement.expression.location);
1037
+ if (!assignableType(actualType, returnType, records)) {
1038
+ fail(nominalMismatchCode(returnType), `Return type ${typeDescription(actualType)}; expected ${typeDescription(returnType)}.`, statement.expression.location);
805
1039
  }
806
1040
  }
807
1041
  if (statement.expression)
@@ -967,38 +1201,79 @@ function validateBlock(block, scope, returnType, functions, records, errors, cal
967
1201
  normal = false;
968
1202
  continue;
969
1203
  }
970
- if (statement.kind == "TryStatement") {
971
- const caughtType = validateErrorType(statement.catchType, statement.location, errors, fail);
972
- if (!statement.catchBinding || statement.catchBinding.kind != "CatchBinding" || statement.catchBinding.mutable !== false) {
973
- fail("INVALID_ERROR_HANDLER", "Catch requires one immutable typed binding.", statement.catchBinding?.location ?? statement.location);
1204
+ if (statement.kind == "RethrowStatement") {
1205
+ const binding = findBinding(statement.binding, scope);
1206
+ if (!binding || binding.mutable !== false || binding.type.kind != "ErrorType") {
1207
+ fail("INVALID_RETHROW", "Rethrow requires a catch binding in scope.", statement.location);
974
1208
  }
975
- const bindingType = validateErrorType(statement.catchBinding.type, statement.catchBinding.location, errors, fail);
976
- if (bindingType.declarationId != caughtType.declarationId) {
977
- fail("INVALID_ERROR_HANDLER", "Catch binding type must exactly match its handler type.", statement.catchBinding.location);
1209
+ raises.add(/** @type {import("./types.js").ErrorType} */ (binding.type).declarationId);
1210
+ normal = false;
1211
+ continue;
1212
+ }
1213
+ if (statement.kind == "TryStatement") {
1214
+ if (!Array.isArray(statement.handlers) || (statement.handlers.length == 0 && !statement.finallyBody)) {
1215
+ fail("INVALID_ERROR_HANDLER", "Try requires at least one exact typed handler or a finally block.", statement.location);
978
1216
  }
979
1217
  const bodyAssignedOuterBindings = outerMutableBindingsAssignedBy(statement.body, scope);
980
1218
  const assignedOuterBindings = new Set(bodyAssignedOuterBindings);
981
- outerMutableBindingsAssignedBy(statement.catchBody, scope, assignedOuterBindings);
1219
+ for (const handler of statement.handlers)
1220
+ outerMutableBindingsAssignedBy(handler.catchBody, scope, assignedOuterBindings);
1221
+ if (statement.finallyBody)
1222
+ outerMutableBindingsAssignedBy(statement.finallyBody, scope, assignedOuterBindings);
982
1223
  const bodyScope = createScope(scope, statement.body.statements);
983
1224
  const bodyFlow = validateBlock(statement.body, bodyScope, returnType, functions, records, errors, callEffects, fail, normalizeOperations, loopContext);
984
- const catchScope = createScope(scope, statement.catchBody.statements);
985
- for (const binding of bodyAssignedOuterBindings) {
986
- binding.knownValue = undefined;
987
- catchScope.presenceProofs.delete(binding);
1225
+ let remainingRaises = new Set(bodyFlow.raises);
1226
+ let normalCompletion = bodyFlow.normal;
1227
+ const handlerRaises = new Set();
1228
+ const seenHandlerNames = new Set();
1229
+ for (const handler of statement.handlers) {
1230
+ const caughtType = validateErrorType(handler.catchType, handler.location, errors, fail);
1231
+ if (!handler.catchBinding || handler.catchBinding.kind != "CatchBinding" || handler.catchBinding.mutable !== false) {
1232
+ fail("INVALID_ERROR_HANDLER", "Catch requires one immutable typed binding.", handler.catchBinding?.location ?? handler.location);
1233
+ }
1234
+ const bindingType = validateErrorType(handler.catchBinding.type, handler.catchBinding.location, errors, fail);
1235
+ if (bindingType.declarationId != caughtType.declarationId) {
1236
+ fail("INVALID_ERROR_HANDLER", "Catch binding type must exactly match its handler type.", handler.catchBinding.location);
1237
+ }
1238
+ if (!remainingRaises.has(caughtType.declarationId)) {
1239
+ fail("UNREACHABLE_HANDLER", `Handler for '${errors.get(caughtType.declarationId)?.name}' cannot be reached.`, typeLocation(handler.catchType, handler.location));
1240
+ }
1241
+ if (seenHandlerNames.has(handler.catchBinding.name)) {
1242
+ fail("DUPLICATE_BINDING", `Duplicate or shadowed binding '${handler.catchBinding.name}'.`, handler.catchBinding.location);
1243
+ }
1244
+ seenHandlerNames.add(handler.catchBinding.name);
1245
+ remainingRaises.delete(caughtType.declarationId);
1246
+ const catchScope = createScope(scope, handler.catchBody.statements);
1247
+ for (const binding of bodyAssignedOuterBindings) {
1248
+ binding.knownValue = undefined;
1249
+ catchScope.presenceProofs.delete(binding);
1250
+ }
1251
+ declareBinding(handler.catchBinding.name, {
1252
+ knownValue: undefined,
1253
+ mutable: false,
1254
+ type: bindingType
1255
+ }, roleLocation(handler.catchBinding, "name"), catchScope, fail);
1256
+ const catchFlow = validateBlock(handler.catchBody, catchScope, returnType, functions, records, errors, callEffects, fail, normalizeOperations, loopContext);
1257
+ normalCompletion = normalCompletion || catchFlow.normal;
1258
+ addAll(handlerRaises, catchFlow.raises);
1259
+ }
1260
+ const pendingRaises = new Set(remainingRaises);
1261
+ addAll(pendingRaises, handlerRaises);
1262
+ if (statement.finallyBody) {
1263
+ const finallyScope = createScope(scope, statement.finallyBody.statements);
1264
+ const finallyFlow = validateBlock(statement.finallyBody, finallyScope, returnType, functions, records, errors, callEffects, fail, normalizeOperations, loopContext);
1265
+ // `raises` is the enclosing block's accumulator. A completion block replaces only this try's
1266
+ // pending completion; escapes contributed by earlier statements of the enclosing block survive
1267
+ // whichever way the completion block completes.
1268
+ if (finallyFlow.normal)
1269
+ addAll(raises, pendingRaises);
1270
+ addAll(raises, finallyFlow.raises);
1271
+ normal = finallyFlow.normal ? normalCompletion : false;
988
1272
  }
989
- declareBinding(statement.catchBinding.name, {
990
- knownValue: undefined,
991
- mutable: false,
992
- type: bindingType
993
- }, roleLocation(statement.catchBinding, "name"), catchScope, fail);
994
- const catchFlow = validateBlock(statement.catchBody, catchScope, returnType, functions, records, errors, callEffects, fail, normalizeOperations, loopContext);
995
- if (!bodyFlow.raises.has(caughtType.declarationId)) {
996
- fail("UNREACHABLE_HANDLER", `Handler for '${errors.get(caughtType.declarationId)?.name}' cannot be reached.`, typeLocation(statement.catchType, statement.location));
1273
+ else {
1274
+ addAll(raises, pendingRaises);
1275
+ normal = normalCompletion;
997
1276
  }
998
- bodyFlow.raises.delete(caughtType.declarationId);
999
- addAll(raises, bodyFlow.raises);
1000
- addAll(raises, catchFlow.raises);
1001
- normal = bodyFlow.normal || catchFlow.normal;
1002
1277
  for (const binding of assignedOuterBindings) {
1003
1278
  binding.knownValue = undefined;
1004
1279
  scope.presenceProofs.delete(binding);
@@ -1142,13 +1417,26 @@ function syntacticBlockEffects(block, callEffects, methodEffects = new Map()) {
1142
1417
  }
1143
1418
  continue;
1144
1419
  }
1420
+ if (kind == "RethrowStatement") {
1421
+ const bindingNode = Reflect.get(statement, "bindingNode");
1422
+ const bindingType = bindingNode && typeof bindingNode == "object" ? Reflect.get(bindingNode, "type") : undefined;
1423
+ const declarationId = bindingType && typeof bindingType == "object" ? Reflect.get(bindingType, "declarationId") : undefined;
1424
+ if (typeof declarationId == "string")
1425
+ result.add(declarationId);
1426
+ continue;
1427
+ }
1145
1428
  if (kind == "TryStatement") {
1146
- const bodyEffects = syntacticBlockEffects(Reflect.get(statement, "body"), callEffects, methodEffects);
1147
- const catchType = Reflect.get(statement, "catchType");
1148
- const caughtId = catchType && typeof catchType == "object" ? Reflect.get(catchType, "declarationId") : undefined;
1149
- if (typeof caughtId == "string" && bodyEffects.delete(caughtId)) {
1150
- addAll(bodyEffects, syntacticBlockEffects(Reflect.get(statement, "catchBody"), callEffects, methodEffects));
1429
+ let bodyEffects = syntacticBlockEffects(Reflect.get(statement, "body"), callEffects, methodEffects);
1430
+ for (const handler of Reflect.get(statement, "handlers") ?? []) {
1431
+ if (!handler || typeof handler != "object")
1432
+ continue;
1433
+ const catchType = Reflect.get(handler, "catchType");
1434
+ const caughtId = catchType && typeof catchType == "object" ? Reflect.get(catchType, "declarationId") : undefined;
1435
+ if (typeof caughtId == "string" && bodyEffects.delete(caughtId)) {
1436
+ addAll(bodyEffects, syntacticBlockEffects(Reflect.get(handler, "catchBody"), callEffects, methodEffects));
1437
+ }
1151
1438
  }
1439
+ addAll(bodyEffects, syntacticBlockEffects(Reflect.get(statement, "finallyBody"), callEffects, methodEffects));
1152
1440
  addAll(result, bodyEffects);
1153
1441
  continue;
1154
1442
  }
@@ -1407,6 +1695,13 @@ function validateTypeReference(type, location, fail, seen = new Set(), records =
1407
1695
  }
1408
1696
  return candidate;
1409
1697
  }
1698
+ if (candidate.kind == "InterfaceType") {
1699
+ if (Object.keys(candidate).filter((key) => key != "sourceProvenance").sort().join(",") != "declarationId,kind" ||
1700
+ typeof candidate.declarationId != "string" || !interfacesByRecordRegistry.get(records)?.has(candidate.declarationId)) {
1701
+ fail("UNKNOWN_INTERFACE", `Unknown interface declaration '${String(candidate.declarationId)}'.`, typeLocation(candidate, location));
1702
+ }
1703
+ return candidate;
1704
+ }
1410
1705
  if (candidate.kind == "OwnedResourceType") {
1411
1706
  if (Object.keys(candidate).filter((key) => key != "sourceProvenance").sort().join(",") != "kind,resourceId" ||
1412
1707
  typeof candidate.resourceId != "string" || !resourceIdsByRecordRegistry.get(records)?.has(candidate.resourceId)) {
@@ -1605,8 +1900,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1605
1900
  return { kind: "OptionalType", valueType };
1606
1901
  }
1607
1902
  const valueType = inferValueExpressionType(expression.value, scope, functions, records, fail, normalizeOperations, "an optional present value", expectedType.valueType);
1608
- if (!sameType(valueType, expectedType.valueType)) {
1609
- fail("TYPE_MISMATCH", `Optional present type ${typeDescription(valueType)}; expected ${typeDescription(expectedType.valueType)}.`, expression.value.location);
1903
+ if (!assignableType(valueType, expectedType.valueType, records)) {
1904
+ fail(nominalMismatchCode(expectedType.valueType), `Optional present type ${typeDescription(valueType)}; expected ${typeDescription(expectedType.valueType)}.`, expression.value.location);
1610
1905
  }
1611
1906
  return expectedType;
1612
1907
  }
@@ -1651,8 +1946,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1651
1946
  const actual = inferValueExpressionType(element, scope, functions, records, fail, normalizeOperations, "a list element", expectedType?.kind == "ListType" ? expectedType.elementType : inferredElementType, inferCollectionElements);
1652
1947
  inferredElementType ??= actual;
1653
1948
  const requiredElementType = expectedType?.kind == "ListType" ? expectedType.elementType : inferredElementType;
1654
- if (!sameType(actual, requiredElementType)) {
1655
- fail("TYPE_MISMATCH", `List element type ${typeDescription(actual)}; expected ${typeDescription(requiredElementType)}.`, element.location);
1949
+ if (!assignableType(actual, requiredElementType, records)) {
1950
+ fail(nominalMismatchCode(requiredElementType), `List element type ${typeDescription(actual)}; expected ${typeDescription(requiredElementType)}.`, element.location);
1656
1951
  }
1657
1952
  }
1658
1953
  return expectedType?.kind == "ListType"
@@ -1679,8 +1974,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1679
1974
  const actual = inferValueExpressionType(entry.value, scope, functions, records, fail, normalizeOperations, "a map value", expectedType?.kind == "MapType" ? expectedType.valueType : inferredValueType, inferCollectionElements);
1680
1975
  inferredValueType ??= actual;
1681
1976
  const requiredValueType = expectedType?.kind == "MapType" ? expectedType.valueType : inferredValueType;
1682
- if (!sameType(actual, requiredValueType)) {
1683
- fail("TYPE_MISMATCH", `Map value type ${typeDescription(actual)}; expected ${typeDescription(requiredValueType)}.`, entry.value.location);
1977
+ if (!assignableType(actual, requiredValueType, records)) {
1978
+ fail(nominalMismatchCode(requiredValueType), `Map value type ${typeDescription(actual)}; expected ${typeDescription(requiredValueType)}.`, entry.value.location);
1684
1979
  }
1685
1980
  }
1686
1981
  return expectedType?.kind == "MapType" ? expectedType : {
@@ -1709,8 +2004,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1709
2004
  const actual = inferValueExpressionType(entry.value, scope, functions, records, fail, normalizeOperations, "an ordered-map value", expectedType?.kind == "OrderedMapType" ? expectedType.valueType : inferredValueType, inferCollectionElements);
1710
2005
  inferredValueType ??= actual;
1711
2006
  const requiredValueType = expectedType?.kind == "OrderedMapType" ? expectedType.valueType : inferredValueType;
1712
- if (!sameType(actual, requiredValueType)) {
1713
- fail("TYPE_MISMATCH", `Ordered-map value type ${typeDescription(actual)}; expected ${typeDescription(requiredValueType)}.`, entry.value.location);
2007
+ if (!assignableType(actual, requiredValueType, records)) {
2008
+ fail(nominalMismatchCode(requiredValueType), `Ordered-map value type ${typeDescription(actual)}; expected ${typeDescription(requiredValueType)}.`, entry.value.location);
1714
2009
  }
1715
2010
  }
1716
2011
  return expectedType?.kind == "OrderedMapType" ? expectedType : {
@@ -1834,6 +2129,44 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1834
2129
  }
1835
2130
  if (expression.kind == "MethodCallExpression") {
1836
2131
  const receiverType = inferValueExpressionType(expression.receiver, scope, functions, records, fail, normalizeOperations, "a method receiver");
2132
+ if (receiverType.kind == "InterfaceType") {
2133
+ const interfaces = interfacesByRecordRegistry.get(records) ?? new Map();
2134
+ const receiverInterface = interfaces.get(receiverType.declarationId);
2135
+ if (!receiverInterface)
2136
+ return fail("UNKNOWN_INTERFACE", `Unknown interface '${receiverType.declarationId}'.`, expression.receiver.location);
2137
+ const members = flattenedInterfaceMembers(receiverType.declarationId, interfaces, fail, new Set(), expression.receiver.location);
2138
+ const member = members.find((candidate) => candidate.methodId == expression.method) ??
2139
+ (normalizeOperations ? members.find((candidate) => candidate.name == expression.method) : undefined);
2140
+ if (!member)
2141
+ return fail("UNKNOWN_METHOD", `Interface '${receiverInterface.name}' has no method '${expression.method}'.`, roleLocation(expression, "member"));
2142
+ if (normalizeOperations)
2143
+ expression.method = member.methodId;
2144
+ if (!isDenseArray(expression.arguments))
2145
+ return fail("TYPE_MISMATCH", "Method arguments must be a dense ordered array.", expression.location);
2146
+ if (expression.arguments.length != member.parameters.length) {
2147
+ return fail("METHOD_ARITY_MISMATCH", `Method '${member.name}' has ${expression.arguments.length} arguments; expected ${member.parameters.length}.`, expression.location);
2148
+ }
2149
+ const parameterTypes = member.parameters.map((parameter) => validateValueTypeReference(parameter.type, parameter.location, fail, undefined, records));
2150
+ for (let index = 0; index < expression.arguments.length; index += 1) {
2151
+ expression.arguments[index] = normalizeOwnedMove(expression.arguments[index], parameterTypes[index], normalizeOperations, fail);
2152
+ const actual = inferValueExpressionType(expression.arguments[index], scope, functions, records, fail, normalizeOperations, "a method argument", parameterTypes[index]);
2153
+ if (!assignableType(actual, parameterTypes[index], records)) {
2154
+ fail(nominalMismatchCode(parameterTypes[index]), `Method argument type ${typeDescription(actual)}; expected ${typeDescription(parameterTypes[index])}.`, expression.arguments[index].location);
2155
+ }
2156
+ }
2157
+ const returnType = validateReturnTypeReference(member.returnType, member.location, fail, records);
2158
+ const resolution = {
2159
+ declarationId: member.methodId,
2160
+ kind: /** @type {const} */ ("ResolvedMethodSignature"),
2161
+ parameterTypes: parameterTypes.map((type) => /** @type {import("./types.js").SemanticTypeIdentity} */ (typeIdentity(type))),
2162
+ returnType: typeIdentity(returnType)
2163
+ };
2164
+ if (normalizeOperations)
2165
+ expression.resolution = resolution;
2166
+ else
2167
+ validateReferenceResolution(expression.resolution, resolution, expression.location, fail, "method");
2168
+ return isVoidType(returnType) ? "void" : returnType;
2169
+ }
1837
2170
  if (receiverType.kind != "ReferenceType" && receiverType.kind != "OwnedReferenceType") {
1838
2171
  return fail("INVALID_METHOD_RECEIVER", "Method call receiver must have a reference class type.", expression.receiver.location);
1839
2172
  }
@@ -1855,8 +2188,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1855
2188
  for (let index = 0; index < expression.arguments.length; index += 1) {
1856
2189
  expression.arguments[index] = normalizeOwnedMove(expression.arguments[index], parameterTypes[index], normalizeOperations, fail);
1857
2190
  const actual = inferValueExpressionType(expression.arguments[index], scope, functions, records, fail, normalizeOperations, "a method argument", parameterTypes[index]);
1858
- if (!sameType(actual, parameterTypes[index])) {
1859
- fail("TYPE_MISMATCH", `Method argument type ${typeDescription(actual)}; expected ${typeDescription(parameterTypes[index])}.`, expression.arguments[index].location);
2191
+ if (!assignableType(actual, parameterTypes[index], records)) {
2192
+ fail(nominalMismatchCode(parameterTypes[index]), `Method argument type ${typeDescription(actual)}; expected ${typeDescription(parameterTypes[index])}.`, expression.arguments[index].location);
1860
2193
  }
1861
2194
  }
1862
2195
  const returnType = validateReturnTypeReference(method.returnType, method.location, fail, records);
@@ -1965,8 +2298,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1965
2298
  if ((functionDeclaration.typeParameters?.length ?? 0) > 0) {
1966
2299
  inferTypeArguments(expectedType, actualType, substitutions, argument.location, fail);
1967
2300
  }
1968
- else if (!sameType(actualType, expectedType)) {
1969
- fail("TYPE_MISMATCH", `Call argument type ${typeDescription(actualType)}; expected ${typeDescription(expectedType)}.`, argument.location);
2301
+ else if (!assignableType(actualType, expectedType, records)) {
2302
+ fail(nominalMismatchCode(expectedType), `Call argument type ${typeDescription(actualType)}; expected ${typeDescription(expectedType)}.`, argument.location);
1970
2303
  }
1971
2304
  }
1972
2305
  for (const parameter of functionDeclaration.typeParameters ?? []) {
@@ -1984,8 +2317,8 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
1984
2317
  for (let index = 0; index < functionDeclaration.parameters.length; index += 1) {
1985
2318
  const expected = substituteValueType(functionDeclaration.parameters[index].type, substitutions);
1986
2319
  const actual = inferValueExpressionType(expression.arguments[index], scope, functions, records, fail, normalizeOperations, "a call argument", expected);
1987
- if (!sameType(actual, expected)) {
1988
- fail("TYPE_MISMATCH", `Call argument type ${typeDescription(actual)}; expected ${typeDescription(expected)}.`, expression.arguments[index].location);
2320
+ if (!assignableType(actual, expected, records)) {
2321
+ fail(nominalMismatchCode(expected), `Call argument type ${typeDescription(actual)}; expected ${typeDescription(expected)}.`, expression.arguments[index].location);
1989
2322
  }
1990
2323
  }
1991
2324
  const resolution = signatureFor(functionDeclaration, records, fail, substitutions);
@@ -2458,6 +2791,8 @@ function typeIdentity(type) {
2458
2791
  };
2459
2792
  if (type.kind == "ReferenceType")
2460
2793
  return { declarationId: type.declarationId, kind: "ReferenceType" };
2794
+ if (type.kind == "InterfaceType")
2795
+ return { declarationId: type.declarationId, kind: "InterfaceType" };
2461
2796
  if (type.kind == "OwnedResourceType")
2462
2797
  return { kind: "OwnedResourceType", resourceId: type.resourceId };
2463
2798
  if (type.kind == "OwnedReferenceType")
@@ -2523,6 +2858,10 @@ function validTypeIdentity(type, allowVoid, seen = new Set()) {
2523
2858
  valid = typeof candidate.declarationId == "string" &&
2524
2859
  /^(?:[a-z][a-z0-9._-]*#)?class:[0-9]+$/u.test(candidate.declarationId);
2525
2860
  }
2861
+ else if (candidate.kind == "InterfaceType" && Object.keys(candidate).sort().join(",") == "declarationId,kind") {
2862
+ valid = typeof candidate.declarationId == "string" &&
2863
+ /^(?:[a-z][a-z0-9._-]*#)?interface:[0-9]+$/u.test(candidate.declarationId);
2864
+ }
2526
2865
  else if (candidate.kind == "OwnedResourceType" && Object.keys(candidate).sort().join(",") == "kind,resourceId") {
2527
2866
  valid = typeof candidate.resourceId == "string" && /^(?:module:[0-9]+\/)?capability:[0-9]+\/resource:[0-9]+$/u
2528
2867
  .test(candidate.resourceId);
@@ -2576,6 +2915,8 @@ function sameTypeIdentity(left, right) {
2576
2915
  }
2577
2916
  if (leftType.kind == "ReferenceType")
2578
2917
  return leftType.declarationId == rightType.declarationId;
2918
+ if (leftType.kind == "InterfaceType")
2919
+ return leftType.declarationId == rightType.declarationId;
2579
2920
  if (leftType.kind == "OwnedResourceType")
2580
2921
  return leftType.resourceId == rightType.resourceId;
2581
2922
  if (leftType.kind == "OwnedReferenceType")
@@ -2594,6 +2935,50 @@ function sameTypeIdentity(left, right) {
2594
2935
  function sameType(left, right) {
2595
2936
  return sameTypeIdentity(typeIdentity(left), typeIdentity(right));
2596
2937
  }
2938
+ /**
2939
+ * Reports whether one validated type may flow to a declared position.
2940
+ * @param {import("./types.js").SemanticFunctionReturnType} actual - Inferred source type.
2941
+ * @param {import("./types.js").SemanticFunctionReturnType} expected - Declared position type.
2942
+ * @param {RecordRegistry} records - Record and reference-class registries.
2943
+ * @returns {boolean} Whether the value flow is admitted.
2944
+ */
2945
+ function assignableType(actual, expected, records) {
2946
+ if (sameType(actual, expected))
2947
+ return true;
2948
+ if (expected.kind != "InterfaceType")
2949
+ return false;
2950
+ const interfaces = interfacesByRecordRegistry.get(records) ?? new Map();
2951
+ if (actual.kind == "InterfaceType")
2952
+ return interfaceExtendsTransitively(actual.declarationId, expected.declarationId, interfaces);
2953
+ if (actual.kind == "ReferenceType") {
2954
+ const declaration = referenceClassesFor(records).get(actual.declarationId);
2955
+ return Boolean(declaration?.implements?.some((implemented) => implemented.declarationId == expected.declarationId ||
2956
+ interfaceExtendsTransitively(implemented.declarationId, expected.declarationId, interfaces)));
2957
+ }
2958
+ return false;
2959
+ }
2960
+ /**
2961
+ * Reports whether one interface transitively extends another through the closed DAG.
2962
+ * @param {string} interfaceId - Descendant interface identity.
2963
+ * @param {string} ancestorId - Ancestor interface identity.
2964
+ * @param {InterfaceRegistry} interfaces - Interfaces by identity.
2965
+ * @returns {boolean} Whether the relation holds.
2966
+ */
2967
+ function interfaceExtendsTransitively(interfaceId, ancestorId, interfaces) {
2968
+ const declaration = interfaces.get(interfaceId);
2969
+ if (!declaration)
2970
+ return false;
2971
+ return (declaration.extends ?? []).some((parent) => parent.declarationId == ancestorId ||
2972
+ interfaceExtendsTransitively(parent.declarationId, ancestorId, interfaces));
2973
+ }
2974
+ /**
2975
+ * Chooses the stable diagnostic code for one failed nominal value flow.
2976
+ * @param {import("./types.js").SemanticFunctionReturnType} expected - Declared position type.
2977
+ * @returns {string} Stable diagnostic code.
2978
+ */
2979
+ function nominalMismatchCode(expected) {
2980
+ return expected.kind == "InterfaceType" ? "INTERFACE_TYPE_MISMATCH" : "TYPE_MISMATCH";
2981
+ }
2597
2982
  /**
2598
2983
  * Formats one validated semantic type for diagnostics.
2599
2984
  * @param {import("./types.js").SemanticFunctionReturnType | import("./types.js").ErrorType} type - Semantic type.
@@ -2609,6 +2994,8 @@ function typeDescription(type) {
2609
2994
  ? `, ${type.arguments.map(typeDescription).join(", ")}` : ""}>`;
2610
2995
  if (type.kind == "ReferenceType")
2611
2996
  return `reference<${type.declarationId}>`;
2997
+ if (type.kind == "InterfaceType")
2998
+ return `interface<${type.declarationId}>`;
2612
2999
  if (type.kind == "OwnedResourceType")
2613
3000
  return `owned-resource<${type.resourceId}>`;
2614
3001
  if (type.kind == "OwnedReferenceType")
@@ -2751,7 +3138,10 @@ function outerMutableBindingsAssignedBy(block, outerScope, assigned = new Set())
2751
3138
  }
2752
3139
  else if (statement.kind == "TryStatement") {
2753
3140
  outerMutableBindingsAssignedBy(statement.body, outerScope, assigned);
2754
- outerMutableBindingsAssignedBy(statement.catchBody, outerScope, assigned);
3141
+ for (const handler of statement.handlers ?? [])
3142
+ outerMutableBindingsAssignedBy(handler.catchBody, outerScope, assigned);
3143
+ if (statement.finallyBody)
3144
+ outerMutableBindingsAssignedBy(statement.finallyBody, outerScope, assigned);
2755
3145
  }
2756
3146
  }
2757
3147
  return assigned;
@@ -2964,4 +3354,4 @@ function setNormalizedOperation(expression, operation, type) {
2964
3354
  Reflect.set(expression, "operation", operation);
2965
3355
  Reflect.set(expression, "type", type);
2966
3356
  }
2967
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdmFsaWRhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxlQUFlLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUMxRixPQUFPLEVBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDbkcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUV2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFFekcsb0ZBQW9GO0FBQ3BGLGtGQUFrRjtBQUNsRixrRkFBa0Y7QUFDbEYscURBQXFEO0FBQ3JELE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUN0RCxtREFBbUQ7QUFDbkQsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRWpEOzs7OztHQUtHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNqRSw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZELG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDMUc7OztPQUdHO0lBQ0gsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBRTFGLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMxRCx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUUvRixPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsOEJBQThCLENBQUMsTUFBTSxFQUFFLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUN4RSxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlLENBQUM7U0FDbkgsR0FBRyxDQUFDLENBQUMsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFN0MsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3ZGLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsU0FBUTtRQUNoQyxNQUFNLEtBQUssR0FBRyxpR0FBaUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRTNILFdBQVcsQ0FBQyxTQUFTLEdBQUcsRUFBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUMsQ0FBQTtRQUM3SCxhQUFhLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUNELHdCQUF3QjtJQUN4QixNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hCLDBCQUEwQjtJQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXRCLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFRO1FBQ25FLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxlQUFlO1lBQ3hFLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUMxRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVE7WUFDNUQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ2pFOzs7T0FHRztJQUNILE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFM0YsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzNELHlCQUF5QixDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQ2pHLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSTtJQUNqRCxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0Msa0JBQWtCLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDM0UsS0FBSyxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTyxJQUFJLEVBQUU7WUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN0RyxDQUFDO0lBQ0QsS0FBSyxNQUFNLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEYsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9FLENBQUM7UUFFRCxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDakUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJO0lBQzdDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxHQUFHLE1BQU0sZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDdEYsQ0FBQztJQUVELEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDelQsSUFBSSxDQUFDLEdBQUcsTUFBTSxjQUFjLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkUsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNwQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUMvRCxJQUFJLFNBQVMsQ0FBQyxTQUFTO2dCQUFFLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3hGLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksa0JBQWtCLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDMUgsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNyQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNwRCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM3RCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDcEYsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMzRyxNQUFNLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNySCxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hHLG9FQUFvRTtJQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFNUcsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3RFLElBQUksbUJBQW1CO1lBQUUsbUJBQW1CLENBQUMsRUFBRSxHQUFHLFlBQVksS0FBSyxFQUFFLENBQUE7UUFDckUsSUFBSSxPQUFPLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxRQUFRLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQ3hILGNBQWMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUscURBQXFELEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEgsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSx1QkFBdUIsbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsWUFBWSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDM0gsQ0FBQztRQUNELGNBQWMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUMsc0JBQXNCLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUE7UUFDdEUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzNGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXhGLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3hGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDOUUsS0FBSyxNQUFNLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25FLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxpQ0FBaUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3RixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLG9EQUFvRCxDQUFDLEVBQUMsc0JBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9HLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUUzRSxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDO1FBQ2pDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRTtRQUNuQixHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDL0QsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQy9ELEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM5RCxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztLQUM3QyxDQUFDLENBQUE7SUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRTlCLEtBQUssTUFBTSxXQUFXLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQ0FBa0MsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUN0SCxDQUFDO1FBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELEtBQUssTUFBTSxXQUFXLElBQUksQ0FBQyxHQUFHLG1CQUFtQixFQUFFLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQzFFLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsa0NBQWtDLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEcsQ0FBQztRQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFDRCxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUMxRSxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBRXhGLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMvQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFDckcsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUVELEtBQUssTUFBTSxtQkFBbUIsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkQsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUMzSSxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtJQUVoRyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUN4RyxtQkFBbUIsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQ3RFLElBQUksbUJBQW1CO1FBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNoRyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsSUFBSTtJQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3hCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQTtJQUVoQixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUV0SCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFMUcsT0FBTyxNQUFNLENBQUE7SUFFYjs7Ozs7O09BTUc7SUFDSCxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU07UUFDakMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU07UUFDdEQsS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsSUFBSSxRQUFRO2dCQUFFLFNBQVE7WUFDeEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzRixNQUFNLElBQUksR0FBRyxxSUFBcUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUU5SixJQUFJLG1CQUFtQjtvQkFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsUUFBUSxFQUFFLENBQUE7Z0JBQ3JELFFBQVEsSUFBSSxDQUFDLENBQUE7Z0JBQ2IsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN6RixJQUFJLENBQUMscUJBQXFCLEVBQUUscUNBQXFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNuRixDQUFDO2dCQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUM1QyxDQUFDO2lCQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3ZGLElBQUksbUJBQW1CLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLFNBQVMsQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDbEgsQ0FBQztpQkFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtnQkFDMUMsSUFBSSxTQUFTLENBQUMsU0FBUztvQkFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDcEUsQ0FBQztpQkFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtnQkFDcEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQzNDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsTUFBTSxFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUE7SUFFbEQsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsU0FBUztRQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUN4RixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUMxRSxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBRXBGLE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6SCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMseUJBQXlCLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDcEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsd0RBQXdELEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzFILENBQUM7SUFDRCw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFFekUsS0FBSyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNFLE1BQU0sV0FBVyxHQUFHLG9EQUFvRCxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFFbkcsSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLGtCQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzlGLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLHdCQUF3QixFQUFFLENBQUM7WUFDOUgsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsbURBQW1ELEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzVHLENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQywyQkFBMkIsRUFBRSx3REFBd0QsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkgsQ0FBQztRQUNELElBQUksbUJBQW1CO1lBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxTQUFTLFVBQVUsRUFBRSxDQUFBO1FBQy9ELElBQUksT0FBTyxXQUFXLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3JHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sV0FBVyxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEksSUFBSSxDQUFDLGlCQUFpQixFQUFFLHlDQUF5QyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ25JLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFFeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU1QixLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDNUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxVQUFVLFVBQVUsRUFBRSxDQUFBO1lBRTFELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLHlCQUF5QixFQUFFLHFDQUFxQyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2pILENBQUM7WUFDRCxJQUFJLG1CQUFtQjtnQkFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQTtZQUM5QyxJQUFJLEtBQUssQ0FBQyxFQUFFLElBQUksVUFBVSxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3BILElBQUksQ0FBQyx5QkFBeUIsRUFBRSx1Q0FBdUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUM3SCxDQUFDO1lBQ0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUIsQ0FBQztRQUNELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLENBQUE7UUFFMUgsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLFdBQVcsQ0FBQyxJQUFJLDREQUE0RCxFQUFFLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVJLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQTtRQUU1RixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsV0FBVyxDQUFDLElBQUksOENBQThDLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3hILENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsaUdBQWlHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNoSSxNQUFNLFFBQVEsR0FBRyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxlQUFlLENBQUM7Z0JBQ3ZHLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFBO1lBRXBDLElBQUksbUJBQW1CO2dCQUFFLFdBQVcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO2lCQUNwRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLHdCQUF3QixFQUFFLFVBQVUsV0FBVyxDQUFDLElBQUksOENBQThDLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2hJLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxXQUFXLENBQUMsSUFBSSxpREFBaUQsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkksQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLEdBQUcsV0FBVyxDQUFDLEVBQUUsY0FBYyxDQUFBO1FBRXJELElBQUksbUJBQW1CO1lBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFBO1FBQ25FLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksYUFBYSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztZQUNuRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsdUJBQXVCLEVBQUUsK0NBQStDLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsSCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU3QixLQUFLLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JGLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDL0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxXQUFXLFdBQVcsRUFBRSxDQUFBO1lBRTVELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsMENBQTBDLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEgsQ0FBQztZQUNELElBQUksbUJBQW1CO2dCQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFBO1lBQy9DLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxVQUFVLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUN0SCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLGdDQUFnQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ2pILENBQUM7WUFDRCxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUM5RyxtQkFBbUIsRUFBRSxVQUFVO0lBQy9CLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFBO0lBQzNDLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDM0QsTUFBTSxxQkFBcUIsR0FBRyxvQkFBb0IsRUFBRSxJQUFJLElBQUksNEJBQTRCO1FBQ3RGLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUMvQyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWUsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQ3ZHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksb0JBQW9CLEVBQUUsSUFBSSxJQUFJLDRCQUE0QjtRQUNyRyxvQkFBb0IsQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxvQkFBb0I7UUFDekgsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxJQUFJLHFCQUFxQixFQUFFLElBQUksSUFBSSxzQkFBc0I7UUFDaEgscUJBQXFCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksU0FBUztRQUMvRCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQTtJQUU5RixJQUFJLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkYsSUFBSSxDQUFDLHVCQUF1QixFQUFFLDJFQUEyRSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNsSSxDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUFnQjtRQUNuQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEksSUFBSSxDQUFDLDJCQUEyQixFQUFFLG9CQUFvQixXQUFXLENBQUMsSUFBSSwwRUFBMEUsRUFDOUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFDRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUV4SCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0MsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QyxNQUFNLElBQUksR0FBRywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVyRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLFNBQVMsQ0FBQyxJQUFJLHVDQUF1QyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFJLENBQUM7UUFDRCxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3RJLElBQUksZ0JBQWdCO1lBQUUsU0FBUTtRQUM5QixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwRCxNQUFNLFdBQVcsR0FBRyxTQUFTLEVBQUUsSUFBSSxJQUFJLDRCQUE0QjtZQUNqRSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUkscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVTtZQUM3RyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRWIsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLDRCQUE0QixJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDN0YsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksb0JBQW9CLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLEVBQUU7WUFDaEcsV0FBVyxFQUFFLElBQUksSUFBSSxzQkFBc0IsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwRixJQUFJLENBQUMsMkJBQTJCLEVBQUUsb0JBQW9CLFdBQVcsQ0FBQyxJQUFJLHNCQUFzQixLQUFLLENBQUMsSUFBSSxxQ0FBcUMsRUFDekksU0FBUyxFQUFFLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFDRCxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQ3pHLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEVBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUUzRixLQUFLLE1BQU0sTUFBTSxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxNQUFNLHdCQUF3QixHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ2xGLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQywwREFBMEQsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUV2RixJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWUsSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUYsSUFBSSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixNQUFNLENBQUMsSUFBSSxzREFBc0QsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEksQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUV4RyxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksR0FBRywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUVyRyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM3SCxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNqRyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQ3RHLG1CQUFtQixFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUUzRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWU7WUFBRSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRXRHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLE1BQU0sQ0FBQyxJQUFJLDRDQUE0QyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3RyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUNuRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsOENBQThDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQ2hKLDRCQUE0QjtJQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXZCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFdkMsSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDhCQUE4QixFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNyRixDQUFDO1FBQ0QsSUFBSSxtQkFBbUI7WUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFNBQVMsS0FBSyxFQUFFLENBQUE7UUFDMUQsSUFBSSxPQUFPLFdBQVcsQ0FBQyxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMsd0NBQXdDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3RJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxrREFBa0QsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkcsQ0FBQztRQUNELElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSwrQkFBK0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUN6SCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CO0lBQ3BFLElBQUksV0FBVyxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQUUsT0FBTTtJQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxFQUFFLGdEQUFnRCxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV2QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkQsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLE9BQU8sU0FBUyxJQUFJLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2pGLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGVBQWU7WUFDdEcsSUFBSSxJQUFJLHVCQUF1QixJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckcsSUFBSSxDQUFDLGVBQWUsRUFBRSx1Q0FBdUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3RyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQywwQkFBMEIsRUFBRSw2QkFBNkIsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNwSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekIsTUFBTSxVQUFVLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxTQUFTLEtBQUssRUFBRSxDQUFBO1FBRXBELElBQUksbUJBQW1CO1lBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUE7UUFDbEQsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQywwQkFBMEIsRUFBRSwrQ0FBK0MsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkcsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMkJBQTJCLENBQUMsV0FBVztJQUM5QyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM5RixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzFILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSwrQ0FBK0MsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDakosNkJBQTZCO0lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBRXZDLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV2QixLQUFLLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTdDLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxtQkFBbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEcsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLCtCQUErQixFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN0RixDQUFDO1FBQ0QsSUFBSSxtQkFBbUI7WUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFVBQVUsV0FBVyxFQUFFLENBQUE7UUFDakUsSUFBSSxPQUFPLFdBQVcsQ0FBQyxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMseUNBQXlDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxtREFBbUQsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDckcsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUscUJBQXFCLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDeEcsQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzNCLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtRQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVELEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUM1QixNQUFNLGNBQWMsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUvRCxLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFNUMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLGFBQWE7Z0JBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNwSSxJQUFJLG1CQUFtQjtnQkFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEdBQUcsV0FBVyxDQUFDLEVBQUUsVUFBVSxVQUFVLEVBQUUsQ0FBQTtZQUMzRSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLEVBQUUsSUFBSSxHQUFHLFdBQVcsQ0FBQyxFQUFFLFVBQVUsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDdkYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLDZDQUE2QyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN4RixDQUFDO1lBQ0QsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ3hILFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzFCLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSx3REFBd0QsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbEcsQ0FBQztZQUNELDBCQUEwQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUNsRyxDQUFDO0lBQ0gsQ0FBQztJQUNELDZCQUE2QixDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFFMUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsNkJBQTZCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFMUI7Ozs7O09BS0c7SUFDSCxTQUFTLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTTtRQUNoQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFBRSxPQUFNO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTVCLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNoRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFlBQVk7Z0JBQUUsU0FBUTtZQUM3QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsaUNBQWlDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUM3SCxDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBRXhELElBQUksVUFBVTtnQkFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3pDLENBQUM7UUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVELEtBQUssTUFBTSxXQUFXLElBQUksWUFBWTtRQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ3ZFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFVBQVU7SUFDdkksTUFBTSxjQUFjLEdBQUcsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDL0QsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQTtJQUVyRyxLQUFLLE1BQU0sU0FBUyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksR0FBRywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFFckgsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDN0gsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQzNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFDOUcsbUJBQW1CLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBRWhFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLFdBQVcsQ0FBQyxJQUFJLDRDQUE0QyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6SCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVc7SUFDOUgsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFBO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFeEIsS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTNGLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sWUFBWSxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDbkksU0FBUyxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUMxRyxNQUFNLGVBQWUsR0FBRyx3QkFBd0IsQ0FDOUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxDQUM1RyxDQUFBO1lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksZUFBZSxDQUFDLElBQUksSUFBSSxjQUFjLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDbEYsSUFBSSxDQUFDLDRCQUE0QixFQUFFLG1FQUFtRSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3pJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsZUFBZSxDQUFDLGVBQWUsQ0FBQyxjQUFjLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDM0osQ0FBQztZQUNELGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2dCQUM3QixVQUFVLEVBQUUsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUM7Z0JBQ2pFLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztnQkFDMUIsSUFBSSxFQUFFLFlBQVk7YUFDbkIsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNoRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNoRSxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFFN0YsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLDZDQUE2QyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDakksQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQW1CLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGtEQUFrRCxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoRyxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQzdDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUMxRyxDQUFBO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLHVDQUF1QyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDM0gsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLG1CQUFtQixlQUFlLENBQUMsY0FBYyxDQUFDLGNBQWMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDeEosQ0FBQztZQUNELE9BQU8sQ0FBQyxVQUFVLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN6RSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUMvRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1lBQ25ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUE7WUFFdEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksb0JBQW9CO2dCQUN4RixTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyx3QkFBd0IsRUFBRSw4REFBOEQsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDcEgsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUVyRixJQUFJLENBQUMsS0FBSztnQkFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsNkRBQTZELEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzdILFNBQVMsQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3RHLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUM3QyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSw0QkFBNEIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUNySCxDQUFBO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLGVBQWUsQ0FBQyxjQUFjLENBQUMsY0FBYyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQ2hJLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbEMsQ0FBQztZQUNELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQy9ELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUE7WUFFekksSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLG1CQUFtQixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLGVBQWUsRUFBRSwrREFBK0QsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZILENBQUM7WUFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxlQUFlLEVBQUUscURBQXFELEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM3RyxDQUFDO1lBQ0Qsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDL0QsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNySSxJQUFJLENBQUMsZUFBZSxFQUFFLDhEQUE4RCxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzRyxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtZQUV0SCxJQUFJLGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxvREFBb0QsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzVHLENBQUM7WUFDRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUMvRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDaEYsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7WUFFekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxPQUFPLFNBQVMsQ0FBQyxZQUFZLElBQUksUUFBUSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7b0JBQzdGLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3ZFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQzlJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsNEJBQTRCLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2xKLENBQUM7WUFDRCxJQUFJLE9BQU8sU0FBUyxDQUFDLFlBQVksSUFBSSxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDakcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHVDQUF1QyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN4SSxDQUFDO1lBQ0QsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6RSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzlJLENBQUM7WUFDRCxJQUFJLFNBQVMsQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzSSxDQUFDO1lBQ0QsTUFBTSxHQUFHLEtBQUssQ0FBQTtZQUNkLFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLHNDQUFzQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLHNDQUFzQyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ2xHLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLDhCQUE4QixlQUFlLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3RILENBQUM7Z0JBQ0QsU0FBUyxDQUFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDdEcsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQ3pDLFNBQVMsQ0FBQyxVQUFVLEVBQ3BCLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUNQLElBQUksRUFDSixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLFVBQVUsQ0FDWCxDQUFBO2dCQUVELElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxlQUFlLENBQUMsVUFBVSxDQUFDLGNBQWMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDOUksQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLFNBQVMsQ0FBQyxVQUFVO2dCQUFFLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3pGLE1BQU0sR0FBRyxLQUFLLENBQUE7WUFDZCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNwQyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxhQUFhLENBQUMsQ0FBQTtZQUV4SSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLGVBQWUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN2SSxDQUFDO1lBQ0QsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbEQsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDL0UsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzNFLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUE7WUFDaEYsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3pFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN6RSxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUMzSyxNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVsRixlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN6QyxPQUFPLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2hELENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxnQkFBZ0IsR0FBRyxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUMsQ0FBQTtZQUV4RCxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3BLLENBQUM7WUFDRCxNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVqRixlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU07b0JBQUUsT0FBTyxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtxQkFDckcsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO29CQUFFLE9BQU8sQ0FBQyxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7cUJBQzNHLElBQUksaUJBQWlCLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3SCxPQUFPLENBQUMsVUFBVSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNuRCxDQUFDOztvQkFBTSxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtZQUN2QyxDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTTtnQkFDM0UsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxjQUFjO2dCQUMvQixDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtvQkFDcEQsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjO29CQUNoQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU07d0JBQ25ELENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDOUcsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUE7WUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7WUFFM0MsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUM1QixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7b0JBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEUsQ0FBQztZQUNELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQzlELE1BQU0sQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDeEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN2QyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQTtZQUM1RCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0scUJBQXFCLEdBQUcsOEJBQThCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUVuRixLQUFLLE1BQU0sT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO2dCQUM5QixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQzVDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLHVDQUF1QyxDQUNuSCxDQUFBO1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLHdCQUF3QixlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDMUksQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUUvRCxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDbkUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUNqSCxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFBO1lBRWxHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQzlELE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9CLEtBQUssTUFBTSxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLENBQUE7WUFFMUksSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLDZCQUE2QixlQUFlLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDMUgsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUM3RSxJQUFJLENBQUMsZUFBZSxFQUFFLDZDQUE2QyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMxRixDQUFDO1lBQ0QsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxzQ0FBc0MsRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdEgsQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUU1SixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSwwQkFBMEIsZUFBZSxDQUFDLFdBQVcsQ0FBQyxjQUFjLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFDaEksWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUMvRSxDQUFDO1lBQ0QsTUFBTSxxQkFBcUIsR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBRW5GLEtBQUssTUFBTSxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFL0QsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO2dCQUMxQyxVQUFVLEVBQUUsU0FBUztnQkFDckIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLFdBQVc7YUFDbEIsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDakUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUNqSCxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFBO1lBQ2xHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3pELE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9CLEtBQUssTUFBTSxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUMxRyw0QkFBNEIsQ0FBQyxDQUFBO1lBRS9CLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlDQUFpQyxlQUFlLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkksQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLGNBQWM7Z0JBQ3RFLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLGVBQWUsRUFBRSxzREFBc0QsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkcsQ0FBQztZQUNELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUN2RixJQUFJLENBQUMsZUFBZSxFQUFFLDJDQUEyQyxFQUMvRCxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzdHLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQ3ZHLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQzNDLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksRUFDN0csU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxlQUFlLEVBQUUsa0NBQWtDLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQy9ILFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDM0UsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLG9DQUFvQyxlQUFlLENBQUMsU0FBUyxDQUFDLGNBQWMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUNySSxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQy9FLENBQUM7WUFDRCxNQUFNLHFCQUFxQixHQUFHLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFbkYsS0FBSyxNQUFNLE9BQU8sSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtnQkFDOUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUUvRCxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxFQUM5RixZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDOUQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsRUFDbEcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUMzRyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUV4RyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUN4RCxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMvQixLQUFLLE1BQU0sT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO2dCQUM5QixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1lBQ0QsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUNwRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZ0RBQWdELEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQy9GLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDbkcsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQzFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQ3hILENBQUE7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLGVBQWUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkksQ0FBQztZQUNELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNsRSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFBO1lBQ2QsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckMsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUUzRixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxjQUFjLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3pILElBQUksQ0FBQyx1QkFBdUIsRUFBRSw2Q0FBNkMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdEksQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUVqSCxJQUFJLFdBQVcsQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUseURBQXlELEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzSCxDQUFDO1lBQ0QsTUFBTSx5QkFBeUIsR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3ZGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUVoRSw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFBO1lBQ2pGLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMvRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDdEosTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJFLEtBQUssTUFBTSxPQUFPLElBQUkseUJBQXlCLEVBQUUsQ0FBQztnQkFDaEQsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzNDLENBQUM7WUFFRCxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7Z0JBQzFDLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsV0FBVzthQUNsQixFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNsRSxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFFN0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksc0JBQXNCLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDdEssQ0FBQztZQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNoRCxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMvQixNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFBO1lBQzVDLEtBQUssTUFBTSxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLDRFQUE0RSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFM0csSUFBSSxDQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRCxPQUFPLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFBO0FBQ3pCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJO0lBQ3JELElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsa0RBQWtELEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDNUYsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLDZDQUE2QyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFdEUsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLFdBQVc7UUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxvQkFBb0I7UUFDMUcsT0FBTyxTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDckYsSUFBSSxDQUFDLGVBQWUsRUFBRSw4QkFBOEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUM3SCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDNUIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNO1FBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFO0lBQ3RGLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBRTNCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUTtRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxnQkFBZ0I7WUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDOUgsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxzQkFBc0IsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQ2xILE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQUUsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRO29CQUFFLElBQUksT0FBTyxPQUFPLElBQUksUUFBUTt3QkFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2hILElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQzlFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQ3pELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ25ELE1BQU0sUUFBUSxHQUFHLFVBQVUsSUFBSSxPQUFPLFVBQVUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFaEgsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVE7b0JBQUUsSUFBSSxPQUFPLE9BQU8sSUFBSSxRQUFRO3dCQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbEgsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVE7WUFDMUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7aUJBQzNDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7Z0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqRSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFHLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUcsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFBO0lBRWxCLE9BQU8sT0FBTyxFQUFFLENBQUM7UUFDZixPQUFPLEdBQUcsS0FBSyxDQUFBO1FBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFdkMsSUFBSSxDQUFDLFdBQVc7Z0JBQUUsU0FBUTtZQUMxQixNQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzdELE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBRTlELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ2xCLE9BQU8sR0FBRyxJQUFJLENBQUE7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFFakYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUE7SUFDN0MsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sU0FBUyxJQUFJLFFBQVE7WUFBRSxTQUFRO1FBQ3hELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRTNDLElBQUksSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDN0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDcEQsTUFBTSxJQUFJLEdBQUcsWUFBWSxJQUFJLE9BQU8sWUFBWSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtZQUM3RyxNQUFNLGFBQWEsR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1lBRXRHLElBQUksT0FBTyxhQUFhLElBQUksUUFBUTtnQkFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQy9ELElBQUksWUFBWSxJQUFJLE9BQU8sWUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNwRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQ2hHLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQTtZQUNyRyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNyRCxNQUFNLFFBQVEsR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1lBRWhILElBQUksT0FBTyxRQUFRLElBQUksUUFBUSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsTUFBTSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUM3RyxDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUMzQixTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQzFCLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDN0YsTUFBTSxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUN2RyxNQUFNLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO1lBQ3RHLFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxJQUFJLElBQUksa0JBQWtCLElBQUksSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDaEUsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLEVBQzNHLGFBQWEsQ0FBQyxDQUFBO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUE7WUFDakcsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzdCLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDN0YsTUFBTSxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUNqRyxTQUFRO1FBQ1YsQ0FBQztRQUNELEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3ZGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pHLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEgsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUE7SUFDcEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMvQixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRXJILEtBQUssTUFBTSxXQUFXLElBQUksT0FBTztRQUFFLEtBQUssTUFBTSxNQUFNLElBQUksV0FBVyxDQUFDLE9BQU87WUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ3BILElBQUksT0FBTyxHQUFHLElBQUksQ0FBQTtJQUVsQixPQUFPLE9BQU8sRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLEtBQUssQ0FBQTtRQUNmLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUNsRixLQUFLLE1BQU0sS0FBSyxJQUFJLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQzVGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLEtBQUssTUFBTSxNQUFNLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6QyxNQUFNLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQ3pFLEtBQUssTUFBTSxLQUFLLElBQUkscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztvQkFDdkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7b0JBQUMsQ0FBQztnQkFDakUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN2RCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztnQkFBRSxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7b0JBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM1RixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUMsQ0FBQTtBQUM3RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLGNBQWMsR0FBRyxNQUFNLEVBQUUsY0FBYyxJQUFJLElBQUksR0FBRyxFQUFFLEVBQ3RILFlBQVksR0FBRyxNQUFNLEVBQUUsWUFBWTtJQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLGtCQUFrQixDQUFDO1NBQzNGLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBRXRFLE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDbkIsWUFBWTtRQUNaLE1BQU07UUFDTixPQUFPO1FBQ1AsY0FBYyxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3JELGNBQWM7UUFDZCxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUM7S0FDdkQsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjO0lBQ2pGLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQTtJQUNwQixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUE7SUFFMUIsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGlCQUFpQixJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksWUFBWTtRQUM1RSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ2hELElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFBO1FBQ3hCLGVBQWUsR0FBRyxLQUFLLENBQUE7SUFDekIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7UUFBRSxPQUFNO0lBQzVDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUUzRCxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU07SUFDcEIsSUFBSSxjQUFjLElBQUksZUFBZTtRQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBOztRQUN6RSxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSTtJQUMxRCxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQ0FBa0MsSUFBSSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFOUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2pDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQzNCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSTtJQUNqRCxLQUFLLElBQUksT0FBTyxHQUFHLGdDQUFnQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0YsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFMUMsSUFBSSxPQUFPO1lBQUUsT0FBTyxPQUFPLENBQUE7UUFDM0IsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLFlBQVksSUFBSSxtQ0FBbUMsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN0RyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixJQUFJLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUMzRSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzdHLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFFNUYsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLCtDQUErQyxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUV0SSxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLDJCQUEyQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUN4RyxPQUFPLHFCQUFxQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0FBQ3hGLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUNwSCxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDRCQUE0QixFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3RFLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRXZGLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNsRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSw0RUFBNEUsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDekksQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLGVBQWUsRUFBRSx5Q0FBeUMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDckcsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksMkJBQTJCO1lBQ25ILE9BQU8sU0FBUyxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3pGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxrQ0FBa0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNwSSxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9GLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXhELElBQUksQ0FBQyxDQUFDLENBQUMsOEJBQThCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUUsT0FBTyxTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSwrQkFBK0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUMvSCxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFBO1FBRTdELElBQUksYUFBYSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxtQkFBbUIsV0FBVyxDQUFDLElBQUksY0FBYyxhQUFhLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN0SixDQUFDO1FBQ0QsSUFBSSxhQUFhLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLHVCQUF1QixXQUFXLENBQUMsSUFBSSxtQ0FBbUMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDL0ksQ0FBQztRQUNELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQTtRQUU5QyxJQUFJLGtCQUFrQixLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUYsSUFBSSxDQUFDLGVBQWUsRUFBRSx5REFBeUQsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDckgsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFBO1FBRTVDLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsV0FBVyxXQUFXLENBQUMsSUFBSSxTQUFTLFVBQVUsQ0FBQyxNQUFNLDZCQUE2QixhQUFhLEdBQUcsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDdkssQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSx1REFBdUQsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDMUgsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNsQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUM3RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUV0QixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRTVDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxvQkFBb0I7WUFDNUcsT0FBTyxTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDdEYsSUFBSSxDQUFDLGVBQWUsRUFBRSx3Q0FBd0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN2SSxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxpQkFBaUI7WUFDekcsT0FBTyxTQUFTLENBQUMsVUFBVSxJQUFJLFFBQVEsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbEgsSUFBSSxDQUFDLHdCQUF3QixFQUFFLDJCQUEyQixNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ2hJLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFNUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQjtZQUM1RyxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7WUFDekgsSUFBSSxDQUFDLHdCQUF3QixFQUFFLDRCQUE0QixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3BJLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsbURBQW1ELEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQzdJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkIsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUU1SixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXRCLElBQUksU0FBUyxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQUUsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFFOUUsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQTtRQUVySCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDekcsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFDMUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLElBQUksU0FBUyxDQUFDLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNENBQTRDLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQy9HLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLG1EQUFtRCxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUM3SSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ25CLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFFaEosSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxFQUFFLGdCQUFnQixlQUFlLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDaEksQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFFdEosSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUV0QixJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssT0FBTztZQUFFLFNBQVMsQ0FBQyxPQUFPLEdBQUcsaURBQWlELENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNsSCxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUFFLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBRXRFLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDM0csT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDBCQUEwQixFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUM3RixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpREFBaUQsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDM0ksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQixNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBRXRKLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEIsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSwyREFBMkQsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ25KLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUFFLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBRXRFLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQy9GLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxPQUFPO0lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUN2SCx1QkFBdUIsR0FBRyxLQUFLO0lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxJQUFJLG9CQUFvQixJQUFJLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQTtJQUMxRixNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFDN0csdUJBQXVCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtJQUU1QyxJQUFJLElBQUksSUFBSSxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLCtCQUErQixPQUFPLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEgsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVc7UUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLE9BQU8sR0FBRyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUU1SCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUN6Ryx1QkFBdUIsR0FBRyxLQUFLLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSztJQUN6RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksc0JBQXNCO1FBQUUsT0FBTyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFFNUgsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLCtEQUErRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3SCxDQUFDO1FBRUQsT0FBTyxFQUFDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBQyxDQUFBO0lBQzlGLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFBO1FBRXRDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLG9CQUFvQjtZQUMxRixVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsOERBQThELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVILENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFdEYsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsRUFBRSw2REFBNkQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFckksT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQ25CLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsb0dBQW9HLEVBQy9ILFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2xFLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLHlFQUF5RSxFQUM5RyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFekksSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLG1CQUFtQixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUNsRixPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxtRUFBbUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbEksQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxvREFBb0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0csQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUVwSSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksbUJBQW1CLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQzVFLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLGdFQUFnRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqSSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLGtEQUFrRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN6RyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUMvRSxPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxtREFBbUQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbEgsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFcEcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxzREFBc0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlILENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3BILE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLGVBQWUsRUFBRSxnQ0FBZ0MsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUUsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFOUMsSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9FLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUN6RCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsc0RBQXNELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFHLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUN6RCxNQUFNLFNBQVMsR0FBRyx3QkFBd0IsQ0FDeEMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsMkJBQTJCLENBQ3BHLENBQUE7WUFFRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixFQUFFLDJEQUEyRCxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDckksQ0FBQztZQUVELE9BQU8sRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBQyxDQUFBO1FBQzFDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyx3QkFBd0IsQ0FDeEMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsMkJBQTJCLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FDNUgsQ0FBQTtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUseUJBQXlCLGVBQWUsQ0FBQyxTQUFTLENBQUMsY0FBYyxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMvSixDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDN0UsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLHdEQUF3RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3RyxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFFMUcsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSwwQkFBMEIsZUFBZSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pJLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUM3RSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsaURBQWlELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RHLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRWpHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDRCQUE0QixlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVJLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQywyQkFBMkIsRUFBRSxxQkFBcUIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLDBCQUEwQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2SSxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUMvQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw2REFBNkQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbEgsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQztZQUNwRCxDQUFDLENBQUMsdUJBQXVCLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsd0RBQXdELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVHLENBQUM7UUFDRCxpRUFBaUU7UUFDakUsSUFBSSxtQkFBbUIsQ0FBQTtRQUN2QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsMERBQTBELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3hHLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzFDLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUMvRSxZQUFZLEVBQUUsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsdUJBQXVCLENBQzNHLENBQUE7WUFFRCxtQkFBbUIsS0FBSyxNQUFNLENBQUE7WUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLEVBQUUsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUE7WUFFN0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsZUFBZSxFQUFFLHFCQUFxQixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDNUksQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFlBQVksRUFBRSxJQUFJLElBQUksVUFBVTtZQUNyQyxDQUFDLENBQUMsWUFBWTtZQUNkLENBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxxREFBcUQsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFBO0lBQ2xILENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEMsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsdUJBQXVCLGVBQWUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFILENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsc0RBQXNELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFHLENBQUM7UUFDRCxJQUFJLFlBQVksRUFBRSxJQUFJLElBQUksU0FBUyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyRixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsOEJBQThCLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDdkgsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQ3hHLHVCQUF1QixDQUFDLENBQUE7UUFFMUIsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSw0REFBNEQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEgsQ0FBQztRQUNELGlFQUFpRTtRQUNqRSxJQUFJLGlCQUFpQixDQUFBO1FBRXJCLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQ3JDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFDaEYsWUFBWSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixDQUN0RyxDQUFBO1lBQ0QsaUJBQWlCLEtBQUssTUFBTSxDQUFBO1lBQzVCLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFBO1lBRXRHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzSSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sWUFBWSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEQsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDN0IsSUFBSSxFQUFFLFNBQVM7WUFDZixTQUFTLEVBQUUscURBQXFELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztTQUNyRixDQUFBO0lBQ0gsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzNDLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsK0JBQStCLGVBQWUsQ0FBQyxZQUFZLENBQUMseUJBQXlCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFJLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsc0VBQXNFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFILENBQUM7UUFDRCxJQUFJLFlBQVksRUFBRSxJQUFJLElBQUksZ0JBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVGLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxzQ0FBc0MsRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUMvSCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFDeEcsdUJBQXVCLENBQUMsQ0FBQTtRQUUxQixJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLDRFQUE0RSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoSSxDQUFDO1FBQ0QsaUVBQWlFO1FBQ2pFLElBQUksaUJBQWlCLENBQUE7UUFFckIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FDckMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQ3pGLFlBQVksRUFBRSxJQUFJLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixDQUM3RyxDQUFBO1lBQ0QsaUJBQWlCLEtBQUssTUFBTSxDQUFBO1lBQzVCLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxFQUFFLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUE7WUFFN0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsZUFBZSxFQUFFLDBCQUEwQixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFDeEgsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sWUFBWSxFQUFFLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM3RCxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFNBQVMsRUFBRSxxREFBcUQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1NBQ3JGLENBQUE7SUFDSCxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtRQUMvSSxNQUFNLFNBQVMsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFFekosSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsZUFBZSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdJLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLGVBQWUsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0SCxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3RSxNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRW5FLElBQUksZUFBZSxFQUFFLElBQUksSUFBSSxhQUFhLElBQUksVUFBVSxFQUFFLElBQUksSUFBSSxnQkFBZ0I7WUFDaEYsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMscUJBQXFCLEVBQUUsY0FBYyxVQUFVLENBQUMsS0FBSyxzQ0FBc0MsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUosQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUVoRixzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVuRixPQUFPLGNBQWMsQ0FBQyxXQUFXLENBQUE7SUFDbkMsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDOUksTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBRWpKLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hGLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsZUFBZSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVJLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsdUJBQXVCLGVBQWUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNySCxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3RSxNQUFNLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRS9ELElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLFlBQVksSUFBSSxlQUFlLEVBQUUsSUFBSSxJQUFJLG1CQUFtQixDQUFDO1lBQ3pGLFFBQVEsRUFBRSxJQUFJLElBQUksZUFBZTtZQUNqQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxRQUFRLENBQUMsS0FBSywyQ0FBMkMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDckgsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFM0Usc0JBQXNCLENBQUMsVUFBVSxFQUFFLE1BQU0sS0FBSyxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFbkYsT0FBTyxjQUFjLENBQUMsU0FBUyxDQUFBO0lBQ2pDLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksMEJBQTBCLEVBQUUsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSw0QkFBNEIsQ0FBQyxDQUFBO1FBRTFKLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxVQUFVLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksY0FBYyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JILE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpQ0FBaUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pKLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFFekUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLElBQUksVUFBVSxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLGNBQWMsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDM0YsSUFBSSxDQUFDLGVBQWUsRUFBRSw2REFBNkQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDM0csQ0FBQztZQUNELFVBQVUsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQzVDLENBQUM7YUFDSSxJQUFJLFVBQVUsQ0FBQyxjQUFjLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsRUFBRSx3REFBd0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEcsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksc0JBQXNCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkgsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLHFFQUFxRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMxSCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUE7UUFFdkQsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2xFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ2hFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtZQUUxRSxJQUFJLE1BQU0sRUFBRSxJQUFJLElBQUksdUJBQXVCLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLHlCQUF5QixFQUFFLDRCQUE0QixZQUFZLENBQUMsSUFBSSwwQkFBMEIsWUFBWSxVQUFVLEVBQzNILE1BQU0sRUFBRSxRQUFRLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUM3SCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFDdkgsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLHdCQUF3QixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQ3RILFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDekMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQTtRQUM3RCxPQUFPLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDekYsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFDbEgsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXZCLElBQUksYUFBYSxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksYUFBYSxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ3hGLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpRUFBaUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEgsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFakYsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLGFBQWEsQ0FBQyxhQUFhLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsc0RBQXNELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNHLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdFLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixFQUN0QyxvQkFBb0IsV0FBVyxDQUFDLElBQUksU0FBUyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sd0JBQXdCLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUM1SSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEIsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzFFLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFFM0YsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRSxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO1lBQy9ILE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUNsRyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUV2RSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsZUFBZSxFQUFFLDZCQUE2QixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQy9ILFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDekMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRztZQUNqQixhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQztZQUMzRCxjQUFjLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUM1SCxDQUFBO1FBRUQsSUFBSSxtQkFBbUI7WUFBRSxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTs7WUFDdEQsMkJBQTJCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFN0csT0FBTyxhQUFhLENBQUE7SUFDdEIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUNoRyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1FBRTNDLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ3RGLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLHdEQUF3RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEksQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFaEYsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLFlBQVksQ0FBQyxhQUFhLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3hJLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDdkYsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUVsSCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsV0FBVyxDQUFDLElBQUksb0JBQW9CLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFDNUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3JDLElBQUksbUJBQW1CO1lBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5RSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsaURBQWlELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdJLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsRUFDakMsV0FBVyxNQUFNLENBQUMsSUFBSSxTQUFTLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSx3QkFBd0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkksQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDekQsMEJBQTBCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUUzRixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDL0gsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2xHLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBRWxFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxlQUFlLEVBQUUsd0JBQXdCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFDMUgsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDakcsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksZUFBZTtZQUNqRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ2xFLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUMseUJBQXlCLENBQUM7WUFDdEQsY0FBYyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0gsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDcEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hDLENBQUE7UUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLHVCQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3hFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtZQUU3RSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMseUJBQXlCLEVBQUUsK0RBQStELFlBQVksbUJBQW1CLEVBQzVILFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDakMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksb0JBQW9CLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksdUJBQXVCLEVBQUUsQ0FBQztZQUNyRyxJQUFJLENBQUMsbUJBQW1CO2dCQUFFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxxREFBcUQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzlJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLGVBQWUsRUFBRSwrREFBK0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3RILENBQUM7WUFDRCxVQUFVLENBQUMsUUFBUSxHQUFHO2dCQUNwQixVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVE7Z0JBQy9CLElBQUksRUFBRSx1QkFBdUI7Z0JBQzdCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVE7Z0JBQ3RDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRO2dCQUMvRCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLGdCQUFnQjtnQkFDdEQsSUFBSSxFQUFFLFlBQVk7YUFDbkIsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLG1CQUFtQjtZQUFFLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBOztZQUN0RCwyQkFBMkIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUV4RyxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7SUFDckQsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzVDLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFckksSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxxREFBcUQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUcsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXpELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsK0JBQStCLFVBQVUsQ0FBQyxhQUFhLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDakksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pJLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw4REFBOEQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkgsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FDVCx1QkFBdUIsRUFDdkIsV0FBVyxXQUFXLENBQUMsSUFBSSxzQkFBc0IsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLHdCQUF3QixXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUNoSSxVQUFVLENBQUMsUUFBUSxDQUNwQixDQUFBO1FBQ0gsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUN0RSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDNUMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2QyxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQ2hFLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUNyQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsU0FBUyxDQUMxRyxDQUFBO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsS0FBSyxDQUFDLElBQUksbUJBQW1CLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDNUosQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUE7UUFFN0ksSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLHdCQUF3QixlQUFlLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDakosQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTNELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsK0JBQStCLFlBQVksQ0FBQyxhQUFhLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVJLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDcEYsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUVoSCxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxXQUFXLENBQUMsSUFBSSxtQkFBbUIsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN6SSxJQUFJLG1CQUFtQjtZQUFFLFVBQVUsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFNUUsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO0lBQzVGLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixVQUFVLENBQUMsTUFBTSxJQUFJLEVBQUUsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ25ILENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEcsQ0FBQztRQUNELE1BQU0seUJBQXlCLEdBQUcsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUNsRixrRUFBa0U7UUFDbEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUMvQixNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsQ0FDakcsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixDQUN4RixDQUFDLENBQUE7UUFDRixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDakksQ0FBQztRQUNELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDNUMsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzFDLE1BQU0sc0JBQXNCLEdBQUcsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFFcEUsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUMzQiw0QkFBNEIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2pHLG1CQUFtQixDQUFDLENBQUE7Z0JBQ3RCLFNBQVE7WUFDVixDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQ3pDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxDQUNoRyxDQUFBO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELGtCQUFrQixDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDdEYsQ0FBQztpQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsZUFBZSxFQUFFLHNCQUFzQixlQUFlLENBQUMsVUFBVSxDQUFDLGNBQWMsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNJLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMxRCxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUVuRSxJQUFJLGlCQUFpQixJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsb0VBQW9FLEVBQ3BHLFVBQVUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDckQsQ0FBQztnQkFDRCxJQUFJLENBQUMsMkJBQTJCLEVBQUUsZ0NBQWdDLFNBQVMsQ0FBQyxJQUFJLHdCQUF3QixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoSSxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSx5RUFBeUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEgsQ0FBQztRQUNELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5RSxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQy9GLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUNsRyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUVuRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLHNCQUFzQixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN0SixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBRWxGLElBQUksbUJBQW1CO1lBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7O1lBQ3RELGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDckYsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUNoRyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBRXpGLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtJQUNyRCxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtRQUNySSxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdEYsTUFBTSxTQUFTLEdBQUcsbUJBQW1CO1lBQ25DLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQzFHLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFBO1FBRXhCLElBQUksbUJBQW1CO1lBQUUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVsSCxNQUFNLFNBQVMsR0FBRyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUVyRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSwyQkFBMkIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xILElBQUksV0FBVyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLFNBQVMsYUFBYSxTQUFTLENBQUMsT0FBTyxjQUFjLFdBQVcsR0FBRyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUksQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsU0FBUyxnQkFBZ0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pJLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUNsRyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUVyQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSx5Q0FBeUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFDeEgsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsQyxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM5QyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRTdDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMxRSxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDMUUsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQzlHLG1CQUFtQixFQUFFLHFDQUFxQyxDQUFDLENBQUE7UUFDN0QsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQzNHLG1CQUFtQixFQUFFLG9DQUFvQyxDQUFDLENBQUE7UUFFNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxFQUFFLCtCQUErQixlQUFlLENBQUMsY0FBYyxDQUFDLFFBQVEsZUFBZSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsRUFDckosVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBRS9DLE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2hJLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDbEksTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzdFLE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNoRixNQUFNLFNBQVMsR0FBRyxtQkFBbUI7WUFDbkMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDaEssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUE7UUFFeEIsSUFBSSxtQkFBbUI7WUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRW5ILE1BQU0sU0FBUyxHQUFHLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXRELElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDRCQUE0QixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkgsSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsU0FBUyxhQUFhLFNBQVMsQ0FBQyxJQUFJLDJCQUEyQixRQUFRLEdBQUcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlJLENBQUM7UUFDRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxTQUFTLGFBQWEsU0FBUyxDQUFDLEtBQUssNEJBQTRCLFNBQVMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbEosQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsU0FBUyxnQkFBZ0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pJLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLDRFQUE0RSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFNUcsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ3BFLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUNqRyx1QkFBdUI7SUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDJEQUEyRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNoSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUseURBQXlELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzlHLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXRCLEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzFGLElBQUksQ0FBQyxlQUFlLEVBQUUsMENBQTBDLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0csQ0FBQztRQUNELHdCQUF3QixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFDbkcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUE7UUFDaEQsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxrREFBa0QsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2pHLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLFVBQVUsQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQy9ILEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFBO0FBQzNCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDdEcsbUJBQW1CO0lBQ25CLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxjQUFjO1FBQUUsT0FBTTtJQUM3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksY0FBYyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdkUsNEJBQTRCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQzdHLG1CQUFtQixDQUFDLENBQUE7UUFDdEIsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSw2REFBNkQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0csQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGVBQWUsRUFBRSwwREFBMEQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEcsQ0FBQztRQUNELEtBQUssTUFBTSxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ3RHLG1CQUFtQixDQUFDLENBQUE7UUFDeEIsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDO1FBQy9ELENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUM5RSxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO1FBRWpILEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsNEJBQTRCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ3hHLG1CQUFtQixDQUFDLENBQUE7UUFDeEIsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQ3JDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FDckcsQ0FBQTtJQUVELGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDOUUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSTtJQUN2RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUVuRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLDRCQUE0QixFQUFFLDZDQUE2QyxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDbkgsQ0FBQztZQUNELE9BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSx1QkFBdUIsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDdkYsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyw2QkFBNkIsRUFBRSwyQ0FBMkMsTUFBTSxDQUFDLFdBQVcsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ2xILENBQUM7UUFDRCxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDN0MsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN4SCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3hILENBQUM7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyRSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN4SCxDQUFDO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksWUFBWSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0QsSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkgsSUFBSSxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3hILENBQUM7UUFDRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEUsa0JBQWtCLENBQUMscURBQXFELENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEcscURBQXFELENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3JILENBQUM7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMzRCxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6RixPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxjQUFjLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNyRixPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQztRQUN4RCxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksZ0JBQWdCLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDdkUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDakYsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdkYsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFdBQVc7SUFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLHVCQUF1QjtRQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUE7SUFDaEYsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFlBQVk7UUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUE7SUFDOUgsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVU7UUFBRSxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdkYsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDNUQsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDN0csQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxjQUFjO1FBQUUsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXpGLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsYUFBYTtJQUMvQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7QUFDM0UsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDekUsTUFBTSxjQUFjLEdBQUcsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDL0QsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQTtJQUMzRCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzlELG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQy9JLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUNyQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUUxSCxPQUFPO1FBQ0wsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLEVBQUUsMkJBQTJCO1FBQ2pDLGNBQWMsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNILFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbEQsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMscURBQXFELENBQUMsQ0FDM0gsYUFBYSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUN4RCxDQUFDLENBQUMsQ0FBQztTQUNQLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNSLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSTtJQUMxRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQzFHLDhDQUE4QyxDQUFBO0lBRWhELElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsdURBQXVELEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDMUYsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLDZEQUE2RCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFeEYsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLDJCQUEyQixJQUFJLE9BQU8sU0FBUyxDQUFDLGFBQWEsSUFBSSxRQUFRO1FBQzdGLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztRQUMxRixTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxhQUFhO1FBQ2pELENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwSSxJQUFJLENBQUMsZUFBZSxFQUFFLDJEQUEyRCxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzlGLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUE7UUFFdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDekcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQzFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRyxJQUFJLENBQUMsZUFBZSxFQUFFLDZEQUE2RCxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ2hHLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU1QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztZQUNwRixDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsZUFBZSxFQUFFLDJEQUEyRCxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzlGLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUN6RSxNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDNUgsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNoRixjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBQzFGLDhDQUE4QyxDQUFBO0lBRWxELElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUgsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLElBQUksc0NBQXNDLElBQUksYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNHLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRWpFLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGFBQWE7UUFDdEYsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTTtRQUM1RyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztZQUM1RSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxJQUFJLFFBQVEsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7WUFDakUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLDJEQUEyRCxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFILElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RixJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksSUFBSSw0Q0FBNEMsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMvRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUk7SUFDL0QsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLG1CQUFtQixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksb0JBQW9CO1FBQUUsT0FBTyxVQUFVLENBQUE7SUFDcEcsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHFCQUFxQjtRQUFFLE9BQU8sVUFBVSxDQUFBO0lBQy9ELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLG9GQUFvRixFQUMzSCxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxzQkFBc0I7UUFBRSxPQUFPLFVBQVUsQ0FBQTtJQUNoRSxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLHNEQUFzRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUVsSSxPQUFPO1FBQ0wsVUFBVTtRQUNWLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1FBQzdCLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7UUFDN0MsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJO0lBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDcEUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEgsU0FBUyxDQUFDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRTFFLE9BQU8sVUFBVSxFQUFFLElBQUksSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3ZFLENBQUMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxVQUFVLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRXZELElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQTtJQUNyRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDOUYsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEVBQ2pDLGlCQUFpQixNQUFNLENBQUMsSUFBSSx1RUFBdUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDekgsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFBO0lBRTlDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQTtJQUM1RSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUV6RCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNoRyxNQUFNLHFCQUFxQixHQUFHLFFBQVEsRUFBRSxJQUFJLElBQUksdUJBQXVCLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksc0JBQXNCO1FBQzNILENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ3hDLE1BQU0saUJBQWlCLEdBQUcscUJBQXFCLEtBQUssU0FBUztRQUMzRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUVySCxJQUFJLGlCQUFpQjtRQUFFLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUE7SUFFaEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLHVCQUF1QixJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLGtCQUFrQjtRQUN6RyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsaUJBQWlCLE1BQU0sQ0FBQyxJQUFJLCtDQUErQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6SSxDQUFDO0lBQ0QsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFDLENBQUE7QUFDMUcsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLEtBQUs7SUFDcEMsZ0RBQWdEO0lBQ2hELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixNQUFNLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXRCLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7UUFFM0IsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFRO1FBQ25FLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQjtZQUNoRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVE7WUFDMUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7aUJBQzNDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7Z0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSTtJQUNuRCxJQUFJLE9BQU8sUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsd0RBQXdELEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDakksT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUNELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLHlFQUF5RSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFdEcsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQjtRQUFFLE9BQU8sRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUMsQ0FBQTtJQUMvRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksb0JBQW9CO1FBQUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBQyxDQUFBO0lBQ3ZILElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFDLENBQUE7SUFDeEksT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQzdFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBSTtJQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtJQUNsRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksdUJBQXVCO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFBO0lBQy9HLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxZQUFZO1FBQUUsT0FBTztZQUNwQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsSUFBSSxFQUFFLFlBQVk7WUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQy9ELHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDNUYsQ0FBQTtJQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxlQUFlO1FBQUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUMsQ0FBQTtJQUNuRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQW1CO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFBO0lBQ3JHLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxvQkFBb0I7UUFBRSxPQUFPLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFDLENBQUE7SUFDN0csSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVU7UUFBRSxPQUFPLEVBQUMsV0FBVyxFQUFFLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQTtJQUM5SixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksY0FBYztRQUFFLE9BQU8sRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxDQUFBO0lBQ2xLLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxnQkFBZ0I7UUFBRSxPQUFPO1lBQ3hDLE9BQU8sRUFBRSx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUYsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixLQUFLLEVBQUUsV0FBVztZQUNsQixTQUFTLEVBQUUsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25HLENBQUE7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RixJQUFJLEVBQUUsU0FBUztRQUNmLFNBQVMsRUFBRSx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbkcsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzFELElBQUksT0FBTyxJQUFJLElBQUksUUFBUTtRQUFFLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUE7SUFDekYsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTNGLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDZCxNQUFNLFNBQVMsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQy9ELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUVqQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDbEcsS0FBSyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQy9ELENBQUM7U0FBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDOUcsS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLElBQUksUUFBUSxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzlGLENBQUM7U0FBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1FBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLDhCQUE4QixFQUFFLENBQUM7UUFDNUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLElBQUksUUFBUSxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksV0FBVztZQUNyRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN2RCxDQUFDO1NBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGNBQWMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNHLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDekQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksT0FBTyxTQUFTLENBQUMsU0FBUyxJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUE7SUFDbEksQ0FBQztTQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSx1QkFBdUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RILEtBQUssR0FBRyxPQUFPLFNBQVMsQ0FBQyxXQUFXLElBQUksUUFBUSxJQUFJLGtFQUFrRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDcEosQ0FBQztTQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxZQUFZO1FBQ3ZDLENBQUMsOEJBQThCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNHLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQTtRQUU5QyxLQUFLLEdBQUcsT0FBTyxTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVEsSUFBSSx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztZQUMzSCxDQUFDLGtCQUFrQixLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsa0JBQWtCLENBQUM7Z0JBQ25FLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkYsQ0FBQztTQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUNoSCxLQUFLLEdBQUcsT0FBTyxTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVE7WUFDaEQsd0NBQXdDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMxRSxDQUFDO1NBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDakgsS0FBSyxHQUFHLE9BQU8sU0FBUyxDQUFDLFVBQVUsSUFBSSxRQUFRLElBQUksMkRBQTJEO2FBQzNHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDL0IsQ0FBQztTQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxvQkFBb0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ3JILEtBQUssR0FBRyxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDOUgsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFakIsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFdkMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLO0lBQ25DLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7UUFBRSxPQUFPLElBQUksS0FBSyxLQUFLLENBQUE7SUFDOUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3hGLE1BQU0sUUFBUSxHQUFHLHNDQUFzQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUQsTUFBTSxTQUFTLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUNqRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksVUFBVTtRQUFFLE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDckcsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLGNBQWM7UUFBRSxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3JHLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSx1QkFBdUI7UUFBRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQTtJQUNsRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNqRixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRXBGLE9BQU8sUUFBUSxDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLE1BQU07WUFDdkcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9GLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksZUFBZTtRQUFFLE9BQU8sUUFBUSxDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUMsYUFBYSxDQUFBO0lBQzlGLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxtQkFBbUI7UUFBRSxPQUFPLFFBQVEsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQTtJQUM1RixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksb0JBQW9CO1FBQUUsT0FBTyxRQUFRLENBQUMsYUFBYSxJQUFJLFNBQVMsQ0FBQyxhQUFhLENBQUE7SUFDbkcsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDcEUsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUMzSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSztJQUMzQixPQUFPLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUNsRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLElBQUk7SUFDM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGVBQWU7UUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDbEQsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLHVCQUF1QjtRQUFFLE9BQU8saUJBQWlCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQTtJQUNyRixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksWUFBWTtRQUFFLE9BQU8sVUFBVSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTTtZQUN6RixDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUE7SUFDakUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGVBQWU7UUFBRSxPQUFPLGFBQWEsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFBO0lBQzNFLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7UUFBRSxPQUFPLGtCQUFrQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUE7SUFDakYsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG9CQUFvQjtRQUFFLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQTtJQUN0RixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVztRQUFFLE9BQU8sU0FBUyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUE7SUFDbkUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVU7UUFBRSxPQUFPLFFBQVEsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFBO0lBQ2hGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxjQUFjO1FBQUUsT0FBTyxZQUFZLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQTtJQUN0RixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1FBQUUsT0FBTyx1QkFBdUIsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFBO0lBRTlHLE9BQU8sZUFBZSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUE7QUFDMUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO0lBQy9DLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzRixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFdEMsSUFBSSxJQUFJLElBQUksbUJBQW1CLElBQUksSUFBSSxJQUFJLG9CQUFvQjtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQzVFLElBQUksSUFBSSxJQUFJLFVBQVU7UUFBRSxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hGLElBQUksSUFBSSxJQUFJLGNBQWM7UUFBRSxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzFGLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRCxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3pILENBQUM7SUFDRCxJQUFJLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUVqRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdEcsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUk7SUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUE7QUFDakgsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFJO0lBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUE7QUFDNUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSw2QkFBNkIsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDdEcsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNsQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJO0lBQzNFLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLG1CQUFtQjtZQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ2xELElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxRQUFRLElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JGLElBQUksQ0FBQyw2QkFBNkIsRUFBRSwrQ0FBK0MsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0csQ0FBQztRQUVELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLDZCQUE2QixFQUFFLDBFQUEwRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN0SSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUs7SUFDOUIsS0FBSyxJQUFJLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9GLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTFDLElBQUksT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFBO0lBQzdCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFFbkIsS0FBSyxJQUFJLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9GLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyw4QkFBOEIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUM3RSxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFFOUQsSUFBSSxPQUFPLEVBQUUsT0FBTztnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdDLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7WUFDM0MsOEJBQThCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDMUUsSUFBSSxTQUFTLENBQUMsU0FBUztnQkFBRSw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNwRyxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGtCQUFrQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUkscUJBQXFCLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pJLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDNUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDcEUsOEJBQThCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxLQUFLO0lBQ2hELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxVQUFVLENBQUE7SUFDeEosSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHNCQUFzQjtRQUFFLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFBO0lBQ3JHLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxxQkFBcUI7UUFBRSxPQUFPLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN0SCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUkscUJBQXFCO1FBQUUsT0FBTyxjQUFjLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRWpILE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSztJQUNqRCxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDbEUsTUFBTSxVQUFVLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXhELElBQUksZUFBZSxFQUFFLElBQUksSUFBSSxhQUFhLElBQUksVUFBVSxFQUFFLElBQUksSUFBSSxnQkFBZ0I7UUFDaEYsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUUvRixPQUFPLGVBQWUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ25ELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUs7SUFDNUMsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xFLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUVwRCxJQUFJLGVBQWUsRUFBRSxJQUFJLElBQUksWUFBWSxJQUFJLGVBQWUsRUFBRSxJQUFJLElBQUksbUJBQW1CO1FBQ3ZGLFFBQVEsRUFBRSxJQUFJLElBQUksZUFBZTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBRXJELE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUE7QUFDMUYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLO0lBQzVCLE9BQU8sZ0RBQWdELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzVFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJO0lBQzlCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUE7QUFDM0YsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxHQUFHLE1BQU07SUFDdEQsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLGFBQWEsQ0FBQTtJQUNqRixNQUFNLFNBQVMsR0FBRyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRXZGLE9BQU8sU0FBUyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQztRQUNoRixTQUFTLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQTtBQUNqRyxDQUFDO0FBRUQsNktBQTZLO0FBQzdLLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ2xFLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLENBQUM7Q0FDdEUsQ0FBQyxDQUFBO0FBRUYseU5BQXlOO0FBQ3pOLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM5QyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDakYsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ25GLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RixTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDaEYsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ2pGLFlBQVksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUNuRixrQkFBa0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN6Rix5QkFBeUIsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUNoRyxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDdEYsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDN0YsZUFBZSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3RGLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RixlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDdEYsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ2hGLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUNoRixjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUM7Q0FDcEYsQ0FBQyxDQUFBO0FBRUY7Ozs7Ozs7R0FPRztBQUNILFNBQVMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSTtJQUMzRSxJQUFJLGVBQWUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFdBQVcsSUFBSSxTQUFTO1lBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLCtDQUErQyxXQUFXLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNuSSxPQUFPLGVBQWUsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxlQUFlLElBQUksS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxXQUFXLElBQUksU0FBUztZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSwwQ0FBMEMsV0FBVyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDOUgsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxrQ0FBa0MsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDdEcsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsSUFBSTtJQUMzSCxJQUFJLGVBQWUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksU0FBUyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLDJEQUEyRCxFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDcEgsQ0FBQztRQUVELGVBQWUsR0FBRyxLQUFLLENBQUE7SUFDekIsQ0FBQztJQUVELElBQUksZUFBZSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLElBQUksUUFBUSxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsa0RBQWtELFFBQVEsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ25JLElBQUksU0FBUyxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsa0RBQWtELFNBQVMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3RJLE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLGVBQWUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVM7WUFBRSxPQUFPLFlBQVksQ0FBQTtRQUN4RSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksU0FBUyxJQUFJLFFBQVE7WUFBRSxPQUFPLGNBQWMsQ0FBQTtRQUV4RSxNQUFNLFFBQVEsR0FBRyxRQUFRLElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFBO1FBRTdGLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLDJEQUEyRCxRQUFRLFFBQVEsU0FBUyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDeEksQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLENBQUM7UUFDNUMsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQztRQUM5QixXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUM7UUFDOUMsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsMkJBQTJCLENBQUM7UUFDNUQsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDO1FBQ3hDLGVBQWUsRUFBRSxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQztRQUN0RCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUM7UUFDeEMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztRQUM1QixRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUM7S0FDekMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7SUFFbkUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBRXZDLElBQUksUUFBUSxJQUFJLFlBQVk7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLGFBQWEsWUFBWSxjQUFjLFFBQVEsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3RKLElBQUksU0FBUyxJQUFJLFlBQVk7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLGFBQWEsWUFBWSxjQUFjLFNBQVMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBRXpKLE9BQU8sMkRBQTJELENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRixDQUFDO0lBRUQsSUFBSSxlQUFlLElBQUksV0FBVyxJQUFJLGVBQWUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN4RSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksU0FBUyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLHFFQUFxRSxFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDOUgsQ0FBQztRQUVELGVBQWUsR0FBRyxlQUFlLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtJQUN6RSxDQUFDO0lBRUQsSUFBSSxlQUFlLElBQUksYUFBYSxJQUFJLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVFLElBQUksUUFBUSxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsNkNBQTZDLFFBQVEsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQzlILElBQUksU0FBUyxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsNkNBQTZDLFNBQVMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBRWpJLE9BQU8sK0NBQStDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsSUFBSSxlQUFlLElBQUksT0FBTyxJQUFJLGVBQWUsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoRSxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQywyQkFBMkIsRUFBRSxxREFBcUQsUUFBUSxRQUFRLFNBQVMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQzVJLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFBO1FBRS9GLE9BQU8sMkRBQTJELENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxlQUFlLEVBQUUsQ0FBQyxDQUFBO0lBQ3BHLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsbUNBQW1DLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFBO0FBQzNHLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSTtJQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtzZW1hbnRpY0ZhaWx1cmUsIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eSwgdW5zdXBwb3J0ZWRTeW50YXh9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7cmVjb3JkVHlwZVN1YnN0aXR1dGlvbnMsIHN1YnN0aXR1dGVWYWx1ZVR5cGUsIHR5cGVDb250YWluc0FueVZhcmlhYmxlfSBmcm9tIFwiLi9nZW5lcmljcy5qc1wiXG5pbXBvcnQge2hhc09ubHlVbmljb2RlU2NhbGFycywgaXNTY2FsYXJUeXBlTmFtZSwgc2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5pbXBvcnQge2FkYXB0ZWRPcGVyYXRpb25Gb3J9IGZyb20gXCIuL29wZXJhdG9ycy5qc1wiXG5pbXBvcnQge3BhcnNlclJhbmdlRm9yfSBmcm9tIFwiLi9wcm92ZW5hbmNlLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVFZmZlY3RHcmFwaH0gZnJvbSBcIi4vZWZmZWN0cy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlUmVzb3VyY2VMaWZldGltZXN9IGZyb20gXCIuL2xpZmV0aW1lLmpzXCJcblxuY29uc3QgdGFzazAwNUxhbmd1YWdlcyA9IG5ldyBTZXQoW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiLCBcImNcIiwgXCJkYXJ0XCIsIFwiemlnXCJdKVxuXG4vKiogQHR5cGVkZWYge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSBSZWNvcmRSZWdpc3RyeSAqL1xuLyoqIEB0eXBlZGVmIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBDbGFzc1JlZ2lzdHJ5ICovXG4vKiogQHR5cGVkZWYge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IEVycm9yUmVnaXN0cnkgKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgQ2xhc3NSZWdpc3RyeT59ICovXG5jb25zdCByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeSA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgU2V0PHN0cmluZz4+fSAqL1xuY29uc3QgcmVzb3VyY2VJZHNCeVJlY29yZFJlZ2lzdHJ5ID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGV9IHR5cGUgLSBCaW5kaW5nIHR5cGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0ga25vd25WYWx1ZSAtIEN1cnJlbnQgc3RhdGljYWxseSBrbm93biBpbW11dGFibGUgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTY29wZVxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBCaW5kaW5nPn0gYmluZGluZ3MgLSBCaW5kaW5ncyBkZWNsYXJlZCBkaXJlY3RseSBpbiB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gcGVuZGluZyAtIE5hbWVzIGRlY2xhcmVkIGxhdGVyIGluIHRoaXMgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NldDxCaW5kaW5nPn0gcHJlc2VuY2VQcm9vZnMgLSBPcHRpb25hbCBiaW5kaW5ncyBwcm92ZW4gcHJlc2VudCBvbiB0aGlzIHBhdGguXG4gKiBAcHJvcGVydHkge1Njb3BlIHwgdW5kZWZpbmVkfSBwYXJlbnQgLSBFbmNsb3NpbmcgbGV4aWNhbCBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHR5cGVQYXJhbWV0ZXJzIC0gVHlwZSBwYXJhbWV0ZXJzIHZpc2libGUgdGhyb3VnaG91dCB0aGUgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gdXNlZE5hbWVzIC0gQWxsIG5hbWVzIHVzZWQgYnkgdGhlIGVuY2xvc2luZyBmdW5jdGlvbiBvciBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgdW5kZWZpbmVkfSBjdXJyZW50Q2xhc3MgLSBEZWNsYXJpbmcgY2xhc3MgZm9yIHJlY2VpdmVyLXByaXZhdGUgYWNjZXNzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9vcEZsb3dDb250ZXh0XG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnR9IFtuZWFyZXN0XSAtIE5lYXJlc3QgYWN0aXZlIGxvb3AuXG4gKiBAcHJvcGVydHkge29iamVjdH0gb3duZXIgLSBFbmNsb3NpbmcgZnVuY3Rpb24gb3IgZW50cnktcG9pbnQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIG9iamVjdD59IG93bmVycyAtIExvb3Agb3duZXIgYnkgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ZhaWxcbiAqIEB0eXBlIHsoY29kZTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfVxuICovXG5cbi8qKlxuICogRW5mb3JjZXMgdGhlIGNvaGVyZW50IHJlbGVhc2UtY2FuZGlkYXRlIHNlbWFudGljIHN1YnNldCBhZnRlciBhZGFwdGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBBZGFwdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7e2NsYXNzZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+LCBmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCByZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gUHJvZ3JhbSBpbXBvcnRzIHZpc2libGUgZHVyaW5nIHZhbGlkYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gVmFsaWRhdGVkIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwgbGFuZ3VhZ2UsIHZpc2libGUgPSB7fSkge1xuICBub3JtYWxpemVQYXJzZWRPd25lZFJlZmVyZW5jZXMobW9kdWxlLCB2aXNpYmxlLmNsYXNzZXMpXG4gIHZhbGlkYXRlTW9kdWxlU2hhcGUobW9kdWxlLCBsYW5ndWFnZSwgKGRldGFpbCwgbG9jYXRpb24pID0+IHVuc3VwcG9ydGVkU3ludGF4KGxhbmd1YWdlLCBkZXRhaWwsIGxvY2F0aW9uKSlcbiAgLyoqXG4gICAqIENvbnZlcnRzIG9uZSBwYXJzZXIgZmFpbHVyZSBpbnRvIGEgbG9jYXRlZCBzZW1hbnRpYyBkaWFnbm9zdGljLlxuICAgKiBAdHlwZSB7U2VtYW50aWNGYWlsfVxuICAgKi9cbiAgY29uc3QgZmFpbCA9IChjb2RlLCBkZXRhaWwsIGxvY2F0aW9uKSA9PiBzZW1hbnRpY0ZhaWx1cmUobGFuZ3VhZ2UsIGNvZGUsIGRldGFpbCwgbG9jYXRpb24pXG5cbiAgdmFsaWRhdGVNb2R1bGVUeXBlcyhtb2R1bGUsIGxhbmd1YWdlLCBmYWlsLCB0cnVlLCB2aXNpYmxlKVxuICB2YWxpZGF0ZVJlc291cmNlTGlmZXRpbWVzKG1vZHVsZSwgaW5mZXJFc2NhcGluZ0Vycm9yRWZmZWN0cyhtb2R1bGUsIHZpc2libGUuY2FsbEVmZmVjdHMpLCBmYWlsKVxuXG4gIHJldHVybiBtb2R1bGVcbn1cblxuLyoqXG4gKiBQcm9tb3RlcyBwYXJzZXItYXV0aG9yZWQgY2xhc3Mgc3BlbGxpbmdzIGFmdGVyIGFsbCBwcml2YXRlIGZpZWxkIHR5cGVzIGFyZSBrbm93bi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gUGFyc2VyLWF1dGhvcmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gW3Zpc2libGVDbGFzc2VzXSAtIEltcG9ydGVkIHJlZmVyZW5jZSBjbGFzc2VzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlZE93bmVkUmVmZXJlbmNlcyhtb2R1bGUsIHZpc2libGVDbGFzc2VzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IG93bmVkQ2xhc3NJZHMgPSBuZXcgU2V0KFsuLi52aXNpYmxlQ2xhc3Nlcy52YWx1ZXMoKV0uZmlsdGVyKCh7b3duZXJzaGlwfSkgPT4gb3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiKVxuICAgIC5tYXAoKHtpZH0pID0+IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoaWQpKSlcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgY29uc3QgZmllbGRzID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbHRlcigoe3R5cGV9KSA9PiB0eXBlPy5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIilcbiAgICBpZiAoZmllbGRzLmxlbmd0aCAhPSAxKSBjb250aW51ZVxuICAgIGNvbnN0IGZpZWxkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZCAmIHt0eXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlfX0gKi8gKGZpZWxkc1swXSlcblxuICAgIGRlY2xhcmF0aW9uLm93bmVyc2hpcCA9IHtmaWVsZElkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGZpZWxkLmlkKSwga2luZDogXCJvd25lZFJlc291cmNlXCIsIHJlc291cmNlSWQ6IGZpZWxkLnR5cGUucmVzb3VyY2VJZH1cbiAgICBvd25lZENsYXNzSWRzLmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSlcbiAgfVxuICAvKiogQHR5cGUge3Vua25vd25bXX0gKi9cbiAgY29uc3QgcGVuZGluZyA9IFttb2R1bGVdXG4gIC8qKiBAdHlwZSB7U2V0PG9iamVjdD59ICovXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiUmVmZXJlbmNlVHlwZVwiICYmXG4gICAgICBvd25lZENsYXNzSWRzLmhhcyhSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpKSkgUmVmbGVjdC5zZXQodmFsdWUsIFwia2luZFwiLCBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKFtcImxvY2F0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgaWYgKGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PSBcIm9iamVjdFwiKSBwZW5kaW5nLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHNjYWxhciB0eXBlcyBhbmQgYmluZGluZ3MgZm9yIGEgY2FsbGVyLXN1cHBsaWVkIHNlbWFudGljIG1vZHVsZSBiZWZvcmUgZW1pc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gQmFja2VuZCBsYW5ndWFnZSBvciBiaW5hcnkgdGFyZ2V0LlxuICogQHBhcmFtIHt7Y2xhc3Nlcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj4sIGZ1bmN0aW9ucz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIHJlY29yZHM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPiwgZXJyb3JzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPiwgY2FsbEVmZmVjdHM/OiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBbdmlzaWJsZV0gLSBSZXNvbHZlZCBwcm9ncmFtIGltcG9ydHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFja2VuZFR5cGVzKG1vZHVsZSwgbGFuZ3VhZ2UsIHZpc2libGUgPSB7fSkge1xuICAvKipcbiAgICogQ29udmVydHMgb25lIGJhY2tlbmQgdmFsaWRhdGlvbiBmYWlsdXJlIGludG8gYW4gdW5zdXBwb3J0ZWQtY2FwYWJpbGl0eSBkaWFnbm9zdGljLlxuICAgKiBAdHlwZSB7U2VtYW50aWNGYWlsfVxuICAgKi9cbiAgY29uc3QgZmFpbCA9IChfY29kZSwgZGV0YWlsLCBsb2NhdGlvbikgPT4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBkZXRhaWwsIGxvY2F0aW9uKVxuXG4gIHZhbGlkYXRlTW9kdWxlVHlwZXMobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCwgZmFsc2UsIHZpc2libGUpXG4gIHZhbGlkYXRlUmVzb3VyY2VMaWZldGltZXMobW9kdWxlLCBpbmZlckVzY2FwaW5nRXJyb3JFZmZlY3RzKG1vZHVsZSwgdmlzaWJsZS5jYWxsRWZmZWN0cyksIGZhaWwpXG59XG5cbi8qKlxuICogQ2hlY2tzIHBhcnNlci1hdXRob3JlZCBibG9jayBhbmQgc3RhdGVtZW50IGxheW91dHMgYmVmb3JlIHNlbWFudGljIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7KGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IGZhaWwgLSBTaGFwZSBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTW9kdWxlU2hhcGUobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCkge1xuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgdmFsaWRhdGVCbG9ja1NoYXBlKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yPy5ib2R5LCBcImNvbnN0cnVjdG9yIGJvZHlcIiwgZmFpbClcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzID8/IFtdKSB2YWxpZGF0ZUJsb2NrU2hhcGUobWV0aG9kLmJvZHksIFwibWV0aG9kIGJvZHlcIiwgZmFpbClcbiAgfVxuICBmb3IgKGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykge1xuICAgIGlmICghdGFzazAwNUxhbmd1YWdlcy5oYXMobGFuZ3VhZ2UpICYmIGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5sZW5ndGggIT0gMikge1xuICAgICAgZmFpbChcImZ1bmN0aW9uIHBhcmFtZXRlciBjb3VudCBvdGhlciB0aGFuIHR3b1wiLCBmdW5jdGlvbkRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHZhbGlkYXRlQmxvY2tTaGFwZShmdW5jdGlvbkRlY2xhcmF0aW9uLmJvZHksIFwiZnVuY3Rpb24gYm9keVwiLCBmYWlsKVxuICB9XG5cbiAgdmFsaWRhdGVCbG9ja1NoYXBlKG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIFwiZW50cnkgcG9pbnRcIiwgZmFpbClcbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIHJlY3Vyc2l2ZWx5IG5lc3RlZCBzZW1hbnRpYyBibG9jayBwcm9kdWNlZCBieSBhIGZyb250ZW5kLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbCAtIERpYWdub3N0aWMgZGV0YWlsLlxuICogQHBhcmFtIHsoZGV0YWlsOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uKSA9PiBuZXZlcn0gZmFpbCAtIFNoYXBlIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCbG9ja1NoYXBlKGJsb2NrLCBkZXRhaWwsIGZhaWwpIHtcbiAgaWYgKCFibG9jayB8fCBibG9jay5raW5kICE9IFwiQmxvY2tcIiB8fCAhQXJyYXkuaXNBcnJheShibG9jay5zdGF0ZW1lbnRzKSkge1xuICAgIGZhaWwoYCR7ZGV0YWlsfSB3aXRob3V0IEJsb2NrYCwgYmxvY2s/LmxvY2F0aW9uID8/IC8qKiBAdHlwZSB7bmV2ZXJ9ICovICh1bmRlZmluZWQpKVxuICB9XG5cbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgYmxvY2suc3RhdGVtZW50cykge1xuICAgIGlmICghW1wiQXNzaWdubWVudFN0YXRlbWVudFwiLCBcIkJyZWFrU3RhdGVtZW50XCIsIFwiQ29udGludWVTdGF0ZW1lbnRcIiwgXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsIFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiLCBcIkZvckVhY2hTdGF0ZW1lbnRcIiwgXCJJZlN0YXRlbWVudFwiLCBcIkxvY2FsRGVjbGFyYXRpb25cIiwgXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiLCBcIlByaW50U3RhdGVtZW50XCIsIFwiUmFpc2VTdGF0ZW1lbnRcIiwgXCJSZXR1cm5TdGF0ZW1lbnRcIiwgXCJUcnlTdGF0ZW1lbnRcIiwgXCJXaGlsZVN0YXRlbWVudFwiXS5pbmNsdWRlcyhzdGF0ZW1lbnQua2luZCkpIHtcbiAgICAgIGZhaWwoYCR7ZGV0YWlsfSBzdGF0ZW1lbnQgJHtzdGF0ZW1lbnQua2luZH1gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuY29uc2VxdWVudCwgXCJpZiBjb25zZXF1ZW50XCIsIGZhaWwpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5hbHRlcm5hdGUsIFwiaWYgYWx0ZXJuYXRlXCIsIGZhaWwpXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuYm9keSwgXCJsb29wIGJvZHlcIiwgZmFpbClcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuYm9keSwgXCJ0cnkgYm9keVwiLCBmYWlsKVxuICAgICAgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5jYXRjaEJvZHksIFwiY2F0Y2ggYm9keVwiLCBmYWlsKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkZWNsYXJhdGlvbnMgYW5kIGV4cHJlc3Npb24gdHlwZXMgd2l0aGluIGxleGljYWwgc2NvcGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBTb3VyY2Ugb3IgYmFja2VuZCBsYW5ndWFnZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gcmVwbGFjZSB0cmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uIGludGVudC5cbiAqIEBwYXJhbSB7e2NsYXNzZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+LCBmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCByZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gUHJvZ3JhbSBpbXBvcnRzIHZpc2libGUgZHVyaW5nIHZhbGlkYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNb2R1bGVUeXBlcyhtb2R1bGUsIGxhbmd1YWdlLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlID0ge30pIHtcbiAgY29uc3QgY2xhc3NlcyA9IHJlZ2lzdGVyQ2xhc3NEZWNsYXJhdGlvbnMobW9kdWxlLmNsYXNzZXMgPz8gW10sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHZpc2libGUuY2xhc3NlcylcbiAgY29uc3QgcmVjb3JkcyA9IHZhbGlkYXRlUmVjb3JkRGVjbGFyYXRpb25zKG1vZHVsZS5yZWNvcmRzID8/IFtdLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlLnJlY29yZHMsIGNsYXNzZXMpXG4gIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlRXJyb3JEZWNsYXJhdGlvbnMobW9kdWxlLmVycm9ycyA/PyBbXSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZS5lcnJvcnMpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gKi9cbiAgY29uc3QgZnVuY3Rpb25zID0gbmV3IE1hcCh2aXNpYmxlLmZ1bmN0aW9ucyA/PyBbXSlcbiAgY29uc3QgZGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KFsuLi5mdW5jdGlvbnMudmFsdWVzKCldLmZsYXRNYXAoKHtpZH0pID0+IHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiID8gW2lkXSA6IFtdKSlcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZnVuY3Rpb25EZWNsYXJhdGlvbl0gb2YgbW9kdWxlLmZ1bmN0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZnVuY3Rpb25EZWNsYXJhdGlvbi5pZCA9IGBmdW5jdGlvbjoke2luZGV4fWBcbiAgICBpZiAodHlwZW9mIGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQgIT0gXCJzdHJpbmdcIiB8fCAhL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2Z1bmN0aW9uOlswLTldKyQvdS50ZXN0KGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQpIHx8XG4gICAgICBkZWNsYXJhdGlvbklkcy5oYXMoZnVuY3Rpb25EZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQklORElOR1wiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LlwiLCBmdW5jdGlvbkRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZnVuY3Rpb25zLmhhcyhmdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYGR1cGxpY2F0ZSBmdW5jdGlvbiAnJHtmdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24oZnVuY3Rpb25EZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBkZWNsYXJhdGlvbklkcy5hZGQoZnVuY3Rpb25EZWNsYXJhdGlvbi5pZClcbiAgICB2YWxpZGF0ZVR5cGVQYXJhbWV0ZXJzKGZ1bmN0aW9uRGVjbGFyYXRpb24sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgZnVuY3Rpb25zLnNldChmdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWUsIGZ1bmN0aW9uRGVjbGFyYXRpb24pXG4gIH1cblxuICB2YWxpZGF0ZUVmZmVjdEdyYXBoKG1vZHVsZSwgbGFuZ3VhZ2UsIGZ1bmN0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgY2xhc3NlcylcbiAgY29uc3QgY2FwYWJpbGl0eVJlc291cmNlcyA9IChtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKS5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKVxuICBjb25zdCBjYXBhYmlsaXR5RmFpbHVyZXMgPSAobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMpXG5cbiAgcmVzb3VyY2VJZHNCeVJlY29yZFJlZ2lzdHJ5LnNldChyZWNvcmRzLCBuZXcgU2V0KGNhcGFiaWxpdHlSZXNvdXJjZXMubWFwKCh7aWR9KSA9PiBpZCkpKVxuICBjb25zdCBleGlzdGluZ0Vycm9yTmFtZXMgPSBuZXcgU2V0KFsuLi5lcnJvcnMudmFsdWVzKCldLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcbiAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHlGYWlsdXJlcykge1xuICAgIGlmIChlcnJvcnMuaGFzKGZhaWx1cmUuaWQpIHx8IGV4aXN0aW5nRXJyb3JOYW1lcy5oYXMoZmFpbHVyZS5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9FUlJPUlwiLCBgRHVwbGljYXRlIGNhcGFiaWxpdHkgZmFpbHVyZSAnJHtmYWlsdXJlLm5hbWV9Jy5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGVycm9ycy5zZXQoZmFpbHVyZS5pZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChmYWlsdXJlKSkpXG4gICAgZXhpc3RpbmdFcnJvck5hbWVzLmFkZChmYWlsdXJlLm5hbWUpXG4gIH1cblxuICBjb25zdCBsb29wT3duZXJzID0gcHJlcGFyZUxvb3BJZGVudGl0aWVzKG1vZHVsZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcblxuICBjb25zdCByZXNlcnZlZFZhbHVlTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi5mdW5jdGlvbnMua2V5cygpLFxuICAgIC4uLlsuLi5yZWNvcmRzLnZhbHVlcygpXS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5uYW1lKSxcbiAgICAuLi5bLi4uY2xhc3Nlcy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uWy4uLmVycm9ycy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uY2FwYWJpbGl0eVJlc291cmNlcy5tYXAoKHtuYW1lfSkgPT4gbmFtZSlcbiAgXSlcblxuICBjb25zdCBub21pbmFsTmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW11dKSB7XG4gICAgaWYgKG5vbWluYWxOYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQklORElOR1wiLCBgRHVwbGljYXRlIG5vbWluYWwgZGVjbGFyYXRpb24gJyR7ZGVjbGFyYXRpb24ubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBub21pbmFsTmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gIH1cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBbLi4uY2FwYWJpbGl0eVJlc291cmNlcywgLi4uY2FwYWJpbGl0eUZhaWx1cmVzXSkge1xuICAgIGlmIChub21pbmFsTmFtZXMuaGFzKGRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYER1cGxpY2F0ZSBub21pbmFsIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uLm5hbWV9Jy5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIG5vbWluYWxOYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgfVxuICBjb25zdCBsb2NhbEZ1bmN0aW9uTmFtZXMgPSBuZXcgU2V0KG1vZHVsZS5mdW5jdGlvbnMubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuICBjb25zdCBjYWxsRWZmZWN0cyA9IGluZmVyQ2FsbEVmZmVjdHMoZnVuY3Rpb25zLCB2aXNpYmxlLmNhbGxFZmZlY3RzLCBsb2NhbEZ1bmN0aW9uTmFtZXMpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIHZhbGlkYXRlQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wT3duZXJzKVxuICB9XG5cbiAgZm9yIChjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uRGVjbGFyYXRpb24sIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wT3duZXJzKVxuICB9XG5cbiAgY29uc3QgZW50cnlTY29wZSA9IGNyZWF0ZVNjb3BlKHVuZGVmaW5lZCwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keS5zdGF0ZW1lbnRzLCByZXNlcnZlZFZhbHVlTmFtZXMpXG5cbiAgdmFsaWRhdGVCbG9jayhtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBlbnRyeVNjb3BlLCB1bmRlZmluZWQsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IG1vZHVsZS5lbnRyeVBvaW50LCBvd25lcnM6IGxvb3BPd25lcnN9KVxuICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgdmFsaWRhdGVFZmZlY3RHcmFwaChtb2R1bGUsIGxhbmd1YWdlLCBmdW5jdGlvbnMsIGZhaWwsIHRydWUsIGNsYXNzZXMpXG59XG5cbi8qKlxuICogQXNzaWducyBwYXJzZXItYXV0aG9yZWQgbG9vcC9jb250cm9sIGlkZW50aXRpZXMgYW5kIHZhbGlkYXRlcyBjYWxsZXItb3duZWQgaWRlbnRpdGllcyB3aXRob3V0IGNyb3NzaW5nIGEgZnVuY3Rpb24gYm91bmRhcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIG9iamVjdD59IExvb3Agb3duZXIgYnkgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb29wSWRlbnRpdGllcyhtb2R1bGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpIHtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcCgpXG4gIGxldCBuZXh0TG9vcCA9IDBcblxuICBjb25zdCBjbGFzc093bmVycyA9IChtb2R1bGUuY2xhc3NlcyA/PyBbXSkuZmxhdE1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciwgLi4uZGVjbGFyYXRpb24ubWV0aG9kc10pXG5cbiAgZm9yIChjb25zdCBvd25lciBvZiBbLi4uY2xhc3NPd25lcnMsIC4uLm1vZHVsZS5mdW5jdGlvbnMsIG1vZHVsZS5lbnRyeVBvaW50XSkgdmlzaXQob3duZXIuYm9keSwgb3duZXIsIFtdKVxuXG4gIHJldHVybiBvd25lcnNcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBibG9jayBpbiBsZXhpY2FsIHNlbWFudGljIG9yZGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gQ2FuZGlkYXRlIGJsb2NrLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3duZXIgLSBFbmNsb3NpbmcgZnVuY3Rpb24gb3IgZW50cnkgcG9pbnQuXG4gICAqIEBwYXJhbSB7KGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnQpW119IGFjdGl2ZSAtIEFjdGl2ZSBsb29wcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChibG9jaywgb3duZXIsIGFjdGl2ZSkge1xuICAgIGlmICghYmxvY2sgfHwgIUFycmF5LmlzQXJyYXkoYmxvY2suc3RhdGVtZW50cykpIHJldHVyblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICAgIGlmICghc3RhdGVtZW50IHx8IHR5cGVvZiBzdGF0ZW1lbnQgIT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICAgIGlmIChbXCJGb3JFYWNoU3RhdGVtZW50XCIsIFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiLCBcIldoaWxlU3RhdGVtZW50XCJdLmluY2x1ZGVzKHN0YXRlbWVudC5raW5kKSkge1xuICAgICAgICBjb25zdCBsb29wID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hNYXBTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLldoaWxlU3RhdGVtZW50fSAqLyAoc3RhdGVtZW50KVxuXG4gICAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBsb29wLmlkID0gYGxvb3A6JHtuZXh0TG9vcH1gXG4gICAgICAgIG5leHRMb29wICs9IDFcbiAgICAgICAgaWYgKHR5cGVvZiBsb29wLmlkICE9IFwic3RyaW5nXCIgfHwgIS9ebG9vcDpbMC05XSskL3UudGVzdChsb29wLmlkKSB8fCBvd25lcnMuaGFzKGxvb3AuaWQpKSB7XG4gICAgICAgICAgZmFpbChcIklOVkFMSURfTE9PUF9UQVJHRVRcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCBsb29wIGlkZW50aXR5LlwiLCBsb29wLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIG93bmVycy5zZXQobG9vcC5pZCwgb3duZXIpXG4gICAgICAgIHZpc2l0KGxvb3AuYm9keSwgb3duZXIsIFsuLi5hY3RpdmUsIGxvb3BdKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJDb250aW51ZVN0YXRlbWVudFwiKSB7XG4gICAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zICYmIGFjdGl2ZS5sZW5ndGggPiAwKSBzdGF0ZW1lbnQudGFyZ2V0TG9vcElkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChhY3RpdmUuYXQoLTEpPy5pZClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0KHN0YXRlbWVudC5jb25zZXF1ZW50LCBvd25lciwgYWN0aXZlKVxuICAgICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgdmlzaXQoc3RhdGVtZW50LmFsdGVybmF0ZSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdChzdGF0ZW1lbnQuYm9keSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgICAgdmlzaXQoc3RhdGVtZW50LmNhdGNoQm9keSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmVzIHZhbGlkYXRvci1vbmx5IHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGZvciBhIHZhbGlkYXRlZCBtb2R1bGUncyBsb2NhbCBmdW5jdGlvbnMuXG4gKiBUaGVzZSBlZmZlY3RzIG5ldmVyIGVudGVyIHNlbWFudGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBvciBwdWJsaWMgc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9ucz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gSW1wb3J0ZWQgZnVuY3Rpb25zIGFuZCBhbHJlYWR5LXJlc29sdmVkIGVmZmVjdHMgYnkgbG9jYWwgYmluZGluZy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IExvY2FsIGZ1bmN0aW9uIGVmZmVjdHMgYnkgc291cmNlLXZpc2libGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZVVuY2hlY2tlZEVycm9yRWZmZWN0cyhtb2R1bGUsIHZpc2libGUgPSB7fSkge1xuICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgTWFwKHZpc2libGUuZnVuY3Rpb25zID8/IFtdKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykgZnVuY3Rpb25zLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgY29uc3QgbG9jYWxGdW5jdGlvbk5hbWVzID0gbmV3IFNldChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcbiAgY29uc3QgZWZmZWN0cyA9IGluZmVyQ2FsbEVmZmVjdHMoZnVuY3Rpb25zLCB2aXNpYmxlLmNhbGxFZmZlY3RzLCBsb2NhbEZ1bmN0aW9uTmFtZXMpXG5cbiAgcmV0dXJuIG5ldyBNYXAobW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24ubmFtZSwgbmV3IFNldChlZmZlY3RzLmdldChkZWNsYXJhdGlvbi5uYW1lKSA/PyBbXSldKSlcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGFuZCB2YWxpZGF0ZXMgdGhlIGNsb3NlZCBub21pbmFsIGlkZW50aXRpZXMgb3duZWQgYnkgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IGRlY2xhcmF0aW9ucyAtIENhbmRpZGF0ZSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHBhcnNlci1hdXRob3JlZCBpZGVudGl0aWVzIGFyZSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gW3Zpc2libGVDbGFzc2VzXSAtIEltcG9ydGVkIGNsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Q2xhc3NSZWdpc3RyeX0gQ2xhc3NlcyBieSBzdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ2xhc3NEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlQ2xhc3NlcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBhbiBvcmRlcmVkIGFycmF5LlwiLCAvKiogQHR5cGUge25ldmVyfSAqLyAodW5kZWZpbmVkKSlcbiAgfVxuICAvKiogQHR5cGUge0NsYXNzUmVnaXN0cnl9ICovXG4gIGNvbnN0IGNsYXNzZXMgPSBuZXcgTWFwKHZpc2libGVDbGFzc2VzKVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoWy4uLnZpc2libGVDbGFzc2VzLnZhbHVlcygpXS5tYXAoKHtuYW1lfSkgPT4gbmFtZSkpXG5cbiAgZm9yIChsZXQgY2xhc3NJbmRleCA9IDA7IGNsYXNzSW5kZXggPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBjbGFzc0luZGV4ICs9IDEpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb25zW2NsYXNzSW5kZXhdKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiQ2xhc3NEZWNsYXJhdGlvblwiIHx8ICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLmZpZWxkcykgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLm1ldGhvZHMpIHx8ICFkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciB8fCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5raW5kICE9IFwiQ29uc3RydWN0b3JEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIkRVUExJQ0FURV9DTEFTU1wiLCBcIk1hbGZvcm1lZCBvciBpbnZhbGlkIHJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBcIlJlZmVyZW5jZSBjbGFzc2VzIG11c3QgZGVjbGFyZSBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLmlkID0gYGNsYXNzOiR7Y2xhc3NJbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8XG4gICAgICBjbGFzc2VzLmhhcyhkZWNsYXJhdGlvbi5pZCkgfHwgdHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBkZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCA9PSAwIHx8IG5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9DTEFTU1wiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgcmVmZXJlbmNlIGNsYXNzICcke1N0cmluZyhkZWNsYXJhdGlvbi5uYW1lKX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICBjbGFzc2VzLnNldChkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb24pXG5cbiAgICBjb25zdCBmaWVsZE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGg7IGZpZWxkSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbZmllbGRJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06ZmllbGQ6JHtmaWVsZEluZGV4fWBcblxuICAgICAgaWYgKCFmaWVsZCB8fCBmaWVsZC5raW5kICE9IFwiUHJpdmF0ZUZpZWxkXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9QUklWQVRFX0ZJRUxEXCIsIFwiTWFsZm9ybWVkIG9yIGludmFsaWQgcHJpdmF0ZSBmaWVsZC5cIiwgZmllbGQ/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZpZWxkLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKGZpZWxkLmlkICE9IGV4cGVjdGVkSWQgfHwgdHlwZW9mIGZpZWxkLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBmaWVsZC5uYW1lLmxlbmd0aCA9PSAwIHx8IGZpZWxkTmFtZXMuaGFzKGZpZWxkLm5hbWUpKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUFJJVkFURV9GSUVMRFwiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgcHJpdmF0ZSBmaWVsZCAnJHtTdHJpbmcoZmllbGQubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24oZmllbGQsIFwibmFtZVwiKSlcbiAgICAgIH1cbiAgICAgIGZpZWxkTmFtZXMuYWRkKGZpZWxkLm5hbWUpXG4gICAgfVxuICAgIGNvbnN0IGludmFsaWRPd25lZEZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKHt0eXBlfSkgPT4gY29udGFpbnNPd25lZFR5cGUodHlwZSkgJiYgdHlwZS5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIilcblxuICAgIGlmIChpbnZhbGlkT3duZWRGaWVsZCkge1xuICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgbWF5IGNvbnRhaW4gb3duZXJzaGlwIG9ubHkgaW4gb25lIGRpcmVjdCByZXNvdXJjZSBmaWVsZC5gLCBpbnZhbGlkT3duZWRGaWVsZC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgb3duZWRGaWVsZHMgPSBkZWNsYXJhdGlvbi5maWVsZHMuZmlsdGVyKCh7dHlwZX0pID0+IHR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKVxuXG4gICAgaWYgKG93bmVkRmllbGRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIG1heSBvd24gZXhhY3RseSBvbmUgZGlyZWN0IHJlc291cmNlIGZpZWxkLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAob3duZWRGaWVsZHMubGVuZ3RoID09IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZCAmIHt0eXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlfX0gKi8gKG93bmVkRmllbGRzWzBdKVxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7ZmllbGRJZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIm93bmVkUmVzb3VyY2VcIiksXG4gICAgICAgIHJlc291cmNlSWQ6IGZpZWxkLnR5cGUucmVzb3VyY2VJZH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLm93bmVyc2hpcCA9IGV4cGVjdGVkXG4gICAgICBlbHNlIGlmIChKU09OLnN0cmluZ2lmeShkZWNsYXJhdGlvbi5vd25lcnNoaXApICE9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyBtYWxmb3JtZWQgcmVzb3VyY2Ugb3duZXJzaGlwIG1ldGFkYXRhLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IGNvbnRhaW4gaXRzIGRlY2xhcmVkIHJlc291cmNlIGZpZWxkLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnN0cnVjdG9ySWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06Y29uc3RydWN0b3JgXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQgPSBjb25zdHJ1Y3RvcklkXG4gICAgaWYgKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkICE9IGNvbnN0cnVjdG9ySWQgfHwgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycykgfHxcbiAgICAgICFkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5IHx8IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHkua2luZCAhPSBcIkJsb2NrXCIpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQ09OU1RSVUNUT1JcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24uY29uc3RydWN0b3IubG9jYXRpb24pXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAobGV0IG1ldGhvZEluZGV4ID0gMDsgbWV0aG9kSW5kZXggPCBkZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aDsgbWV0aG9kSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kc1ttZXRob2RJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06bWV0aG9kOiR7bWV0aG9kSW5kZXh9YFxuXG4gICAgICBpZiAoIW1ldGhvZCB8fCBtZXRob2Qua2luZCAhPSBcIk1ldGhvZERlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9NRVRIT0RcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBtZXRob2QgZGVjbGFyYXRpb24uXCIsIG1ldGhvZD8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgbWV0aG9kLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKG1ldGhvZC5pZCAhPSBleHBlY3RlZElkIHx8IHR5cGVvZiBtZXRob2QubmFtZSAhPSBcInN0cmluZ1wiIHx8IG1ldGhvZC5uYW1lLmxlbmd0aCA9PSAwIHx8IG1ldGhvZE5hbWVzLmhhcyhtZXRob2QubmFtZSkgfHxcbiAgICAgICAgIUFycmF5LmlzQXJyYXkobWV0aG9kLnBhcmFtZXRlcnMpIHx8ICFtZXRob2QuYm9keSB8fCBtZXRob2QuYm9keS5raW5kICE9IFwiQmxvY2tcIikge1xuICAgICAgICBmYWlsKFwiRFVQTElDQVRFX01FVEhPRFwiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgbWV0aG9kICcke1N0cmluZyhtZXRob2QubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24obWV0aG9kLCBcIm5hbWVcIikpXG4gICAgICB9XG4gICAgICBtZXRob2ROYW1lcy5hZGQobWV0aG9kLm5hbWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsYXNzZXNcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZXhhY3QgY29uc3RydWN0aW9uLCBwcml2YXRlIHN0YXRlLCBhbmQgbWV0aG9kIGJvZGllcyBmb3Igb25lIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIEZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGFuZCByZWZlcmVuY2UtY2xhc3MgcmVnaXN0cmllcy5cbiAqIEBwYXJhbSB7RXJyb3JSZWdpc3RyeX0gZXJyb3JzIC0gRXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gRnVuY3Rpb24gY2FsbCBlZmZlY3RzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gcmVzZXJ2ZWRWYWx1ZU5hbWVzIC0gTW9kdWxlLXJlc2VydmVkIG5hbWVzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgcmVzb2x1dGlvbnMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBsb29wT3duZXJzIC0gTG9vcCBvd25lcnNoaXAgcmVnaXN0cnkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIHJlc2VydmVkVmFsdWVOYW1lcywgZmFpbCxcbiAgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcE93bmVycykge1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRlY2xhcmF0aW9uLmZpZWxkcykge1xuICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGZpZWxkLnR5cGUsIGZpZWxkLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMpXG4gIH1cblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yXG4gIGNvbnN0IGFjcXVpc2l0aW9uU3RhdGVtZW50ID0gY29uc3RydWN0b3IuYm9keS5zdGF0ZW1lbnRzWzBdXG4gIGNvbnN0IGFjcXVpc2l0aW9uRXhwcmVzc2lvbiA9IGFjcXVpc2l0aW9uU3RhdGVtZW50Py5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIlxuICAgID8gYWNxdWlzaXRpb25TdGF0ZW1lbnQuZXhwcmVzc2lvbiA6IHVuZGVmaW5lZFxuICBjb25zdCBvd25lZEFjcXVpc2l0aW9uID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiICYmIGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGggPT0gMSAmJlxuICAgIGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPT0gMSAmJiBhY3F1aXNpdGlvblN0YXRlbWVudD8ua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIgJiZcbiAgICBhY3F1aXNpdGlvblN0YXRlbWVudC5maWVsZCA9PSBkZWNsYXJhdGlvbi5vd25lcnNoaXAuZmllbGRJZCAmJiBhY3F1aXNpdGlvblN0YXRlbWVudC5yZWNlaXZlci5raW5kID09IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgJiZcbiAgICBhY3F1aXNpdGlvblN0YXRlbWVudC5yZWNlaXZlci5jbGFzc0lkID09IGRlY2xhcmF0aW9uLmlkICYmIGFjcXVpc2l0aW9uRXhwcmVzc2lvbj8ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgJiZcbiAgICBhY3F1aXNpdGlvbkV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cua2luZCA9PSBcImFjcXVpcmVcIiAmJlxuICAgIGFjcXVpc2l0aW9uRXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvdy5yZXNvdXJjZUlkID09IGRlY2xhcmF0aW9uLm93bmVyc2hpcC5yZXNvdXJjZUlkXG5cbiAgaWYgKHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhjb25zdHJ1Y3Rvci5ib2R5LCBjYWxsRWZmZWN0cykuc2l6ZSA+IDAgJiYgIW93bmVkQWNxdWlzaXRpb24pIHtcbiAgICBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsIFwiUmVmZXJlbmNlIGNvbnN0cnVjdG9ycyBjYW5ub3QgZXhwb3NlIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGluIFRhc2sgMDMzLlwiLCBjb25zdHJ1Y3Rvci5sb2NhdGlvbilcbiAgfVxuXG4gIGlmICghb3duZWRBY3F1aXNpdGlvbiAmJlxuICAgIChjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoIHx8IGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCkpIHtcbiAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtdXN0IGluaXRpYWxpemUgZXZlcnkgcHJpdmF0ZSBmaWVsZCBleGFjdGx5IG9uY2UgaW4gZGVjbGFyYXRpb24gb3JkZXIuYCxcbiAgICAgIGNvbnN0cnVjdG9yLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNvbnN0cnVjdG9yU2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBuZXcgU2V0KCksIGRlY2xhcmF0aW9uKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbaW5kZXhdXG4gICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbaW5kZXhdXG4gICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcylcblxuICAgIGlmICghb3duZWRBY3F1aXNpdGlvbiAmJiAhc2FtZVR5cGUodHlwZSwgZmllbGQudHlwZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9JyBtdXN0IGV4YWN0bHkgbWF0Y2ggcHJpdmF0ZSBmaWVsZCAnJHtmaWVsZC5uYW1lfScuYCwgcGFyYW1ldGVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBkZWNsYXJlQmluZGluZyhwYXJhbWV0ZXIubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGV9LCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIiksIGNvbnN0cnVjdG9yU2NvcGUsIGZhaWwpXG4gICAgaWYgKG93bmVkQWNxdWlzaXRpb24pIGNvbnRpbnVlXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gY29uc3RydWN0b3IuYm9keS5zdGF0ZW1lbnRzW2luZGV4XVxuICAgIGNvbnN0IGluaXRpYWxpemVyID0gc3RhdGVtZW50Py5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIlxuICAgICAgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24uZXhwcmVzc2lvbiA6IHN0YXRlbWVudC5leHByZXNzaW9uXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFzdGF0ZW1lbnQgfHwgc3RhdGVtZW50LmtpbmQgIT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5maWVsZCAhPSBmaWVsZC5pZCB8fFxuICAgICAgc3RhdGVtZW50LnJlY2VpdmVyPy5raW5kICE9IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgfHwgc3RhdGVtZW50LnJlY2VpdmVyLmNsYXNzSWQgIT0gZGVjbGFyYXRpb24uaWQgfHxcbiAgICAgIGluaXRpYWxpemVyPy5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiB8fCBpbml0aWFsaXplci5uYW1lICE9IHBhcmFtZXRlci5uYW1lKSB7XG4gICAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtdXN0IGluaXRpYWxpemUgJyR7ZmllbGQubmFtZX0nIGZyb20gaXRzIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyLmAsXG4gICAgICAgIHN0YXRlbWVudD8ubG9jYXRpb24gPz8gY29uc3RydWN0b3IubG9jYXRpb24pXG4gICAgfVxuICB9XG4gIHZhbGlkYXRlQmxvY2soY29uc3RydWN0b3IuYm9keSwgY29uc3RydWN0b3JTY29wZSwge2tpbmQ6IFwiVHlwZVJlZmVyZW5jZVwiLCBuYW1lOiBcInZvaWRcIn0sIGZ1bmN0aW9ucywgcmVjb3JkcyxcbiAgICBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IGNvbnN0cnVjdG9yLCBvd25lcnM6IGxvb3BPd25lcnN9KVxuXG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICBjb25zdCB1bnN1cHBvcnRlZE1ldGhvZEVmZmVjdHMgPSBbLi4uc3ludGFjdGljQmxvY2tFZmZlY3RzKG1ldGhvZC5ib2R5LCBjYWxsRWZmZWN0cyldXG4gICAgICAuZmlsdGVyKChpZCkgPT4gIS9eKD86bW9kdWxlOlswLTldK1xcLyk/Y2FwYWJpbGl0eTpbMC05XStcXC9mYWlsdXJlOlswLTldKyQvdS50ZXN0KGlkKSlcblxuICAgIGlmIChkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgIT0gXCJvd25lZFJlc291cmNlXCIgJiYgdW5zdXBwb3J0ZWRNZXRob2RFZmZlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZhaWwoXCJVTlNVUFBPUlRFRF9TVEFURU1FTlRcIiwgYFJlZmVyZW5jZSBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBjYW5ub3QgZXhwb3NlIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGluIFRhc2sgMDMzLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgc2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIG1ldGhvZC5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgbmV3IFNldCgpLCBkZWNsYXJhdGlvbilcblxuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCB0eXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhwYXJhbWV0ZXIubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGV9LCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIiksIHNjb3BlLCBmYWlsKVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKG1ldGhvZC5yZXR1cm5UeXBlLCBtZXRob2QubG9jYXRpb24sIGZhaWwsIHJlY29yZHMpXG4gICAgY29uc3QgZmxvdyA9IHZhbGlkYXRlQmxvY2sobWV0aG9kLmJvZHksIHNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IG1ldGhvZCwgb3duZXJzOiBsb29wT3duZXJzfSlcblxuICAgIGlmIChkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgPT0gXCJvd25lZFJlc291cmNlXCIpIG93bmVkTWV0aG9kUmVzb3VyY2VGbG93KGRlY2xhcmF0aW9uLCBtZXRob2QsIGZhaWwpXG5cbiAgICBpZiAoIWlzVm9pZFR5cGUocmV0dXJuVHlwZSkgJiYgZmxvdy5ub3JtYWwpIHtcbiAgICAgIGZhaWwoXCJNSVNTSU5HX1JFVFVSTlwiLCBgTWV0aG9kICcke21ldGhvZC5uYW1lfScgZG9lcyBub3QgcmV0dXJuIG9uIGV2ZXJ5IHJlYWNoYWJsZSBwYXRoLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHt1bmtub3dufSBkZWNsYXJhdGlvbnMgLSBDYW5kaWRhdGUgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IFt2aXNpYmxlRXJyb3JzXSAtIEltcG9ydGVkIGVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtFcnJvclJlZ2lzdHJ5fSBWYWxpZGF0ZWQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVycm9yRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZUVycm9ycyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiRXJyb3IgZGVjbGFyYXRpb25zIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgLyoqIEB0eXBlIHtuZXZlcn0gKi8gKHVuZGVmaW5lZCkpXG4gIC8qKiBAdHlwZSB7RXJyb3JSZWdpc3RyeX0gKi9cbiAgY29uc3QgZXJyb3JzID0gbmV3IE1hcCh2aXNpYmxlRXJyb3JzKVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnNbaW5kZXhdXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uIHx8IGRlY2xhcmF0aW9uLmtpbmQgIT0gXCJFcnJvckRlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBlcnJvciBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uaWQgPSBgZXJyb3I6JHtpbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/ZXJyb3I6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8IGVycm9ycy5oYXMoZGVjbGFyYXRpb24uaWQpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0VSUk9SXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXCIsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBuYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRVJST1JcIiwgYER1cGxpY2F0ZSBvciBpbnZhbGlkIGVycm9yICcke1N0cmluZyhkZWNsYXJhdGlvbi5uYW1lKX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICBlcnJvcnMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGFuZCB2YWxpZGF0ZXMgb25lIGRlY2xhcmF0aW9uJ3MgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gT3duaW5nIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUeXBlUGFyYW1ldGVycyhkZWNsYXJhdGlvbiwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucykge1xuICBpZiAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmICghQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycykpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlR5cGUgcGFyYW1ldGVycyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcGFyYW1ldGVyID0gZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnNbaW5kZXhdXG4gICAgY29uc3Qga2V5cyA9IHBhcmFtZXRlciAmJiB0eXBlb2YgcGFyYW1ldGVyID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1ldGVyKVxuICAgICAgPyBPYmplY3Qua2V5cyhwYXJhbWV0ZXIpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSA6IFwiXCJcblxuICAgIGlmICghT2JqZWN0Lmhhc093bihkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycywgaW5kZXgpIHx8ICFwYXJhbWV0ZXIgfHwgcGFyYW1ldGVyLmtpbmQgIT0gXCJUeXBlUGFyYW1ldGVyXCIgfHxcbiAgICAgIGtleXMgIT0gXCJpZCxraW5kLGxvY2F0aW9uLG5hbWVcIiB8fCB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBwYXJhbWV0ZXIubmFtZS5sZW5ndGggPT0gMCkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uXCIsIHBhcmFtZXRlcj8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChuYW1lcy5oYXMocGFyYW1ldGVyLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX1RZUEVfUEFSQU1FVEVSXCIsIGBEdXBsaWNhdGUgdHlwZSBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIikpXG4gICAgfVxuICAgIG5hbWVzLmFkZChwYXJhbWV0ZXIubmFtZSlcbiAgICBjb25zdCBleHBlY3RlZElkID0gYCR7ZGVjbGFyYXRpb24uaWR9OnR5cGU6JHtpbmRleH1gXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgcGFyYW1ldGVyLmlkID0gZXhwZWN0ZWRJZFxuICAgIGlmIChwYXJhbWV0ZXIuaWQgIT0gZXhwZWN0ZWRJZCkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9UWVBFX1BBUkFNRVRFUlwiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIHR5cGUgcGFyYW1ldGVyIGlkZW50aXR5LlwiLCBwYXJhbWV0ZXIubG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2xvc2VkIGlkZW50aXR5IHNjb3BlIG93bmVkIGJ5IG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gRGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IFR5cGUtcGFyYW1ldGVyIGlkZW50aXRpZXMuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcklkcyhkZWNsYXJhdGlvbikge1xuICByZXR1cm4gbmV3IFNldCgoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgoe2lkfSkgPT4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpZCkpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBub21pbmFsIGRlY2xhcmF0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBzdGFibGUgaWRlbnRpdHkgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge3Vua25vd259IGRlY2xhcmF0aW9ucyAtIENhbmRpZGF0ZSBvcmRlcmVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gW3Zpc2libGVSZWNvcmRzXSAtIEltcG9ydGVkIHJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0NsYXNzUmVnaXN0cnl9IFtjbGFzc2VzXSAtIE1vZHVsZSByZWZlcmVuY2UgY2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWNvcmRSZWdpc3RyeX0gVmFsaWRhdGVkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWNvcmREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlUmVjb3JkcyA9IG5ldyBNYXAoKSwgY2xhc3NlcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjb3JkIGRlY2xhcmF0aW9ucyBtdXN0IGJlIGFuIG9yZGVyZWQgYXJyYXkuXCIsIC8qKiBAdHlwZSB7bmV2ZXJ9ICovICh1bmRlZmluZWQpKVxuICAvKiogQHR5cGUge1JlY29yZFJlZ2lzdHJ5fSAqL1xuICBjb25zdCByZWNvcmRzID0gbmV3IE1hcCh2aXNpYmxlUmVjb3JkcylcblxuICByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeS5zZXQocmVjb3JkcywgY2xhc3NlcylcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCByZWNvcmRJbmRleCA9IDA7IHJlY29yZEluZGV4IDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zW3JlY29yZEluZGV4XVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiUmVjb3JkRGVjbGFyYXRpb25cIiB8fCAhQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi5maWVsZHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgcmVjb3JkIGRlY2xhcmF0aW9uLlwiLCBkZWNsYXJhdGlvbj8ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBkZWNsYXJhdGlvbi5pZCA9IGByZWNvcmQ6JHtyZWNvcmRJbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/cmVjb3JkOlswLTldKyQvdS50ZXN0KGRlY2xhcmF0aW9uLmlkKSB8fCByZWNvcmRzLmhhcyhkZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUkVDT1JEXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9SRUNPUkRcIiwgYER1cGxpY2F0ZSByZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICB2YWxpZGF0ZVR5cGVQYXJhbWV0ZXJzKGRlY2xhcmF0aW9uLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIHJlY29yZHMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgY29uc3QgZmllbGROYW1lcyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGRlY2xhcmF0aW9uKVxuXG4gICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOyBmaWVsZEluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2ZpZWxkSW5kZXhdXG5cbiAgICAgIGlmICghZmllbGQgfHwgZmllbGQua2luZCAhPSBcIlJlY29yZEZpZWxkXCIpIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFsZm9ybWVkIHJlY29yZCBmaWVsZC5cIiwgZmllbGQ/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZpZWxkLmlkID0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLmlkICE9IFwic3RyaW5nXCIgfHwgZmllbGQuaWQgIT0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRklFTERcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCByZWNvcmQgZmllbGQgaWRlbnRpdHkuXCIsIGZpZWxkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkTmFtZXMuaGFzKGZpZWxkLm5hbWUpKSBmYWlsKFwiRFVQTElDQVRFX0ZJRUxEXCIsIGBEdXBsaWNhdGUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihmaWVsZCwgXCJuYW1lXCIpKVxuICAgICAgZmllbGROYW1lcy5hZGQoZmllbGQubmFtZSlcbiAgICAgIGlmIChjb250YWluc093bmVkVHlwZShmaWVsZC50eXBlKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgXCJPd25lZCByZXNvdXJjZXMgY2Fubm90IGJlIHN0b3JlZCBpbiBpbW11dGFibGUgcmVjb3Jkcy5cIiwgZmllbGQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbiAgICB9XG4gIH1cbiAgdmFsaWRhdGVEaXJlY3RSZWNvcmRSZWN1cnNpb24oZGVjbGFyYXRpb25zLCByZWNvcmRzLCBmYWlsKVxuXG4gIHJldHVybiByZWNvcmRzXG59XG5cbi8qKlxuICogUmVqZWN0cyBjeWNsZXMgY29tcG9zZWQgc29sZWx5IG9mIHVubWVkaWF0ZWQgcmVjb3JkIGZpZWxkcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbltdfSBkZWNsYXJhdGlvbnMgLSBWYWxpZCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gRGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0UmVjb3JkUmVjdXJzaW9uKGRlY2xhcmF0aW9ucywgcmVjb3JkcywgZmFpbCkge1xuICBjb25zdCBjb21wbGV0ZSA9IG5ldyBTZXQoKVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGRlY2xhcmF0aW9uIGFsb25nIGFuIHVubWVkaWF0ZWQgcmVjb3JkIHBhdGguXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBDdXJyZW50IGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhY3RpdmUgLSBEZWNsYXJhdGlvbiBpZGVudGl0aWVzIGFjdGl2ZSBvbiB0aGlzIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQoZGVjbGFyYXRpb24sIGFjdGl2ZSkge1xuICAgIGlmIChjb21wbGV0ZS5oYXMoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCkpKSByZXR1cm5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChhY3RpdmUpXG5cbiAgICBuZXh0LmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSlcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRlY2xhcmF0aW9uLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikgY29udGludWVcbiAgICAgIGlmIChuZXh0LmhhcyhmaWVsZC50eXBlLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICAgIGZhaWwoXCJJTExFR0FMX1JFQ09SRF9SRUNVUlNJT05cIiwgYERpcmVjdCB2YWx1ZS1yZWN1cnNpdmUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHR5cGVMb2NhdGlvbihmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCByZWZlcmVuY2VkID0gcmVjb3Jkcy5nZXQoZmllbGQudHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgICBpZiAocmVmZXJlbmNlZCkgdmlzaXQocmVmZXJlbmNlZCwgbmV4dClcbiAgICB9XG4gICAgY29tcGxldGUuYWRkKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpKVxuICB9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHZpc2l0KGRlY2xhcmF0aW9uLCBuZXcgU2V0KCkpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBub24tdm9pZCBmdW5jdGlvbiBhbmQgaXRzIGNvbXBsZXRlIGNvbnRyb2wgZmxvdy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIEZ1bmN0aW9uIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBGdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0Vycm9yUmVnaXN0cnl9IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjYWxsRWZmZWN0cyAtIEludGVybmFsbHkgaW5mZXJyZWQgdW5jaGVja2VkLWVycm9yIGVmZmVjdHMuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSByZXNlcnZlZFZhbHVlTmFtZXMgLSBNb2R1bGUgZnVuY3Rpb25zIGFuZCBub21pbmFsIGNvbnN0cnVjdG9ycyB1bmF2YWlsYWJsZSB0byBsZXhpY2FsIGJpbmRpbmdzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBsb29wT3duZXJzIC0gTG9vcCBvd25lciBieSBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbihkZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BPd25lcnMpIHtcbiAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZGVjbGFyYXRpb24pXG4gIGNvbnN0IHNjb3BlID0gY3JlYXRlU2NvcGUodW5kZWZpbmVkLCBkZWNsYXJhdGlvbi5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZGVjbGFyYXRpb24ucGFyYW1ldGVycykge1xuICAgIGNvbnN0IHR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgZGVjbGFyZUJpbmRpbmcocGFyYW1ldGVyLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlfSwgcm9sZUxvY2F0aW9uKHBhcmFtZXRlciwgXCJuYW1lXCIpLCBzY29wZSwgZmFpbClcbiAgfVxuXG4gIGNvbnN0IHJldHVyblR5cGUgPSB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgZGVjbGFyYXRpb24ubG9jYXRpb24sIGZhaWwsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuICBjb25zdCByZXR1cm5zID0gdmFsaWRhdGVCbG9jayhkZWNsYXJhdGlvbi5ib2R5LCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtvd25lcjogZGVjbGFyYXRpb24sIG93bmVyczogbG9vcE93bmVyc30pXG5cbiAgaWYgKCFpc1ZvaWRUeXBlKHJldHVyblR5cGUpICYmIHJldHVybnMubm9ybWFsKSB7XG4gICAgZmFpbChcIk1JU1NJTkdfUkVUVVJOXCIsIGBGdW5jdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScgZG9lcyBub3QgcmV0dXJuIG9uIGV2ZXJ5IHJlYWNoYWJsZSBwYXRoLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBvcmRlcmVkIGJsb2NrIGFuZCByZXBvcnRzIHdoZXRoZXIgZXZlcnkgcGF0aCByZXR1cm5zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBTY29wZSBiZWxvbmdpbmcgdG8gdGhpcyBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IHVuZGVmaW5lZH0gcmV0dXJuVHlwZSAtIEZ1bmN0aW9uIHJldHVybiB0eXBlLCBhYnNlbnQgZm9yIGVudHJ5IHBvaW50cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gRnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtFcnJvclJlZ2lzdHJ5fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY2FsbEVmZmVjdHMgLSBJbnRlcm5hbGx5IGluZmVycmVkIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtMb29wRmxvd0NvbnRleHR9IGxvb3BDb250ZXh0IC0gQWN0aXZlIGxvb3AgYW5kIG93bmVyIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7e25vcm1hbDogYm9vbGVhbiwgcmFpc2VzOiBTZXQ8c3RyaW5nPn19IFJlYWNoYWJsZSBub3JtYWwgY29udGludWF0aW9uIGFuZCBlc2NhcGluZyBlcnJvciBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJsb2NrKGJsb2NrLCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dCkge1xuICBsZXQgbm9ybWFsID0gdHJ1ZVxuICBjb25zdCByYWlzZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKCFub3JtYWwpIGZhaWwoXCJVTlJFQUNIQUJMRV9TVEFURU1FTlRcIiwgXCJTdGF0ZW1lbnQgaXMgdW5yZWFjaGFibGUuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcblxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikge1xuICAgICAgY29uc3QgZGVjbGFyZWRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LnR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBzY29wZS50eXBlUGFyYW1ldGVycylcbiAgICAgIHN0YXRlbWVudC5pbml0aWFsaXplciA9IG5vcm1hbGl6ZU93bmVkTW92ZShzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGRlY2xhcmVkVHlwZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmluaXRpYWxpemVyLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIGluaXRpYWxpemVyXCIsIGRlY2xhcmVkVHlwZVxuICAgICAgKVxuXG4gICAgICBzY29wZS5wZW5kaW5nLmRlbGV0ZShzdGF0ZW1lbnQubmFtZSlcbiAgICAgIGlmICghc2FtZVR5cGUoaW5pdGlhbGl6ZXJUeXBlLCBkZWNsYXJlZFR5cGUpKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplclR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIGRlY2xhcmVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgICBmYWlsKFwiRkFJTFVSRV9BQlNFTkNFX0NPTkZMQVRJT05cIiwgXCJPcHRpb25hbCBhYnNlbmNlIGNhbm5vdCBiZSBjb2VyY2VkIGludG8gYSB2YWx1ZSBvciB0eXBlZCBmYWlsdXJlLlwiLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYEluaXRpYWxpemVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oaW5pdGlhbGl6ZXJUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGRlY2xhcmVkVHlwZSl9LmAsIHN0YXRlbWVudC5pbml0aWFsaXplci5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC5uYW1lLCB7XG4gICAgICAgIGtub3duVmFsdWU6IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKHN0YXRlbWVudC5pbml0aWFsaXplciwgc2NvcGUpLFxuICAgICAgICBtdXRhYmxlOiBzdGF0ZW1lbnQubXV0YWJsZSxcbiAgICAgICAgdHlwZTogZGVjbGFyZWRUeXBlXG4gICAgICB9LCByb2xlTG9jYXRpb24oc3RhdGVtZW50LCBcIm5hbWVcIiksIHNjb3BlLCBmYWlsKVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gcmVzb2x2ZUJpbmRpbmcoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBzdGF0ZW1lbnQudGFyZ2V0LmxvY2F0aW9uLCBzY29wZSwgZmFpbClcblxuICAgICAgaWYgKGJpbmRpbmcudHlwZS5raW5kID09IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIklNTVVUQUJMRV9BU1NJR05NRU5UXCIsIGBDYW5ub3QgYXNzaWduIHRvIGltbXV0YWJsZSBjYXRjaCBiaW5kaW5nICcke3N0YXRlbWVudC50YXJnZXQubmFtZX0nLmAsIHN0YXRlbWVudC50YXJnZXQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoYmluZGluZy50eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IGJpbmRpbmcudHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIFwiT3duZWQgcmVzb3VyY2VzIGNhbm5vdCBiZSByZWFzc2lnbmVkIG9yIGFsaWFzZWQuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cHJlc3Npb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBhc3NpZ25tZW50XCIsIGJpbmRpbmcudHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoIWJpbmRpbmcubXV0YWJsZSkge1xuICAgICAgICBmYWlsKFwiSU1NVVRBQkxFX0FTU0lHTk1FTlRcIiwgYENhbm5vdCBhc3NpZ24gdG8gaW1tdXRhYmxlIGJpbmRpbmcgJyR7c3RhdGVtZW50LnRhcmdldC5uYW1lfScuYCwgc3RhdGVtZW50LnRhcmdldC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghc2FtZVR5cGUoZXhwcmVzc2lvblR5cGUsIGJpbmRpbmcudHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYEFzc2lnbm1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihleHByZXNzaW9uVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihiaW5kaW5nLnR5cGUpfS5gLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSlcbiAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHNjb3BlLmN1cnJlbnRDbGFzc1xuXG4gICAgICBpZiAoIWRlY2xhcmF0aW9uIHx8ICFzdGF0ZW1lbnQucmVjZWl2ZXIgfHwgc3RhdGVtZW50LnJlY2VpdmVyLmtpbmQgIT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIiB8fFxuICAgICAgICBzdGF0ZW1lbnQucmVjZWl2ZXIuY2xhc3NJZCAhPSBkZWNsYXJhdGlvbi5pZCkge1xuICAgICAgICBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlByaXZhdGUgZmllbGQgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgZGVjbGFyaW5nIGNsYXNzIHJlY2VpdmVyLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBzdGF0ZW1lbnQuZmllbGQpXG5cbiAgICAgIGlmICghZmllbGQpIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCBpZGVudGl0eSBpcyBub3Qgb3duZWQgYnkgdGhlIGRlY2xhcmluZyBjbGFzcy5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBub3JtYWxpemVPd25lZE1vdmUoc3RhdGVtZW50LmV4cHJlc3Npb24sIGZpZWxkLnR5cGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICBjb25zdCBleHByZXNzaW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBwcml2YXRlIGZpZWxkIGFzc2lnbm1lbnRcIiwgZmllbGQudHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGV4cHJlc3Npb25UeXBlLCBmaWVsZC50eXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUHJpdmF0ZSBmaWVsZCBhc3NpZ25tZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oZXhwcmVzc2lvblR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZmllbGQudHlwZSl9LmAsXG4gICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5leHByZXNzaW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IHByaW50ZWRUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgcHJpbnQgdmFsdWVcIilcblxuICAgICAgaWYgKHByaW50ZWRUeXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IHByaW50ZWRUeXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgICBmYWlsKFwiQk9SUk9XX0VTQ0FQRVwiLCBcIk93bmVkIHZhbHVlcyBjYW5ub3QgZXNjYXBlIHRocm91Z2ggcHJpbnRpbmcgb3Igc2VyaWFsaXphdGlvbi5cIiwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAocHJpbnRlZFR5cGUua2luZCAhPSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNvbGxlY3Rpb25zIGFuZCByZWNvcmRzIGNhbm5vdCBiZSBwcmludGVkIGRpcmVjdGx5LlwiLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudC5leHByZXNzaW9uIHx8ICFbXCJDYWxsRXhwcmVzc2lvblwiLCBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIsIFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIl0uaW5jbHVkZXMoc3RhdGVtZW50LmV4cHJlc3Npb24ua2luZCkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJFeHByZXNzaW9uIHN0YXRlbWVudCBtdXN0IGNvbnRhaW4gYSBkaXJlY3Qgb3IgcmVjZWl2ZXIgY2FsbC5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgZXhwcmVzc2lvblR5cGUgPSBpbmZlckV4cHJlc3Npb25UeXBlKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKVxuXG4gICAgICBpZiAoZXhwcmVzc2lvblR5cGUgIT0gXCJ2b2lkXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJFeHByZXNzaW9uIHN0YXRlbWVudHMgbWF5IGNvbnRhaW4gb25seSB2b2lkIGNhbGxzLlwiLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgPyBcImJyZWFrXCIgOiBcImNvbnRpbnVlXCJcblxuICAgICAgaWYgKCFsb29wQ29udGV4dC5uZWFyZXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGVtZW50LnRhcmdldExvb3BJZCA9PSBcInN0cmluZ1wiICYmIGxvb3BDb250ZXh0Lm93bmVycy5oYXMoc3RhdGVtZW50LnRhcmdldExvb3BJZCkgJiZcbiAgICAgICAgICBsb29wQ29udGV4dC5vd25lcnMuZ2V0KHN0YXRlbWVudC50YXJnZXRMb29wSWQpICE9PSBsb29wQ29udGV4dC5vd25lcikge1xuICAgICAgICAgIGZhaWwoXCJDUk9TU19GVU5DVElPTl9MT09QX1RBUkdFVFwiLCBgJHtjb250cm9sWzBdLnRvVXBwZXJDYXNlKCl9JHtjb250cm9sLnNsaWNlKDEpfSB0YXJnZXQgY3Jvc3NlcyBhIGZ1bmN0aW9uIGJvdW5kYXJ5LmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBmYWlsKGBJTExFR0FMXyR7Y29udHJvbC50b1VwcGVyQ2FzZSgpfV9DT05URVhUYCwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gc3RhdGVtZW50IG91dHNpZGUgYSBsb29wLmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3RhdGVtZW50LnRhcmdldExvb3BJZCAhPSBcInN0cmluZ1wiIHx8ICFsb29wQ29udGV4dC5vd25lcnMuaGFzKHN0YXRlbWVudC50YXJnZXRMb29wSWQpKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX0xPT1BfVEFSR0VUXCIsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IGhhcyBhbiBpbnZhbGlkIGxvb3AgdGFyZ2V0IGlkZW50aXR5LmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChsb29wQ29udGV4dC5vd25lcnMuZ2V0KHN0YXRlbWVudC50YXJnZXRMb29wSWQpICE9PSBsb29wQ29udGV4dC5vd25lcikge1xuICAgICAgICBmYWlsKFwiQ1JPU1NfRlVOQ1RJT05fTE9PUF9UQVJHRVRcIiwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gdGFyZ2V0IGNyb3NzZXMgYSBmdW5jdGlvbiBib3VuZGFyeS5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGVtZW50LnRhcmdldExvb3BJZCAhPSBsb29wQ29udGV4dC5uZWFyZXN0LmlkKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX0xPT1BfVEFSR0VUXCIsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IG11c3QgdGFyZ2V0IHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIG5vcm1hbCA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgICAgaWYgKCFyZXR1cm5UeXBlKSBmYWlsKFwiSUxMRUdBTF9SRVRVUk5fQ09OVEVYVFwiLCBcIlJldHVybiBzdGF0ZW1lbnQgb3V0c2lkZSBhIGZ1bmN0aW9uLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICBpZiAoaXNWb2lkVHlwZShyZXR1cm5UeXBlKSkge1xuICAgICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgICAgICBmYWlsKFwiVk9JRF9SRVRVUk5fVkFMVUVcIiwgXCJWb2lkIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS5cIiwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgICAgICBmYWlsKFwiTUlTU0lOR19SRVRVUk5fVkFMVUVcIiwgYEZ1bmN0aW9uIHJldHVybiByZXF1aXJlcyBhICR7dHlwZURlc2NyaXB0aW9uKHJldHVyblR5cGUpfSB2YWx1ZS5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBub3JtYWxpemVPd25lZE1vdmUoc3RhdGVtZW50LmV4cHJlc3Npb24sIHJldHVyblR5cGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgZnVuY3Rpb25zLFxuICAgICAgICAgIHJlY29yZHMsXG4gICAgICAgICAgZmFpbCxcbiAgICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgICAgIFwiYSByZXR1cm5lZCB2YWx1ZVwiLFxuICAgICAgICAgIHJldHVyblR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsVHlwZSwgcmV0dXJuVHlwZSkpIHtcbiAgICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUmV0dXJuIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihyZXR1cm5UeXBlKX0uYCwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbikgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBub3JtYWwgPSBmYWxzZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY29uZGl0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uXCIpXG5cbiAgICAgIGlmICghaXNTY2FsYXJUeXBlKGNvbmRpdGlvblR5cGUsIFwiYm9vbGVhblwiKSkge1xuICAgICAgICBmYWlsKFwiTk9OX0JPT0xFQU5fQ09ORElUSU9OXCIsIGBJZiBjb25kaXRpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb25kaXRpb25UeXBlKX07IGV4cGVjdGVkIGJvb2xlYW4uYCwgc3RhdGVtZW50LmNvbmRpdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGVCaW5kaW5ncyA9IGJpbmRpbmdzVmlzaWJsZUZyb20oc2NvcGUpXG4gICAgICBjb25zdCBpbml0aWFsS25vd25WYWx1ZXMgPSB2aXNpYmxlQmluZGluZ3MubWFwKChiaW5kaW5nKSA9PiBiaW5kaW5nLmtub3duVmFsdWUpXG4gICAgICBjb25zdCBjb25zZXF1ZW50U2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgc3RhdGVtZW50LmNvbnNlcXVlbnQuc3RhdGVtZW50cylcbiAgICAgIGNvbnN0IGFsdGVybmF0ZVNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5hbHRlcm5hdGU/LnN0YXRlbWVudHMgPz8gW10pXG4gICAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBjb25zZXF1ZW50U2NvcGUsIHRydWUpXG4gICAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBhbHRlcm5hdGVTY29wZSwgZmFsc2UpXG4gICAgICBjb25zdCBjb25zZXF1ZW50UmV0dXJucyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIGNvbnNlcXVlbnRTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dClcbiAgICAgIGNvbnN0IGNvbnNlcXVlbnRLbm93blZhbHVlcyA9IHZpc2libGVCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcua25vd25WYWx1ZSlcblxuICAgICAgdmlzaWJsZUJpbmRpbmdzLmZvckVhY2goKGJpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IGluaXRpYWxLbm93blZhbHVlc1tpbmRleF1cbiAgICAgIH0pXG4gICAgICBsZXQgYWx0ZXJuYXRlUmV0dXJucyA9IHtub3JtYWw6IHRydWUsIHJhaXNlczogbmV3IFNldCgpfVxuXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICBhbHRlcm5hdGVSZXR1cm5zID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBhbHRlcm5hdGVTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsdGVybmF0ZUtub3duVmFsdWVzID0gdmlzaWJsZUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5rbm93blZhbHVlKVxuXG4gICAgICB2aXNpYmxlQmluZGluZ3MuZm9yRWFjaCgoYmluZGluZywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCFjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWwpIGJpbmRpbmcua25vd25WYWx1ZSA9IGFsdGVybmF0ZUtub3duVmFsdWVzW2luZGV4XVxuICAgICAgICBlbHNlIGlmIChjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgIWFsdGVybmF0ZVJldHVybnMubm9ybWFsKSBiaW5kaW5nLmtub3duVmFsdWUgPSBjb25zZXF1ZW50S25vd25WYWx1ZXNbaW5kZXhdXG4gICAgICAgIGVsc2UgaWYgKGNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCAmJiBhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbCAmJiBjb25zZXF1ZW50S25vd25WYWx1ZXNbaW5kZXhdID09PSBhbHRlcm5hdGVLbm93blZhbHVlc1tpbmRleF0pIHtcbiAgICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSBjb25zZXF1ZW50S25vd25WYWx1ZXNbaW5kZXhdXG4gICAgICAgIH0gZWxzZSBiaW5kaW5nLmtub3duVmFsdWUgPSB1bmRlZmluZWRcbiAgICAgIH0pXG4gICAgICBjb25zdCBjb250aW51aW5nUHJvb2ZzID0gIWNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCAmJiBhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbFxuICAgICAgICA/IGFsdGVybmF0ZVNjb3BlLnByZXNlbmNlUHJvb2ZzXG4gICAgICAgIDogY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmICFhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbFxuICAgICAgICAgID8gY29uc2VxdWVudFNjb3BlLnByZXNlbmNlUHJvb2ZzXG4gICAgICAgICAgOiBjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWxcbiAgICAgICAgICAgID8gbmV3IFNldChbLi4uY29uc2VxdWVudFNjb3BlLnByZXNlbmNlUHJvb2ZzXS5maWx0ZXIoKGJpbmRpbmcpID0+IGFsdGVybmF0ZVNjb3BlLnByZXNlbmNlUHJvb2ZzLmhhcyhiaW5kaW5nKSkpXG4gICAgICAgICAgICA6IG5ldyBTZXQoKVxuICAgICAgY29uc3QgdmlzaWJsZVNldCA9IG5ldyBTZXQodmlzaWJsZUJpbmRpbmdzKVxuXG4gICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgY29udGludWluZ1Byb29mcykge1xuICAgICAgICBpZiAodmlzaWJsZVNldC5oYXMoYmluZGluZykpIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmFkZChiaW5kaW5nKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGNvbnNlcXVlbnRSZXR1cm5zLnJhaXNlcylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGFsdGVybmF0ZVJldHVybnMucmFpc2VzKVxuICAgICAgbm9ybWFsID0gY29uc2VxdWVudFJldHVybnMubm9ybWFsIHx8IGFsdGVybmF0ZVJldHVybnMubm9ybWFsXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBhc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb25kaXRpb24tY29udHJvbGxlZCBsb29wIGNvbmRpdGlvblwiXG4gICAgICApXG5cbiAgICAgIGlmICghaXNTY2FsYXJUeXBlKGNvbmRpdGlvblR5cGUsIFwiYm9vbGVhblwiKSkge1xuICAgICAgICBmYWlsKFwiTk9OX0JPT0xFQU5fQ09ORElUSU9OXCIsIGBXaGlsZSBjb25kaXRpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb25kaXRpb25UeXBlKX07IGV4cGVjdGVkIGJvb2xlYW4uYCwgc3RhdGVtZW50LmNvbmRpdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb3BTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuXG4gICAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBsb29wU2NvcGUsIHRydWUpXG4gICAgICBjb25zdCBib2R5RmxvdyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmJvZHksIGxvb3BTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7bmVhcmVzdDogc3RhdGVtZW50LCBvd25lcjogbG9vcENvbnRleHQub3duZXIsIG93bmVyczogbG9vcENvbnRleHQub3duZXJzfSlcblxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBsaXN0VHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQubGlzdCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBpdGVyYXRpb24gY29sbGVjdGlvblwiKVxuXG4gICAgICBpZiAobGlzdFR5cGUua2luZCAhPSBcIkxpc3RUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYEl0ZXJhdGlvbiBjb2xsZWN0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24obGlzdFR5cGUpfTsgZXhwZWN0ZWQgbGlzdC5gLCBzdGF0ZW1lbnQubGlzdC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghc3RhdGVtZW50LnZhbHVlQmluZGluZyB8fCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmtpbmQgIT0gXCJWYWx1ZUJpbmRpbmdcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkl0ZXJhdGlvbiByZXF1aXJlcyBvbmUgdHlwZWQgdmFsdWUgYmluZGluZy5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJdGVyYXRpb24gYmluZGluZyBtdXN0IGJlIGltbXV0YWJsZS5cIiwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbiA/PyBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBiaW5kaW5nVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBzY29wZS50eXBlUGFyYW1ldGVycylcblxuICAgICAgaWYgKCFzYW1lVHlwZShiaW5kaW5nVHlwZSwgbGlzdFR5cGUuZWxlbWVudFR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBJdGVyYXRpb24gYmluZGluZyB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGJpbmRpbmdUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGxpc3RUeXBlLmVsZW1lbnRUeXBlKX0uYCxcbiAgICAgICAgICB0eXBlTG9jYXRpb24oc3RhdGVtZW50LnZhbHVlQmluZGluZy50eXBlLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFzc2lnbmVkT3V0ZXJCaW5kaW5ncyA9IG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuYm9keSwgc2NvcGUpXG5cbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29uc3QgbG9vcFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5ib2R5LnN0YXRlbWVudHMpXG5cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZSwge1xuICAgICAgICBrbm93blZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG11dGFibGU6IGZhbHNlLFxuICAgICAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICAgICAgfSwgcm9sZUxvY2F0aW9uKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcsIFwibmFtZVwiKSwgbG9vcFNjb3BlLCBmYWlsKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBsb29wU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywge25lYXJlc3Q6IHN0YXRlbWVudCwgb3duZXI6IGxvb3BDb250ZXh0Lm93bmVyLCBvd25lcnM6IGxvb3BDb250ZXh0Lm93bmVyc30pXG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5saXN0LCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBtYXBUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKHN0YXRlbWVudC5tYXAsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICAgIFwiYSBtYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb25cIilcblxuICAgICAgaWYgKG1hcFR5cGUua2luZCAhPSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBpdGVyYXRpb24gY29sbGVjdGlvbiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKG1hcFR5cGUpfTsgZXhwZWN0ZWQgb3JkZXJlZCBtYXAuYCwgc3RhdGVtZW50Lm1hcC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghc3RhdGVtZW50LmtleUJpbmRpbmcgfHwgc3RhdGVtZW50LmtleUJpbmRpbmcua2luZCAhPSBcIlZhbHVlQmluZGluZ1wiIHx8XG4gICAgICAgICFzdGF0ZW1lbnQudmFsdWVCaW5kaW5nIHx8IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcua2luZCAhPSBcIlZhbHVlQmluZGluZ1wiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFwIGl0ZXJhdGlvbiByZXF1aXJlcyBleGFjdCBrZXkgYW5kIHZhbHVlIGJpbmRpbmdzLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGVtZW50LmtleUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UgfHwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5tdXRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBpdGVyYXRpb24gYmluZGluZ3MgbXVzdCBiZSBpbW11dGFibGUuXCIsXG4gICAgICAgICAgc3RhdGVtZW50LmtleUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UgPyBzdGF0ZW1lbnQua2V5QmluZGluZy5sb2NhdGlvbiA6IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBrZXlUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LmtleUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LmtleUJpbmRpbmcubG9jYXRpb24sIGZhaWwsXG4gICAgICAgIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24sIGZhaWwsXG4gICAgICAgIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoa2V5VHlwZSwgbWFwVHlwZS5rZXlUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGl0ZXJhdGlvbiBrZXkgYmluZGluZyB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGtleVR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24obWFwVHlwZS5rZXlUeXBlKX0uYCxcbiAgICAgICAgICB0eXBlTG9jYXRpb24oc3RhdGVtZW50LmtleUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LmtleUJpbmRpbmcubG9jYXRpb24pKVxuICAgICAgfVxuICAgICAgaWYgKCFzYW1lVHlwZSh2YWx1ZVR5cGUsIG1hcFR5cGUudmFsdWVUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGl0ZXJhdGlvbiB2YWx1ZSBiaW5kaW5nIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24odmFsdWVUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKG1hcFR5cGUudmFsdWVUeXBlKX0uYCxcbiAgICAgICAgICB0eXBlTG9jYXRpb24oc3RhdGVtZW50LnZhbHVlQmluZGluZy50eXBlLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFzc2lnbmVkT3V0ZXJCaW5kaW5ncyA9IG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuYm9keSwgc2NvcGUpXG5cbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29uc3QgbG9vcFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5ib2R5LnN0YXRlbWVudHMpXG5cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC5rZXlCaW5kaW5nLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlOiBrZXlUeXBlfSxcbiAgICAgICAgcm9sZUxvY2F0aW9uKHN0YXRlbWVudC5rZXlCaW5kaW5nLCBcIm5hbWVcIiksIGxvb3BTY29wZSwgZmFpbClcbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGU6IHZhbHVlVHlwZX0sXG4gICAgICAgIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBcIm5hbWVcIiksIGxvb3BTY29wZSwgZmFpbClcbiAgICAgIGNvbnN0IGJvZHlGbG93ID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYm9keSwgbG9vcFNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsXG4gICAgICAgIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtuZWFyZXN0OiBzdGF0ZW1lbnQsIG93bmVyOiBsb29wQ29udGV4dC5vd25lciwgb3duZXJzOiBsb29wQ29udGV4dC5vd25lcnN9KVxuXG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5tYXAsIGNhbGxFZmZlY3RzKVxuICAgICAgYWRkQWxsKHJhaXNlcywgYm9keUZsb3cucmFpc2VzKVxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncykge1xuICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSB1bmRlZmluZWRcbiAgICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudC5lcnJvciB8fCBzdGF0ZW1lbnQuZXJyb3Iua2luZCAhPSBcIkVycm9yQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgICAgZmFpbChcIk5PTl9FUlJPUl9SQUlTRVwiLCBcIlJhaXNlIHJlcXVpcmVzIG9uZSBjb25zdHJ1Y3RlZCBzZW1hbnRpYyBlcnJvci5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgcmFpc2VkVHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKHN0YXRlbWVudC5lcnJvci5lcnJvciwgc3RhdGVtZW50LmVycm9yLmxvY2F0aW9uLCBlcnJvcnMsIGZhaWwpXG4gICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gZXJyb3IgbWVzc2FnZVwiLCBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gICAgICApXG5cbiAgICAgIGlmICghaXNTY2FsYXJUeXBlKG1lc3NhZ2VUeXBlLCBcInN0cmluZ1wiKSkge1xuICAgICAgICBmYWlsKFwiTk9OX0VSUk9SX1JBSVNFXCIsIGBFcnJvciBtZXNzYWdlIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24obWVzc2FnZVR5cGUpfTsgZXhwZWN0ZWQgc3RyaW5nLmAsIHN0YXRlbWVudC5lcnJvci5tZXNzYWdlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZSwgY2FsbEVmZmVjdHMpXG4gICAgICByYWlzZXMuYWRkKHJhaXNlZFR5cGUuZGVjbGFyYXRpb25JZClcbiAgICAgIG5vcm1hbCA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY2F1Z2h0VHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKHN0YXRlbWVudC5jYXRjaFR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZXJyb3JzLCBmYWlsKVxuXG4gICAgICBpZiAoIXN0YXRlbWVudC5jYXRjaEJpbmRpbmcgfHwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5raW5kICE9IFwiQ2F0Y2hCaW5kaW5nXCIgfHwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5tdXRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9FUlJPUl9IQU5ETEVSXCIsIFwiQ2F0Y2ggcmVxdWlyZXMgb25lIGltbXV0YWJsZSB0eXBlZCBiaW5kaW5nLlwiLCBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nPy5sb2NhdGlvbiA/PyBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBiaW5kaW5nVHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKHN0YXRlbWVudC5jYXRjaEJpbmRpbmcudHlwZSwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5sb2NhdGlvbiwgZXJyb3JzLCBmYWlsKVxuXG4gICAgICBpZiAoYmluZGluZ1R5cGUuZGVjbGFyYXRpb25JZCAhPSBjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfRVJST1JfSEFORExFUlwiLCBcIkNhdGNoIGJpbmRpbmcgdHlwZSBtdXN0IGV4YWN0bHkgbWF0Y2ggaXRzIGhhbmRsZXIgdHlwZS5cIiwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHlBc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuICAgICAgY29uc3QgYXNzaWduZWRPdXRlckJpbmRpbmdzID0gbmV3IFNldChib2R5QXNzaWduZWRPdXRlckJpbmRpbmdzKVxuXG4gICAgICBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmNhdGNoQm9keSwgc2NvcGUsIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncylcbiAgICAgIGNvbnN0IGJvZHlTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBib2R5U2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG4gICAgICBjb25zdCBjYXRjaFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5jYXRjaEJvZHkuc3RhdGVtZW50cylcblxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGJvZHlBc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIGNhdGNoU2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICB9XG5cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubmFtZSwge1xuICAgICAgICBrbm93blZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG11dGFibGU6IGZhbHNlLFxuICAgICAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICAgICAgfSwgcm9sZUxvY2F0aW9uKHN0YXRlbWVudC5jYXRjaEJpbmRpbmcsIFwibmFtZVwiKSwgY2F0Y2hTY29wZSwgZmFpbClcbiAgICAgIGNvbnN0IGNhdGNoRmxvdyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmNhdGNoQm9keSwgY2F0Y2hTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dClcblxuICAgICAgaWYgKCFib2R5Rmxvdy5yYWlzZXMuaGFzKGNhdWdodFR5cGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgICAgZmFpbChcIlVOUkVBQ0hBQkxFX0hBTkRMRVJcIiwgYEhhbmRsZXIgZm9yICcke2Vycm9ycy5nZXQoY2F1Z2h0VHlwZS5kZWNsYXJhdGlvbklkKT8ubmFtZX0nIGNhbm5vdCBiZSByZWFjaGVkLmAsIHR5cGVMb2NhdGlvbihzdGF0ZW1lbnQuY2F0Y2hUeXBlLCBzdGF0ZW1lbnQubG9jYXRpb24pKVxuICAgICAgfVxuICAgICAgYm9keUZsb3cucmFpc2VzLmRlbGV0ZShjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpXG4gICAgICBhZGRBbGwocmFpc2VzLCBib2R5Rmxvdy5yYWlzZXMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBjYXRjaEZsb3cucmFpc2VzKVxuICAgICAgbm9ybWFsID0gYm9keUZsb3cubm9ybWFsIHx8IGNhdGNoRmxvdy5ub3JtYWxcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB1bmV4cGVjdGVkID0gLyoqIEB0eXBlIHt7a2luZDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn19ICovIChzdGF0ZW1lbnQpXG5cbiAgICBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsIHVuZXhwZWN0ZWQua2luZCwgdW5leHBlY3RlZC5sb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7bm9ybWFsLCByYWlzZXN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBleGFjdCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgbG9jYXRpb24uXG4gKiBAcGFyYW0ge0Vycm9yUmVnaXN0cnl9IGVycm9ycyAtIFZpc2libGUgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JUeXBlfSBWYWxpZGF0ZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFcnJvclR5cGUodHlwZSwgbG9jYXRpb24sIGVycm9ycywgZmFpbCkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJVTktOT1dOX0VSUk9SXCIsIFwiSGFuZGxlciBvciByYWlzZSBpcyBtaXNzaW5nIGFuIGV4YWN0IGVycm9yIHR5cGUuXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvclR5cGV9ICovICh0eXBlKVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIkVycm9yVHlwZVwiIHx8XG4gICAgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFlcnJvcnMuaGFzKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKSkge1xuICAgIGZhaWwoXCJVTktOT1dOX0VSUk9SXCIsIGBVbmtub3duIGVycm9yIGRlY2xhcmF0aW9uICcke1N0cmluZyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCl9Jy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gIH1cblxuICByZXR1cm4gY2FuZGlkYXRlXG59XG5cbi8qKlxuICogQWRkcyBldmVyeSBzb3VyY2UgdmFsdWUgdG8gb25lIHNldC5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHRhcmdldCAtIERlc3RpbmF0aW9uIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBzb3VyY2UgLSBTb3VyY2UgaWRlbnRpdGllcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZGRBbGwodGFyZ2V0LCBzb3VyY2UpIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHRhcmdldC5hZGQodmFsdWUpXG59XG5cbi8qKlxuICogQWRkcyB1bmNoZWNrZWQgZXJyb3JzIHJhaXNlZCB3aGlsZSBldmFsdWF0aW5nIG9uZSBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdGFyZ2V0IC0gRGVzdGluYXRpb24gaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBzZW1hbnRpYyBleHByZXNzaW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gSW5mZXJyZWQgY2FsbCBlZmZlY3RzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFttZXRob2RFZmZlY3RzXSAtIEluZmVycmVkIGVmZmVjdHMgYnkgcmVzb2x2ZWQgbWV0aG9kIGlkZW50aXR5LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEV4cHJlc3Npb25FZmZlY3RzKHRhcmdldCwgZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgcGVuZGluZyA9IFtleHByZXNzaW9uXVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGVuZGluZy5wb3AoKVxuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSBhZGRBbGwodGFyZ2V0LCBjYWxsRWZmZWN0cy5nZXQoUmVmbGVjdC5nZXQodmFsdWUsIFwiY2FsbGVlXCIpKSA/PyBuZXcgU2V0KCkpXG4gICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiIHx8IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgICAgY29uc3QgZmFpbHVyZXMgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJmYWlsdXJlSWRzXCIpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmYWlsdXJlcykpIGZvciAoY29uc3QgZmFpbHVyZSBvZiBmYWlsdXJlcykgaWYgKHR5cGVvZiBmYWlsdXJlID09IFwic3RyaW5nXCIpIHRhcmdldC5hZGQoZmFpbHVyZSlcbiAgICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgICBhZGRBbGwodGFyZ2V0LCBtZXRob2RFZmZlY3RzLmdldChSZWZsZWN0LmdldCh2YWx1ZSwgXCJtZXRob2RcIikpID8/IG5ldyBTZXQoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCByZXNvbHV0aW9uID0gUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb2x1dGlvblwiKVxuICAgICAgY29uc3QgZmFpbHVyZXMgPSByZXNvbHV0aW9uICYmIHR5cGVvZiByZXNvbHV0aW9uID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChyZXNvbHV0aW9uLCBcImZhaWx1cmVJZHNcIikgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmFpbHVyZXMpKSBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgZmFpbHVyZXMpIGlmICh0eXBlb2YgZmFpbHVyZSA9PSBcInN0cmluZ1wiKSB0YXJnZXQuYWRkKGZhaWx1cmUpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKFtcImxvY2F0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiLCBcInJlc29sdXRpb25cIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgcGVuZGluZy5wdXNoKC4uLmNoaWxkKVxuICAgICAgZWxzZSBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmVzIHVuY2hlY2tlZC1lcnJvciBwcm9wYWdhdGlvbiBvdmVyIHRoZSByZXNvbHZlZCBmaW5pdGUgZnVuY3Rpb24gZ3JhcGguXG4gKiBUaGlzIGlzIHZhbGlkYXRvciBzdGF0ZSwgbmV2ZXIgYSBjaGVja2VkIGVmZmVjdCBpbiB0aGUgcHVibGljIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gUmVzb2x2ZWQgZnVuY3Rpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFtzZWVkRWZmZWN0c10gLSBEZXBlbmRlbmN5IGVmZmVjdHMga2V5ZWQgYnkgbG9jYWwgaW1wb3J0IG5hbWUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbbG9jYWxGdW5jdGlvbk5hbWVzXSAtIEZ1bmN0aW9ucyB3aG9zZSBib2RpZXMgYmVsb25nIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IEVzY2FwaW5nIGVycm9yIGlkZW50aXRpZXMgYnkgc291cmNlLXZpc2libGUgZnVuY3Rpb24gbmFtZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJDYWxsRWZmZWN0cyhmdW5jdGlvbnMsIHNlZWRFZmZlY3RzID0gbmV3IE1hcCgpLCBsb2NhbEZ1bmN0aW9uTmFtZXMgPSBuZXcgU2V0KGZ1bmN0aW9ucy5rZXlzKCkpKSB7XG4gIGNvbnN0IGVmZmVjdHMgPSBuZXcgTWFwKFsuLi5mdW5jdGlvbnMua2V5cygpXS5tYXAoKG5hbWUpID0+IFtuYW1lLCBuZXcgU2V0KHNlZWRFZmZlY3RzLmdldChuYW1lKSA/PyBbXSldKSlcbiAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2VcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWxGdW5jdGlvbk5hbWVzKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGZ1bmN0aW9ucy5nZXQobmFtZSlcblxuICAgICAgaWYgKCFkZWNsYXJhdGlvbikgY29udGludWVcbiAgICAgIGNvbnN0IG5leHQgPSBzeW50YWN0aWNCbG9ja0VmZmVjdHMoZGVjbGFyYXRpb24uYm9keSwgZWZmZWN0cylcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAoZWZmZWN0cy5nZXQobmFtZSkpXG5cbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2YgbmV4dCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQuaGFzKGVycm9yKSkge1xuICAgICAgICAgIGN1cnJlbnQuYWRkKGVycm9yKVxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0c1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGVzY2FwaW5nIGlkZW50aXRpZXMgZnJvbSBvbmUgYmxvY2sgZm9yIHRoZSBjYWxsLWVmZmVjdCBmaXhlZCBwb2ludC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYmxvY2sgLSBDYW5kaWRhdGUgYmxvY2suXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY2FsbEVmZmVjdHMgLSBDdXJyZW50IGZpeGVkLXBvaW50IHN0YXRlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFttZXRob2RFZmZlY3RzXSAtIEN1cnJlbnQgbWV0aG9kIGZpeGVkLXBvaW50IHN0YXRlLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBFc2NhcGluZyBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBzeW50YWN0aWNCbG9ja0VmZmVjdHMoYmxvY2ssIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKVxuICBjb25zdCBzdGF0ZW1lbnRzID0gUmVmbGVjdC5nZXQoLyoqIEB0eXBlIHtvYmplY3R9ICovIChibG9jayA/PyB7fSksIFwic3RhdGVtZW50c1wiKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRzKSkgcmV0dXJuIHJlc3VsdFxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgaWYgKCFzdGF0ZW1lbnQgfHwgdHlwZW9mIHN0YXRlbWVudCAhPSBcIm9iamVjdFwiKSBjb250aW51ZVxuICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwia2luZFwiKVxuXG4gICAgaWYgKGtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3Rpb24gPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiZXJyb3JcIilcbiAgICAgIGNvbnN0IHR5cGUgPSBjb25zdHJ1Y3Rpb24gJiYgdHlwZW9mIGNvbnN0cnVjdGlvbiA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQoY29uc3RydWN0aW9uLCBcImVycm9yXCIpIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gdHlwZSAmJiB0eXBlb2YgdHlwZSA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQodHlwZSwgXCJkZWNsYXJhdGlvbklkXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiKSByZXN1bHQuYWRkKGRlY2xhcmF0aW9uSWQpXG4gICAgICBpZiAoY29uc3RydWN0aW9uICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24gPT0gXCJvYmplY3RcIikge1xuICAgICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KGNvbnN0cnVjdGlvbiwgXCJtZXNzYWdlXCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGJvZHlFZmZlY3RzID0gc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJib2R5XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIGNvbnN0IGNhdGNoVHlwZSA9IFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjYXRjaFR5cGVcIilcbiAgICAgIGNvbnN0IGNhdWdodElkID0gY2F0Y2hUeXBlICYmIHR5cGVvZiBjYXRjaFR5cGUgPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KGNhdGNoVHlwZSwgXCJkZWNsYXJhdGlvbklkXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICh0eXBlb2YgY2F1Z2h0SWQgPT0gXCJzdHJpbmdcIiAmJiBib2R5RWZmZWN0cy5kZWxldGUoY2F1Z2h0SWQpKSB7XG4gICAgICAgIGFkZEFsbChib2R5RWZmZWN0cywgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjYXRjaEJvZHlcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgIH1cbiAgICAgIGFkZEFsbChyZXN1bHQsIGJvZHlFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjb25kaXRpb25cIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKVxuICAgICAgYWRkQWxsKHJlc3VsdCwgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjb25zZXF1ZW50XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpXG4gICAgICBhZGRBbGwocmVzdWx0LCBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImFsdGVybmF0ZVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwga2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIGtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgPyBcImxpc3RcIiA6IFwibWFwXCIpLCBjYWxsRWZmZWN0cyxcbiAgICAgICAgbWV0aG9kRWZmZWN0cylcbiAgICAgIGFkZEFsbChyZXN1bHQsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiYm9keVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjb25kaXRpb25cIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKVxuICAgICAgYWRkQWxsKHJlc3VsdCwgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJib2R5XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbXCJleHByZXNzaW9uXCIsIFwiaW5pdGlhbGl6ZXJcIl0pIHtcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJlc3VsdCwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBrZXkpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRGVyaXZlcyB0aGUgZXNjYXBpbmcgdXNlci1kZWZpbmVkIGVycm9yIHNldHMgZm9yIGxvY2FsIGZ1bmN0aW9ucyBhbmQgcmVzb2x2ZWQgY2xhc3MgbWV0aG9kcy5cbiAqIFRoZSBmaXhlZCBwb2ludCBpcyBjb21wdXRlZCBvdmVyIGV2ZXJ5IHVuY2hlY2tlZCBlcnJvcjsgY2FwYWJpbGl0eSBmYWlsdXJlcyBhcmUgcHJvamVjdGVkIG91dFxuICogYmVjYXVzZSBjYWxsIHNpdGVzIGFscmVhZHkgY2FycnkgdGhlaXIgY2FwYWJpbGl0eS1mYWlsdXJlIGJvdW5kYXJ5IHRocm91Z2ggcmVzb2x1dGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gUmVzb2x2ZWQgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFtzZWVkRWZmZWN0c10gLSBEZXBlbmRlbmN5IGVmZmVjdHMga2V5ZWQgYnkgbG9jYWwgaW1wb3J0IG5hbWUuXG4gKiBAcmV0dXJucyB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBFc2NhcGluZyB1c2VyLWRlZmluZWQgZXJyb3IgaWRlbnRpdGllcyBieSBmdW5jdGlvbiBuYW1lIGFuZCBtZXRob2QgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckVzY2FwaW5nRXJyb3JFZmZlY3RzKG1vZHVsZSwgc2VlZEVmZmVjdHMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgZnVuY3Rpb25zID0gbmV3IE1hcChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbl0pKVxuICBjb25zdCBmdW5jdGlvbkVmZmVjdHMgPSBuZXcgTWFwKFsuLi5mdW5jdGlvbnMua2V5cygpXS5tYXAoKG5hbWUpID0+IFtuYW1lLCBuZXcgU2V0KHNlZWRFZmZlY3RzLmdldChuYW1lKSA/PyBbXSldKSlcbiAgY29uc3QgY2xhc3NlcyA9IG1vZHVsZS5jbGFzc2VzID8/IFtdXG4gIGNvbnN0IG1ldGhvZEVmZmVjdHMgPSBuZXcgTWFwKClcbiAgY29uc3QgY2FwYWJpbGl0eUZhaWx1cmVJZHMgPSBuZXcgU2V0KChtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKS5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcykubWFwKCh7aWR9KSA9PiBpZCkpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBjbGFzc2VzKSBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBtZXRob2RFZmZlY3RzLnNldChtZXRob2QuaWQsIG5ldyBTZXQoKSlcbiAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2VcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAoZnVuY3Rpb25FZmZlY3RzLmdldChkZWNsYXJhdGlvbi5uYW1lKSlcbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2Ygc3ludGFjdGljQmxvY2tFZmZlY3RzKGRlY2xhcmF0aW9uLmJvZHksIGZ1bmN0aW9uRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50LmhhcyhlcnJvcikpIHsgY3VycmVudC5hZGQoZXJyb3IpOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgY2xhc3Nlcykge1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKG1ldGhvZEVmZmVjdHMuZ2V0KG1ldGhvZC5pZCkpXG4gICAgICAgIGZvciAoY29uc3QgZXJyb3Igb2Ygc3ludGFjdGljQmxvY2tFZmZlY3RzKG1ldGhvZC5ib2R5LCBmdW5jdGlvbkVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKSB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50LmhhcyhlcnJvcikpIHsgY3VycmVudC5hZGQoZXJyb3IpOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVmZmVjdHMgb2YgW2Z1bmN0aW9uRWZmZWN0cywgbWV0aG9kRWZmZWN0c10pIHtcbiAgICBmb3IgKGNvbnN0IGVycm9ycyBvZiBlZmZlY3RzLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIFsuLi5lcnJvcnNdKSBpZiAoY2FwYWJpbGl0eUZhaWx1cmVJZHMuaGFzKGVycm9yKSkgZXJyb3JzLmRlbGV0ZShlcnJvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2Z1bmN0aW9uczogZnVuY3Rpb25FZmZlY3RzLCBtZXRob2RzOiBtZXRob2RFZmZlY3RzfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsZXhpY2FsIHNjb3BlIHdpdGggZGVjbGFyYXRpb25zIG1hcmtlZCBwZW5kaW5nIHVudGlsIHZpc2l0ZWQuXG4gKiBAcGFyYW0ge1Njb3BlIHwgdW5kZWZpbmVkfSBwYXJlbnQgLSBFbmNsb3Npbmcgc2NvcGUuXG4gKiBAcGFyYW0ge3traW5kOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmd9W119IHN0YXRlbWVudHMgLSBTY29wZSBzdGF0ZW1lbnRzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3Jlc2VydmVkTmFtZXNdIC0gTmFtZXMgdW5hdmFpbGFibGUgdG8gcm9vdCBiaW5kaW5ncy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgdHlwZSBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IFtjdXJyZW50Q2xhc3NdIC0gRGVjbGFyaW5nIGNsYXNzIGZvciByZWNlaXZlci1wcml2YXRlIGFjY2Vzcy5cbiAqIEByZXR1cm5zIHtTY29wZX0gU2NvcGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHBhcmVudCwgc3RhdGVtZW50cywgcmVzZXJ2ZWROYW1lcyA9IG5ldyBTZXQoKSwgdHlwZVBhcmFtZXRlcnMgPSBwYXJlbnQ/LnR5cGVQYXJhbWV0ZXJzID8/IG5ldyBTZXQoKSxcbiAgY3VycmVudENsYXNzID0gcGFyZW50Py5jdXJyZW50Q2xhc3MpIHtcbiAgY29uc3QgcGVuZGluZyA9IG5ldyBTZXQoc3RhdGVtZW50cy5maWx0ZXIoKHN0YXRlbWVudCkgPT4gc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpXG4gICAgLm1hcCgoc3RhdGVtZW50KSA9PiAvKiogQHR5cGUge3tuYW1lOiBzdHJpbmd9fSAqLyAoc3RhdGVtZW50KS5uYW1lKSlcblxuICByZXR1cm4ge1xuICAgIGJpbmRpbmdzOiBuZXcgTWFwKCksXG4gICAgY3VycmVudENsYXNzLFxuICAgIHBhcmVudCxcbiAgICBwZW5kaW5nLFxuICAgIHByZXNlbmNlUHJvb2ZzOiBuZXcgU2V0KHBhcmVudD8ucHJlc2VuY2VQcm9vZnMgPz8gW10pLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHVzZWROYW1lczogcGFyZW50Py51c2VkTmFtZXMgPz8gbmV3IFNldChyZXNlcnZlZE5hbWVzKVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbXBsZS1pZGVudGlmaWVyIHByZXNlbmNlIHByb29mIHRvIGV4YWN0bHkgdGhlIGJyYW5jaCB3aGVyZSB0aGUgdGVzdCBpcyB0cnVlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGNvbmRpdGlvbiAtIFZhbGlkYXRlZCBicmFuY2ggY29uZGl0aW9uLlxuICogQHBhcmFtIHtTY29wZX0gc291cmNlU2NvcGUgLSBTY29wZSBjb250YWluaW5nIHRoZSB0ZXN0ZWQgYmluZGluZy5cbiAqIEBwYXJhbSB7U2NvcGV9IGJyYW5jaFNjb3BlIC0gQnJhbmNoLWxvY2FsIHByb29mIHNjb3BlLlxuICogQHBhcmFtIHtib29sZWFufSBicmFuY2hXaGVuVHJ1ZSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgY29uZGl0aW9uJ3MgdHJ1ZSBicmFuY2guXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhjb25kaXRpb24sIHNvdXJjZVNjb3BlLCBicmFuY2hTY29wZSwgYnJhbmNoV2hlblRydWUpIHtcbiAgbGV0IHRlc3QgPSBjb25kaXRpb25cbiAgbGV0IHByZXNlbnRXaGVuVHJ1ZSA9IHRydWVcblxuICBpZiAoY29uZGl0aW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIiAmJiBjb25kaXRpb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk5vdFwiICYmXG4gICAgY29uZGl0aW9uLm9wZXJhbmQua2luZCA9PSBcIk9wdGlvbmFsSXNQcmVzZW50XCIpIHtcbiAgICB0ZXN0ID0gY29uZGl0aW9uLm9wZXJhbmRcbiAgICBwcmVzZW50V2hlblRydWUgPSBmYWxzZVxuICB9XG4gIGlmICh0ZXN0LmtpbmQgIT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSByZXR1cm5cbiAgY29uc3QgYmluZGluZyA9IGZpbmRCaW5kaW5nKHRlc3Qub3BlcmFuZC5uYW1lLCBzb3VyY2VTY29wZSlcblxuICBpZiAoIWJpbmRpbmcpIHJldHVyblxuICBpZiAoYnJhbmNoV2hlblRydWUgPT0gcHJlc2VudFdoZW5UcnVlKSBicmFuY2hTY29wZS5wcmVzZW5jZVByb29mcy5hZGQoYmluZGluZylcbiAgZWxzZSBicmFuY2hTY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbn1cblxuLyoqXG4gKiBBZGRzIG9uZSBiaW5kaW5nIHdoaWxlIHJlamVjdGluZyBkdXBsaWNhdGVzIGFuZCBzaGFkb3dpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEJpbmRpbmcgbmFtZS5cbiAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyAtIEJpbmRpbmcgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIEN1cnJlbnQgc2NvcGUuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZUJpbmRpbmcobmFtZSwgYmluZGluZywgbG9jYXRpb24sIHNjb3BlLCBmYWlsKSB7XG4gIGlmIChzY29wZS51c2VkTmFtZXMuaGFzKG5hbWUpKSBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYER1cGxpY2F0ZSBvciBzaGFkb3dlZCBiaW5kaW5nICcke25hbWV9Jy5gLCBsb2NhdGlvbilcblxuICBzY29wZS5iaW5kaW5ncy5zZXQobmFtZSwgYmluZGluZylcbiAgc2NvcGUudXNlZE5hbWVzLmFkZChuYW1lKVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBpZGVudGlmaWVyIGFuZCBkaXN0aW5ndWlzaGVzIHVzZS1iZWZvcmUtZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEJpbmRpbmcgbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIEN1cnJlbnQgc2NvcGUuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7QmluZGluZ30gQmluZGluZy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmcobmFtZSwgbG9jYXRpb24sIHNjb3BlLCBmYWlsKSB7XG4gIGZvciAobGV0IGN1cnJlbnQgPSAvKiogQHR5cGUge1Njb3BlIHwgdW5kZWZpbmVkfSAqLyAoc2NvcGUpOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpIHtcbiAgICBjb25zdCBiaW5kaW5nID0gY3VycmVudC5iaW5kaW5ncy5nZXQobmFtZSlcblxuICAgIGlmIChiaW5kaW5nKSByZXR1cm4gYmluZGluZ1xuICAgIGlmIChjdXJyZW50LnBlbmRpbmcuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVTRV9CRUZPUkVfREVDTEFSQVRJT05cIiwgYEJpbmRpbmcgJyR7bmFtZX0nIGlzIHVzZWQgYmVmb3JlIGl0cyBkZWNsYXJhdGlvbi5gLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFpbChcIlVOUkVTT0xWRURfQklORElOR1wiLCBgVW5rbm93biBiaW5kaW5nICcke25hbWV9Jy5gLCBsb2NhdGlvbilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHNlbWFudGljIHZhbHVlIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE93bmluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBbc2Vlbl0gLSBBY3RpdmUgcmVjdXJzaXZlIHR5cGUgcGF0aC5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IFtyZWNvcmRzXSAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbdHlwZVBhcmFtZXRlcnNdIC0gVHlwZS12YXJpYWJsZSBpZGVudGl0aWVzIGluIGRlY2xhcmF0aW9uIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IFZhbGlkYXRlZCB2YWx1ZSB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgc2VlbiwgcmVjb3JkcyA9IG5ldyBNYXAoKSwgdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KCkpIHtcbiAgY29uc3QgY2FuZGlkYXRlID0gdmFsaWRhdGVUeXBlUmVmZXJlbmNlKHR5cGUsIGxvY2F0aW9uLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICBpZiAoaXNWb2lkVHlwZShjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlZPSURfQVNfVkFMVUVcIiwgXCJWb2lkIGlzIHZhbGlkIG9ubHkgYXMgYSBmdW5jdGlvbiByZXR1cm4gdHlwZS5cIiwgdHlwZUxvY2F0aW9uKHR5cGUsIGxvY2F0aW9uKSlcblxuICByZXR1cm4gY2FuZGlkYXRlXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBmdW5jdGlvbiByZXR1cm4gdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgc2VtYW50aWMgcmV0dXJuIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE93bmluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSBbcmVjb3Jkc10gLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIFR5cGUtdmFyaWFibGUgaWRlbnRpdGllcyBpbiBkZWNsYXJhdGlvbiBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBWYWxpZGF0ZWQgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgcmVjb3JkcyA9IG5ldyBNYXAoKSwgdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KCkpIHtcbiAgcmV0dXJuIHZhbGlkYXRlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgbmV3IFNldCgpLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHJlY3Vyc2l2ZSBzZW1hbnRpYyB0eXBlLXJlZmVyZW5jZSBzaGFwZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2l2ZSB0eXBlIHBhdGguXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSBbcmVjb3Jkc10gLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIFR5cGUtdmFyaWFibGUgaWRlbnRpdGllcyBpbiBkZWNsYXJhdGlvbiBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBWYWxpZGF0ZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUeXBlUmVmZXJlbmNlKHR5cGUsIGxvY2F0aW9uLCBmYWlsLCBzZWVuID0gbmV3IFNldCgpLCByZWNvcmRzID0gbmV3IE1hcCgpLCB0eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQoKSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgc2VtYW50aWMgdHlwZS5cIiwgbG9jYXRpb24pXG4gIH1cblxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9ICovICh0eXBlKVxuXG4gIGlmIChbXCJMaXN0VHlwZVwiLCBcIk1hcFR5cGVcIiwgXCJPcHRpb25hbFR5cGVcIiwgXCJPcmRlcmVkTWFwVHlwZVwiLCBcIlJlY29yZFR5cGVcIl0uaW5jbHVkZXMoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgY29udGFpbnNPd25lZFR5cGUoY2FuZGlkYXRlKSkge1xuICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBcIk93bmVkIHJlc291cmNlcyBhbmQgcmVmZXJlbmNlcyBjYW5ub3QgYmUgbmVzdGVkIGluIHZhbHVlIG9yIGdlbmVyaWMgdHlwZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgfVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIGlmICghaXNTY2FsYXJUeXBlTmFtZShjYW5kaWRhdGUubmFtZSkgJiYgY2FuZGlkYXRlLm5hbWUgIT0gXCJ2b2lkXCIpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgc2NhbGFyIG9yIHZvaWQgcmV0dXJuIHR5cGUuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJraW5kLGxvY2F0aW9uLHBhcmFtZXRlcklkXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUucGFyYW1ldGVySWQgIT0gXCJzdHJpbmdcIiB8fCAhdHlwZVBhcmFtZXRlcnMuaGFzKGNhbmRpZGF0ZS5wYXJhbWV0ZXJJZCkpIHtcbiAgICAgIGZhaWwoXCJGUkVFX1RZUEVfVkFSSUFCTEVcIiwgYEZyZWUgb3IgdW5rbm93biB0eXBlIHZhcmlhYmxlICcke1N0cmluZyhjYW5kaWRhdGUucGFyYW1ldGVySWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIilcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY29yZHMuZ2V0KGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCEoW1wiYXJndW1lbnRzLGRlY2xhcmF0aW9uSWQsa2luZFwiLCBcImRlY2xhcmF0aW9uSWQsa2luZFwiXS5pbmNsdWRlcyhrZXlzKSkgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFkZWNsYXJhdGlvbikge1xuICAgICAgZmFpbChcIlVOS05PV05fUkVDT1JEXCIsIGBVbmtub3duIHJlY29yZCBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBleHBlY3RlZEFyaXR5ID0gZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwXG5cbiAgICBpZiAoZXhwZWN0ZWRBcml0eSA+IDAgJiYgY2FuZGlkYXRlLmFyZ3VtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmYWlsKFwiUkFXX0dFTkVSSUNfQVBQTElDQVRJT05cIiwgYEdlbmVyaWMgcmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9JyByZXF1aXJlcyAke2V4cGVjdGVkQXJpdHl9IHR5cGUgYXJndW1lbnRzLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkQXJpdHkgPT0gMCAmJiBjYW5kaWRhdGUuYXJndW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZhaWwoXCJHRU5FUklDX0FSSVRZX01JU01BVENIXCIsIGBOb24tZ2VuZXJpYyByZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IGFjY2VwdCB0eXBlIGFyZ3VtZW50cy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGNhbmRpZGF0ZUFyZ3VtZW50cyA9IGNhbmRpZGF0ZS5hcmd1bWVudHNcblxuICAgIGlmIChjYW5kaWRhdGVBcmd1bWVudHMgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlQXJndW1lbnRzKSB8fFxuICAgICAgY2FuZGlkYXRlQXJndW1lbnRzLnNvbWUoKF9hcmd1bWVudCwgaW5kZXgpID0+ICFPYmplY3QuaGFzT3duKGNhbmRpZGF0ZUFyZ3VtZW50cywgaW5kZXgpKSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiR2VuZXJpYyByZWNvcmQgYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGFyZ3VtZW50c18gPSBjYW5kaWRhdGUuYXJndW1lbnRzID8/IFtdXG5cbiAgICBpZiAoYXJndW1lbnRzXy5sZW5ndGggIT0gZXhwZWN0ZWRBcml0eSkge1xuICAgICAgZmFpbChcIkdFTkVSSUNfQVJJVFlfTUlTTUFUQ0hcIiwgYFJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzICR7YXJndW1lbnRzXy5sZW5ndGh9IHR5cGUgYXJndW1lbnRzOyBleHBlY3RlZCAke2V4cGVjdGVkQXJpdHl9LmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY3Vyc2l2ZSBnZW5lcmljIGFwcGxpY2F0aW9ucyBjYW5ub3QgY29udGFpbiBjeWNsZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgYXJndW1lbnRzXykge1xuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoYXJndW1lbnQsIHR5cGVMb2NhdGlvbihhcmd1bWVudCwgbG9jYXRpb24pLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbiAgICB9XG4gICAgc2Vlbi5kZWxldGUoY2FuZGlkYXRlKVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgIGNvbnN0IGNsYXNzZXMgPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgIWNsYXNzZXMuaGFzKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgZmFpbChcIlVOS05PV05fQ0xBU1NcIiwgYFVua25vd24gcmVmZXJlbmNlIGNsYXNzIGRlY2xhcmF0aW9uICcke1N0cmluZyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCl9Jy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJraW5kLHJlc291cmNlSWRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5yZXNvdXJjZUlkICE9IFwic3RyaW5nXCIgfHwgIXJlc291cmNlSWRzQnlSZWNvcmRSZWdpc3RyeS5nZXQocmVjb3Jkcyk/LmhhcyhjYW5kaWRhdGUucmVzb3VyY2VJZCkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIGBVbmtub3duIG93bmVkIHJlc291cmNlICcke1N0cmluZyhjYW5kaWRhdGUucmVzb3VyY2VJZCl9Jy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgIGNvbnN0IGNsYXNzZXMgPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgY2xhc3Nlcy5nZXQoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpPy5vd25lcnNoaXA/LmtpbmQgIT0gXCJvd25lZFJlc291cmNlXCIpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIGBVbmtub3duIG93bmVkIHJlZmVyZW5jZSAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiTGlzdFR5cGVcIikge1xuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgY29sbGVjdGlvbiB0eXBlcyBjYW5ub3QgY29udGFpbiBjeWNsZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICBzZWVuLmFkZChjYW5kaWRhdGUpXG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShjYW5kaWRhdGUuZWxlbWVudFR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcImVsZW1lbnRUeXBlXCIpLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICAgIHNlZW4uZGVsZXRlKGNhbmRpZGF0ZSlcblxuICAgIGlmIChjYW5kaWRhdGUuZWxlbWVudFR5cGUgIT09IGVsZW1lbnRUeXBlKSBjYW5kaWRhdGUuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICBjb25zdCBleHBlY3RlZEZpZWxkcyA9IGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IFwia2V5VHlwZSxraW5kLG9yZGVyLHZhbHVlVHlwZVwiIDogXCJrZXlUeXBlLGtpbmQsdmFsdWVUeXBlXCJcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBleHBlY3RlZEZpZWxkcykge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYWxmb3JtZWQgJHtjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBcIm9yZGVyZWQgbWFwXCIgOiBcIm1hcFwifSB0eXBlLmAsXG4gICAgICAgIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJiBjYW5kaWRhdGUub3JkZXIgIT0gXCJpbnNlcnRpb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3JkZXJlZCBtYXAgdHlwZSByZXF1aXJlcyBpbnNlcnRpb24gb3JkZXIuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY3Vyc2l2ZSBjb2xsZWN0aW9uIHR5cGVzIGNhbm5vdCBjb250YWluIGN5Y2xlcy5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIHNlZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICBjb25zdCBrZXlUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoY2FuZGlkYXRlLmtleVR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcImtleVR5cGVcIiksIGZhaWwsIHNlZW4sIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgaWYgKCFpc1NjYWxhclR5cGUoa2V5VHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAga2V5IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oa2V5VHlwZSl9OyBleHBlY3RlZCBzdHJpbmcuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZS5rZXlUeXBlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGNhbmRpZGF0ZS52YWx1ZVR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcInZhbHVlVHlwZVwiKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgICBzZWVuLmRlbGV0ZShjYW5kaWRhdGUpXG5cbiAgICBpZiAoY2FuZGlkYXRlLmtleVR5cGUgIT09IGtleVR5cGUpIGNhbmRpZGF0ZS5rZXlUeXBlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlR5cGVSZWZlcmVuY2V9ICovIChrZXlUeXBlKVxuICAgIGlmIChjYW5kaWRhdGUudmFsdWVUeXBlICE9PSB2YWx1ZVR5cGUpIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPSB2YWx1ZVR5cGVcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBcImtpbmQsdmFsdWVUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBvcHRpb25hbCB0eXBlLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgb3B0aW9uYWwgdHlwZXMgY2Fubm90IGNvbnRhaW4gY3ljbGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGNhbmRpZGF0ZS52YWx1ZVR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcInZhbHVlVHlwZVwiKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgICBzZWVuLmRlbGV0ZShjYW5kaWRhdGUpXG4gICAgaWYgKHZhbHVlVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGZhaWwoXCJJTlZBTElEX09QVElPTkFMX0NPTlNUSVRVRU5UXCIsIFwiT3B0aW9uYWwgdmFsdWVzIGNhbm5vdCBkaXJlY3RseSBjb250YWluIGFub3RoZXIgb3B0aW9uYWwuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcInZhbHVlVHlwZVwiKSlcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS52YWx1ZVR5cGUgIT09IHZhbHVlVHlwZSkgY2FuZGlkYXRlLnZhbHVlVHlwZSA9IHZhbHVlVHlwZVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgc2VtYW50aWMgdHlwZS5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcmVmZXJlbmNlLWNsYXNzIHJlZ2lzdHJ5IGF0dGFjaGVkIHRvIHRoZSByZWNvcmQgdmFsaWRhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCB2YWxpZGF0aW9uIHJlZ2lzdHJ5LlxuICogQHJldHVybnMge0NsYXNzUmVnaXN0cnl9IFJlZmVyZW5jZSBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpIHtcbiAgcmV0dXJuIHJlZmVyZW5jZUNsYXNzZXNCeVJlY29yZFJlZ2lzdHJ5LmdldChyZWNvcmRzKSA/PyBuZXcgTWFwKClcbn1cblxuLyoqXG4gKiBJbmZlcnMgYSB2YWx1ZSBleHByZXNzaW9uIGFuZCByZWplY3RzIHRoZSBub24tdmFsdWUgcmVzdWx0IG9mIGEgdm9pZCBjYWxsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBTZW1hbnRpYyBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIGxleGljYWwgc2NvcGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHRvIG5vcm1hbGl6ZSBmcm9udGVuZCBpbnRlbnQgYW5kIGNhbGwgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0IC0gVmFsdWUgY29udGV4dCBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IFtleHBlY3RlZFR5cGVdIC0gQ29udGV4dHVhbCBjb2xsZWN0aW9uIHR5cGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmZlckNvbGxlY3Rpb25FbGVtZW50c10gLSBXaGV0aGVyIGEgZ2VuZXJpYy1jYWxsIGV2aWRlbmNlIHBhc3MgbWF5IGluZmVyIG5vbmVtcHR5IGNvbGxlY3Rpb24gbGl0ZXJhbHMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gRXhwcmVzc2lvbiB2YWx1ZSB0eXBlLlxuICovXG5mdW5jdGlvbiBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgY29udGV4dCwgZXhwZWN0ZWRUeXBlLFxuICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cyA9IGZhbHNlKSB7XG4gIGNvbnN0IGFsbG93T3duZWRCb3Jyb3cgPSBjb250ZXh0ID09IFwiYW4gZWZmZWN0IGFyZ3VtZW50XCIgfHwgY29udGV4dCA9PSBcImEgbWV0aG9kIHJlY2VpdmVyXCJcbiAgY29uc3QgdHlwZSA9IGluZmVyRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgZXhwZWN0ZWRUeXBlLFxuICAgIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzLCBhbGxvd093bmVkQm9ycm93KVxuXG4gIGlmICh0eXBlID09IFwidm9pZFwiKSByZXR1cm4gZmFpbChcIlZPSURfQVNfVkFMVUVcIiwgYFZvaWQgY2FsbCBjYW5ub3QgYmUgdXNlZCBhcyAke2NvbnRleHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJFcnJvclR5cGVcIikgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBFcnJvciB2YWx1ZSBjYW5ub3QgYmUgdXNlZCBhcyAke2NvbnRleHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG5cbiAgcmV0dXJuIHR5cGVcbn1cblxuLyoqXG4gKiBJbmZlcnMgYW5kIHZhbGlkYXRlcyBvbmUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBbZXhwZWN0ZWRUeXBlXSAtIENvbnRleHR1YWwgY29sbGVjdGlvbiB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNdIC0gV2hldGhlciBhIGdlbmVyaWMtY2FsbCBldmlkZW5jZSBwYXNzIG1heSBpbmZlciBub25lbXB0eSBjb2xsZWN0aW9uIGxpdGVyYWxzLlxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dPd25lZEJvcnJvd10gLSBXaGV0aGVyIHRoaXMgZXhhY3QgY2FsbCBwb3NpdGlvbiBhZG1pdHMgYW4gaW1tZWRpYXRlIGJvcnJvdy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGUgfCBcInZvaWRcIn0gRXhwcmVzc2lvbiB0eXBlLlxuICovXG5mdW5jdGlvbiBpbmZlckV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGV4cGVjdGVkVHlwZSxcbiAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMgPSBmYWxzZSwgYWxsb3dPd25lZEJvcnJvdyA9IGZhbHNlKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gcmVzb2x2ZUJpbmRpbmcoZXhwcmVzc2lvbi5uYW1lLCBleHByZXNzaW9uLmxvY2F0aW9uLCBzY29wZSwgZmFpbCkudHlwZVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIikge1xuICAgIGlmICghc2NvcGUuY3VycmVudENsYXNzIHx8IGV4cHJlc3Npb24uY2xhc3NJZCAhPSBzY29wZS5jdXJyZW50Q2xhc3MuaWQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlJlY2VpdmVyIGV4cHJlc3Npb24gaXMgdmFsaWQgb25seSBpbnNpZGUgaXRzIGRlY2xhcmluZyBjbGFzcy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc2NvcGUuY3VycmVudENsYXNzLmlkKSwga2luZDogXCJSZWZlcmVuY2VUeXBlXCJ9XG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUHJpdmF0ZUZpZWxkUmVhZFwiKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBzY29wZS5jdXJyZW50Q2xhc3NcblxuICAgIGlmICghZGVjbGFyYXRpb24gfHwgIWV4cHJlc3Npb24ucmVjZWl2ZXIgfHwgZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kICE9IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgfHxcbiAgICAgIGV4cHJlc3Npb24ucmVjZWl2ZXIuY2xhc3NJZCAhPSBkZWNsYXJhdGlvbi5pZCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCByZWNlaXZlciBtdXN0IGJlIHRoZSBkZWNsYXJpbmcgY2xhc3MgcmVjZWl2ZXIuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGV4cHJlc3Npb24uZmllbGQpXG5cbiAgICBpZiAoIWZpZWxkKSByZXR1cm4gZmFpbChcIklMTEVHQUxfUFJJVkFURV9BQ0NFU1NcIiwgXCJQcml2YXRlIGZpZWxkIGlkZW50aXR5IGlzIG5vdCBvd25lZCBieSB0aGUgZGVjbGFyaW5nIGNsYXNzLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuXG4gICAgcmV0dXJuIGZpZWxkLnR5cGVcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIikge1xuICAgIGlmICghYWxsb3dPd25lZEJvcnJvdykge1xuICAgICAgcmV0dXJuIGZhaWwoXCJCT1JST1dfRVNDQVBFXCIsIFwiQk9SUk9XX0VTQ0FQRTogT3duZWQgYm9ycm93cyBhcmUgdmFsaWQgb25seSBhcyBpbW1lZGlhdGUgY2FwYWJpbGl0eSBhcmd1bWVudHMgb3IgbWV0aG9kIHJlY2VpdmVycy5cIixcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ubW9kZSAhPSBcInNoYXJlZFwiICYmIGV4cHJlc3Npb24ubW9kZSAhPSBcImV4Y2x1c2l2ZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1c6IE93bmVkIGJvcnJvdyBtb2RlIG11c3QgYmUgc2hhcmVkIG9yIGV4Y2x1c2l2ZS5cIixcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgYm9ycm93ZWQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG93bmVkIGJvcnJvd1wiKVxuXG4gICAgaWYgKGJvcnJvd2VkLmtpbmQgIT0gXCJPd25lZFJlc291cmNlVHlwZVwiICYmIGJvcnJvd2VkLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIkJvcnJvd2VkIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBvd25lZCByZXNvdXJjZSBvciBvd25lZCByZWZlcmVuY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2FtZVR5cGUoYm9ycm93ZWQsIGV4cHJlc3Npb24udHlwZSkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIFwiQm9ycm93IG1ldGFkYXRhIGRvZXMgbm90IG1hdGNoIGl0cyByZXNvdXJjZSBwbGFjZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuIGJvcnJvd2VkXG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgbW92ZWQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG93bmVkIG1vdmVcIilcblxuICAgIGlmIChtb3ZlZC5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBtb3ZlZC5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9UUkFOU0ZFUlwiLCBcIk1vdmVkIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBvd25lZCByZXNvdXJjZSBvciBvd25lZCByZWZlcmVuY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2FtZVR5cGUobW92ZWQsIGV4cHJlc3Npb24udHlwZSkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIFwiTW92ZSBtZXRhZGF0YSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVzb3VyY2UgcGxhY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBtb3ZlZFxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVycm9yTWVzc2FnZVJlYWRcIikge1xuICAgIGlmICghZXhwcmVzc2lvbi5yZWNlaXZlciB8fCBleHByZXNzaW9uLnJlY2VpdmVyLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfTUVNQkVSX1JFQ0VJVkVSXCIsIFwiRXJyb3IgbWVzc2FnZSByZWNlaXZlciBtdXN0IGJlIG9uZSBjYXRjaCBiaW5kaW5nLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCByZWNlaXZlciA9IHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ucmVjZWl2ZXIubmFtZSwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpXG5cbiAgICBpZiAocmVjZWl2ZXIudHlwZS5raW5kICE9IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9NRU1CRVJfUkVDRUlWRVJcIiwgXCJNZXNzYWdlIG1lbWJlciByZXF1aXJlcyBhIHR5cGVkIGVycm9yIGNhdGNoIGJpbmRpbmcuXCIsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJzdHJpbmdcIilcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJbnRlZ2VyTGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihleHByZXNzaW9uLnZhbHVlKSkgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJOb24tc2FmZSBpbnRlZ2VyIGxpdGVyYWwuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJpbnRlZ2VyXCIpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwidmFsdWVcIikgIT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiSW52YWxpZCBib29sZWFuIGxpdGVyYWwgdmFsdWUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwiYm9vbGVhblwiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwidmFsdWVcIilcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIiB8fCAhaGFzT25seVVuaWNvZGVTY2FsYXJzKHZhbHVlKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJbnZhbGlkIFVuaWNvZGUgc3RyaW5nIGxpdGVyYWwuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsTm9uZVwiKSB7XG4gICAgaWYgKCFleHBlY3RlZFR5cGUgfHwgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJPcHRpb25hbCBhYnNlbmNlIHJlcXVpcmVzIGFuIGV4cGxpY2l0IG9wdGlvbmFsIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFNvbWVcIikge1xuICAgIGlmICghZXhwZWN0ZWRUeXBlIHx8IGV4cGVjdGVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgZXhwcmVzc2lvbi52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvcHRpb25hbCBwcmVzZW50IHZhbHVlXCJcbiAgICAgIClcblxuICAgICAgaWYgKHZhbHVlVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX09QVElPTkFMX0NPTlNUSVRVRU5UXCIsIFwiT3B0aW9uYWwgdmFsdWVzIGNhbm5vdCBkaXJlY3RseSBjb250YWluIGFub3RoZXIgb3B0aW9uYWwuXCIsIGV4cHJlc3Npb24udmFsdWUubG9jYXRpb24pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlfVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICBleHByZXNzaW9uLnZhbHVlLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG9wdGlvbmFsIHByZXNlbnQgdmFsdWVcIiwgZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZVxuICAgIClcblxuICAgIGlmICghc2FtZVR5cGUodmFsdWVUeXBlLCBleHBlY3RlZFR5cGUudmFsdWVUeXBlKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE9wdGlvbmFsIHByZXNlbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbih2YWx1ZVR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSl9LmAsIGV4cHJlc3Npb24udmFsdWUubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSB7XG4gICAgaWYgKCFleHByZXNzaW9uLm9wZXJhbmQgfHwgZXhwcmVzc2lvbi5vcGVyYW5kLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJPcHRpb25hbCBwcmVzZW5jZSB0ZXN0IHJlcXVpcmVzIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFR5cGUgPSByZXNvbHZlQmluZGluZyhleHByZXNzaW9uLm9wZXJhbmQubmFtZSwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBzY29wZSwgZmFpbCkudHlwZVxuXG4gICAgaWYgKG9wZXJhbmRUeXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBQcmVzZW5jZSB0ZXN0IHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKG9wZXJhbmRUeXBlKX07IGV4cGVjdGVkIG9wdGlvbmFsLmAsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImJvb2xlYW5cIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxVbndyYXBcIikge1xuICAgIGlmICghZXhwcmVzc2lvbi5vcGVyYW5kIHx8IGV4cHJlc3Npb24ub3BlcmFuZC5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3B0aW9uYWwgdW53cmFwIHJlcXVpcmVzIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgYmluZGluZyA9IHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ub3BlcmFuZC5uYW1lLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24sIHNjb3BlLCBmYWlsKVxuXG4gICAgaWYgKGJpbmRpbmcudHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgT3B0aW9uYWwgdW53cmFwIHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKGJpbmRpbmcudHlwZSl9OyBleHBlY3RlZCBvcHRpb25hbC5gLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2NvcGUucHJlc2VuY2VQcm9vZnMuaGFzKGJpbmRpbmcpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOQ0hFQ0tFRF9PUFRJT05BTF9VTldSQVBcIiwgYE9wdGlvbmFsIGJpbmRpbmcgJyR7ZXhwcmVzc2lvbi5vcGVyYW5kLm5hbWV9JyBpcyBub3QgcHJvdmVuIHByZXNlbnQuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gYmluZGluZy50eXBlLnZhbHVlVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0TGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJMaXN0IGxpdGVyYWwgZWxlbWVudHMgbXVzdCBiZSBhIGRlbnNlIHNvdXJjZS1vcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoKCFleHBlY3RlZFR5cGUgfHwgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSAmJlxuICAgICAgKCFpbmZlckNvbGxlY3Rpb25FbGVtZW50cyB8fCBleHByZXNzaW9uLmVsZW1lbnRzLmxlbmd0aCA9PSAwKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJMaXN0IGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIGxpc3QgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBpbmZlcnJlZEVsZW1lbnRUeXBlXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZXhwcmVzc2lvbi5lbGVtZW50cywgaW5kZXgpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiU3BhcnNlIGxpc3QgbGl0ZXJhbHMgYXJlIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHN1YnNldC5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBleHByZXNzaW9uLmVsZW1lbnRzW2luZGV4XVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBlbGVtZW50LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbGlzdCBlbGVtZW50XCIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIkxpc3RUeXBlXCIgPyBleHBlY3RlZFR5cGUuZWxlbWVudFR5cGUgOiBpbmZlcnJlZEVsZW1lbnRUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuXG4gICAgICBpbmZlcnJlZEVsZW1lbnRUeXBlID8/PSBhY3R1YWxcbiAgICAgIGNvbnN0IHJlcXVpcmVkRWxlbWVudFR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiID8gZXhwZWN0ZWRUeXBlLmVsZW1lbnRUeXBlIDogaW5mZXJyZWRFbGVtZW50VHlwZVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcmVxdWlyZWRFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYExpc3QgZWxlbWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihyZXF1aXJlZEVsZW1lbnRUeXBlKX0uYCwgZWxlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIlxuICAgICAgPyBleHBlY3RlZFR5cGVcbiAgICAgIDoge2VsZW1lbnRUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChpbmZlcnJlZEVsZW1lbnRUeXBlKSwga2luZDogXCJMaXN0VHlwZVwifVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIpIHtcbiAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9IFwiTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBsaXRlcmFsIGNvbnRleHQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlKX07IGV4cGVjdGVkIG1hcC5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiAhaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiTWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG1hcCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiICYmICFpc1NjYWxhclR5cGUoZXhwZWN0ZWRUeXBlLmtleVR5cGUsIFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAga2V5IHR5cGUgbXVzdCBiZSBzdHJpbmcuXCIsIHR5cGVMb2NhdGlvbihleHBlY3RlZFR5cGUua2V5VHlwZSwgZXhwcmVzc2lvbi5sb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXMgPSB2YWxpZGF0ZU1hcExpdGVyYWxFbnRyaWVzKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cylcblxuICAgIGlmICghZXhwZWN0ZWRUeXBlICYmIGVudHJpZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiRW1wdHkgbWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG1hcCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGUgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGluZmVycmVkVmFsdWVUeXBlXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgZW50cnkudmFsdWUsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtYXAgdmFsdWVcIixcbiAgICAgICAgZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUgPz89IGFjdHVhbFxuICAgICAgY29uc3QgcmVxdWlyZWRWYWx1ZVR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUudmFsdWVUeXBlIDogaW5mZXJyZWRWYWx1ZVR5cGVcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIHJlcXVpcmVkVmFsdWVUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIHZhbHVlIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHJlcXVpcmVkVmFsdWVUeXBlKX0uYCwgZW50cnkudmFsdWUubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZSA6IHtcbiAgICAgIGtleVR5cGU6IHNjYWxhclR5cGUoXCJzdHJpbmdcIiksXG4gICAgICBraW5kOiBcIk1hcFR5cGVcIixcbiAgICAgIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoaW5mZXJyZWRWYWx1ZVR5cGUpXG4gICAgfVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSB7XG4gICAgaWYgKGV4cGVjdGVkVHlwZSAmJiBleHBlY3RlZFR5cGUua2luZCAhPSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgT3JkZXJlZC1tYXAgbGl0ZXJhbCBjb250ZXh0ICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkVHlwZSl9OyBleHBlY3RlZCBvcmRlcmVkIG1hcC5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiAhaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiT3JkZXJlZC1tYXAgbGl0ZXJhbCByZXF1aXJlcyBhbiBleHBsaWNpdCByZWN1cnNpdmUgb3JkZXJlZC1tYXAgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgJiYgIWlzU2NhbGFyVHlwZShleHBlY3RlZFR5cGUua2V5VHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk9yZGVyZWQtbWFwIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nLlwiLCB0eXBlTG9jYXRpb24oZXhwZWN0ZWRUeXBlLmtleVR5cGUsIGV4cHJlc3Npb24ubG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzID0gdmFsaWRhdGVNYXBMaXRlcmFsRW50cmllcyhleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpXG5cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiBlbnRyaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU1NJTkdfVFlQRVwiLCBcIkVtcHR5IG9yZGVyZWQtbWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG9yZGVyZWQtbWFwIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgaW5mZXJyZWRWYWx1ZVR5cGVcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBlbnRyeS52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvcmRlcmVkLW1hcCB2YWx1ZVwiLFxuICAgICAgICBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUgPz89IGFjdHVhbFxuICAgICAgY29uc3QgcmVxdWlyZWRWYWx1ZVR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCByZXF1aXJlZFZhbHVlVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE9yZGVyZWQtbWFwIHZhbHVlIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHJlcXVpcmVkVmFsdWVUeXBlKX0uYCxcbiAgICAgICAgICBlbnRyeS52YWx1ZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZSA6IHtcbiAgICAgIGtleVR5cGU6IHNjYWxhclR5cGUoXCJzdHJpbmdcIiksXG4gICAgICBraW5kOiBcIk9yZGVyZWRNYXBUeXBlXCIsXG4gICAgICBvcmRlcjogXCJpbnNlcnRpb25cIixcbiAgICAgIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoaW5mZXJyZWRWYWx1ZVR5cGUpXG4gICAgfVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBsaXN0IHJlY2VpdmVyXCIpXG4gICAgY29uc3QgaW5kZXhUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBsaXN0IGluZGV4XCIsIHNjYWxhclR5cGUoXCJpbnRlZ2VyXCIpKVxuXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYExpc3QgaW5kZXggcmVjZWl2ZXIgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb2xsZWN0aW9uVHlwZSl9OyBleHBlY3RlZCBsaXN0LmAsIGV4cHJlc3Npb24uY29sbGVjdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCFpc1NjYWxhclR5cGUoaW5kZXhUeXBlLCBcImludGVnZXJcIikpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBMaXN0IGluZGV4IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oaW5kZXhUeXBlKX07IGV4cGVjdGVkIGludGVnZXIuYCwgZXhwcmVzc2lvbi5pbmRleC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qga25vd25Db2xsZWN0aW9uID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSlcbiAgICBjb25zdCBrbm93bkluZGV4ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oZXhwcmVzc2lvbi5pbmRleCwgc2NvcGUpXG5cbiAgICBpZiAoa25vd25Db2xsZWN0aW9uPy5raW5kID09IFwiTGlzdExpdGVyYWxcIiAmJiBrbm93bkluZGV4Py5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIiAmJlxuICAgICAgKGtub3duSW5kZXgudmFsdWUgPCAwIHx8IGtub3duSW5kZXgudmFsdWUgPj0ga25vd25Db2xsZWN0aW9uLmVsZW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgIGZhaWwoXCJJTkRFWF9PVVRfT0ZfQk9VTkRTXCIsIGBMaXN0IGluZGV4ICR7a25vd25JbmRleC52YWx1ZX0gaXMgb3V0c2lkZSBhIGxpdGVyYWwgbGlzdCBvZiBzaXplICR7a25vd25Db2xsZWN0aW9uLmVsZW1lbnRzLmxlbmd0aH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcHJvdmVuID0gcHJvdmVuTGlzdEVsZW1lbnQoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmluZGV4LCBzY29wZSlcblxuICAgIHZhbGlkYXRlQWNjZXNzVG90YWxpdHkoZXhwcmVzc2lvbiwgcHJvdmVuICE9PSB1bmRlZmluZWQsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG5cbiAgICByZXR1cm4gY29sbGVjdGlvblR5cGUuZWxlbWVudFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgY29sbGVjdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWFwIHJlY2VpdmVyXCIpXG4gICAgY29uc3Qga2V5VHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmtleSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIG1hcCBrZXlcIiwgc2NhbGFyVHlwZShcInN0cmluZ1wiKSlcblxuICAgIGlmIChjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTWFwVHlwZVwiICYmIGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBsb29rdXAgcmVjZWl2ZXIgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb2xsZWN0aW9uVHlwZSl9OyBleHBlY3RlZCBtYXAuYCwgZXhwcmVzc2lvbi5jb2xsZWN0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWlzU2NhbGFyVHlwZShrZXlUeXBlLCBcInN0cmluZ1wiKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBsb29rdXAga2V5IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oa2V5VHlwZSl9OyBleHBlY3RlZCBzdHJpbmcuYCwgZXhwcmVzc2lvbi5rZXkubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgc2NvcGUpXG4gICAgY29uc3Qga25vd25LZXkgPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLmtleSwgc2NvcGUpXG5cbiAgICBpZiAoKGtub3duQ29sbGVjdGlvbj8ua2luZCA9PSBcIk1hcExpdGVyYWxcIiB8fCBrbm93bkNvbGxlY3Rpb24/LmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSAmJlxuICAgICAga25vd25LZXk/LmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIgJiZcbiAgICAgICFrbm93bkNvbGxlY3Rpb24uZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkua2V5LnZhbHVlID09IGtub3duS2V5LnZhbHVlKSkge1xuICAgICAgZmFpbChcIk1JU1NJTkdfTUFQX0tFWVwiLCBgTWFwIGtleSAnJHtrbm93bktleS52YWx1ZX0nIGlzIGFic2VudCBmcm9tIHRoZSBsaXRlcmFsIGluaXRpYWxpemVyLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHByb3ZlbiA9IHByb3Zlbk1hcFZhbHVlKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5rZXksIHNjb3BlKVxuXG4gICAgdmFsaWRhdGVBY2Nlc3NUb3RhbGl0eShleHByZXNzaW9uLCBwcm92ZW4gIT09IHVuZGVmaW5lZCwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcblxuICAgIHJldHVybiBjb2xsZWN0aW9uVHlwZS52YWx1ZVR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb2xsZWN0aW9uLXNpemUgcmVjZWl2ZXJcIilcblxuICAgIGlmIChjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTGlzdFR5cGVcIiAmJiBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTWFwVHlwZVwiICYmIGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENvbGxlY3Rpb24gc2l6ZSByZWNlaXZlciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGNvbGxlY3Rpb25UeXBlKX07IGV4cGVjdGVkIGxpc3Qgb3IgbWFwLmAsIGV4cHJlc3Npb24uY29sbGVjdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGlvbktpbmQgPSBjb2xsZWN0aW9uVHlwZS5raW5kID09IFwiTGlzdFR5cGVcIiA/IFwibGlzdFwiIDogXCJtYXBcIlxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHtcbiAgICAgIGlmIChleHByZXNzaW9uLmNvbGxlY3Rpb25LaW5kICE9PSB1bmRlZmluZWQgJiYgZXhwcmVzc2lvbi5jb2xsZWN0aW9uS2luZCAhPSBjb2xsZWN0aW9uS2luZCkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNvbGxlY3Rpb24gc2l6ZSBvcGVyYXRpb24gZG9lcyBub3QgbWF0Y2ggaXRzIHJlY2VpdmVyIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBleHByZXNzaW9uLmNvbGxlY3Rpb25LaW5kID0gY29sbGVjdGlvbktpbmRcbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5jb2xsZWN0aW9uS2luZCAhPSBjb2xsZWN0aW9uS2luZCkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDb2xsZWN0aW9uIHNpemUga2luZCBkb2VzIG5vdCBtYXRjaCBpdHMgcmVjZWl2ZXIgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImludGVnZXJcIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmFyZ3VtZW50cykgfHwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5wYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkVmZmVjdCBjYWxsIGFyZ3VtZW50IGNvdW50IGRvZXMgbm90IG1hdGNoIGl0cyBhdXRob3JpemVkIG9wZXJhdGlvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2VGbG93ID0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvd1xuXG4gICAgaWYgKHJlc291cmNlRmxvdy5raW5kID09IFwiYm9ycm93XCIgfHwgcmVzb3VyY2VGbG93LmtpbmQgPT0gXCJjbG9zZVwiKSB7XG4gICAgICBjb25zdCBib3Jyb3cgPSBleHByZXNzaW9uLmFyZ3VtZW50c1tyZXNvdXJjZUZsb3cucGFyYW1ldGVySW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZE1vZGUgPSByZXNvdXJjZUZsb3cua2luZCA9PSBcImNsb3NlXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIlxuXG4gICAgICBpZiAoYm9ycm93Py5raW5kICE9IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgfHwgYm9ycm93Lm1vZGUgIT0gZXhwZWN0ZWRNb2RlKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBgSU5WQUxJRF9SRVNPVVJDRV9CT1JST1c6ICR7cmVzb3VyY2VGbG93LmtpbmR9IHJlcXVpcmVzIGFuIGltbWVkaWF0ZSAke2V4cGVjdGVkTW9kZX0gYm9ycm93LmAsXG4gICAgICAgICAgYm9ycm93Py5sb2NhdGlvbiA/PyBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGlkZW50aXR5QXNWYWx1ZVR5cGUoZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnBhcmFtZXRlclR5cGVzW2luZGV4XSwgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgICAgICAgXCJhbiBlZmZlY3QgYXJndW1lbnRcIiwgZXhwZWN0ZWQpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX1RZUEVfTUlTTUFUQ0hcIiwgYEVmZmVjdCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihleHBlY3RlZCl9LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJldHVyblR5cGUgPT0gXCJ2b2lkXCIpIHJldHVybiBcInZvaWRcIlxuICAgIHJldHVybiBpZGVudGl0eUFzVmFsdWVUeXBlKGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXR1cm5UeXBlLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShleHByZXNzaW9uLnJlZmVyZW5jZSwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLFxuICAgICAgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICBpZiAocmVmZXJlbmNlVHlwZS5raW5kICE9IFwiUmVmZXJlbmNlVHlwZVwiICYmIHJlZmVyZW5jZVR5cGUua2luZCAhPSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWZlcmVuY2UgY29uc3RydWN0aW9uIHJlcXVpcmVzIGEgbm9taW5hbCByZWZlcmVuY2UgY2xhc3MgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpLmdldChyZWZlcmVuY2VUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uKSByZXR1cm4gZmFpbChcIlVOS05PV05fQ0xBU1NcIiwgYFVua25vd24gcmVmZXJlbmNlIGNsYXNzICcke3JlZmVyZW5jZVR5cGUuZGVjbGFyYXRpb25JZH0nLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDb25zdHJ1Y3RvciBhcmd1bWVudHMgbXVzdCBiZSBhIGRlbnNlIG9yZGVyZWQgYXJyYXkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiQ09OU1RSVUNUT1JfQVJJVFlfTUlTTUFUQ0hcIixcbiAgICAgICAgYENvbnN0cnVjdG9yIGZvciAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7ZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGh9LmAsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcykpXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0gPSBub3JtYWxpemVPd25lZE1vdmUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uc3RydWN0b3IgYXJndW1lbnRcIiwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ29uc3RydWN0b3IgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocGFyYW1ldGVyVHlwZXNbaW5kZXhdKX0uYCxcbiAgICAgICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdXRpb24gPSB7XG4gICAgICBkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIiksXG4gICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyVHlwZXMubWFwKCh0eXBlKSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZSkpKVxuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG4gICAgZWxzZSB2YWxpZGF0ZVJlZmVyZW5jZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCBcImNvbnN0cnVjdG9yXCIpXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ucmVjZWl2ZXIsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWV0aG9kIHJlY2VpdmVyXCIpXG5cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgcmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FVEhPRF9SRUNFSVZFUlwiLCBcIk1ldGhvZCBjYWxsIHJlY2VpdmVyIG11c3QgaGF2ZSBhIHJlZmVyZW5jZSBjbGFzcyB0eXBlLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUNsYXNzZXNGb3IocmVjb3JkcykuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX0NMQVNTXCIsIGBVbmtub3duIHJlZmVyZW5jZSBjbGFzcyAnJHtyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZH0nLmAsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLm1ldGhvZCkgPz9cbiAgICAgIChub3JtYWxpemVPcGVyYXRpb25zID8gZGVjbGFyYXRpb24ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IGV4cHJlc3Npb24ubWV0aG9kKSA6IHVuZGVmaW5lZClcblxuICAgIGlmICghbWV0aG9kKSByZXR1cm4gZmFpbChcIlVOS05PV05fTUVUSE9EXCIsIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzIG5vIG1ldGhvZCAnJHtleHByZXNzaW9uLm1ldGhvZH0nLmAsXG4gICAgICByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJtZW1iZXJcIikpXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24ubWV0aG9kID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZXRob2QuaWQpXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNZXRob2QgYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1FVEhPRF9BUklUWV9NSVNNQVRDSFwiLFxuICAgICAgICBgTWV0aG9kICcke21ldGhvZC5uYW1lfScgaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7bWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RofS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKSlcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSA9IG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHBhcmFtZXRlclR5cGVzW2luZGV4XSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZXRob2QgYXJndW1lbnRcIiwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWV0aG9kIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHBhcmFtZXRlclR5cGVzW2luZGV4XSl9LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKG1ldGhvZC5yZXR1cm5UeXBlLCBtZXRob2QubG9jYXRpb24sIGZhaWwsIHJlY29yZHMpXG4gICAgY29uc3QgcmVzb3VyY2VGbG93ID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiXG4gICAgICA/IG93bmVkTWV0aG9kUmVzb3VyY2VGbG93KGRlY2xhcmF0aW9uLCBtZXRob2QsIGZhaWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgcmVzb2x1dGlvbiA9IHtcbiAgICAgIGRlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlXCIpLFxuICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlclR5cGVzLm1hcCgodHlwZSkgPT4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUpKSksXG4gICAgICByZXR1cm5UeXBlOiB0eXBlSWRlbnRpdHkocmV0dXJuVHlwZSksXG4gICAgICAuLi4ocmVzb3VyY2VGbG93ID8ge3Jlc291cmNlRmxvd30gOiB7fSlcbiAgICB9XG5cbiAgICBpZiAoZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgJiYgcmVzb3VyY2VGbG93KSB7XG4gICAgICBjb25zdCBleHBlY3RlZE1vZGUgPSByZXNvdXJjZUZsb3cua2luZCA9PSBcInRlcm1pbmFsXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIlxuXG4gICAgICBpZiAoZXhwcmVzc2lvbi5yZWNlaXZlci5tb2RlICE9IGV4cGVjdGVkTW9kZSkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgYElOVkFMSURfUkVTT1VSQ0VfQk9SUk9XOiBPd25lZCBtZXRob2QgcmVxdWlyZXMgYW4gaW1tZWRpYXRlICR7ZXhwZWN0ZWRNb2RlfSByZWNlaXZlciBib3Jyb3cuYCxcbiAgICAgICAgICBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWNlaXZlclR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiICYmIGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCAhPSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiKSB7XG4gICAgICBpZiAoIW5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIk93bmVkIG1ldGhvZCByZWNlaXZlciByZXF1aXJlcyBhbiBpbW1lZGlhdGUgYm9ycm93LlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgICAgaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgZmFpbChcIkJPUlJPV19FU0NBUEVcIiwgXCJPd25lZCBtZXRob2QgcmVjZWl2ZXIgYm9ycm93IG11c3QgbmFtZSBvbmUgaW1tZWRpYXRlIGJpbmRpbmcuXCIsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBleHByZXNzaW9uLnJlY2VpdmVyID0ge1xuICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLnJlY2VpdmVyLFxuICAgICAgICBraW5kOiBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiLFxuICAgICAgICBsb2NhdGlvbjogZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbixcbiAgICAgICAgbW9kZTogcmVzb3VyY2VGbG93Py5raW5kID09IFwidGVybWluYWxcIiA/IFwiZXhjbHVzaXZlXCIgOiBcInNoYXJlZFwiLFxuICAgICAgICBzb3VyY2VQcm92ZW5hbmNlOiBleHByZXNzaW9uLnJlY2VpdmVyLnNvdXJjZVByb3ZlbmFuY2UsXG4gICAgICAgIHR5cGU6IHJlY2VpdmVyVHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG4gICAgZWxzZSB2YWxpZGF0ZVJlZmVyZW5jZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCBcIm1ldGhvZFwiKVxuXG4gICAgcmV0dXJuIGlzVm9pZFR5cGUocmV0dXJuVHlwZSkgPyBcInZvaWRcIiA6IHJldHVyblR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpIHtcbiAgICBjb25zdCByZWNvcmRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoZXhwcmVzc2lvbi5yZWNvcmQsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICBpZiAocmVjb3JkVHlwZS5raW5kICE9IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWNvcmQgY29uc3RydWN0aW9uIHJlcXVpcmVzIGEgbm9taW5hbCByZWNvcmQgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmRzLmdldChyZWNvcmRUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uKSByZXR1cm4gZmFpbChcIlVOS05PV05fUkVDT1JEXCIsIGBVbmtub3duIHJlY29yZCBkZWNsYXJhdGlvbiAnJHtyZWNvcmRUeXBlLmRlY2xhcmF0aW9uSWR9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmFyZ3VtZW50cykgfHwgZXhwcmVzc2lvbi5hcmd1bWVudHMuc29tZSgoX2FyZ3VtZW50LCBpbmRleCkgPT4gIU9iamVjdC5oYXNPd24oZXhwcmVzc2lvbi5hcmd1bWVudHMsIGluZGV4KSkpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY29yZCBjb25zdHJ1Y3Rpb24gYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFxuICAgICAgICBcIlJFQ09SRF9BUklUWV9NSVNNQVRDSFwiLFxuICAgICAgICBgUmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9JyBjb25zdHJ1Y3Rpb24gaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7ZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aH0uYCxcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvblxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gcmVjb3JkVHlwZVN1YnN0aXR1dGlvbnMocmVjb3JkVHlwZSwgZGVjbGFyYXRpb24pXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgYXJndW1lbnQgPSBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF1cbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2luZGV4XVxuICAgICAgY29uc3QgZmllbGRUeXBlID0gc3Vic3RpdHV0ZVZhbHVlVHlwZShmaWVsZC50eXBlLCBzdWJzdGl0dXRpb25zKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBhcmd1bWVudCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgYHJlY29yZCBmaWVsZCAnJHtmaWVsZC5uYW1lfSdgLCBmaWVsZFR5cGVcbiAgICAgIClcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIGZpZWxkVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFJlY29yZCBmaWVsZCAnJHtmaWVsZC5uYW1lfScgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZmllbGRUeXBlKX0uYCwgYXJndW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWVtYmVyUmVhZFwiKSB7XG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ucmVjZWl2ZXIsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZW1iZXIgcmVjZWl2ZXJcIilcblxuICAgIGlmIChyZWNlaXZlclR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FTUJFUl9SRUNFSVZFUlwiLCBgTWVtYmVyIHJlY2VpdmVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24ocmVjZWl2ZXJUeXBlKX07IGV4cGVjdGVkIHJlY29yZC5gLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY29yZHMuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX1JFQ09SRFwiLCBgVW5rbm93biByZWNvcmQgZGVjbGFyYXRpb24gJyR7cmVjZWl2ZXJUeXBlLmRlY2xhcmF0aW9uSWR9Jy5gLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGV4cHJlc3Npb24uZmllbGQpID8/XG4gICAgICAobm9ybWFsaXplT3BlcmF0aW9ucyA/IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IGV4cHJlc3Npb24uZmllbGQpIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKCFmaWVsZCkgZmFpbChcIlVOS05PV05fRklFTERcIiwgYFJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzIG5vIGZpZWxkICcke2V4cHJlc3Npb24uZmllbGR9Jy5gLCByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJtZW1iZXJcIikpXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24uZmllbGQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGZpZWxkLmlkKVxuXG4gICAgcmV0dXJuIHN1YnN0aXR1dGVWYWx1ZVR5cGUoZmllbGQudHlwZSwgcmVjb3JkVHlwZVN1YnN0aXR1dGlvbnMocmVjZWl2ZXJUeXBlLCBkZWNsYXJhdGlvbikpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uID0gZnVuY3Rpb25zLmdldChleHByZXNzaW9uLmNhbGxlZSlcblxuICAgIGlmICghZnVuY3Rpb25EZWNsYXJhdGlvbikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVTlJFU09MVkVEX0JJTkRJTkdcIiwgYFVua25vd24gZnVuY3Rpb24gJyR7ZXhwcmVzc2lvbi5jYWxsZWV9Jy5gLCByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJjYWxsZWVcIikpXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gZnVuY3Rpb25EZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IGNvdW50IGZvciAnJHtleHByZXNzaW9uLmNhbGxlZX0nLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZnVuY3Rpb25EZWNsYXJhdGlvbilcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSAqL1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSBuZXcgTWFwKClcbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoXG4gICAgICBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcnNcbiAgICApKVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSA9IG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHBhcmFtZXRlclR5cGVzW2luZGV4XSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgYXJndW1lbnQgPSBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHBhcmFtZXRlclR5cGVzW2luZGV4XVxuICAgICAgY29uc3QgZ2F0aGVyc0dlbmVyaWNFdmlkZW5jZSA9IHR5cGVDb250YWluc0FueVZhcmlhYmxlKGV4cGVjdGVkVHlwZSlcblxuICAgICAgaWYgKGdhdGhlcnNHZW5lcmljRXZpZGVuY2UpIHtcbiAgICAgICAgaW5mZXJHZW5lcmljQXJndW1lbnRFdmlkZW5jZShleHBlY3RlZFR5cGUsIGFyZ3VtZW50LCBzdWJzdGl0dXRpb25zLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWxUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBhcmd1bWVudCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNhbGwgYXJndW1lbnRcIiwgZXhwZWN0ZWRUeXBlXG4gICAgICApXG5cbiAgICAgIGlmICgoZnVuY3Rpb25EZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDApID4gMCkge1xuICAgICAgICBpbmZlclR5cGVBcmd1bWVudHMoZXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlLCBzdWJzdGl0dXRpb25zLCBhcmd1bWVudC5sb2NhdGlvbiwgZmFpbClcbiAgICAgIH0gZWxzZSBpZiAoIXNhbWVUeXBlKGFjdHVhbFR5cGUsIGV4cGVjdGVkVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWxUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkVHlwZSl9LmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBmdW5jdGlvbkRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIXN1YnN0aXR1dGlvbnMuaGFzKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLmlkKSkpIHtcbiAgICAgICAgY29uc3QgZXZpZGVuY2VGcmVlSW5kZXggPSBwYXJhbWV0ZXJUeXBlcy5maW5kSW5kZXgoKHR5cGUpID0+XG4gICAgICAgICAgdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZSwgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIuaWQpKSlcblxuICAgICAgICBpZiAoZXZpZGVuY2VGcmVlSW5kZXggPj0gMCkge1xuICAgICAgICAgIGZhaWwoXCJHRU5FUklDX0lORkVSRU5DRV9GQUlMVVJFXCIsIFwiQ2Fubm90IGluZmVyIGEgdHlwZSBwYXJhbWV0ZXIgZnJvbSBhbiBldmlkZW5jZS1mcmVlIGNhbGwgYXJndW1lbnQuXCIsXG4gICAgICAgICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tldmlkZW5jZUZyZWVJbmRleF0ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX0ZBSUxVUkVcIiwgYENhbm5vdCBpbmZlciB0eXBlIHBhcmFtZXRlciAnJHtwYXJhbWV0ZXIubmFtZX0nIGZyb20gY2FsbCBhcmd1bWVudHMuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFsuLi5zdWJzdGl0dXRpb25zLnZhbHVlcygpXS5zb21lKCh0eXBlKSA9PiBjb250YWluc093bmVkVHlwZSh0eXBlKSkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBcIk93bmVkIHJlc291cmNlcyBhbmQgcmVmZXJlbmNlcyBjYW5ub3QgYmUgaW5mZXJyZWQgYXMgZ2VuZXJpYyBhcmd1bWVudHMuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHN1YnN0aXR1dGVWYWx1ZVR5cGUoZnVuY3Rpb25EZWNsYXJhdGlvbi5wYXJhbWV0ZXJzW2luZGV4XS50eXBlLCBzdWJzdGl0dXRpb25zKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNhbGwgYXJndW1lbnRcIiwgZXhwZWN0ZWQpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWQpfS5gLCBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdXRpb24gPSBzaWduYXR1cmVGb3IoZnVuY3Rpb25EZWNsYXJhdGlvbiwgcmVjb3JkcywgZmFpbCwgc3Vic3RpdHV0aW9ucylcblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG4gICAgZWxzZSB2YWxpZGF0ZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICAgIGNvbnN0IHJldHVyblR5cGUgPSBzdWJzdGl0dXRlUmV0dXJuVHlwZSh2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZnVuY3Rpb25EZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgICAgZnVuY3Rpb25EZWNsYXJhdGlvbi5sb2NhdGlvbiwgZmFpbCwgcmVjb3JkcywgZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVycyksIHN1YnN0aXR1dGlvbnMpXG5cbiAgICByZXR1cm4gaXNWb2lkVHlwZShyZXR1cm5UeXBlKSA/IFwidm9pZFwiIDogcmV0dXJuVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IG9wZXJhbmQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5vcGVyYW5kLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgdW5hcnkgb3BlcmFuZFwiKVxuICAgIGNvbnN0IG9wZXJhbmRUeXBlID0gc2NhbGFyTmFtZUZvck9wZXJhdGlvbihvcGVyYW5kLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24sIGZhaWwpXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gbm9ybWFsaXplT3BlcmF0aW9uc1xuICAgICAgPyBub3JtYWxpemVVbmFyeU9wZXJhdGlvbihhZGFwdGVkT3BlcmF0aW9uRm9yKGV4cHJlc3Npb24pLCBvcGVyYW5kVHlwZSwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgOiBleHByZXNzaW9uLm9wZXJhdGlvblxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHNldE5vcm1hbGl6ZWRPcGVyYXRpb24oZXhwcmVzc2lvbiwgb3BlcmF0aW9uLCB1bmFyeU9wZXJhdGlvblNpZ25hdHVyZXNbb3BlcmF0aW9uXS5yZXN1bHQpXG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSB1bmFyeU9wZXJhdGlvblNpZ25hdHVyZXNbb3BlcmF0aW9uXVxuXG4gICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biB1bmFyeSBvcGVyYXRpb24gJHtTdHJpbmcob3BlcmF0aW9uKX0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAob3BlcmFuZFR5cGUgIT0gc2lnbmF0dXJlLm9wZXJhbmQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7b3BlcmF0aW9ufSByZXF1aXJlcyAke3NpZ25hdHVyZS5vcGVyYW5kfTsgcmVjZWl2ZWQgJHtvcGVyYW5kVHlwZX0uYCwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi50eXBlICE9IHNpZ25hdHVyZS5yZXN1bHQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgJHtvcGVyYXRpb259IHJlc3VsdCB0eXBlICR7U3RyaW5nKGV4cHJlc3Npb24udHlwZSl9OyBleHBlY3RlZCAke3NpZ25hdHVyZS5yZXN1bHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKHNpZ25hdHVyZS5yZXN1bHQpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgY29uZGl0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbmRpdGlvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb25kaXRpb25cIilcblxuICAgIGlmICghaXNTY2FsYXJUeXBlKGNvbmRpdGlvblR5cGUsIFwiYm9vbGVhblwiKSkge1xuICAgICAgZmFpbChcIk5PTl9CT09MRUFOX0NPTkRJVElPTlwiLCBgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiBjb25kaXRpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb25kaXRpb25UeXBlKX07IGV4cGVjdGVkIGJvb2xlYW4uYCxcbiAgICAgICAgZXhwcmVzc2lvbi5jb25kaXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGNvbnNlcXVlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBbXSlcbiAgICBjb25zdCBhbHRlcm5hdGVTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBbXSlcblxuICAgIGFwcGx5UHJlc2VuY2VOYXJyb3dpbmcoZXhwcmVzc2lvbi5jb25kaXRpb24sIHNjb3BlLCBjb25zZXF1ZW50U2NvcGUsIHRydWUpXG4gICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhleHByZXNzaW9uLmNvbmRpdGlvbiwgc2NvcGUsIGFsdGVybmF0ZVNjb3BlLCBmYWxzZSlcbiAgICBjb25zdCBjb25zZXF1ZW50VHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbnNlcXVlbnQsIGNvbnNlcXVlbnRTY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gY29uc2VxdWVudFwiKVxuICAgIGNvbnN0IGFsdGVybmF0ZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hbHRlcm5hdGUsIGFsdGVybmF0ZVNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbHRlcm5hdGVcIilcblxuICAgIGlmICghc2FtZVR5cGUoY29uc2VxdWVudFR5cGUsIGFsdGVybmF0ZVR5cGUpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhcm1zICR7dHlwZURlc2NyaXB0aW9uKGNvbnNlcXVlbnRUeXBlKX0gYW5kICR7dHlwZURlc2NyaXB0aW9uKGFsdGVybmF0ZVR5cGUpfTsgZXhwZWN0ZWQgb25lIGpvaW5lZCB0eXBlLmAsXG4gICAgICAgIGV4cHJlc3Npb24uYWx0ZXJuYXRlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBSZWZsZWN0LnNldChleHByZXNzaW9uLCBcInR5cGVcIiwgY29uc2VxdWVudFR5cGUpXG5cbiAgICByZXR1cm4gY29uc2VxdWVudFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgbGVmdCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmxlZnQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBiaW5hcnkgb3BlcmFuZFwiKVxuICAgIGNvbnN0IHJpZ2h0ID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ucmlnaHQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBiaW5hcnkgb3BlcmFuZFwiKVxuICAgIGNvbnN0IGxlZnRUeXBlID0gc2NhbGFyTmFtZUZvck9wZXJhdGlvbihsZWZ0LCBleHByZXNzaW9uLmxlZnQubG9jYXRpb24sIGZhaWwpXG4gICAgY29uc3QgcmlnaHRUeXBlID0gc2NhbGFyTmFtZUZvck9wZXJhdGlvbihyaWdodCwgZXhwcmVzc2lvbi5yaWdodC5sb2NhdGlvbiwgZmFpbClcbiAgICBjb25zdCBvcGVyYXRpb24gPSBub3JtYWxpemVPcGVyYXRpb25zXG4gICAgICA/IG5vcm1hbGl6ZUJpbmFyeU9wZXJhdGlvbihhZGFwdGVkT3BlcmF0aW9uRm9yKGV4cHJlc3Npb24pLCBsZWZ0VHlwZSwgcmlnaHRUeXBlLCBleHByZXNzaW9uLmxlZnQubG9jYXRpb24sIGV4cHJlc3Npb24ucmlnaHQubG9jYXRpb24sIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG4gICAgICA6IGV4cHJlc3Npb24ub3BlcmF0aW9uXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgc2V0Tm9ybWFsaXplZE9wZXJhdGlvbihleHByZXNzaW9uLCBvcGVyYXRpb24sIGJpbmFyeU9wZXJhdGlvblNpZ25hdHVyZXNbb3BlcmF0aW9uXS5yZXN1bHQpXG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSBiaW5hcnlPcGVyYXRpb25TaWduYXR1cmVzW29wZXJhdGlvbl1cblxuICAgIGlmICghc2lnbmF0dXJlKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFVua25vd24gYmluYXJ5IG9wZXJhdGlvbiAke1N0cmluZyhvcGVyYXRpb24pfS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChsZWZ0VHlwZSAhPSBzaWduYXR1cmUubGVmdCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgJHtvcGVyYXRpb259IHJlcXVpcmVzICR7c2lnbmF0dXJlLmxlZnR9IGxlZnQgb3BlcmFuZDsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgZXhwcmVzc2lvbi5sZWZ0LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAocmlnaHRUeXBlICE9IHNpZ25hdHVyZS5yaWdodCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgJHtvcGVyYXRpb259IHJlcXVpcmVzICR7c2lnbmF0dXJlLnJpZ2h0fSByaWdodCBvcGVyYW5kOyByZWNlaXZlZCAke3JpZ2h0VHlwZX0uYCwgZXhwcmVzc2lvbi5yaWdodC5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24udHlwZSAhPSBzaWduYXR1cmUucmVzdWx0KSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYCR7b3BlcmF0aW9ufSByZXN1bHQgdHlwZSAke1N0cmluZyhleHByZXNzaW9uLnR5cGUpfTsgZXhwZWN0ZWQgJHtzaWduYXR1cmUucmVzdWx0fS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gc2NhbGFyVHlwZShzaWduYXR1cmUucmVzdWx0KVxuICB9XG5cbiAgY29uc3QgdW5leHBlY3RlZCA9IC8qKiBAdHlwZSB7e2tpbmQ6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259fSAqLyAoZXhwcmVzc2lvbilcblxuICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgdW5leHBlY3RlZC5raW5kLCB1bmV4cGVjdGVkLmxvY2F0aW9uKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBtYXAgbGF5b3V0IGFuZCBmaXhlZCBzdHJpbmcga2V5cyBpbmRlcGVuZGVudGx5IG9mIGNvbnRleHR1YWwgdmFsdWUgaW5mZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1hcExpdGVyYWwgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk9yZGVyZWRNYXBMaXRlcmFsfSBleHByZXNzaW9uIC0gQ2FuZGlkYXRlIG1hcCBsaXRlcmFsLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIGxleGljYWwgc2NvcGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHRvIG5vcm1hbGl6ZSBmcm9udGVuZCBpbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzIC0gV2hldGhlciBuZXN0ZWQgY29sbGVjdGlvbiBldmlkZW5jZSBtYXkgYmUgaW5mZXJyZWQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NYXBFbnRyeVtdfSBWYWxpZGF0ZWQgZGVuc2UgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNYXBMaXRlcmFsRW50cmllcyhleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbi5lbnRyaWVzKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBsaXRlcmFsIGVudHJpZXMgbXVzdCBiZSBhIGRlbnNlIHNvdXJjZS1vcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG4gIGlmICghaXNEZW5zZUFycmF5KGV4cHJlc3Npb24uZW50cmllcykpIHtcbiAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJTcGFyc2UgbWFwIGxpdGVyYWxzIGFyZSBvdXRzaWRlIHRoZSBpbXBsZW1lbnRlZCBzdWJzZXQuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gIH1cbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhwcmVzc2lvbi5lbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5raW5kICE9IFwiTWFwRW50cnlcIiB8fCAhZW50cnkua2V5IHx8IGVudHJ5LmtleS5raW5kICE9IFwiU3RyaW5nTGl0ZXJhbFwiKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBlbnRyaWVzIHJlcXVpcmUgbGl0ZXJhbCBzdHJpbmcga2V5cy5cIiwgZW50cnk/LmxvY2F0aW9uID8/IGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShlbnRyeS5rZXksIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtYXAga2V5XCIsXG4gICAgICBzY2FsYXJUeXBlKFwic3RyaW5nXCIpLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50cylcbiAgICBpZiAoaXNOdW1lcmljU3RyaW5nKGVudHJ5LmtleS52YWx1ZSkpIHtcbiAgICAgIGZhaWwoXCJJTlZBTElEX01BUF9LRVlcIiwgXCJNYXAgaW5pdGlhbGl6ZXIga2V5cyBtdXN0IGJlIG5vbm51bWVyaWMgc3RyaW5ncy5cIiwgZW50cnkua2V5LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoa2V5cy5oYXMoZW50cnkua2V5LnZhbHVlKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9NQVBfS0VZXCIsIGBEdXBsaWNhdGUgJHtleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiID8gXCJvcmRlcmVkLW1hcFwiIDogXCJtYXBcIn0ga2V5ICcke2VudHJ5LmtleS52YWx1ZX0nLmAsXG4gICAgICAgIGVudHJ5LmtleS5sb2NhdGlvbilcbiAgICB9XG4gICAga2V5cy5hZGQoZW50cnkua2V5LnZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIGV4cHJlc3Npb24uZW50cmllc1xufVxuXG4vKipcbiAqIENvbGxlY3RzIGFyZ3VtZW50LW9ubHkgZ2VuZXJpYyBldmlkZW5jZSB3aGlsZSBkZWZlcnJpbmcgcmVjdXJzaXZlbHkgY29udGV4dHVhbCBsaXRlcmFscy5cbiAqIFRoZSBjb21wbGV0ZSBhcmd1bWVudCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCBpdHMgY2xvc2VkIHN1YnN0aXR1dGVkIHR5cGUgYWZ0ZXIgaW5mZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBmb3JtYWwgLSBPcGVuIGRlY2xhcmF0aW9uIHBhcmFtZXRlciB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBDYWxsIGFyZ3VtZW50IG9yIG5lc3RlZCBjb2xsZWN0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gc3Vic3RpdHV0aW9ucyAtIEluZmVyZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byBub3JtYWxpemUgZnJvbnRlbmQgaW50ZW50LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZm9ybWFsLCBleHByZXNzaW9uLCBzdWJzdGl0dXRpb25zLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICBub3JtYWxpemVPcGVyYXRpb25zKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbE5vbmVcIikgcmV0dXJuXG4gIGlmIChmb3JtYWwua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsU29tZVwiKSB7XG4gICAgaW5mZXJHZW5lcmljQXJndW1lbnRFdmlkZW5jZShmb3JtYWwudmFsdWVUeXBlLCBleHByZXNzaW9uLnZhbHVlLCBzdWJzdGl0dXRpb25zLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJMaXN0VHlwZVwiICYmIGV4cHJlc3Npb24ua2luZCA9PSBcIkxpc3RMaXRlcmFsXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbi5lbGVtZW50cykpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTGlzdCBsaXRlcmFsIGVsZW1lbnRzIG11c3QgYmUgYSBkZW5zZSBzb3VyY2Utb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5lbGVtZW50cykpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiU3BhcnNlIGxpc3QgbGl0ZXJhbHMgYXJlIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHN1YnNldC5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGV4cHJlc3Npb24uZWxlbWVudHMpIHtcbiAgICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZm9ybWFsLmVsZW1lbnRUeXBlLCBlbGVtZW50LCBzdWJzdGl0dXRpb25zLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoKGZvcm1hbC5raW5kID09IFwiTWFwVHlwZVwiICYmIGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExpdGVyYWxcIikgfHxcbiAgICAoZm9ybWFsLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiICYmIGV4cHJlc3Npb24ua2luZCA9PSBcIk9yZGVyZWRNYXBMaXRlcmFsXCIpKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbGlkYXRlTWFwTGl0ZXJhbEVudHJpZXMoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdHJ1ZSlcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaW5mZXJHZW5lcmljQXJndW1lbnRFdmlkZW5jZShmb3JtYWwudmFsdWVUeXBlLCBlbnRyeS52YWx1ZSwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgIGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjYWxsIGFyZ3VtZW50XCIsIHVuZGVmaW5lZCwgdHJ1ZVxuICApXG5cbiAgaW5mZXJUeXBlQXJndW1lbnRzKGZvcm1hbCwgYWN0dWFsLCBzdWJzdGl0dXRpb25zLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxufVxuXG4vKipcbiAqIFVuaWZpZXMgb25lIGRlY2xhcmF0aW9uLW93bmVkIGZvcm1hbCB0eXBlIHdpdGggb25lIGFyZ3VtZW50IHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IGZvcm1hbCAtIEdlbmVyaWMgc2lnbmF0dXJlIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IGFjdHVhbCAtIEluZmVycmVkIGFyZ3VtZW50IHR5cGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSBzdWJzdGl0dXRpb25zIC0gSW5mZXJlbmNlIHN0YXRlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFyZ3VtZW50IGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwsIGFjdHVhbCwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpIHtcbiAgaWYgKGZvcm1hbC5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICBjb25zdCBwcmlvciA9IHN1YnN0aXR1dGlvbnMuZ2V0KGZvcm1hbC5wYXJhbWV0ZXJJZClcblxuICAgIGlmIChwcmlvcikge1xuICAgICAgaWYgKCFzYW1lVHlwZShwcmlvciwgYWN0dWFsKSkge1xuICAgICAgICBmYWlsKFwiR0VORVJJQ19JTkZFUkVOQ0VfQ09ORkxJQ1RcIiwgYENvbmZsaWN0aW5nIGluZmVyZW5jZSBmb3IgdHlwZSBwYXJhbWV0ZXIgJyR7Zm9ybWFsLnBhcmFtZXRlcklkfScuYCwgbG9jYXRpb24pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCEoYWN0dWFsLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiAmJiBhY3R1YWwucGFyYW1ldGVySWQgPT0gZm9ybWFsLnBhcmFtZXRlcklkKSAmJlxuICAgICAgdHlwZUNvbnRhaW5zVmFyaWFibGUoYWN0dWFsLCBmb3JtYWwucGFyYW1ldGVySWQpKSB7XG4gICAgICBmYWlsKFwiR0VORVJJQ19JTkZFUkVOQ0VfUkVDVVJTSU9OXCIsIGBSZWN1cnNpdmUgaW5mZXJlbmNlIGZvciB0eXBlIHBhcmFtZXRlciAnJHtmb3JtYWwucGFyYW1ldGVySWR9Jy5gLCBsb2NhdGlvbilcbiAgICB9XG4gICAgc3Vic3RpdHV0aW9ucy5zZXQoZm9ybWFsLnBhcmFtZXRlcklkLCBhY3R1YWwpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kICE9IGFjdHVhbC5raW5kKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZm9ybWFsKX0uYCwgbG9jYXRpb24pXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiKSB7XG4gICAgaWYgKCFzYW1lVHlwZShmb3JtYWwsIGFjdHVhbCkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZvcm1hbCl9LmAsIGxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgYWN0dWFsLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICBpZiAoZm9ybWFsLmRlY2xhcmF0aW9uSWQgIT0gYWN0dWFsLmRlY2xhcmF0aW9uSWQpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZvcm1hbCl9LmAsIGxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIgJiYgYWN0dWFsLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICBpZiAoZm9ybWFsLmRlY2xhcmF0aW9uSWQgIT0gYWN0dWFsLmRlY2xhcmF0aW9uSWQgfHwgKGZvcm1hbC5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwKSAhPSAoYWN0dWFsLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDApKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmb3JtYWwpfS5gLCBsb2NhdGlvbilcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IChmb3JtYWwuYXJndW1lbnRzPy5sZW5ndGggPz8gMCk7IGluZGV4ICs9IDEpIHtcbiAgICAgIGluZmVyVHlwZUFyZ3VtZW50cygvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChmb3JtYWwuYXJndW1lbnRzPy5baW5kZXhdKSxcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoYWN0dWFsLmFyZ3VtZW50cz8uW2luZGV4XSksIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJMaXN0VHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiTGlzdFR5cGVcIikge1xuICAgIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwuZWxlbWVudFR5cGUsIGFjdHVhbC5lbGVtZW50VHlwZSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgJiYgYWN0dWFsLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwudmFsdWVUeXBlLCBhY3R1YWwudmFsdWVUeXBlLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoKGZvcm1hbC5raW5kID09IFwiTWFwVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiTWFwVHlwZVwiKSB8fFxuICAgIChmb3JtYWwua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgJiYgYWN0dWFsLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSkge1xuICAgIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwua2V5VHlwZSwgYWN0dWFsLmtleVR5cGUsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKVxuICAgIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwudmFsdWVUeXBlLCBhY3R1YWwudmFsdWVUeXBlLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgb2NjdXJzIGNvbnN0cmFpbnQgZm9yIGZpcnN0LW9yZGVyIGluZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIENhbmRpZGF0ZSBpbmZlcnJlZCB0eXBlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gUGFyYW1ldGVyIGJlaW5nIGluZmVycmVkLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHR5cGUgcmVjdXJzaXZlbHkgY29udGFpbnMgdGhlIHBhcmFtZXRlci5cbiAqL1xuZnVuY3Rpb24gdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZSwgcGFyYW1ldGVySWQpIHtcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZXR1cm4gdHlwZS5wYXJhbWV0ZXJJZCA9PSBwYXJhbWV0ZXJJZFxuICBpZiAodHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gdHlwZS5hcmd1bWVudHM/LnNvbWUoKGFyZ3VtZW50KSA9PiB0eXBlQ29udGFpbnNWYXJpYWJsZShhcmd1bWVudCwgcGFyYW1ldGVySWQpKSA/PyBmYWxzZVxuICBpZiAodHlwZS5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUuZWxlbWVudFR5cGUsIHBhcmFtZXRlcklkKVxuICBpZiAodHlwZS5raW5kID09IFwiTWFwVHlwZVwiIHx8IHR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZS5rZXlUeXBlLCBwYXJhbWV0ZXJJZCkgfHwgdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZS52YWx1ZVR5cGUsIHBhcmFtZXRlcklkKVxuICB9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUudmFsdWVUeXBlLCBwYXJhbWV0ZXJJZClcblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHN1YnN0aXR1dGlvbnMgdG8gYSB2YWx1ZSBvciB2b2lkIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gT3BlbiByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZT59IHN1YnN0aXR1dGlvbnMgLSBDbG9zZWQgc3Vic3RpdHV0aW9ucy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBTdWJzdGl0dXRlZCByZXR1cm4gdHlwZS5cbiAqL1xuZnVuY3Rpb24gc3Vic3RpdHV0ZVJldHVyblR5cGUodHlwZSwgc3Vic3RpdHV0aW9ucykge1xuICByZXR1cm4gaXNWb2lkVHlwZSh0eXBlKSA/IHR5cGUgOiBzdWJzdGl0dXRlVmFsdWVUeXBlKHR5cGUsIHN1YnN0aXR1dGlvbnMpXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleGFjdCBzZW1hbnRpYyBzaWduYXR1cmUgYm91bmQgdG8gb25lIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUmVzb2x2ZWQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZT59IFtzdWJzdGl0dXRpb25zXSAtIEluZmVycmVkIGdlbmVyaWMgc3Vic3RpdHV0aW9ucy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmV9IERldGFjaGVkIHNpZ25hdHVyZSBiaW5kaW5nLlxuICovXG5mdW5jdGlvbiBzaWduYXR1cmVGb3IoZGVjbGFyYXRpb24sIHJlY29yZHMsIGZhaWwsIHN1YnN0aXR1dGlvbnMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZGVjbGFyYXRpb24pXG4gIGNvbnN0IGRlY2xhcmVkUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdXG4gIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gZGVjbGFyYXRpb24ucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICBzdWJzdGl0dXRlVmFsdWVUeXBlKHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpLCBzdWJzdGl0dXRpb25zKSlcbiAgY29uc3QgcmV0dXJuVHlwZSA9IHN1YnN0aXR1dGVSZXR1cm5UeXBlKFxuICAgIHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLCBkZWNsYXJhdGlvbi5sb2NhdGlvbiwgZmFpbCwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpLCBzdWJzdGl0dXRpb25zKVxuXG4gIHJldHVybiB7XG4gICAgZGVjbGFyYXRpb25JZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksXG4gICAga2luZDogXCJSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXCIsXG4gICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlclR5cGVzLm1hcCgodHlwZSkgPT4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUpKSksXG4gICAgcmV0dXJuVHlwZTogdHlwZUlkZW50aXR5KHJldHVyblR5cGUpLFxuICAgIC4uLihkZWNsYXJlZFBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IHtcbiAgICAgIHR5cGVBcmd1bWVudHM6IGRlY2xhcmVkUGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKFxuICAgICAgICAgIHN1YnN0aXR1dGlvbnMuZ2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLmlkKSlcbiAgICAgICAgKSkpKVxuICAgIH0gOiB7fSlcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbiBleHRlcm5hbGx5IHN1cHBsaWVkIGNhbGwgYmluZGluZyBhZ2FpbnN0IHRoZSBkZWNsYXJhdGlvbiBjb2xsZWN0ZWQgZm9yIHRoaXMgbW9kdWxlLlxuICogQHBhcmFtIHt1bmtub3dufSBhY3R1YWwgLSBDYW5kaWRhdGUgY2FsbCByZXNvbHV0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmV9IGV4cGVjdGVkIC0gRXhhY3QgZGVjbGFyYXRpb24gc2lnbmF0dXJlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENhbGwgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXNvbHV0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGNvbnN0IGV4cGVjdGVkS2V5cyA9IGV4cGVjdGVkLnR5cGVBcmd1bWVudHMgPyBcImRlY2xhcmF0aW9uSWQsa2luZCxwYXJhbWV0ZXJUeXBlcyxyZXR1cm5UeXBlLHR5cGVBcmd1bWVudHNcIiA6XG4gICAgXCJkZWNsYXJhdGlvbklkLGtpbmQscGFyYW1ldGVyVHlwZXMscmV0dXJuVHlwZVwiXG5cbiAgaWYgKCFhY3R1YWwgfHwgdHlwZW9mIGFjdHVhbCAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYWN0dWFsKSB8fFxuICAgIE9iamVjdC5rZXlzKGFjdHVhbCkuc29ydCgpLmpvaW4oXCIsXCIpICE9IGV4cGVjdGVkS2V5cykge1xuICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ2FsbCBpcyBtaXNzaW5nIGFuIGV4YWN0IHJlc29sdmVkIGZ1bmN0aW9uIHNpZ25hdHVyZS5cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmV9ICovIChhY3R1YWwpXG5cbiAgaWYgKGNhbmRpZGF0ZS5raW5kICE9IFwiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwiIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzKSB8fCAhdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnJldHVyblR5cGUsIHRydWUpIHx8XG4gICAgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gZXhwZWN0ZWQuZGVjbGFyYXRpb25JZCB8fFxuICAgICFzYW1lVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS5yZXR1cm5UeXBlLCBleHBlY3RlZC5yZXR1cm5UeXBlKSB8fCBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IGV4cGVjdGVkLnBhcmFtZXRlclR5cGVzLmxlbmd0aCkge1xuICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ2FsbCByZXNvbHV0aW9uIGRvZXMgbm90IG1hdGNoIGl0cyBkZWNsYXJhdGlvbiBzaWduYXR1cmUuXCIsIGxvY2F0aW9uKVxuICB9XG4gIGlmIChleHBlY3RlZC50eXBlQXJndW1lbnRzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlVHlwZUFyZ3VtZW50cyA9IGNhbmRpZGF0ZS50eXBlQXJndW1lbnRzXG5cbiAgICBpZiAoIWlzRGVuc2VBcnJheShjYW5kaWRhdGVUeXBlQXJndW1lbnRzKSB8fCBjYW5kaWRhdGVUeXBlQXJndW1lbnRzLmxlbmd0aCAhPSBleHBlY3RlZC50eXBlQXJndW1lbnRzLmxlbmd0aCB8fFxuICAgICAgY2FuZGlkYXRlVHlwZUFyZ3VtZW50cy5zb21lKCh0eXBlLCBpbmRleCkgPT5cbiAgICAgICAgIXZhbGlkVHlwZUlkZW50aXR5KHR5cGUsIGZhbHNlKSB8fCAhc2FtZVR5cGVJZGVudGl0eSh0eXBlLCBleHBlY3RlZC50eXBlQXJndW1lbnRzPy5baW5kZXhdKSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ2FsbCByZXNvbHV0aW9uIGRvZXMgbm90IG1hdGNoIGl0cyBpbmZlcnJlZCB0eXBlIGFyZ3VtZW50cy5cIiwgbG9jYXRpb24pXG4gICAgfVxuICB9XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdHlwZSA9IGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlc1tpbmRleF1cblxuICAgIGlmICghT2JqZWN0Lmhhc093bihjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMsIGluZGV4KSB8fCAhdmFsaWRUeXBlSWRlbnRpdHkodHlwZSwgZmFsc2UpIHx8XG4gICAgICAhc2FtZVR5cGVJZGVudGl0eSh0eXBlLCBleHBlY3RlZC5wYXJhbWV0ZXJUeXBlc1tpbmRleF0pKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgcmVzb2x1dGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyYXRpb24gc2lnbmF0dXJlLlwiLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZXhhY3QgY2FsbGVyLW93bmVkIGNvbnN0cnVjdG9yIG9yIG1ldGhvZCByZXNvbHV0aW9uIG1ldGFkYXRhLlxuICogQHBhcmFtIHt1bmtub3dufSBhY3R1YWwgLSBDYW5kaWRhdGUgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZE1ldGhvZFNpZ25hdHVyZX0gZXhwZWN0ZWQgLSBFeGFjdCByZXNvbHV0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4cHJlc3Npb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1wiY29uc3RydWN0b3JcIiB8IFwibWV0aG9kXCJ9IHJvbGUgLSBSZXNvbHV0aW9uIHJvbGUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWZlcmVuY2VSZXNvbHV0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIGxvY2F0aW9uLCBmYWlsLCByb2xlKSB7XG4gIGNvbnN0IGV4cGVjdGVkTWV0aG9kID0gcm9sZSA9PSBcIm1ldGhvZFwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlfSAqLyAoZXhwZWN0ZWQpIDogdW5kZWZpbmVkXG4gIGNvbnN0IGV4cGVjdGVkS2V5cyA9IHJvbGUgPT0gXCJjb25zdHJ1Y3RvclwiID8gXCJkZWNsYXJhdGlvbklkLGtpbmQscGFyYW1ldGVyVHlwZXNcIiA6XG4gICAgZXhwZWN0ZWRNZXRob2Q/LnJlc291cmNlRmxvdyA/IFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzLHJlc291cmNlRmxvdyxyZXR1cm5UeXBlXCIgOlxuICAgICAgXCJkZWNsYXJhdGlvbklkLGtpbmQscGFyYW1ldGVyVHlwZXMscmV0dXJuVHlwZVwiXG5cbiAgaWYgKCFhY3R1YWwgfHwgdHlwZW9mIGFjdHVhbCAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYWN0dWFsKSB8fCBPYmplY3Qua2V5cyhhY3R1YWwpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBleHBlY3RlZEtleXMpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUmVmZXJlbmNlICR7cm9sZX0gY2FsbCBpcyBtaXNzaW5nIGFuIGV4YWN0IHJlc29sdmVkICR7cm9sZX0gc2lnbmF0dXJlLmAsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhY3R1YWwpXG5cbiAgaWYgKGNhbmRpZGF0ZS5raW5kICE9IGV4cGVjdGVkLmtpbmQgfHwgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gZXhwZWN0ZWQuZGVjbGFyYXRpb25JZCB8fFxuICAgICFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzKSB8fCBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IGV4cGVjdGVkLnBhcmFtZXRlclR5cGVzLmxlbmd0aCB8fFxuICAgIGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcy5zb21lKCh0eXBlLCBpbmRleCkgPT4gIXZhbGlkVHlwZUlkZW50aXR5KHR5cGUsIGZhbHNlKSB8fFxuICAgICAgIXNhbWVUeXBlSWRlbnRpdHkodHlwZSwgZXhwZWN0ZWQucGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkgfHxcbiAgICByb2xlID09IFwibWV0aG9kXCIgJiYgKCF2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUucmV0dXJuVHlwZSwgdHJ1ZSkgfHxcbiAgICAgICFzYW1lVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS5yZXR1cm5UeXBlLCAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9ICovIChleHBlY3RlZCkucmV0dXJuVHlwZSkgfHxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNhbmRpZGF0ZS5yZXNvdXJjZUZsb3cpICE9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkTWV0aG9kPy5yZXNvdXJjZUZsb3cpKSkge1xuICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBSZXNvbHZlZCAke3JvbGV9IHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyYXRpb24uYCwgbG9jYXRpb24pXG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlcyBhIHNvdXJjZSBpZGVudGlmaWVyJ3Mgb3duZXJzaGlwIHRyYW5zZmVyIGV4cGxpY2l0IGluIG5vcm1hbGl6ZWQgSVIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSB0cmFuc2ZlciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBleHBlY3RlZCAtIERlc3RpbmF0aW9uIHR5cGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZSAtIFdoZXRoZXIgcGFyc2VyIGludGVudCBtYXkgYmUgbm9ybWFsaXplZC5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gRXhwbGljaXQgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplT3duZWRNb3ZlKGV4cHJlc3Npb24sIGV4cGVjdGVkLCBub3JtYWxpemUsIGZhaWwpIHtcbiAgaWYgKGV4cGVjdGVkLmtpbmQgIT0gXCJPd25lZFJlc291cmNlVHlwZVwiICYmIGV4cGVjdGVkLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGV4cHJlc3Npb25cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIikgcmV0dXJuIGV4cHJlc3Npb25cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikge1xuICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9UUkFOU0ZFUlwiLCBcIlByaXZhdGUgcmVzb3VyY2UgZmllbGRzIGNhbm5vdCBiZSBtb3ZlZCBvciBleHBvc2VkOyB0cmFuc2ZlciB0aGUgb3duaW5nIHJlZmVyZW5jZS5cIixcbiAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uXG4gIGlmICghbm9ybWFsaXplKSByZXR1cm4gZmFpbChcIlJFU09VUkNFX01PVkVfUkVRVUlSRURcIiwgXCJPd25lZCB0cmFuc2ZlciByZXF1aXJlcyBhbiBleHBsaWNpdCBtb3ZlIGV4cHJlc3Npb24uXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG5cbiAgcmV0dXJuIHtcbiAgICBleHByZXNzaW9uLFxuICAgIGtpbmQ6IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiLFxuICAgIGxvY2F0aW9uOiBleHByZXNzaW9uLmxvY2F0aW9uLFxuICAgIHNvdXJjZVByb3ZlbmFuY2U6IGV4cHJlc3Npb24uc291cmNlUHJvdmVuYW5jZSxcbiAgICB0eXBlOiBleHBlY3RlZFxuICB9XG59XG5cbi8qKlxuICogQ2xhc3NpZmllcyB0aGUgZGVsaWJlcmF0ZWx5IGJvdW5kZWQgVGFzayAwMzQgcmVjZWl2ZXIgdHJhbnNpdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIE93bmVkIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1ldGhvZERlY2xhcmF0aW9ufSBtZXRob2QgLSBDYW5kaWRhdGUgbWV0aG9kLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7e2tpbmQ6IFwicHJlc2VydmVcIiB8IFwidGVybWluYWxcIiwgdGVybWluYWxGYWlsdXJlSWQ/OiBzdHJpbmd9fSBSZWNlaXZlciB0cmFuc2l0aW9uLlxuICovXG5mdW5jdGlvbiBvd25lZE1ldGhvZFJlc291cmNlRmxvdyhkZWNsYXJhdGlvbiwgbWV0aG9kLCBmYWlsKSB7XG4gIGNvbnN0IGVmZmVjdFN0YXRlbWVudHMgPSBtZXRob2QuYm9keS5zdGF0ZW1lbnRzLmZsYXRNYXAoKHN0YXRlbWVudCkgPT4ge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24gOlxuICAgICAgc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgPyBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiBleHByZXNzaW9uPy5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIiA/IFtleHByZXNzaW9uXSA6IFtdXG4gIH0pXG4gIGNvbnN0IGFsbEVmZmVjdHMgPSBtZXRob2RFZmZlY3RFeHByZXNzaW9ucyhtZXRob2QuYm9keSlcblxuICBpZiAoYWxsRWZmZWN0cy5sZW5ndGggPT0gMCkgcmV0dXJuIHtraW5kOiBcInByZXNlcnZlXCJ9XG4gIGlmIChtZXRob2QuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCAhPSAxIHx8IGVmZmVjdFN0YXRlbWVudHMubGVuZ3RoICE9IDEgfHwgYWxsRWZmZWN0cy5sZW5ndGggIT0gMSB8fFxuICAgIGFsbEVmZmVjdHNbMF0gIT09IGVmZmVjdFN0YXRlbWVudHNbMF0pIHtcbiAgICByZXR1cm4gZmFpbChcIlVOU1VQUE9SVEVEX1NUQVRFTUVOVFwiLFxuICAgICAgYE93bmVkIG1ldGhvZCAnJHttZXRob2QubmFtZX0nIG11c3QgY29udGFpbiBvbmUgZGlyZWN0IHJlc291cmNlIG9wZXJhdGlvbiBvciBvbmx5IHB1cmUgc3RhdGVtZW50cy5gLCBtZXRob2QubG9jYXRpb24pXG4gIH1cbiAgY29uc3Qgb3BlcmF0aW9uID0gZWZmZWN0U3RhdGVtZW50c1swXVxuICBjb25zdCBmbG93ID0gb3BlcmF0aW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93XG5cbiAgaWYgKGZsb3cua2luZCA9PSBcIm5vbmVcIiB8fCBmbG93LmtpbmQgPT0gXCJhY3F1aXJlXCIpIHJldHVybiB7a2luZDogXCJwcmVzZXJ2ZVwifVxuICBjb25zdCBhcmd1bWVudCA9IG9wZXJhdGlvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF1cblxuICBjb25zdCBvd25lZCA9IGRlY2xhcmF0aW9uLm93bmVyc2hpcD8ua2luZCA9PSBcIm93bmVkUmVzb3VyY2VcIiA/IGRlY2xhcmF0aW9uLm93bmVyc2hpcCA6IHVuZGVmaW5lZFxuICBjb25zdCBib3Jyb3dlZFBhcmFtZXRlck5hbWUgPSBhcmd1bWVudD8ua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiICYmIGFyZ3VtZW50LmV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCJcbiAgICA/IGFyZ3VtZW50LmV4cHJlc3Npb24ubmFtZSA6IHVuZGVmaW5lZFxuICBjb25zdCBib3Jyb3dlZFBhcmFtZXRlciA9IGJvcnJvd2VkUGFyYW1ldGVyTmFtZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgbWV0aG9kLnBhcmFtZXRlcnMuc29tZSgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIubmFtZSA9PSBib3Jyb3dlZFBhcmFtZXRlck5hbWUgJiYgY29udGFpbnNPd25lZFR5cGUocGFyYW1ldGVyLnR5cGUpKVxuXG4gIGlmIChib3Jyb3dlZFBhcmFtZXRlcikgcmV0dXJuIHtraW5kOiBcInByZXNlcnZlXCJ9XG5cbiAgaWYgKCFhcmd1bWVudCB8fCBhcmd1bWVudC5raW5kICE9IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgfHwgYXJndW1lbnQuZXhwcmVzc2lvbi5raW5kICE9IFwiUHJpdmF0ZUZpZWxkUmVhZFwiIHx8XG4gICAgYXJndW1lbnQuZXhwcmVzc2lvbi5maWVsZCAhPSBvd25lZD8uZmllbGRJZCkge1xuICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgYE93bmVkIG1ldGhvZCAnJHttZXRob2QubmFtZX0nIG11c3Qgb3BlcmF0ZSBvbiBpdHMgcHJpdmF0ZSByZXNvdXJjZSBmaWVsZC5gLCBvcGVyYXRpb24ubG9jYXRpb24pXG4gIH1cbiAgcmV0dXJuIHtraW5kOiBmbG93LmtpbmQgPT0gXCJjbG9zZVwiID8gXCJ0ZXJtaW5hbFwiIDogXCJwcmVzZXJ2ZVwiLCB0ZXJtaW5hbEZhaWx1cmVJZDogZmxvdy50ZXJtaW5hbEZhaWx1cmVJZH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBob3N0LWVmZmVjdCBzaXRlIG5lc3RlZCBpbiBvbmUgb3duZWQgbWV0aG9kIGJvZHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gTWV0aG9kIGJvZHkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uW119IEVmZmVjdGZ1bCBleHByZXNzaW9ucy5cbiAqL1xuZnVuY3Rpb24gbWV0aG9kRWZmZWN0RXhwcmVzc2lvbnMoYmxvY2spIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb25bXX0gKi9cbiAgY29uc3QgZWZmZWN0cyA9IFtdXG4gIGNvbnN0IHBlbmRpbmcgPSBbLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoYmxvY2spXVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGVuZGluZy5wb3AoKVxuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAoUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgfHxcbiAgICAgIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJlZmZlY3RTaXRlSWRcIikgPT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIGVmZmVjdHMucHVzaCgvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKHZhbHVlKSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBpZiAoW1wibG9jYXRpb25cIiwgXCJyZXNvbHV0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSBwZW5kaW5nLnB1c2goLi4uY2hpbGQpXG4gICAgICBlbHNlIGlmIChjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT0gXCJvYmplY3RcIikgcGVuZGluZy5wdXNoKGNoaWxkKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZWZmZWN0c1xufVxuXG4vKipcbiAqIFJlaHlkcmF0ZXMgYSBjbG9zZWQgY2FwYWJpbGl0eSB0eXBlIGlkZW50aXR5IGZvciBvcmRpbmFyeSBleHByZXNzaW9uIGNoZWNrcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gaWRlbnRpdHkgLSBDbG9zZWQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGlhZ25vc3RpYyBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IFZhbHVlIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5QXNWYWx1ZVR5cGUoaWRlbnRpdHksIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT0gXCJzdHJpbmdcIikge1xuICAgIGlmICghaXNTY2FsYXJUeXBlTmFtZShpZGVudGl0eSkpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlZvaWQgb3IgaW52YWxpZCBpZGVudGl0eSB1c2VkIGFzIGFuIGVmZmVjdCB2YWx1ZSB0eXBlLlwiLCBsb2NhdGlvbilcbiAgICByZXR1cm4gc2NhbGFyVHlwZShpZGVudGl0eSlcbiAgfVxuICBpZiAoIWlkZW50aXR5IHx8IHR5cGVvZiBpZGVudGl0eSAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoaWRlbnRpdHkpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFsZm9ybWVkIGVmZmVjdCB0eXBlIGlkZW50aXR5LlwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge0V4Y2x1ZGU8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eSwgc3RyaW5nPn0gKi8gKGlkZW50aXR5KVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHJldHVybiB7a2luZDogXCJPd25lZFJlc291cmNlVHlwZVwiLCByZXNvdXJjZUlkOiBjYW5kaWRhdGUucmVzb3VyY2VJZH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB7ZGVjbGFyYXRpb25JZDogY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQsIGtpbmQ6IFwiT3duZWRSZWZlcmVuY2VUeXBlXCJ9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogaWRlbnRpdHlBc1ZhbHVlVHlwZShjYW5kaWRhdGUudmFsdWVUeXBlLCBsb2NhdGlvbiwgZmFpbCl9XG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIGVmZmVjdCB0eXBlIGlkZW50aXR5LlwiLCBsb2NhdGlvbilcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNlbWFudGljIHR5cGUgdG8gaXRzIGRldGFjaGVkIGNhbGwtcmVzb2x1dGlvbiBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIFZhbGlkYXRlZCBzZW1hbnRpYyB0eXBlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IERldGFjaGVkIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiB0eXBlSWRlbnRpdHkodHlwZSkge1xuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiKSByZXR1cm4gdHlwZS5uYW1lXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIHtraW5kOiBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiLCBwYXJhbWV0ZXJJZDogdHlwZS5wYXJhbWV0ZXJJZH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHtcbiAgICBkZWNsYXJhdGlvbklkOiB0eXBlLmRlY2xhcmF0aW9uSWQsXG4gICAga2luZDogXCJSZWNvcmRUeXBlXCIsXG4gICAgLi4uKHR5cGUuYXJndW1lbnRzID8ge2FyZ3VtZW50czogdHlwZS5hcmd1bWVudHMubWFwKChhcmd1bWVudCkgPT5cbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eShhcmd1bWVudCkpKX0gOiB7fSlcbiAgfVxuICBpZiAodHlwZS5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCwga2luZDogXCJSZWZlcmVuY2VUeXBlXCJ9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2VJZDogdHlwZS5yZXNvdXJjZUlkfVxuICBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB7ZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLCBraW5kOiBcIk93bmVkUmVmZXJlbmNlVHlwZVwifVxuICBpZiAodHlwZS5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIHtlbGVtZW50VHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUuZWxlbWVudFR5cGUpKSwga2luZDogXCJMaXN0VHlwZVwifVxuICBpZiAodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKX1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHJldHVybiB7XG4gICAga2V5VHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUua2V5VHlwZSkpLFxuICAgIGtpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIixcbiAgICBvcmRlcjogXCJpbnNlcnRpb25cIixcbiAgICB2YWx1ZVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLnZhbHVlVHlwZSkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtleVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmtleVR5cGUpKSxcbiAgICBraW5kOiBcIk1hcFR5cGVcIixcbiAgICB2YWx1ZVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLnZhbHVlVHlwZSkpXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIGV4dGVybmFsbHkgc3VwcGxpZWQgcmVjdXJzaXZlIHR5cGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93Vm9pZCAtIFdoZXRoZXIgdm9pZCBpcyBwZXJtaXR0ZWQuXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBbc2Vlbl0gLSBBY3RpdmUgcmVjdXJzaW9uIHBhdGguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaWRlbnRpdHkgaXMgY2xvc2VkIGFuZCBhY3ljbGljLlxuICovXG5mdW5jdGlvbiB2YWxpZFR5cGVJZGVudGl0eSh0eXBlLCBhbGxvd1ZvaWQsIHNlZW4gPSBuZXcgU2V0KCkpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpIHJldHVybiBpc1NjYWxhclR5cGVOYW1lKHR5cGUpIHx8IGFsbG93Vm9pZCAmJiB0eXBlID09IFwidm9pZFwiXG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodHlwZSkgfHwgc2Vlbi5oYXModHlwZSkpIHJldHVybiBmYWxzZVxuXG4gIHNlZW4uYWRkKHR5cGUpXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh0eXBlKVxuICBsZXQgdmFsaWQgPSBmYWxzZVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIkxpc3RUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJlbGVtZW50VHlwZSxraW5kXCIpIHtcbiAgICB2YWxpZCA9IHZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS5lbGVtZW50VHlwZSwgZmFsc2UsIHNlZW4pXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJNYXBUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJrZXlUeXBlLGtpbmQsdmFsdWVUeXBlXCIpIHtcbiAgICB2YWxpZCA9IGNhbmRpZGF0ZS5rZXlUeXBlID09IFwic3RyaW5nXCIgJiYgdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnZhbHVlVHlwZSwgZmFsc2UsIHNlZW4pXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiICYmXG4gICAgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJrZXlUeXBlLGtpbmQsb3JkZXIsdmFsdWVUeXBlXCIpIHtcbiAgICB2YWxpZCA9IGNhbmRpZGF0ZS5rZXlUeXBlID09IFwic3RyaW5nXCIgJiYgY2FuZGlkYXRlLm9yZGVyID09IFwiaW5zZXJ0aW9uXCIgJiZcbiAgICAgIHZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS52YWx1ZVR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJraW5kLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUudmFsdWVUeXBlLCBmYWxzZSwgc2VlbikgJiZcbiAgICAgICEoY2FuZGlkYXRlLnZhbHVlVHlwZSAmJiB0eXBlb2YgY2FuZGlkYXRlLnZhbHVlVHlwZSA9PSBcIm9iamVjdFwiICYmIFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZS52YWx1ZVR5cGUsIFwia2luZFwiKSA9PSBcIk9wdGlvbmFsVHlwZVwiKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJraW5kLHBhcmFtZXRlcklkXCIpIHtcbiAgICB2YWxpZCA9IHR5cGVvZiBjYW5kaWRhdGUucGFyYW1ldGVySWQgPT0gXCJzdHJpbmdcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/KD86cmVjb3JkfGZ1bmN0aW9uKTpbMC05XSs6dHlwZTpbMC05XSskL3UudGVzdChjYW5kaWRhdGUucGFyYW1ldGVySWQpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIgJiZcbiAgICBbXCJhcmd1bWVudHMsZGVjbGFyYXRpb25JZCxraW5kXCIsIFwiZGVjbGFyYXRpb25JZCxraW5kXCJdLmluY2x1ZGVzKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpKSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUFyZ3VtZW50cyA9IGNhbmRpZGF0ZS5hcmd1bWVudHNcblxuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP3JlY29yZDpbMC05XSskL3UudGVzdChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCkgJiZcbiAgICAgIChjYW5kaWRhdGVBcmd1bWVudHMgPT09IHVuZGVmaW5lZCB8fCBpc0RlbnNlQXJyYXkoY2FuZGlkYXRlQXJndW1lbnRzKSAmJlxuICAgICAgICBjYW5kaWRhdGVBcmd1bWVudHMuZXZlcnkoKGFyZ3VtZW50KSA9PiB2YWxpZFR5cGVJZGVudGl0eShhcmd1bWVudCwgZmFsc2UsIHNlZW4pKSlcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiAmJiBPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSA9PSBcImRlY2xhcmF0aW9uSWQsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2NsYXNzOlswLTldKyQvdS50ZXN0KGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSA9PSBcImtpbmQscmVzb3VyY2VJZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLnJlc291cmNlSWQgPT0gXCJzdHJpbmdcIiAmJiAvXig/Om1vZHVsZTpbMC05XStcXC8pP2NhcGFiaWxpdHk6WzAtOV0rXFwvcmVzb3VyY2U6WzAtOV0rJC91XG4gICAgICAudGVzdChjYW5kaWRhdGUucmVzb3VyY2VJZClcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwiZGVjbGFyYXRpb25JZCxraW5kXCIpIHtcbiAgICB2YWxpZCA9IHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9jbGFzczpbMC05XSskL3UudGVzdChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcbiAgfVxuICBzZWVuLmRlbGV0ZSh0eXBlKVxuXG4gIHJldHVybiB2YWxpZFxufVxuXG4vKipcbiAqIENoZWNrcyBhcnJheSBpZGVudGl0eSB3aXRob3V0IHJlbHlpbmcgb24gaXRlcmF0aW9uIG1ldGhvZHMgdGhhdCBza2lwIHNwYXJzZSBzbG90cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgYXJyYXkuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgdW5rbm93bltdfSBXaGV0aGVyIGV2ZXJ5IGluZGV4ZWQgc2xvdCBpcyBwcmVzZW50LlxuICovXG5mdW5jdGlvbiBpc0RlbnNlQXJyYXkodmFsdWUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGlmICghT2JqZWN0Lmhhc093bih2YWx1ZSwgaW5kZXgpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGNsb3NlZCB0eXBlIGlkZW50aXRpZXMgc3RydWN0dXJhbGx5LlxuICogQHBhcmFtIHt1bmtub3dufSBsZWZ0IC0gRmlyc3QgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3Vua25vd259IHJpZ2h0IC0gU2Vjb25kIGlkZW50aXR5LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGlkZW50aXRpZXMgYXJlIGVxdWFsLlxuICovXG5mdW5jdGlvbiBzYW1lVHlwZUlkZW50aXR5KGxlZnQsIHJpZ2h0KSB7XG4gIGlmICh0eXBlb2YgbGVmdCA9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiByaWdodCA9PSBcInN0cmluZ1wiKSByZXR1cm4gbGVmdCA9PT0gcmlnaHRcbiAgaWYgKCFsZWZ0IHx8ICFyaWdodCB8fCB0eXBlb2YgbGVmdCAhPSBcIm9iamVjdFwiIHx8IHR5cGVvZiByaWdodCAhPSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgbGVmdFR5cGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAobGVmdClcbiAgY29uc3QgcmlnaHRUeXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHJpZ2h0KVxuXG4gIGlmIChsZWZ0VHlwZS5raW5kICE9IHJpZ2h0VHlwZS5raW5kKSByZXR1cm4gZmFsc2VcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gc2FtZVR5cGVJZGVudGl0eShsZWZ0VHlwZS5lbGVtZW50VHlwZSwgcmlnaHRUeXBlLmVsZW1lbnRUeXBlKVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gc2FtZVR5cGVJZGVudGl0eShsZWZ0VHlwZS52YWx1ZVR5cGUsIHJpZ2h0VHlwZS52YWx1ZVR5cGUpXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHJldHVybiBsZWZ0VHlwZS5wYXJhbWV0ZXJJZCA9PSByaWdodFR5cGUucGFyYW1ldGVySWRcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICBjb25zdCBsZWZ0QXJndW1lbnRzID0gQXJyYXkuaXNBcnJheShsZWZ0VHlwZS5hcmd1bWVudHMpID8gbGVmdFR5cGUuYXJndW1lbnRzIDogW11cbiAgICBjb25zdCByaWdodEFyZ3VtZW50cyA9IEFycmF5LmlzQXJyYXkocmlnaHRUeXBlLmFyZ3VtZW50cykgPyByaWdodFR5cGUuYXJndW1lbnRzIDogW11cblxuICAgIHJldHVybiBsZWZ0VHlwZS5kZWNsYXJhdGlvbklkID09IHJpZ2h0VHlwZS5kZWNsYXJhdGlvbklkICYmIGxlZnRBcmd1bWVudHMubGVuZ3RoID09IHJpZ2h0QXJndW1lbnRzLmxlbmd0aCAmJlxuICAgICAgbGVmdEFyZ3VtZW50cy5ldmVyeSgoYXJndW1lbnQsIGluZGV4KSA9PiBzYW1lVHlwZUlkZW50aXR5KGFyZ3VtZW50LCByaWdodEFyZ3VtZW50c1tpbmRleF0pKVxuICB9XG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4gbGVmdFR5cGUuZGVjbGFyYXRpb25JZCA9PSByaWdodFR5cGUuZGVjbGFyYXRpb25JZFxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHJldHVybiBsZWZ0VHlwZS5yZXNvdXJjZUlkID09IHJpZ2h0VHlwZS5yZXNvdXJjZUlkXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiBsZWZ0VHlwZS5kZWNsYXJhdGlvbklkID09IHJpZ2h0VHlwZS5kZWNsYXJhdGlvbklkXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiTWFwVHlwZVwiIHx8IGxlZnRUeXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUua2V5VHlwZSwgcmlnaHRUeXBlLmtleVR5cGUpICYmIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUudmFsdWVUeXBlLCByaWdodFR5cGUudmFsdWVUeXBlKVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHZhbGlkYXRlZCBzZW1hbnRpYyB0eXBlcyBzdHJ1Y3R1cmFsbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IGxlZnQgLSBGaXJzdCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByaWdodCAtIFNlY29uZCB0eXBlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHR5cGVzIGFyZSBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZVR5cGUobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkodHlwZUlkZW50aXR5KGxlZnQpLCB0eXBlSWRlbnRpdHkocmlnaHQpKVxufVxuXG4vKipcbiAqIEZvcm1hdHMgb25lIHZhbGlkYXRlZCBzZW1hbnRpYyB0eXBlIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JUeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSByZWN1cnNpdmUgc3BlbGxpbmcuXG4gKi9cbmZ1bmN0aW9uIHR5cGVEZXNjcmlwdGlvbih0eXBlKSB7XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHJldHVybiB0eXBlLm5hbWVcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZXR1cm4gYHR5cGUtdmFyaWFibGU8JHt0eXBlLnBhcmFtZXRlcklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHJldHVybiBgcmVjb3JkPCR7dHlwZS5kZWNsYXJhdGlvbklkfSR7dHlwZS5hcmd1bWVudHM/Lmxlbmd0aFxuICAgID8gYCwgJHt0eXBlLmFyZ3VtZW50cy5tYXAodHlwZURlc2NyaXB0aW9uKS5qb2luKFwiLCBcIil9YCA6IFwiXCJ9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGByZWZlcmVuY2U8JHt0eXBlLmRlY2xhcmF0aW9uSWR9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHJldHVybiBgb3duZWQtcmVzb3VyY2U8JHt0eXBlLnJlc291cmNlSWR9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4gYG93bmVkLXJlZmVyZW5jZTwke3R5cGUuZGVjbGFyYXRpb25JZH0+YFxuICBpZiAodHlwZS5raW5kID09IFwiRXJyb3JUeXBlXCIpIHJldHVybiBgZXJyb3I8JHt0eXBlLmRlY2xhcmF0aW9uSWR9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiBgbGlzdDwke3R5cGVEZXNjcmlwdGlvbih0eXBlLmVsZW1lbnRUeXBlKX0+YFxuICBpZiAodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiBgb3B0aW9uYWw8JHt0eXBlRGVzY3JpcHRpb24odHlwZS52YWx1ZVR5cGUpfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSByZXR1cm4gYG9yZGVyZWQtbWFwPHN0cmluZywgJHt0eXBlRGVzY3JpcHRpb24odHlwZS52YWx1ZVR5cGUpfSwgaW5zZXJ0aW9uPmBcblxuICByZXR1cm4gYG1hcDxzdHJpbmcsICR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0+YFxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdHlwZSBncmFwaCBjb250YWlucyBsaW5lYXIgb3duZXJzaGlwLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBbc2Vlbl0gLSBWaXNpdGVkIHR5cGUgY29udGFpbmVycy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG93bmVyc2hpcCBvY2N1cnMgYXQgYW55IGRlcHRoLlxuICovXG5mdW5jdGlvbiBjb250YWluc093bmVkVHlwZSh0eXBlLCBzZWVuID0gbmV3IFNldCgpKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodHlwZSkgfHwgc2Vlbi5oYXModHlwZSkpIHJldHVybiBmYWxzZVxuICBzZWVuLmFkZCh0eXBlKVxuICBjb25zdCBraW5kID0gUmVmbGVjdC5nZXQodHlwZSwgXCJraW5kXCIpXG5cbiAgaWYgKGtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IGtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIHRydWVcbiAgaWYgKGtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gY29udGFpbnNPd25lZFR5cGUoUmVmbGVjdC5nZXQodHlwZSwgXCJlbGVtZW50VHlwZVwiKSwgc2VlbilcbiAgaWYgKGtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIGNvbnRhaW5zT3duZWRUeXBlKFJlZmxlY3QuZ2V0KHR5cGUsIFwidmFsdWVUeXBlXCIpLCBzZWVuKVxuICBpZiAoa2luZCA9PSBcIk1hcFR5cGVcIiB8fCBraW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgIHJldHVybiBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcImtleVR5cGVcIiksIHNlZW4pIHx8IGNvbnRhaW5zT3duZWRUeXBlKFJlZmxlY3QuZ2V0KHR5cGUsIFwidmFsdWVUeXBlXCIpLCBzZWVuKVxuICB9XG4gIGlmIChraW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgY29uc3QgYXJndW1lbnRzXyA9IFJlZmxlY3QuZ2V0KHR5cGUsIFwiYXJndW1lbnRzXCIpXG5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmd1bWVudHNfKSAmJiBhcmd1bWVudHNfLnNvbWUoKGFyZ3VtZW50KSA9PiBjb250YWluc093bmVkVHlwZShhcmd1bWVudCwgc2VlbikpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzY2FsYXIgc2VtYW50aWMgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0gW25hbWVdIC0gT3B0aW9uYWwgcmVxdWlyZWQgc2NhbGFyLlxuICogQHJldHVybnMge3R5cGUgaXMgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5UeXBlUmVmZXJlbmNlfSBXaGV0aGVyIGl0IGlzIHRoZSByZXF1ZXN0ZWQgc2NhbGFyLlxuICovXG5mdW5jdGlvbiBpc1NjYWxhclR5cGUodHlwZSwgbmFtZSkge1xuICByZXR1cm4gdHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiICYmIGlzU2NhbGFyVHlwZU5hbWUodHlwZS5uYW1lKSAmJiAobmFtZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUubmFtZSA9PSBuYW1lKVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgc29sZSBub24tdmFsdWUgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHJldHVybnMge3R5cGUgaXMgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFdoZXRoZXIgaXQgaXMgdm9pZC5cbiAqL1xuZnVuY3Rpb24gaXNWb2lkVHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIgJiYgdHlwZS5uYW1lID09IFwidm9pZFwiXG59XG5cbi8qKlxuICogUmVxdWlyZXMgYSBzY2FsYXIgdHlwZSBmb3IgdGhlIHByZS1jb2xsZWN0aW9uIG9wZXJhdG9yIGNvbnRyYWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gT3BlcmFuZCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSBTY2FsYXIgbmFtZS5cbiAqL1xuZnVuY3Rpb24gc2NhbGFyTmFtZUZvck9wZXJhdGlvbih0eXBlLCBsb2NhdGlvbiwgZmFpbCkge1xuICBpZiAoIWlzU2NhbGFyVHlwZSh0eXBlKSkge1xuICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYFNjYWxhciBvcGVyYXRpb24gcmVjZWl2ZWQgJHt0eXBlRGVzY3JpcHRpb24odHlwZSl9LmAsIGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHR5cGUubmFtZVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIHRoYXQgYSB0b3RhbCBjb2xsZWN0aW9uIGFjY2VzcyBpcyBwcm92ZW4gb3IgdXNlcyBhIHNvdXJjZSBvcGVyYXRpb24gdGhhdCBmYWlscyBvbiBhYnNlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkxpc3RJbmRleEV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1hcExvb2t1cEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBBY2Nlc3MuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3ZlbiAtIFdoZXRoZXIgc3RhdGljIGxpdGVyYWwgcHJvcGFnYXRpb24gcHJvdmVzIHByZXNlbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0aGlzIGlzIGZyb250ZW5kIGFkbWlzc2lvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUFjY2Vzc1RvdGFsaXR5KGV4cHJlc3Npb24sIHByb3Zlbiwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbCkge1xuICBpZiAocHJvdmVuKSB7XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24udG90YWxpdHkgPSBcInByb3ZlblwiXG4gICAgZWxzZSBpZiAoZXhwcmVzc2lvbi50b3RhbGl0eSAhPSBcInByb3ZlblwiICYmIGV4cHJlc3Npb24udG90YWxpdHkgIT0gXCJmYWlsLW9uLWFic2VuY2VcIikge1xuICAgICAgZmFpbChcIlVOQ0hFQ0tFRF9DT0xMRUNUSU9OX0FDQ0VTU1wiLCBcIkNvbGxlY3Rpb24gYWNjZXNzIGxhY2tzIGEgdG90YWxpdHkgZ3VhcmFudGVlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG4gIGlmIChleHByZXNzaW9uLnRvdGFsaXR5ICE9IFwiZmFpbC1vbi1hYnNlbmNlXCIpIHtcbiAgICBmYWlsKFwiVU5DSEVDS0VEX0NPTExFQ1RJT05fQUNDRVNTXCIsIFwiQ29sbGVjdGlvbiBhY2Nlc3MgaXMgbm90IHN0YXRpY2FsbHkgcHJvdmVuIGFuZCBkb2VzIG5vdCBmYWlsIG9uIGFic2VuY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGJpbmRpbmcgd2l0aG91dCBwcm9kdWNpbmcgYSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBCaW5kaW5nIG5hbWUuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7QmluZGluZyB8IHVuZGVmaW5lZH0gQmluZGluZyB3aGVuIHZpc2libGUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRCaW5kaW5nKG5hbWUsIHNjb3BlKSB7XG4gIGZvciAobGV0IGN1cnJlbnQgPSAvKiogQHR5cGUge1Njb3BlIHwgdW5kZWZpbmVkfSAqLyAoc2NvcGUpOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpIHtcbiAgICBjb25zdCBiaW5kaW5nID0gY3VycmVudC5iaW5kaW5ncy5nZXQobmFtZSlcblxuICAgIGlmIChiaW5kaW5nKSByZXR1cm4gYmluZGluZ1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4aXN0aW5nIGJpbmRpbmdzIHdob3NlIGtub3duIHZhbHVlcyBtdXN0IGJlIG1lcmdlZCBhY3Jvc3MgYSBjb25kaXRpb25hbC5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBzY29wZS5cbiAqIEByZXR1cm5zIHtCaW5kaW5nW119IE5lYXJlc3QtdG8tZmFydGhlc3QgYmluZGluZ3MuXG4gKi9cbmZ1bmN0aW9uIGJpbmRpbmdzVmlzaWJsZUZyb20oc2NvcGUpIHtcbiAgY29uc3QgYmluZGluZ3MgPSBbXVxuXG4gIGZvciAobGV0IGN1cnJlbnQgPSAvKiogQHR5cGUge1Njb3BlIHwgdW5kZWZpbmVkfSAqLyAoc2NvcGUpOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpIHtcbiAgICBiaW5kaW5ncy5wdXNoKC4uLmN1cnJlbnQuYmluZGluZ3MudmFsdWVzKCkpXG4gIH1cblxuICByZXR1cm4gYmluZGluZ3Ncbn1cblxuLyoqXG4gKiBGaW5kcyB2aXNpYmxlIG11dGFibGUgYmluZGluZ3MgdGhhdCBhIGxvb3AgYm9keSBtYXkgYXNzaWduIG9uIGFueSBuZXN0ZWQgcGF0aC5cbiAqIFRoZSBzZXQgaXMgY29tcHV0ZWQgYWZ0ZXIgdmFsaWRhdGluZyB0aGUgbGlzdCBleHByZXNzaW9uIGJlY2F1c2UgY29sbGVjdGlvbiBldmFsdWF0aW9uIHByZWNlZGVzIGJvZHkgZWZmZWN0cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBDYW5kaWRhdGUgbG9vcCBib2R5LlxuICogQHBhcmFtIHtTY29wZX0gb3V0ZXJTY29wZSAtIFNjb3BlIHZpc2libGUgYmVmb3JlIGVudGVyaW5nIHRoZSBsb29wLlxuICogQHBhcmFtIHtTZXQ8QmluZGluZz59IFthc3NpZ25lZF0gLSBBY2N1bXVsYXRlZCBiaW5kaW5nIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7U2V0PEJpbmRpbmc+fSBFeGFjdGx5IHRoZSB2aXNpYmxlIG11dGFibGUgYmluZGluZ3MgdGFyZ2V0ZWQgYnkgbmVzdGVkIGFzc2lnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoYmxvY2ssIG91dGVyU2NvcGUsIGFzc2lnbmVkID0gbmV3IFNldCgpKSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGJpbmRpbmcgPSBmaW5kQmluZGluZyhzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIG91dGVyU2NvcGUpXG5cbiAgICAgIGlmIChiaW5kaW5nPy5tdXRhYmxlKSBhc3NpZ25lZC5hZGQoYmluZGluZylcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5jb25zZXF1ZW50LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmFsdGVybmF0ZSwgb3V0ZXJTY29wZSwgYXNzaWduZWQpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICAgIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuYm9keSwgb3V0ZXJTY29wZSwgYXNzaWduZWQpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgICAgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5jYXRjaEJvZHksIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhc3NpZ25lZFxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZXMgb25seSBpbW11dGFibGUgdmFsdWVzIHdob3NlIGV4YWN0IGNvbGxlY3Rpb24gY29udGVudHMgcmVtYWluIGtub3duLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBFeHByZXNzaW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0gS25vd24gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNjb3BlKSB7XG4gIGlmIChbXCJJbnRlZ2VyTGl0ZXJhbFwiLCBcIkJvb2xlYW5MaXRlcmFsXCIsIFwiU3RyaW5nTGl0ZXJhbFwiLCBcIkxpc3RMaXRlcmFsXCIsIFwiTWFwTGl0ZXJhbFwiLCBcIk9yZGVyZWRNYXBMaXRlcmFsXCJdLmluY2x1ZGVzKGV4cHJlc3Npb24ua2luZCkpIHJldHVybiBleHByZXNzaW9uXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gZmluZEJpbmRpbmcoZXhwcmVzc2lvbi5uYW1lLCBzY29wZSk/Lmtub3duVmFsdWVcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkxpc3RJbmRleEV4cHJlc3Npb25cIikgcmV0dXJuIHByb3Zlbkxpc3RFbGVtZW50KGV4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5pbmRleCwgc2NvcGUpXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMb29rdXBFeHByZXNzaW9uXCIpIHJldHVybiBwcm92ZW5NYXBWYWx1ZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24ua2V5LCBzY29wZSlcblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRmluZHMgdGhlIHN0YXRpY2FsbHkgc2VsZWN0ZWQgbGlzdCBlbGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0IHJlY2VpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGluZGV4IC0gSW5kZXggZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9IFByb3ZlbiBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBwcm92ZW5MaXN0RWxlbWVudChjb2xsZWN0aW9uLCBpbmRleCwgc2NvcGUpIHtcbiAgY29uc3Qga25vd25Db2xsZWN0aW9uID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oY29sbGVjdGlvbiwgc2NvcGUpXG4gIGNvbnN0IGtub3duSW5kZXggPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihpbmRleCwgc2NvcGUpXG5cbiAgaWYgKGtub3duQ29sbGVjdGlvbj8ua2luZCAhPSBcIkxpc3RMaXRlcmFsXCIgfHwga25vd25JbmRleD8ua2luZCAhPSBcIkludGVnZXJMaXRlcmFsXCIgfHxcbiAgICBrbm93bkluZGV4LnZhbHVlIDwgMCB8fCBrbm93bkluZGV4LnZhbHVlID49IGtub3duQ29sbGVjdGlvbi5lbGVtZW50cy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4ga25vd25Db2xsZWN0aW9uLmVsZW1lbnRzW2tub3duSW5kZXgudmFsdWVdXG59XG5cbi8qKlxuICogRmluZHMgdGhlIHN0YXRpY2FsbHkgc2VsZWN0ZWQgbWFwIHZhbHVlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBNYXAgcmVjZWl2ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0ga2V5IC0gS2V5IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkfSBQcm92ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHByb3Zlbk1hcFZhbHVlKGNvbGxlY3Rpb24sIGtleSwgc2NvcGUpIHtcbiAgY29uc3Qga25vd25Db2xsZWN0aW9uID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oY29sbGVjdGlvbiwgc2NvcGUpXG4gIGNvbnN0IGtub3duS2V5ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oa2V5LCBzY29wZSlcblxuICBpZiAoa25vd25Db2xsZWN0aW9uPy5raW5kICE9IFwiTWFwTGl0ZXJhbFwiICYmIGtub3duQ29sbGVjdGlvbj8ua2luZCAhPSBcIk9yZGVyZWRNYXBMaXRlcmFsXCIgfHxcbiAgICBrbm93bktleT8ua2luZCAhPSBcIlN0cmluZ0xpdGVyYWxcIikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiBrbm93bkNvbGxlY3Rpb24uZW50cmllcy5maW5kKChlbnRyeSkgPT4gZW50cnkua2V5LnZhbHVlID09IGtub3duS2V5LnZhbHVlKT8udmFsdWVcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIG51bWVyaWMgc3RyaW5ncyBpbmRlcGVuZGVudGx5IGZyb20gYW55IHRhcmdldCdzIGtleSBjb2VyY2lvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBMaXRlcmFsIGtleS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGl0IGlzIG51bWVyaWMuXG4gKi9cbmZ1bmN0aW9uIGlzTnVtZXJpY1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gL15bKy1dPyg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8kL2l1LnRlc3QodmFsdWUudHJpbSgpKVxufVxuXG4vKipcbiAqIFNlbGVjdHMgYW4gZXhhY3Qgc2VtYW50aWMgdG9rZW4gbG9jYXRpb24gd2hlbiBwYXJzZXIgcHJvdmVuYW5jZSBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge3tsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgc291cmNlUHJvdmVuYW5jZT86IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX19IG5vZGUgLSBMb2NhdGVkIHNlbWFudGljIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFRva2VuIHJvbGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gRXhhY3Qgb3Igb3duaW5nIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiByb2xlTG9jYXRpb24obm9kZSwgcm9sZSkge1xuICByZXR1cm4gbm9kZS5zb3VyY2VQcm92ZW5hbmNlPy5yYW5nZXNbcm9sZV0gPz8gcGFyc2VyUmFuZ2VGb3Iobm9kZSwgcm9sZSkgPz8gbm9kZS5sb2NhdGlvblxufVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGV4YWN0IHR5cGUgdG9rZW4gb3IgdGhlIG93bmluZyBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gb3duZXJMb2NhdGlvbiAtIE93bmluZyBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcm9sZV0gLSBSZWN1cnNpdmUgdHlwZSByb2xlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IEV4YWN0IHR5cGUgbG9jYXRpb24gd2hlbiBrbm93bi5cbiAqL1xuZnVuY3Rpb24gdHlwZUxvY2F0aW9uKHR5cGUsIG93bmVyTG9jYXRpb24sIHJvbGUgPSBcInR5cGVcIikge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpKSByZXR1cm4gb3duZXJMb2NhdGlvblxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9ICovICh0eXBlKVxuXG4gIHJldHVybiBjYW5kaWRhdGUuc291cmNlUHJvdmVuYW5jZT8ucmFuZ2VzW3JvbGVdID8/IHBhcnNlclJhbmdlRm9yKGNhbmRpZGF0ZSwgcm9sZSkgPz9cbiAgICBjYW5kaWRhdGUuc291cmNlUHJvdmVuYW5jZT8ucmFuZ2VzLnR5cGUgPz8gcGFyc2VyUmFuZ2VGb3IoY2FuZGlkYXRlLCBcInR5cGVcIikgPz8gb3duZXJMb2NhdGlvblxufVxuXG4vKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVW5hcnlPcGVyYXRpb24sIHtvcGVyYW5kOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWUsIHJlc3VsdDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfT4+fSAqL1xuY29uc3QgdW5hcnlPcGVyYXRpb25TaWduYXR1cmVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEJvb2xlYW5Ob3Q6IE9iamVjdC5mcmVlemUoe29wZXJhbmQ6IFwiYm9vbGVhblwiLCByZXN1bHQ6IFwiYm9vbGVhblwifSksXG4gIEludGVnZXJOZWdhdGU6IE9iamVjdC5mcmVlemUoe29wZXJhbmQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiaW50ZWdlclwifSlcbn0pXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNCaW5hcnlPcGVyYXRpb24sIHtsZWZ0OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWUsIHJpZ2h0OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWUsIHJlc3VsdDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfT4+fSAqL1xuY29uc3QgYmluYXJ5T3BlcmF0aW9uU2lnbmF0dXJlcyA9IE9iamVjdC5mcmVlemUoe1xuICBCb29sZWFuQW5kOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiYm9vbGVhblwifSksXG4gIEJvb2xlYW5FcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBCb29sZWFuTm90RXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiYm9vbGVhblwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJib29sZWFuXCJ9KSxcbiAgQm9vbGVhbk9yOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiYm9vbGVhblwifSksXG4gIEludGVnZXJBZGQ6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiaW50ZWdlclwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJHcmVhdGVyVGhhbjogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJMZXNzVGhhbjogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTGVzc1RoYW5PckVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJNdWx0aXBseTogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJpbnRlZ2VyXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTm90RXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlclN1YnRyYWN0OiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIFN0cmluZ0NvbmNhdDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJzdHJpbmdcIiwgcmVzdWx0OiBcInN0cmluZ1wiLCByaWdodDogXCJzdHJpbmdcIn0pLFxuICBTdHJpbmdFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJzdHJpbmdcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwic3RyaW5nXCJ9KSxcbiAgU3RyaW5nTm90RXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcInN0cmluZ1wifSlcbn0pXG5cbi8qKlxuICogU2VsZWN0cyBvbmUgdHlwZWQgdW5hcnkgbWVhbmluZyBmcm9tIHBhcnNlci1ub3JtYWxpemVkIHNvdXJjZSBpbnRlbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IHNvdXJjZU9wZXJhdGlvbiAtIFRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0gb3BlcmFuZFR5cGUgLSBSZXNvbHZlZCBvcGVyYW5kIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3BlcmFuZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVW5hcnlPcGVyYXRpb259IFNlbWFudGljIG9wZXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVW5hcnlPcGVyYXRpb24oc291cmNlT3BlcmF0aW9uLCBvcGVyYW5kVHlwZSwgbG9jYXRpb24sIGZhaWwpIHtcbiAgaWYgKHNvdXJjZU9wZXJhdGlvbiA9PSBcIk5lZ2F0ZVwiKSB7XG4gICAgaWYgKG9wZXJhbmRUeXBlICE9IFwiaW50ZWdlclwiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYEludGVnZXIgbmVnYXRpb24gcmVxdWlyZXMgaW50ZWdlcjsgcmVjZWl2ZWQgJHtvcGVyYW5kVHlwZX0uYCwgbG9jYXRpb24pXG4gICAgcmV0dXJuIFwiSW50ZWdlck5lZ2F0ZVwiXG4gIH1cbiAgaWYgKHNvdXJjZU9wZXJhdGlvbiA9PSBcIk5vdFwiKSB7XG4gICAgaWYgKG9wZXJhbmRUeXBlICE9IFwiYm9vbGVhblwiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYEJvb2xlYW4gbm90IHJlcXVpcmVzIGJvb2xlYW47IHJlY2VpdmVkICR7b3BlcmFuZFR5cGV9LmAsIGxvY2F0aW9uKVxuICAgIHJldHVybiBcIkJvb2xlYW5Ob3RcIlxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIHVuYXJ5IHNvdXJjZSBvcGVyYXRpb24gJHtTdHJpbmcoc291cmNlT3BlcmF0aW9uKX0uYCwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogU2VsZWN0cyBvbmUgdHlwZWQgYmluYXJ5IG1lYW5pbmcgZnJvbSBwYXJzZXItbm9ybWFsaXplZCBzb3VyY2UgaW50ZW50LlxuICogQHBhcmFtIHt1bmtub3dufSBzb3VyY2VPcGVyYXRpb24gLSBUcmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IGxlZnRUeXBlIC0gUmVzb2x2ZWQgbGVmdCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IHJpZ2h0VHlwZSAtIFJlc29sdmVkIHJpZ2h0IHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxlZnRMb2NhdGlvbiAtIExlZnQgb3BlcmFuZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gcmlnaHRMb2NhdGlvbiAtIFJpZ2h0IG9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGV4cHJlc3Npb25Mb2NhdGlvbiAtIFdob2xlIG9wZXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBTZW1hbnRpYyBvcGVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJpbmFyeU9wZXJhdGlvbihzb3VyY2VPcGVyYXRpb24sIGxlZnRUeXBlLCByaWdodFR5cGUsIGxlZnRMb2NhdGlvbiwgcmlnaHRMb2NhdGlvbiwgZXhwcmVzc2lvbkxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJQaHBBZGRcIikge1xuICAgIGlmIChsZWZ0VHlwZSA9PSBcInN0cmluZ1wiICYmIHJpZ2h0VHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOU1VQUE9SVEVEX1NZTlRBWFwiLCBcIlBIUCBiaW5hcnkgKyBkb2VzIG5vdCBjb25jYXRlbmF0ZSBzdHJpbmdzOyB1c2UgLiBpbnN0ZWFkLlwiLCBleHByZXNzaW9uTG9jYXRpb24pXG4gICAgfVxuXG4gICAgc291cmNlT3BlcmF0aW9uID0gXCJBZGRcIlxuICB9XG5cbiAgaWYgKHNvdXJjZU9wZXJhdGlvbiA9PSBcIlN0cmluZ0NvbmNhdFwiKSB7XG4gICAgaWYgKGxlZnRUeXBlICE9IFwic3RyaW5nXCIpIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgU3RyaW5nIGNvbmNhdGVuYXRpb24gcmVxdWlyZXMgc3RyaW5nOyByZWNlaXZlZCAke2xlZnRUeXBlfS5gLCBsZWZ0TG9jYXRpb24pXG4gICAgaWYgKHJpZ2h0VHlwZSAhPSBcInN0cmluZ1wiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYFN0cmluZyBjb25jYXRlbmF0aW9uIHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtyaWdodFR5cGV9LmAsIHJpZ2h0TG9jYXRpb24pXG4gICAgcmV0dXJuIFwiU3RyaW5nQ29uY2F0XCJcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJBZGRcIikge1xuICAgIGlmIChsZWZ0VHlwZSA9PSBcImludGVnZXJcIiAmJiByaWdodFR5cGUgPT0gXCJpbnRlZ2VyXCIpIHJldHVybiBcIkludGVnZXJBZGRcIlxuICAgIGlmIChsZWZ0VHlwZSA9PSBcInN0cmluZ1wiICYmIHJpZ2h0VHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJTdHJpbmdDb25jYXRcIlxuXG4gICAgY29uc3QgbG9jYXRpb24gPSBsZWZ0VHlwZSA9PSBcImludGVnZXJcIiB8fCBsZWZ0VHlwZSA9PSBcInN0cmluZ1wiID8gcmlnaHRMb2NhdGlvbiA6IGxlZnRMb2NhdGlvblxuXG4gICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgQWRkaXRpb24gcmVxdWlyZXMgdHdvIGludGVnZXJzIG9yIHR3byBzdHJpbmdzOyByZWNlaXZlZCAke2xlZnRUeXBlfSBhbmQgJHtyaWdodFR5cGV9LmAsIGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgZml4ZWRPcGVyYXRpb25zID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgICBBbmQ6IFtcImJvb2xlYW5cIiwgXCJCb29sZWFuQW5kXCJdLFxuICAgIEdyZWF0ZXJUaGFuOiBbXCJpbnRlZ2VyXCIsIFwiSW50ZWdlckdyZWF0ZXJUaGFuXCJdLFxuICAgIEdyZWF0ZXJUaGFuT3JFcXVhbDogW1wiaW50ZWdlclwiLCBcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIl0sXG4gICAgTGVzc1RoYW46IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyTGVzc1RoYW5cIl0sXG4gICAgTGVzc1RoYW5PckVxdWFsOiBbXCJpbnRlZ2VyXCIsIFwiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiXSxcbiAgICBNdWx0aXBseTogW1wiaW50ZWdlclwiLCBcIkludGVnZXJNdWx0aXBseVwiXSxcbiAgICBPcjogW1wiYm9vbGVhblwiLCBcIkJvb2xlYW5PclwiXSxcbiAgICBTdWJ0cmFjdDogW1wiaW50ZWdlclwiLCBcIkludGVnZXJTdWJ0cmFjdFwiXVxuICB9KVxuICBjb25zdCBmaXhlZCA9IFJlZmxlY3QuZ2V0KGZpeGVkT3BlcmF0aW9ucywgU3RyaW5nKHNvdXJjZU9wZXJhdGlvbikpXG5cbiAgaWYgKGZpeGVkKSB7XG4gICAgY29uc3QgW3JlcXVpcmVkVHlwZSwgb3BlcmF0aW9uXSA9IGZpeGVkXG5cbiAgICBpZiAobGVmdFR5cGUgIT0gcmVxdWlyZWRUeXBlKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9IHJlcXVpcmVzICR7cmVxdWlyZWRUeXBlfTsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gcmVxdWlyZWRUeXBlKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9IHJlcXVpcmVzICR7cmVxdWlyZWRUeXBlfTsgcmVjZWl2ZWQgJHtyaWdodFR5cGV9LmAsIHJpZ2h0TG9jYXRpb24pXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9ufSAqLyAob3BlcmF0aW9uKVxuICB9XG5cbiAgaWYgKHNvdXJjZU9wZXJhdGlvbiA9PSBcIkphdmFFcXVhbFwiIHx8IHNvdXJjZU9wZXJhdGlvbiA9PSBcIkphdmFOb3RFcXVhbFwiKSB7XG4gICAgaWYgKGxlZnRUeXBlID09IFwic3RyaW5nXCIgfHwgcmlnaHRUeXBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVU5TVVBQT1JURURfU1lOVEFYXCIsIFwiSmF2YSByZWZlcmVuY2UgZXF1YWxpdHkgaXMgb3V0c2lkZSB0aGUgaW1wbGVtZW50ZWQgc2VtYW50aWMgc3Vic2V0LlwiLCBleHByZXNzaW9uTG9jYXRpb24pXG4gICAgfVxuXG4gICAgc291cmNlT3BlcmF0aW9uID0gc291cmNlT3BlcmF0aW9uID09IFwiSmF2YUVxdWFsXCIgPyBcIkVxdWFsXCIgOiBcIk5vdEVxdWFsXCJcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdFcXVhbFwiIHx8IHNvdXJjZU9wZXJhdGlvbiA9PSBcIlN0cmluZ05vdEVxdWFsXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgZXF1YWxpdHkgcmVxdWlyZXMgc3RyaW5nOyByZWNlaXZlZCAke2xlZnRUeXBlfS5gLCBsZWZ0TG9jYXRpb24pXG4gICAgaWYgKHJpZ2h0VHlwZSAhPSBcInN0cmluZ1wiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYFN0cmluZyBlcXVhbGl0eSByZXF1aXJlcyBzdHJpbmc7IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7XCJTdHJpbmdFcXVhbFwiIHwgXCJTdHJpbmdOb3RFcXVhbFwifSAqLyAoc291cmNlT3BlcmF0aW9uKVxuICB9XG5cbiAgaWYgKHNvdXJjZU9wZXJhdGlvbiA9PSBcIkVxdWFsXCIgfHwgc291cmNlT3BlcmF0aW9uID09IFwiTm90RXF1YWxcIikge1xuICAgIGlmIChsZWZ0VHlwZSAhPSByaWdodFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTTUFUQ0hFRF9FUVVBTElUWV9UWVBFU1wiLCBgRXF1YWxpdHkgcmVxdWlyZXMgbWF0Y2hpbmcgc2NhbGFyIHR5cGVzOyByZWNlaXZlZCAke2xlZnRUeXBlfSBhbmQgJHtyaWdodFR5cGV9LmAsIHJpZ2h0TG9jYXRpb24pXG4gICAgfVxuXG4gICAgY29uc3QgcHJlZml4ID0gbGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgPyBcIkludGVnZXJcIiA6IGxlZnRUeXBlID09IFwiYm9vbGVhblwiID8gXCJCb29sZWFuXCIgOiBcIlN0cmluZ1wiXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9ufSAqLyAoYCR7cHJlZml4fSR7c291cmNlT3BlcmF0aW9ufWApXG4gIH1cblxuICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFVua25vd24gYmluYXJ5IHNvdXJjZSBvcGVyYXRpb24gJHtTdHJpbmcoc291cmNlT3BlcmF0aW9uKX0uYCwgbGVmdExvY2F0aW9uKVxufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRyYW5zaWVudCBmcm9udGVuZCBpbnRlbnQgd2l0aCB0aGUgcHVibGljIHR5cGVkIG9wZXJhdGlvbiBmaWVsZHMuXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwcmVzc2lvbiAtIE11dGFibGUgYWRhcHRlZCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVW5hcnlPcGVyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBUeXBlZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IHJlc3VsdCB0eXBlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNldE5vcm1hbGl6ZWRPcGVyYXRpb24oZXhwcmVzc2lvbiwgb3BlcmF0aW9uLCB0eXBlKSB7XG4gIFJlZmxlY3Quc2V0KGV4cHJlc3Npb24sIFwib3BlcmF0aW9uXCIsIG9wZXJhdGlvbilcbiAgUmVmbGVjdC5zZXQoZXhwcmVzc2lvbiwgXCJ0eXBlXCIsIHR5cGUpXG59XG4iXX0=
3357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdmFsaWRhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxlQUFlLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUMxRixPQUFPLEVBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDbkcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUV2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFFekcsb0ZBQW9GO0FBQ3BGLGtGQUFrRjtBQUNsRiwwRkFBMEY7QUFDMUYsa0ZBQWtGO0FBQ2xGOzs7Ozs7OztHQVFHO0FBQ0gscURBQXFEO0FBQ3JELE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUN0RCx5REFBeUQ7QUFDekQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2hELDRGQUE0RjtBQUM1RixNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFDN0MsbURBQW1EO0FBQ25ELE1BQU0sMkJB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QUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ2hHLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RixzQkFBc0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUM3RixlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDdEYsZUFBZSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3RGLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RixZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDaEYsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ2hGLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVB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QUFTLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSw2Q0FBNkMsU0FBUyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFakksT0FBTywrQ0FBK0MsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCxJQUFJLGVBQWUsSUFBSSxPQUFPLElBQUksZUFBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hFLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLHFEQUFxRCxRQUFRLFFBQVEsU0FBUyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDNUksQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFFL0YsT0FBTywyREFBMkQsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDcEcsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxtQ0FBbUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUE7QUFDM0csQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJO0lBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3NlbWFudGljRmFpbHVyZSwgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5LCB1bnN1cHBvcnRlZFN5bnRheH0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtyZWNvcmRUeXBlU3Vic3RpdHV0aW9ucywgc3Vic3RpdHV0ZVZhbHVlVHlwZSwgdHlwZUNvbnRhaW5zQW55VmFyaWFibGV9IGZyb20gXCIuL2dlbmVyaWNzLmpzXCJcbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzLCBpc1NjYWxhclR5cGVOYW1lLCBzY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcbmltcG9ydCB7YWRhcHRlZE9wZXJhdGlvbkZvcn0gZnJvbSBcIi4vb3BlcmF0b3JzLmpzXCJcbmltcG9ydCB7cGFyc2VyUmFuZ2VGb3J9IGZyb20gXCIuL3Byb3ZlbmFuY2UuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZUVmZmVjdEdyYXBofSBmcm9tIFwiLi9lZmZlY3RzLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVSZXNvdXJjZUxpZmV0aW1lc30gZnJvbSBcIi4vbGlmZXRpbWUuanNcIlxuXG5jb25zdCB0YXNrMDA1TGFuZ3VhZ2VzID0gbmV3IFNldChbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCIsIFwiY1wiLCBcImRhcnRcIiwgXCJ6aWdcIl0pXG5cbi8qKiBAdHlwZWRlZiB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IFJlY29yZFJlZ2lzdHJ5ICovXG4vKiogQHR5cGVkZWYge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IENsYXNzUmVnaXN0cnkgKi9cbi8qKiBAdHlwZWRlZiB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IEludGVyZmFjZVJlZ2lzdHJ5ICovXG4vKiogQHR5cGVkZWYge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IEVycm9yUmVnaXN0cnkgKi9cbi8qKlxuICogQHR5cGVkZWYgSW50ZXJmYWNlQ29udHJhY3RNZW1iZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnRlcmZhY2VJZCAtIERlY2xhcmluZyBpbnRlcmZhY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kSWQgLSBEZWNsYXJpbmcgaW50ZXJmYWNlIG1ldGhvZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gQ29udHJhY3QgbWV0aG9kIG5hbWUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBTb3VyY2Utb3JkZXJlZCBjb250cmFjdCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gQ29udHJhY3QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGVjbGFyaW5nIG1ldGhvZCBzb3VyY2UgbG9jYXRpb24uXG4gKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgQ2xhc3NSZWdpc3RyeT59ICovXG5jb25zdCByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeSA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgSW50ZXJmYWNlUmVnaXN0cnk+fSAqL1xuY29uc3QgaW50ZXJmYWNlc0J5UmVjb3JkUmVnaXN0cnkgPSBuZXcgV2Vha01hcCgpXG4vKiogQHR5cGUge1dlYWtNYXA8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbiwgSW50ZXJmYWNlQ29udHJhY3RNZW1iZXJbXT59ICovXG5jb25zdCBmbGF0dGVuZWRJbnRlcmZhY2VDYWNoZSA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgU2V0PHN0cmluZz4+fSAqL1xuY29uc3QgcmVzb3VyY2VJZHNCeVJlY29yZFJlZ2lzdHJ5ID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGV9IHR5cGUgLSBCaW5kaW5nIHR5cGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0ga25vd25WYWx1ZSAtIEN1cnJlbnQgc3RhdGljYWxseSBrbm93biBpbW11dGFibGUgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTY29wZVxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBCaW5kaW5nPn0gYmluZGluZ3MgLSBCaW5kaW5ncyBkZWNsYXJlZCBkaXJlY3RseSBpbiB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gcGVuZGluZyAtIE5hbWVzIGRlY2xhcmVkIGxhdGVyIGluIHRoaXMgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NldDxCaW5kaW5nPn0gcHJlc2VuY2VQcm9vZnMgLSBPcHRpb25hbCBiaW5kaW5ncyBwcm92ZW4gcHJlc2VudCBvbiB0aGlzIHBhdGguXG4gKiBAcHJvcGVydHkge1Njb3BlIHwgdW5kZWZpbmVkfSBwYXJlbnQgLSBFbmNsb3NpbmcgbGV4aWNhbCBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHR5cGVQYXJhbWV0ZXJzIC0gVHlwZSBwYXJhbWV0ZXJzIHZpc2libGUgdGhyb3VnaG91dCB0aGUgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gdXNlZE5hbWVzIC0gQWxsIG5hbWVzIHVzZWQgYnkgdGhlIGVuY2xvc2luZyBmdW5jdGlvbiBvciBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgdW5kZWZpbmVkfSBjdXJyZW50Q2xhc3MgLSBEZWNsYXJpbmcgY2xhc3MgZm9yIHJlY2VpdmVyLXByaXZhdGUgYWNjZXNzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9vcEZsb3dDb250ZXh0XG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnR9IFtuZWFyZXN0XSAtIE5lYXJlc3QgYWN0aXZlIGxvb3AuXG4gKiBAcHJvcGVydHkge29iamVjdH0gb3duZXIgLSBFbmNsb3NpbmcgZnVuY3Rpb24gb3IgZW50cnktcG9pbnQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIG9iamVjdD59IG93bmVycyAtIExvb3Agb3duZXIgYnkgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ZhaWxcbiAqIEB0eXBlIHsoY29kZTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfVxuICovXG5cbi8qKlxuICogRW5mb3JjZXMgdGhlIGNvaGVyZW50IHJlbGVhc2UtY2FuZGlkYXRlIHNlbWFudGljIHN1YnNldCBhZnRlciBhZGFwdGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBBZGFwdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7e2NsYXNzZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+LCBmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCBpbnRlcmZhY2VzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj4sIHJlY29yZHM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPiwgZXJyb3JzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPiwgY2FsbEVmZmVjdHM/OiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBbdmlzaWJsZV0gLSBQcm9ncmFtIGltcG9ydHMgdmlzaWJsZSBkdXJpbmcgdmFsaWRhdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBWYWxpZGF0ZWQgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXJzZWRNb2R1bGUobW9kdWxlLCBsYW5ndWFnZSwgdmlzaWJsZSA9IHt9KSB7XG4gIG5vcm1hbGl6ZVBhcnNlZE93bmVkUmVmZXJlbmNlcyhtb2R1bGUsIHZpc2libGUuY2xhc3NlcylcbiAgdmFsaWRhdGVNb2R1bGVTaGFwZShtb2R1bGUsIGxhbmd1YWdlLCAoZGV0YWlsLCBsb2NhdGlvbikgPT4gdW5zdXBwb3J0ZWRTeW50YXgobGFuZ3VhZ2UsIGRldGFpbCwgbG9jYXRpb24pKVxuICAvKipcbiAgICogQ29udmVydHMgb25lIHBhcnNlciBmYWlsdXJlIGludG8gYSBsb2NhdGVkIHNlbWFudGljIGRpYWdub3N0aWMuXG4gICAqIEB0eXBlIHtTZW1hbnRpY0ZhaWx9XG4gICAqL1xuICBjb25zdCBmYWlsID0gKGNvZGUsIGRldGFpbCwgbG9jYXRpb24pID0+IHNlbWFudGljRmFpbHVyZShsYW5ndWFnZSwgY29kZSwgZGV0YWlsLCBsb2NhdGlvbilcblxuICB2YWxpZGF0ZU1vZHVsZVR5cGVzKG1vZHVsZSwgbGFuZ3VhZ2UsIGZhaWwsIHRydWUsIHZpc2libGUpXG4gIHZhbGlkYXRlUmVzb3VyY2VMaWZldGltZXMobW9kdWxlLCBpbmZlckVzY2FwaW5nRXJyb3JFZmZlY3RzKG1vZHVsZSwgdmlzaWJsZS5jYWxsRWZmZWN0cyksIGZhaWwpXG5cbiAgcmV0dXJuIG1vZHVsZVxufVxuXG4vKipcbiAqIFByb21vdGVzIHBhcnNlci1hdXRob3JlZCBjbGFzcyBzcGVsbGluZ3MgYWZ0ZXIgYWxsIHByaXZhdGUgZmllbGQgdHlwZXMgYXJlIGtub3duLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBQYXJzZXItYXV0aG9yZWQgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBbdmlzaWJsZUNsYXNzZXNdIC0gSW1wb3J0ZWQgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGFyc2VkT3duZWRSZWZlcmVuY2VzKG1vZHVsZSwgdmlzaWJsZUNsYXNzZXMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3Qgb3duZWRDbGFzc0lkcyA9IG5ldyBTZXQoWy4uLnZpc2libGVDbGFzc2VzLnZhbHVlcygpXS5maWx0ZXIoKHtvd25lcnNoaXB9KSA9PiBvd25lcnNoaXA/LmtpbmQgPT0gXCJvd25lZFJlc291cmNlXCIpXG4gICAgLm1hcCgoe2lkfSkgPT4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpZCkpKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBkZWNsYXJhdGlvbi5maWVsZHMuZmlsdGVyKCh7dHlwZX0pID0+IHR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKVxuICAgIGlmIChmaWVsZHMubGVuZ3RoICE9IDEpIGNvbnRpbnVlXG4gICAgY29uc3QgZmllbGQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkICYge3R5cGU6IGltcG9ydChcIi4vdHlwZXMuanNcIikuT3duZWRSZXNvdXJjZVR5cGV9fSAqLyAoZmllbGRzWzBdKVxuXG4gICAgZGVjbGFyYXRpb24ub3duZXJzaGlwID0ge2ZpZWxkSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZmllbGQuaWQpLCBraW5kOiBcIm93bmVkUmVzb3VyY2VcIiwgcmVzb3VyY2VJZDogZmllbGQudHlwZS5yZXNvdXJjZUlkfVxuICAgIG93bmVkQ2xhc3NJZHMuYWRkKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpKVxuICB9XG4gIC8qKiBAdHlwZSB7dW5rbm93bltdfSAqL1xuICBjb25zdCBwZW5kaW5nID0gW21vZHVsZV1cbiAgLyoqIEB0eXBlIHtTZXQ8b2JqZWN0Pn0gKi9cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJSZWZlcmVuY2VUeXBlXCIgJiZcbiAgICAgIG93bmVkQ2xhc3NJZHMuaGFzKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImRlY2xhcmF0aW9uSWRcIikpKSBSZWZsZWN0LnNldCh2YWx1ZSwgXCJraW5kXCIsIFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpXG4gICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBpZiAoW1wibG9jYXRpb25cIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgc2NhbGFyIHR5cGVzIGFuZCBiaW5kaW5ncyBmb3IgYSBjYWxsZXItc3VwcGxpZWQgc2VtYW50aWMgbW9kdWxlIGJlZm9yZSBlbWlzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tlbmRMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBCYWNrZW5kIGxhbmd1YWdlIG9yIGJpbmFyeSB0YXJnZXQuXG4gKiBAcGFyYW0ge3tjbGFzc2VzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPiwgZnVuY3Rpb25zPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgaW50ZXJmYWNlcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+LCByZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gUmVzb2x2ZWQgcHJvZ3JhbSBpbXBvcnRzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJhY2tlbmRUeXBlcyhtb2R1bGUsIGxhbmd1YWdlLCB2aXNpYmxlID0ge30pIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIG9uZSBiYWNrZW5kIHZhbGlkYXRpb24gZmFpbHVyZSBpbnRvIGFuIHVuc3VwcG9ydGVkLWNhcGFiaWxpdHkgZGlhZ25vc3RpYy5cbiAgICogQHR5cGUge1NlbWFudGljRmFpbH1cbiAgICovXG4gIGNvbnN0IGZhaWwgPSAoX2NvZGUsIGRldGFpbCwgbG9jYXRpb24pID0+IHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgZGV0YWlsLCBsb2NhdGlvbilcblxuICB2YWxpZGF0ZU1vZHVsZVR5cGVzKG1vZHVsZSwgbGFuZ3VhZ2UsIGZhaWwsIGZhbHNlLCB2aXNpYmxlKVxuICB2YWxpZGF0ZVJlc291cmNlTGlmZXRpbWVzKG1vZHVsZSwgaW5mZXJFc2NhcGluZ0Vycm9yRWZmZWN0cyhtb2R1bGUsIHZpc2libGUuY2FsbEVmZmVjdHMpLCBmYWlsKVxufVxuXG4vKipcbiAqIENoZWNrcyBwYXJzZXItYXV0aG9yZWQgYmxvY2sgYW5kIHN0YXRlbWVudCBsYXlvdXRzIGJlZm9yZSBzZW1hbnRpYyB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0geyhkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfSBmYWlsIC0gU2hhcGUgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1vZHVsZVNoYXBlKG1vZHVsZSwgbGFuZ3VhZ2UsIGZhaWwpIHtcbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIHZhbGlkYXRlQmxvY2tTaGFwZShkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvcj8uYm9keSwgXCJjb25zdHJ1Y3RvciBib2R5XCIsIGZhaWwpXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcyA/PyBbXSkgdmFsaWRhdGVCbG9ja1NoYXBlKG1ldGhvZC5ib2R5LCBcIm1ldGhvZCBib2R5XCIsIGZhaWwpXG4gIH1cbiAgZm9yIChjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICBpZiAoIXRhc2swMDVMYW5ndWFnZXMuaGFzKGxhbmd1YWdlKSAmJiBmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoICE9IDIpIHtcbiAgICAgIGZhaWwoXCJmdW5jdGlvbiBwYXJhbWV0ZXIgY291bnQgb3RoZXIgdGhhbiB0d29cIiwgZnVuY3Rpb25EZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUJsb2NrU2hhcGUoZnVuY3Rpb25EZWNsYXJhdGlvbi5ib2R5LCBcImZ1bmN0aW9uIGJvZHlcIiwgZmFpbClcbiAgfVxuXG4gIHZhbGlkYXRlQmxvY2tTaGFwZShtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcImVudHJ5IHBvaW50XCIsIGZhaWwpXG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSByZWN1cnNpdmVseSBuZXN0ZWQgc2VtYW50aWMgYmxvY2sgcHJvZHVjZWQgYnkgYSBmcm9udGVuZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwgLSBEaWFnbm9zdGljIGRldGFpbC5cbiAqIEBwYXJhbSB7KGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IGZhaWwgLSBTaGFwZSBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQmxvY2tTaGFwZShibG9jaywgZGV0YWlsLCBmYWlsKSB7XG4gIGlmICghYmxvY2sgfHwgYmxvY2sua2luZCAhPSBcIkJsb2NrXCIgfHwgIUFycmF5LmlzQXJyYXkoYmxvY2suc3RhdGVtZW50cykpIHtcbiAgICBmYWlsKGAke2RldGFpbH0gd2l0aG91dCBCbG9ja2AsIGJsb2NrPy5sb2NhdGlvbiA/PyAvKiogQHR5cGUge25ldmVyfSAqLyAodW5kZWZpbmVkKSlcbiAgfVxuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoIVtcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiwgXCJCcmVha1N0YXRlbWVudFwiLCBcIkNvbnRpbnVlU3RhdGVtZW50XCIsIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiwgXCJGb3JFYWNoU3RhdGVtZW50XCIsIFwiSWZTdGF0ZW1lbnRcIiwgXCJMb2NhbERlY2xhcmF0aW9uXCIsIFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIiwgXCJQcmludFN0YXRlbWVudFwiLCBcIlJhaXNlU3RhdGVtZW50XCIsIFwiUmV0aHJvd1N0YXRlbWVudFwiLCBcIlJldHVyblN0YXRlbWVudFwiLCBcIlRyeVN0YXRlbWVudFwiLCBcIldoaWxlU3RhdGVtZW50XCJdLmluY2x1ZGVzKHN0YXRlbWVudC5raW5kKSkge1xuICAgICAgZmFpbChgJHtkZXRhaWx9IHN0YXRlbWVudCAke3N0YXRlbWVudC5raW5kfWAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5jb25zZXF1ZW50LCBcImlmIGNvbnNlcXVlbnRcIiwgZmFpbClcbiAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2YWxpZGF0ZUJsb2NrU2hhcGUoc3RhdGVtZW50LmFsdGVybmF0ZSwgXCJpZiBhbHRlcm5hdGVcIiwgZmFpbClcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgICAgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5ib2R5LCBcImxvb3AgYm9keVwiLCBmYWlsKVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5ib2R5LCBcInRyeSBib2R5XCIsIGZhaWwpXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGVtZW50LmhhbmRsZXJzKSB8fCAoc3RhdGVtZW50LmhhbmRsZXJzLmxlbmd0aCA9PSAwICYmICFzdGF0ZW1lbnQuZmluYWxseUJvZHkpKSB7XG4gICAgICAgIGZhaWwoYCR7ZGV0YWlsfSB0cnkgd2l0aG91dCBhbiBvcmRlcmVkIGhhbmRsZXIgbGlzdGAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHN0YXRlbWVudC5oYW5kbGVycyA/PyBbXSkge1xuICAgICAgICBpZiAoIWhhbmRsZXIgfHwgaGFuZGxlci5raW5kICE9IFwiQ2F0Y2hIYW5kbGVyXCIgfHxcbiAgICAgICAgICBPYmplY3Qua2V5cyhoYW5kbGVyKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJjYXRjaEJpbmRpbmcsY2F0Y2hCb2R5LGNhdGNoVHlwZSxraW5kLGxvY2F0aW9uXCIpIHtcbiAgICAgICAgICBmYWlsKGAke2RldGFpbH0gbWFsZm9ybWVkIGNhdGNoIGhhbmRsZXJgLCBoYW5kbGVyPy5sb2NhdGlvbiA/PyBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVCbG9ja1NoYXBlKGhhbmRsZXIuY2F0Y2hCb2R5LCBcImNhdGNoIGJvZHlcIiwgZmFpbClcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQuZmluYWxseUJvZHkpIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuZmluYWxseUJvZHksIFwiZmluYWxseSBib2R5XCIsIGZhaWwpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGRlY2xhcmF0aW9ucyBhbmQgZXhwcmVzc2lvbiB0eXBlcyB3aXRoaW4gbGV4aWNhbCBzY29wZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIFNvdXJjZSBvciBiYWNrZW5kIGxhbmd1YWdlIGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHt7Y2xhc3Nlcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj4sIGZ1bmN0aW9ucz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIGludGVyZmFjZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPiwgcmVjb3Jkcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+LCBjYWxsRWZmZWN0cz86IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn19IFt2aXNpYmxlXSAtIFByb2dyYW0gaW1wb3J0cyB2aXNpYmxlIGR1cmluZyB2YWxpZGF0aW9uLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTW9kdWxlVHlwZXMobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZSA9IHt9KSB7XG4gIGNvbnN0IGludGVyZmFjZXMgPSByZWdpc3RlckludGVyZmFjZURlY2xhcmF0aW9ucyhtb2R1bGUuaW50ZXJmYWNlcyA/PyBbXSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZS5pbnRlcmZhY2VzKVxuICBjb25zdCBjbGFzc2VzID0gcmVnaXN0ZXJDbGFzc0RlY2xhcmF0aW9ucyhtb2R1bGUuY2xhc3NlcyA/PyBbXSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZS5jbGFzc2VzLCBpbnRlcmZhY2VzKVxuICBjb25zdCByZWNvcmRzID0gdmFsaWRhdGVSZWNvcmREZWNsYXJhdGlvbnMobW9kdWxlLnJlY29yZHMgPz8gW10sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHZpc2libGUucmVjb3JkcywgY2xhc3NlcylcblxuICBpbnRlcmZhY2VzQnlSZWNvcmRSZWdpc3RyeS5zZXQocmVjb3JkcywgaW50ZXJmYWNlcylcbiAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVFcnJvckRlY2xhcmF0aW9ucyhtb2R1bGUuZXJyb3JzID8/IFtdLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlLmVycm9ycylcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSAqL1xuICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgTWFwKHZpc2libGUuZnVuY3Rpb25zID8/IFtdKVxuICBjb25zdCBkZWNsYXJhdGlvbklkcyA9IG5ldyBTZXQoWy4uLmZ1bmN0aW9ucy52YWx1ZXMoKV0uZmxhdE1hcCgoe2lkfSkgPT4gdHlwZW9mIGlkID09IFwic3RyaW5nXCIgPyBbaWRdIDogW10pKVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBmdW5jdGlvbkRlY2xhcmF0aW9uXSBvZiBtb2R1bGUuZnVuY3Rpb25zLmVudHJpZXMoKSkge1xuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBmdW5jdGlvbkRlY2xhcmF0aW9uLmlkID0gYGZ1bmN0aW9uOiR7aW5kZXh9YFxuICAgIGlmICh0eXBlb2YgZnVuY3Rpb25EZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/ZnVuY3Rpb246WzAtOV0rJC91LnRlc3QoZnVuY3Rpb25EZWNsYXJhdGlvbi5pZCkgfHxcbiAgICAgIGRlY2xhcmF0aW9uSWRzLmhhcyhmdW5jdGlvbkRlY2xhcmF0aW9uLmlkKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgZnVuY3Rpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXCIsIGZ1bmN0aW9uRGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChmdW5jdGlvbnMuaGFzKGZ1bmN0aW9uRGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQklORElOR1wiLCBgZHVwbGljYXRlIGZ1bmN0aW9uICcke2Z1bmN0aW9uRGVjbGFyYXRpb24ubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihmdW5jdGlvbkRlY2xhcmF0aW9uLCBcIm5hbWVcIikpXG4gICAgfVxuICAgIGRlY2xhcmF0aW9uSWRzLmFkZChmdW5jdGlvbkRlY2xhcmF0aW9uLmlkKVxuICAgIHZhbGlkYXRlVHlwZVBhcmFtZXRlcnMoZnVuY3Rpb25EZWNsYXJhdGlvbiwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgICBmdW5jdGlvbnMuc2V0KGZ1bmN0aW9uRGVjbGFyYXRpb24ubmFtZSwgZnVuY3Rpb25EZWNsYXJhdGlvbilcbiAgfVxuXG4gIHZhbGlkYXRlRWZmZWN0R3JhcGgobW9kdWxlLCBsYW5ndWFnZSwgZnVuY3Rpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBjbGFzc2VzKVxuICBjb25zdCBjYXBhYmlsaXR5UmVzb3VyY2VzID0gKG1vZHVsZS5jYXBhYmlsaXRpZXMgPz8gW10pLmZsYXRNYXAoKHtyZXNvdXJjZXN9KSA9PiByZXNvdXJjZXMpXG4gIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlcyA9IChtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKS5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcylcblxuICByZXNvdXJjZUlkc0J5UmVjb3JkUmVnaXN0cnkuc2V0KHJlY29yZHMsIG5ldyBTZXQoY2FwYWJpbGl0eVJlc291cmNlcy5tYXAoKHtpZH0pID0+IGlkKSkpXG4gIGNvbnN0IGV4aXN0aW5nRXJyb3JOYW1lcyA9IG5ldyBTZXQoWy4uLmVycm9ycy52YWx1ZXMoKV0ubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgY2FwYWJpbGl0eUZhaWx1cmVzKSB7XG4gICAgaWYgKGVycm9ycy5oYXMoZmFpbHVyZS5pZCkgfHwgZXhpc3RpbmdFcnJvck5hbWVzLmhhcyhmYWlsdXJlLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0VSUk9SXCIsIGBEdXBsaWNhdGUgY2FwYWJpbGl0eSBmYWlsdXJlICcke2ZhaWx1cmUubmFtZX0nLmAsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgZXJyb3JzLnNldChmYWlsdXJlLmlkLCAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGZhaWx1cmUpKSlcbiAgICBleGlzdGluZ0Vycm9yTmFtZXMuYWRkKGZhaWx1cmUubmFtZSlcbiAgfVxuXG4gIGNvbnN0IGxvb3BPd25lcnMgPSBwcmVwYXJlTG9vcElkZW50aXRpZXMobW9kdWxlLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuXG4gIGNvbnN0IHJlc2VydmVkVmFsdWVOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLmZ1bmN0aW9ucy5rZXlzKCksXG4gICAgLi4uWy4uLmludGVyZmFjZXMudmFsdWVzKCldLm1hcCgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLm5hbWUpLFxuICAgIC4uLlsuLi5yZWNvcmRzLnZhbHVlcygpXS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5uYW1lKSxcbiAgICAuLi5bLi4uY2xhc3Nlcy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uWy4uLmVycm9ycy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uY2FwYWJpbGl0eVJlc291cmNlcy5tYXAoKHtuYW1lfSkgPT4gbmFtZSlcbiAgXSlcblxuICBjb25zdCBub21pbmFsTmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFsuLi5tb2R1bGUuaW50ZXJmYWNlcyA/PyBbXSwgLi4ubW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLm1vZHVsZS5jbGFzc2VzID8/IFtdLCAuLi5tb2R1bGUuZXJyb3JzID8/IFtdXSkge1xuICAgIGlmIChub21pbmFsTmFtZXMuaGFzKGRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYER1cGxpY2F0ZSBub21pbmFsIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24oZGVjbGFyYXRpb24sIFwibmFtZVwiKSlcbiAgICB9XG4gICAgbm9taW5hbE5hbWVzLmFkZChkZWNsYXJhdGlvbi5uYW1lKVxuICB9XG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgWy4uLmNhcGFiaWxpdHlSZXNvdXJjZXMsIC4uLmNhcGFiaWxpdHlGYWlsdXJlc10pIHtcbiAgICBpZiAobm9taW5hbE5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIGBEdXBsaWNhdGUgbm9taW5hbCBkZWNsYXJhdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScuYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBub21pbmFsTmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gIH1cbiAgY29uc3QgbG9jYWxGdW5jdGlvbk5hbWVzID0gbmV3IFNldChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcbiAgY29uc3QgY2FsbEVmZmVjdHMgPSBpbmZlckNhbGxFZmZlY3RzKGZ1bmN0aW9ucywgdmlzaWJsZS5jYWxsRWZmZWN0cywgbG9jYWxGdW5jdGlvbk5hbWVzKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICB2YWxpZGF0ZUludGVyZmFjZUNvbnRyYWN0cyhkZWNsYXJhdGlvbiwgaW50ZXJmYWNlcywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgfVxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgdmFsaWRhdGVDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIHJlc2VydmVkVmFsdWVOYW1lcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BPd25lcnMpXG4gIH1cblxuICBmb3IgKGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykge1xuICAgIHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25EZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BPd25lcnMpXG4gIH1cblxuICBjb25zdCBlbnRyeVNjb3BlID0gY3JlYXRlU2NvcGUodW5kZWZpbmVkLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcylcblxuICB2YWxpZGF0ZUJsb2NrKG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIGVudHJ5U2NvcGUsIHVuZGVmaW5lZCwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtvd25lcjogbW9kdWxlLmVudHJ5UG9pbnQsIG93bmVyczogbG9vcE93bmVyc30pXG4gIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSB2YWxpZGF0ZUVmZmVjdEdyYXBoKG1vZHVsZSwgbGFuZ3VhZ2UsIGZ1bmN0aW9ucywgZmFpbCwgdHJ1ZSwgY2xhc3Nlcylcbn1cblxuLyoqXG4gKiBBc3NpZ25zIHBhcnNlci1hdXRob3JlZCBsb29wL2NvbnRyb2wgaWRlbnRpdGllcyBhbmQgdmFsaWRhdGVzIGNhbGxlci1vd25lZCBpZGVudGl0aWVzIHdpdGhvdXQgY3Jvc3NpbmcgYSBmdW5jdGlvbiBib3VuZGFyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgb2JqZWN0Pn0gTG9vcCBvd25lciBieSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUxvb3BJZGVudGl0aWVzKG1vZHVsZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbCkge1xuICBjb25zdCBvd25lcnMgPSBuZXcgTWFwKClcbiAgbGV0IG5leHRMb29wID0gMFxuXG4gIGNvbnN0IGNsYXNzT3duZXJzID0gKG1vZHVsZS5jbGFzc2VzID8/IFtdKS5mbGF0TWFwKChkZWNsYXJhdGlvbikgPT4gW2RlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLCAuLi5kZWNsYXJhdGlvbi5tZXRob2RzXSlcblxuICBmb3IgKGNvbnN0IG93bmVyIG9mIFsuLi5jbGFzc093bmVycywgLi4ubW9kdWxlLmZ1bmN0aW9ucywgbW9kdWxlLmVudHJ5UG9pbnRdKSB2aXNpdChvd25lci5ib2R5LCBvd25lciwgW10pXG5cbiAgcmV0dXJuIG93bmVyc1xuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGJsb2NrIGluIGxleGljYWwgc2VtYW50aWMgb3JkZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBDYW5kaWRhdGUgYmxvY2suXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvd25lciAtIEVuY2xvc2luZyBmdW5jdGlvbiBvciBlbnRyeSBwb2ludC5cbiAgICogQHBhcmFtIHsoaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Gb3JFYWNoU3RhdGVtZW50IHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Gb3JFYWNoTWFwU3RhdGVtZW50IHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5XaGlsZVN0YXRlbWVudClbXX0gYWN0aXZlIC0gQWN0aXZlIGxvb3BzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0KGJsb2NrLCBvd25lciwgYWN0aXZlKSB7XG4gICAgaWYgKCFibG9jayB8fCAhQXJyYXkuaXNBcnJheShibG9jay5zdGF0ZW1lbnRzKSkgcmV0dXJuXG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgYmxvY2suc3RhdGVtZW50cykge1xuICAgICAgaWYgKCFzdGF0ZW1lbnQgfHwgdHlwZW9mIHN0YXRlbWVudCAhPSBcIm9iamVjdFwiKSBjb250aW51ZVxuICAgICAgaWYgKFtcIkZvckVhY2hTdGF0ZW1lbnRcIiwgXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIsIFwiV2hpbGVTdGF0ZW1lbnRcIl0uaW5jbHVkZXMoc3RhdGVtZW50LmtpbmQpKSB7XG4gICAgICAgIGNvbnN0IGxvb3AgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnR9ICovIChzdGF0ZW1lbnQpXG5cbiAgICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGxvb3AuaWQgPSBgbG9vcDoke25leHRMb29wfWBcbiAgICAgICAgbmV4dExvb3AgKz0gMVxuICAgICAgICBpZiAodHlwZW9mIGxvb3AuaWQgIT0gXCJzdHJpbmdcIiB8fCAhL15sb29wOlswLTldKyQvdS50ZXN0KGxvb3AuaWQpIHx8IG93bmVycy5oYXMobG9vcC5pZCkpIHtcbiAgICAgICAgICBmYWlsKFwiSU5WQUxJRF9MT09QX1RBUkdFVFwiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIGxvb3AgaWRlbnRpdHkuXCIsIGxvb3AubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgb3duZXJzLnNldChsb29wLmlkLCBvd25lcilcbiAgICAgICAgdmlzaXQobG9vcC5ib2R5LCBvd25lciwgWy4uLmFjdGl2ZSwgbG9vcF0pXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMgJiYgYWN0aXZlLmxlbmd0aCA+IDApIHN0YXRlbWVudC50YXJnZXRMb29wSWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGFjdGl2ZS5hdCgtMSk/LmlkKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXQoc3RhdGVtZW50LmNvbnNlcXVlbnQsIG93bmVyLCBhY3RpdmUpXG4gICAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdChzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBvd25lciwgYWN0aXZlKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0KHN0YXRlbWVudC5ib2R5LCBvd25lciwgYWN0aXZlKVxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygc3RhdGVtZW50LmhhbmRsZXJzID8/IFtdKSB2aXNpdChoYW5kbGVyLmNhdGNoQm9keSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgICAgaWYgKHN0YXRlbWVudC5maW5hbGx5Qm9keSkgdmlzaXQoc3RhdGVtZW50LmZpbmFsbHlCb2R5LCBvd25lciwgYWN0aXZlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZXMgdmFsaWRhdG9yLW9ubHkgdW5jaGVja2VkLWVycm9yIGVmZmVjdHMgZm9yIGEgdmFsaWRhdGVkIG1vZHVsZSdzIGxvY2FsIGZ1bmN0aW9ucy5cbiAqIFRoZXNlIGVmZmVjdHMgbmV2ZXIgZW50ZXIgc2VtYW50aWMgZnVuY3Rpb24gZGVjbGFyYXRpb25zIG9yIHB1YmxpYyBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHt7ZnVuY3Rpb25zPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgY2FsbEVmZmVjdHM/OiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBbdmlzaWJsZV0gLSBJbXBvcnRlZCBmdW5jdGlvbnMgYW5kIGFscmVhZHktcmVzb2x2ZWQgZWZmZWN0cyBieSBsb2NhbCBiaW5kaW5nLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gTG9jYWwgZnVuY3Rpb24gZWZmZWN0cyBieSBzb3VyY2UtdmlzaWJsZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlVW5jaGVja2VkRXJyb3JFZmZlY3RzKG1vZHVsZSwgdmlzaWJsZSA9IHt9KSB7XG4gIGNvbnN0IGZ1bmN0aW9ucyA9IG5ldyBNYXAodmlzaWJsZS5mdW5jdGlvbnMgPz8gW10pXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSBmdW5jdGlvbnMuc2V0KGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmF0aW9uKVxuICBjb25zdCBsb2NhbEZ1bmN0aW9uTmFtZXMgPSBuZXcgU2V0KG1vZHVsZS5mdW5jdGlvbnMubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuICBjb25zdCBlZmZlY3RzID0gaW5mZXJDYWxsRWZmZWN0cyhmdW5jdGlvbnMsIHZpc2libGUuY2FsbEVmZmVjdHMsIGxvY2FsRnVuY3Rpb25OYW1lcylcblxuICByZXR1cm4gbmV3IE1hcChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5uYW1lLCBuZXcgU2V0KGVmZmVjdHMuZ2V0KGRlY2xhcmF0aW9uLm5hbWUpID8/IFtdKV0pKVxufVxuXG4vKipcbiAqIEFzc2lnbnMgYW5kIHZhbGlkYXRlcyB0aGUgY2xvc2VkIG5vbWluYWwgaWRlbnRpdGllcyBvd25lZCBieSByZWZlcmVuY2UgY2xhc3Nlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZGVjbGFyYXRpb25zIC0gQ2FuZGlkYXRlIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBbdmlzaWJsZUNsYXNzZXNdIC0gSW1wb3J0ZWQgY2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IFtpbnRlcmZhY2VzXSAtIEludGVyZmFjZSBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Q2xhc3NSZWdpc3RyeX0gQ2xhc3NlcyBieSBzdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ2xhc3NEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlQ2xhc3NlcyA9IG5ldyBNYXAoKSwgaW50ZXJmYWNlcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBhbiBvcmRlcmVkIGFycmF5LlwiLCAvKiogQHR5cGUge25ldmVyfSAqLyAodW5kZWZpbmVkKSlcbiAgfVxuICAvKiogQHR5cGUge0NsYXNzUmVnaXN0cnl9ICovXG4gIGNvbnN0IGNsYXNzZXMgPSBuZXcgTWFwKHZpc2libGVDbGFzc2VzKVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoWy4uLnZpc2libGVDbGFzc2VzLnZhbHVlcygpXS5tYXAoKHtuYW1lfSkgPT4gbmFtZSkpXG5cbiAgZm9yIChsZXQgY2xhc3NJbmRleCA9IDA7IGNsYXNzSW5kZXggPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBjbGFzc0luZGV4ICs9IDEpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb25zW2NsYXNzSW5kZXhdKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiQ2xhc3NEZWNsYXJhdGlvblwiIHx8ICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLmZpZWxkcykgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLm1ldGhvZHMpIHx8ICFkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciB8fCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5raW5kICE9IFwiQ29uc3RydWN0b3JEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIkRVUExJQ0FURV9DTEFTU1wiLCBcIk1hbGZvcm1lZCBvciBpbnZhbGlkIHJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBcIlJlZmVyZW5jZSBjbGFzc2VzIG11c3QgZGVjbGFyZSBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLmlkID0gYGNsYXNzOiR7Y2xhc3NJbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8XG4gICAgICBjbGFzc2VzLmhhcyhkZWNsYXJhdGlvbi5pZCkgfHwgdHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBkZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCA9PSAwIHx8IG5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9DTEFTU1wiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgcmVmZXJlbmNlIGNsYXNzICcke1N0cmluZyhkZWNsYXJhdGlvbi5uYW1lKX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICBjbGFzc2VzLnNldChkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb24pXG5cbiAgICBjb25zdCBmaWVsZE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGg7IGZpZWxkSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbZmllbGRJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06ZmllbGQ6JHtmaWVsZEluZGV4fWBcblxuICAgICAgaWYgKCFmaWVsZCB8fCBmaWVsZC5raW5kICE9IFwiUHJpdmF0ZUZpZWxkXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9QUklWQVRFX0ZJRUxEXCIsIFwiTWFsZm9ybWVkIG9yIGludmFsaWQgcHJpdmF0ZSBmaWVsZC5cIiwgZmllbGQ/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZpZWxkLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKGZpZWxkLmlkICE9IGV4cGVjdGVkSWQgfHwgdHlwZW9mIGZpZWxkLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBmaWVsZC5uYW1lLmxlbmd0aCA9PSAwIHx8IGZpZWxkTmFtZXMuaGFzKGZpZWxkLm5hbWUpKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUFJJVkFURV9GSUVMRFwiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgcHJpdmF0ZSBmaWVsZCAnJHtTdHJpbmcoZmllbGQubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24oZmllbGQsIFwibmFtZVwiKSlcbiAgICAgIH1cbiAgICAgIGZpZWxkTmFtZXMuYWRkKGZpZWxkLm5hbWUpXG4gICAgfVxuICAgIGNvbnN0IGludmFsaWRPd25lZEZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKHt0eXBlfSkgPT4gY29udGFpbnNPd25lZFR5cGUodHlwZSkgJiYgdHlwZS5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIilcblxuICAgIGlmIChpbnZhbGlkT3duZWRGaWVsZCkge1xuICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgbWF5IGNvbnRhaW4gb3duZXJzaGlwIG9ubHkgaW4gb25lIGRpcmVjdCByZXNvdXJjZSBmaWVsZC5gLCBpbnZhbGlkT3duZWRGaWVsZC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgb3duZWRGaWVsZHMgPSBkZWNsYXJhdGlvbi5maWVsZHMuZmlsdGVyKCh7dHlwZX0pID0+IHR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKVxuXG4gICAgaWYgKG93bmVkRmllbGRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIG1heSBvd24gZXhhY3RseSBvbmUgZGlyZWN0IHJlc291cmNlIGZpZWxkLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAob3duZWRGaWVsZHMubGVuZ3RoID09IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZCAmIHt0eXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlfX0gKi8gKG93bmVkRmllbGRzWzBdKVxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7ZmllbGRJZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIm93bmVkUmVzb3VyY2VcIiksXG4gICAgICAgIHJlc291cmNlSWQ6IGZpZWxkLnR5cGUucmVzb3VyY2VJZH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLm93bmVyc2hpcCA9IGV4cGVjdGVkXG4gICAgICBlbHNlIGlmIChKU09OLnN0cmluZ2lmeShkZWNsYXJhdGlvbi5vd25lcnNoaXApICE9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyBtYWxmb3JtZWQgcmVzb3VyY2Ugb3duZXJzaGlwIG1ldGFkYXRhLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IGNvbnRhaW4gaXRzIGRlY2xhcmVkIHJlc291cmNlIGZpZWxkLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnN0cnVjdG9ySWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06Y29uc3RydWN0b3JgXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQgPSBjb25zdHJ1Y3RvcklkXG4gICAgaWYgKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkICE9IGNvbnN0cnVjdG9ySWQgfHwgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycykgfHxcbiAgICAgICFkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5IHx8IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHkua2luZCAhPSBcIkJsb2NrXCIpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQ09OU1RSVUNUT1JcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24uY29uc3RydWN0b3IubG9jYXRpb24pXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAobGV0IG1ldGhvZEluZGV4ID0gMDsgbWV0aG9kSW5kZXggPCBkZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aDsgbWV0aG9kSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kc1ttZXRob2RJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06bWV0aG9kOiR7bWV0aG9kSW5kZXh9YFxuXG4gICAgICBpZiAoIW1ldGhvZCB8fCBtZXRob2Qua2luZCAhPSBcIk1ldGhvZERlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9NRVRIT0RcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBtZXRob2QgZGVjbGFyYXRpb24uXCIsIG1ldGhvZD8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgbWV0aG9kLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKG1ldGhvZC5pZCAhPSBleHBlY3RlZElkIHx8IHR5cGVvZiBtZXRob2QubmFtZSAhPSBcInN0cmluZ1wiIHx8IG1ldGhvZC5uYW1lLmxlbmd0aCA9PSAwIHx8IG1ldGhvZE5hbWVzLmhhcyhtZXRob2QubmFtZSkgfHxcbiAgICAgICAgIUFycmF5LmlzQXJyYXkobWV0aG9kLnBhcmFtZXRlcnMpIHx8ICFtZXRob2QuYm9keSB8fCBtZXRob2QuYm9keS5raW5kICE9IFwiQmxvY2tcIikge1xuICAgICAgICBmYWlsKFwiRFVQTElDQVRFX01FVEhPRFwiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgbWV0aG9kICcke1N0cmluZyhtZXRob2QubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24obWV0aG9kLCBcIm5hbWVcIikpXG4gICAgICB9XG4gICAgICBtZXRob2ROYW1lcy5hZGQobWV0aG9kLm5hbWUpXG4gICAgfVxuICAgIGlmIChkZWNsYXJhdGlvbi5pbXBsZW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi5pbXBsZW1lbnRzKSkge1xuICAgICAgICBmYWlsKFwiVU5LTk9XTl9JTlRFUkZBQ0VcIiwgYENsYXNzICcke2RlY2xhcmF0aW9uLm5hbWV9JyBoYXMgYSBtYWxmb3JtZWQgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIHNldC5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgaW1wbGVtZW50ZWQgb2YgZGVjbGFyYXRpb24uaW1wbGVtZW50cykge1xuICAgICAgICBpZiAoIWltcGxlbWVudGVkIHx8IGltcGxlbWVudGVkLmtpbmQgIT0gXCJJbnRlcmZhY2VUeXBlXCIgfHwgdHlwZW9mIGltcGxlbWVudGVkLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICFpbnRlcmZhY2VzLmhhcyhpbXBsZW1lbnRlZC5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgICAgIGZhaWwoXCJVTktOT1dOX0lOVEVSRkFDRVwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGltcGxlbWVudHMgdW5rbm93biBpbnRlcmZhY2UgJyR7U3RyaW5nKGltcGxlbWVudGVkPy5kZWNsYXJhdGlvbklkKX0nLmAsXG4gICAgICAgICAgICBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbGFzc2VzXG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBleGFjdCB0b3RhbCBvdmVycmlkZSBjb250cmFjdCBmb3Igb25lIGltcGxlbWVudGluZyBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIENsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtJbnRlcmZhY2VSZWdpc3RyeX0gaW50ZXJmYWNlcyAtIEludGVyZmFjZXMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcmVzb2x2ZWQgZmFjdHMgYXJlIGFzc2lnbmVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlSW50ZXJmYWNlQ29udHJhY3RzKGRlY2xhcmF0aW9uLCBpbnRlcmZhY2VzLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKSB7XG4gIGNvbnN0IGltcGxlbWVudGVkID0gZGVjbGFyYXRpb24uaW1wbGVtZW50cyA/PyBbXVxuXG4gIGlmIChpbXBsZW1lbnRlZC5sZW5ndGggPT0gMCkgcmV0dXJuXG4gIC8qKiBAdHlwZSB7SW50ZXJmYWNlQ29udHJhY3RNZW1iZXJbXX0gKi9cbiAgY29uc3QgcmVxdWlyZWQgPSBbXVxuXG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGltcGxlbWVudGVkKSB7XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgZmxhdHRlbmVkSW50ZXJmYWNlTWVtYmVycyhyZWZlcmVuY2UuZGVjbGFyYXRpb25JZCwgaW50ZXJmYWNlcywgZmFpbCwgbmV3IFNldCgpLCBkZWNsYXJhdGlvbi5sb2NhdGlvbikpIHtcbiAgICAgIGlmIChyZXF1aXJlZC5zb21lKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1lbWJlci5uYW1lKSkgY29udGludWVcbiAgICAgIHJlcXVpcmVkLnB1c2gobWVtYmVyKVxuICAgIH1cbiAgfVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtwYXJhbWV0ZXJUeXBlczogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZVtdLCByZXR1cm5UeXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfT59ICovXG4gIGNvbnN0IGNvbnRyYWN0U2lnbmF0dXJlcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIHJlcXVpcmVkKSB7XG4gICAgY29udHJhY3RTaWduYXR1cmVzLnNldChtZW1iZXIubmFtZSwge1xuICAgICAgcGFyYW1ldGVyVHlwZXM6IG1lbWJlci5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgICB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMpKSxcbiAgICAgIHJldHVyblR5cGU6IHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShtZW1iZXIucmV0dXJuVHlwZSwgbWVtYmVyLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzKVxuICAgIH0pXG4gIH1cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBJbnRlcmZhY2VDb250cmFjdE1lbWJlcj59ICovXG4gIGNvbnN0IHNhdGlzZmllZCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICBjb25zdCBtZW1iZXIgPSByZXF1aXJlZC5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1ldGhvZC5uYW1lKVxuXG4gICAgaWYgKCFtZW1iZXIpIGNvbnRpbnVlXG4gICAgaWYgKHNhdGlzZmllZC5oYXMobWVtYmVyLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiSU5URVJGQUNFX01FTUJFUl9EVVBMSUNBVEVcIiwgYENsYXNzICcke2RlY2xhcmF0aW9uLm5hbWV9JyBzdXBwbGllcyBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBtb3JlIHRoYW4gb25jZSBmb3IgaW50ZXJmYWNlIGNvbnRyYWN0IG1lbWJlcnNoaXAuYCxcbiAgICAgICAgcm9sZUxvY2F0aW9uKG1ldGhvZCwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBjb25zdCBtZXRob2RQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKSlcbiAgICBjb25zdCBtZXRob2RSZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKG1ldGhvZC5yZXR1cm5UeXBlLCBtZXRob2QubG9jYXRpb24sIGZhaWwsIHJlY29yZHMpXG5cbiAgICBjb25zdCBjb250cmFjdCA9IGNvbnRyYWN0U2lnbmF0dXJlcy5nZXQobWVtYmVyLm5hbWUpXG5cbiAgICBpZiAoIWNvbnRyYWN0IHx8IG1ldGhvZFBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBjb250cmFjdC5wYXJhbWV0ZXJUeXBlcy5sZW5ndGggfHxcbiAgICAgIG1ldGhvZFBhcmFtZXRlclR5cGVzLnNvbWUoKHR5cGUsIGluZGV4KSA9PiAhc2FtZVR5cGUodHlwZSwgY29udHJhY3QucGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkgfHxcbiAgICAgICFzYW1lVHlwZShtZXRob2RSZXR1cm5UeXBlLCBjb250cmFjdC5yZXR1cm5UeXBlKSkge1xuICAgICAgZmFpbChcIklOVEVSRkFDRV9NRU1CRVJfU0lHTkFUVVJFX01JU01BVENIXCIsXG4gICAgICAgIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgbWV0aG9kICcke21ldGhvZC5uYW1lfScgbXVzdCBleGFjdGx5IG1hdGNoIGludGVyZmFjZSAnJHtpbnRlcmZhY2VzLmdldChtZW1iZXIuaW50ZXJmYWNlSWQpPy5uYW1lfScgc2lnbmF0dXJlICR7aW50ZXJmYWNlU2lnbmF0dXJlRGVzY3JpcHRpb24obWVtYmVyKX0uYCxcbiAgICAgICAgcm9sZUxvY2F0aW9uKG1ldGhvZCwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBzYXRpc2ZpZWQuc2V0KG1lbWJlci5uYW1lLCBtZW1iZXIpXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIG1ldGhvZC5pbXBsZW1lbnRzID0ge2ludGVyZmFjZUlkOiBtZW1iZXIuaW50ZXJmYWNlSWQsIG1ldGhvZElkOiBtZW1iZXIubWV0aG9kSWR9XG4gIH1cbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgcmVxdWlyZWQpIHtcbiAgICBpZiAoc2F0aXNmaWVkLmhhcyhtZW1iZXIubmFtZSkpIGNvbnRpbnVlXG4gICAgZmFpbChcIklOVEVSRkFDRV9NRU1CRVJfTUlTU0lOR1wiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IGltcGxlbWVudCBpbnRlcmZhY2UgJyR7aW50ZXJmYWNlcy5nZXQobWVtYmVyLmludGVyZmFjZUlkKT8ubmFtZX0nIG1ldGhvZCAnJHttZW1iZXIubmFtZX0nLmAsXG4gICAgICBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgb25lIGZsYXR0ZW5lZCBpbnRlcmZhY2Ugc2lnbmF0dXJlIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7SW50ZXJmYWNlQ29udHJhY3RNZW1iZXJ9IG1lbWJlciAtIEZsYXR0ZW5lZCBtZW1iZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgc2lnbmF0dXJlIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiBpbnRlcmZhY2VTaWduYXR1cmVEZXNjcmlwdGlvbihtZW1iZXIpIHtcbiAgcmV0dXJuIGAke21lbWJlci5uYW1lfSgke21lbWJlci5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiB0eXBlRGVzY3JpcHRpb24ocGFyYW1ldGVyLnR5cGUpKS5qb2luKFwiLCBcIil9KTogJHt0eXBlRGVzY3JpcHRpb24obWVtYmVyLnJldHVyblR5cGUpfWBcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucywgdGhlaXIgY2xvc2VkIGV4dGVuZHMgREFHLCBhbmQgdGhlaXIgZmxhdHRlbmVkIHNpZ25hdHVyZSBzZXRzLlxuICogQHBhcmFtIHt1bmtub3dufSBkZWNsYXJhdGlvbnMgLSBDYW5kaWRhdGUgb3JkZXJlZCBpbnRlcmZhY2UgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge0ludGVyZmFjZVJlZ2lzdHJ5fSBbdmlzaWJsZUludGVyZmFjZXNdIC0gSW1wb3J0ZWQgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtJbnRlcmZhY2VSZWdpc3RyeX0gVmFsaWRhdGVkIGludGVyZmFjZXMgYnkgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVySW50ZXJmYWNlRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZUludGVyZmFjZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9ucykpIHtcbiAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJbnRlcmZhY2UgZGVjbGFyYXRpb25zIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgLyoqIEB0eXBlIHtuZXZlcn0gKi8gKHVuZGVmaW5lZCkpXG4gIH1cbiAgLyoqIEB0eXBlIHtJbnRlcmZhY2VSZWdpc3RyeX0gKi9cbiAgY29uc3QgaW50ZXJmYWNlcyA9IG5ldyBNYXAodmlzaWJsZUludGVyZmFjZXMpXG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldChbLi4udmlzaWJsZUludGVyZmFjZXMudmFsdWVzKCldLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcblxuICBmb3IgKGxldCBpbnRlcmZhY2VJbmRleCA9IDA7IGludGVyZmFjZUluZGV4IDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgaW50ZXJmYWNlSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb25zW2ludGVyZmFjZUluZGV4XSlcblxuICAgIGlmICghZGVjbGFyYXRpb24gfHwgZGVjbGFyYXRpb24ua2luZCAhPSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIgfHwgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24ubWV0aG9kcykgfHxcbiAgICAgIChkZWNsYXJhdGlvbi5leHRlbmRzICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uZXh0ZW5kcykpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIkRVUExJQ0FURV9JTlRFUkZBQ0VcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBpbnRlcmZhY2UgZGVjbGFyYXRpb24uXCIsIGRlY2xhcmF0aW9uPy5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLmlkID0gYGludGVyZmFjZToke2ludGVyZmFjZUluZGV4fWBcbiAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uLmlkICE9IFwic3RyaW5nXCIgfHwgIS9eKD86W2Etel1bYS16MC05Ll8tXSojKT9pbnRlcmZhY2U6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8XG4gICAgICBpbnRlcmZhY2VzLmhhcyhkZWNsYXJhdGlvbi5pZCkgfHwgdHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBkZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgICBuYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfSU5URVJGQUNFXCIsIGBEdXBsaWNhdGUgb3IgaW52YWxpZCBpbnRlcmZhY2UgJyR7U3RyaW5nKGRlY2xhcmF0aW9uLm5hbWUpfScuYCwgcm9sZUxvY2F0aW9uKGRlY2xhcmF0aW9uLCBcIm5hbWVcIikpXG4gICAgfVxuICAgIG5hbWVzLmFkZChkZWNsYXJhdGlvbi5uYW1lKVxuICAgIGludGVyZmFjZXMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcblxuICAgIGNvbnN0IG1ldGhvZE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGxldCBtZXRob2RJbmRleCA9IDA7IG1ldGhvZEluZGV4IDwgZGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGg7IG1ldGhvZEluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGRlY2xhcmF0aW9uLm1ldGhvZHNbbWV0aG9kSW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZElkID0gYCR7ZGVjbGFyYXRpb24uaWR9Om1ldGhvZDoke21ldGhvZEluZGV4fWBcblxuICAgICAgaWYgKCFtZXRob2QgfHwgbWV0aG9kLmtpbmQgIT0gXCJJbnRlcmZhY2VNZXRob2REZWNsYXJhdGlvblwiIHx8ICFBcnJheS5pc0FycmF5KG1ldGhvZC5wYXJhbWV0ZXJzKSB8fFxuICAgICAgICBSZWZsZWN0LmdldChtZXRob2QsIFwiYm9keVwiKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZhaWwoXCJJTlRFUkZBQ0VfTUVNQkVSX0RVUExJQ0FURVwiLCBcIk1hbGZvcm1lZCBvciBpbnZhbGlkIGludGVyZmFjZSBtZXRob2QgZGVjbGFyYXRpb24uXCIsIG1ldGhvZD8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgbWV0aG9kLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKG1ldGhvZC5pZCAhPSBleHBlY3RlZElkIHx8IHR5cGVvZiBtZXRob2QubmFtZSAhPSBcInN0cmluZ1wiIHx8IG1ldGhvZC5uYW1lLmxlbmd0aCA9PSAwIHx8IG1ldGhvZE5hbWVzLmhhcyhtZXRob2QubmFtZSkpIHtcbiAgICAgICAgZmFpbChcIklOVEVSRkFDRV9NRU1CRVJfRFVQTElDQVRFXCIsIGBEdXBsaWNhdGUgb3IgaW52YWxpZCBpbnRlcmZhY2UgbWV0aG9kICcke1N0cmluZyhtZXRob2QubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24obWV0aG9kLCBcIm5hbWVcIikpXG4gICAgICB9XG4gICAgICBtZXRob2ROYW1lcy5hZGQobWV0aG9kLm5hbWUpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBpbnRlcmZhY2VzLnZhbHVlcygpKSB7XG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgZGVjbGFyYXRpb24uZXh0ZW5kcyA/PyBbXSkge1xuICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50LmtpbmQgIT0gXCJJbnRlcmZhY2VUeXBlXCIgfHwgdHlwZW9mIHBhcmVudC5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICAgIWludGVyZmFjZXMuaGFzKHBhcmVudC5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgICBmYWlsKFwiVU5LTk9XTl9JTlRFUkZBQ0VcIiwgYFVua25vd24gaW50ZXJmYWNlIHBhcmVudCAnJHtTdHJpbmcocGFyZW50Py5kZWNsYXJhdGlvbklkKX0nLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBmbGF0dGVuZWRJbnRlcmZhY2VNZW1iZXJzKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBpbnRlcmZhY2VzLCBmYWlsKVxuICB9XG5cbiAgcmV0dXJuIGludGVyZmFjZXNcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBvbmUgaW50ZXJmYWNlJ3MgdHJhbnNpdGl2ZSBzaWduYXR1cmUgc2V0OiBwYXJlbnRzIGZpcnN0IGluIGRlY2xhcmF0aW9uIG9yZGVyLCB0aGVuIGl0cyBvd24gbWV0aG9kcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcmZhY2VJZCAtIEludGVyZmFjZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7SW50ZXJmYWNlUmVnaXN0cnl9IGludGVyZmFjZXMgLSBJbnRlcmZhY2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW2FjdGl2ZV0gLSBBY3RpdmUgZXh0ZW5kcyBwYXRoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBbZmFsbGJhY2tMb2NhdGlvbl0gLSBMb2NhdGlvbiBmb3IgYSBtaXNzaW5nLXBhcmVudCBkaWFnbm9zdGljLlxuICogQHJldHVybnMge0ludGVyZmFjZUNvbnRyYWN0TWVtYmVyW119IEZsYXR0ZW5lZCBtZW1iZXJzLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRJbnRlcmZhY2VNZW1iZXJzKGludGVyZmFjZUlkLCBpbnRlcmZhY2VzLCBmYWlsLCBhY3RpdmUgPSBuZXcgU2V0KCksIGZhbGxiYWNrTG9jYXRpb24gPSB1bmRlZmluZWQpIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBpbnRlcmZhY2VzLmdldChpbnRlcmZhY2VJZClcblxuICBpZiAoIWRlY2xhcmF0aW9uKSByZXR1cm4gZmFpbChcIlVOS05PV05fSU5URVJGQUNFXCIsIGBVbmtub3duIGludGVyZmFjZSBkZWNsYXJhdGlvbiAnJHtpbnRlcmZhY2VJZH0nLmAsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKGZhbGxiYWNrTG9jYXRpb24pKVxuICBpZiAoYWN0aXZlLmhhcyhpbnRlcmZhY2VJZCkpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVEVSRkFDRV9DWUNMRVwiLCBgSW50ZXJmYWNlICcke2RlY2xhcmF0aW9uLm5hbWV9JyBleHRlbmRzIGl0c2VsZiB0aHJvdWdoIGEgY3ljbGUuYCwgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gIH1cbiAgY29uc3QgY2FjaGVkID0gZmxhdHRlbmVkSW50ZXJmYWNlQ2FjaGUuZ2V0KGRlY2xhcmF0aW9uKVxuXG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcbiAgYWN0aXZlLmFkZChpbnRlcmZhY2VJZClcbiAgLyoqIEB0eXBlIHtJbnRlcmZhY2VDb250cmFjdE1lbWJlcltdfSAqL1xuICBjb25zdCBtZW1iZXJzID0gW11cblxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBkZWNsYXJhdGlvbi5leHRlbmRzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgZmxhdHRlbmVkSW50ZXJmYWNlTWVtYmVycyhwYXJlbnQuZGVjbGFyYXRpb25JZCwgaW50ZXJmYWNlcywgZmFpbCwgYWN0aXZlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGVkID0gbWVtYmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1lbWJlci5uYW1lKVxuXG4gICAgICBpZiAoaW5oZXJpdGVkKSB7XG4gICAgICAgIGlmICghc2FtZUludGVyZmFjZVNpZ25hdHVyZShpbmhlcml0ZWQsIG1lbWJlcikpIHtcbiAgICAgICAgICBmYWlsKFwiSU5URVJGQUNFX01FTUJFUl9EVVBMSUNBVEVcIiwgYEludGVyZmFjZSAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaW5oZXJpdHMgY29uZmxpY3Rpbmcgc2lnbmF0dXJlcyBmb3IgJyR7bWVtYmVyLm5hbWV9Jy5gLFxuICAgICAgICAgICAgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIG1lbWJlcnMucHVzaChtZW1iZXIpXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSBtZW1iZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT0gbWV0aG9kLm5hbWUpXG5cbiAgICBpZiAoaW5oZXJpdGVkKSB7XG4gICAgICBpZiAoIXNhbWVJbnRlcmZhY2VTaWduYXR1cmUoaW5oZXJpdGVkLCBtZXRob2QpKSB7XG4gICAgICAgIGZhaWwoXCJJTlRFUkZBQ0VfTUVNQkVSX0RVUExJQ0FURVwiLCBgSW50ZXJmYWNlICcke2RlY2xhcmF0aW9uLm5hbWV9JyByZWRlY2xhcmVzIGluaGVyaXRlZCBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyB3aXRoIGEgZGlmZmVyZW50IHNpZ25hdHVyZS5gLFxuICAgICAgICAgIHJvbGVMb2NhdGlvbihtZXRob2QsIFwibmFtZVwiKSlcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIG1lbWJlcnMucHVzaCh7XG4gICAgICBpbnRlcmZhY2VJZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksXG4gICAgICBsb2NhdGlvbjogbWV0aG9kLmxvY2F0aW9uLFxuICAgICAgbWV0aG9kSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSxcbiAgICAgIG5hbWU6IG1ldGhvZC5uYW1lLFxuICAgICAgcGFyYW1ldGVyczogbWV0aG9kLnBhcmFtZXRlcnMsXG4gICAgICByZXR1cm5UeXBlOiBtZXRob2QucmV0dXJuVHlwZVxuICAgIH0pXG4gIH1cbiAgYWN0aXZlLmRlbGV0ZShpbnRlcmZhY2VJZClcbiAgZmxhdHRlbmVkSW50ZXJmYWNlQ2FjaGUuc2V0KGRlY2xhcmF0aW9uLCBtZW1iZXJzKVxuXG4gIHJldHVybiBtZW1iZXJzXG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGZsYXR0ZW5lZCBpbnRlcmZhY2Ugc2lnbmF0dXJlcyBleGFjdGx5LlxuICogQHBhcmFtIHt7cGFyYW1ldGVyczogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5QYXJhbWV0ZXJbXSwgcmV0dXJuVHlwZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX19IGxlZnQgLSBGaXJzdCBzaWduYXR1cmUuXG4gKiBAcGFyYW0ge3twYXJhbWV0ZXJzOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdLCByZXR1cm5UeXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfX0gcmlnaHQgLSBTZWNvbmQgc2lnbmF0dXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNpZ25hdHVyZXMgYXJlIGlkZW50aWNhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZUludGVyZmFjZVNpZ25hdHVyZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdC5wYXJhbWV0ZXJzLmxlbmd0aCA9PSByaWdodC5wYXJhbWV0ZXJzLmxlbmd0aCAmJlxuICAgIGxlZnQucGFyYW1ldGVycy5ldmVyeSgocGFyYW1ldGVyLCBpbmRleCkgPT4gc2FtZVR5cGVJZGVudGl0eSh0eXBlSWRlbnRpdHkocGFyYW1ldGVyLnR5cGUpLCB0eXBlSWRlbnRpdHkocmlnaHQucGFyYW1ldGVyc1tpbmRleF0udHlwZSkpKSAmJlxuICAgIHNhbWVUeXBlSWRlbnRpdHkodHlwZUlkZW50aXR5KGxlZnQucmV0dXJuVHlwZSksIHR5cGVJZGVudGl0eShyaWdodC5yZXR1cm5UeXBlKSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZXhhY3QgY29uc3RydWN0aW9uLCBwcml2YXRlIHN0YXRlLCBhbmQgbWV0aG9kIGJvZGllcyBmb3Igb25lIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIEZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGFuZCByZWZlcmVuY2UtY2xhc3MgcmVnaXN0cmllcy5cbiAqIEBwYXJhbSB7RXJyb3JSZWdpc3RyeX0gZXJyb3JzIC0gRXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gRnVuY3Rpb24gY2FsbCBlZmZlY3RzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gcmVzZXJ2ZWRWYWx1ZU5hbWVzIC0gTW9kdWxlLXJlc2VydmVkIG5hbWVzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgcmVzb2x1dGlvbnMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBsb29wT3duZXJzIC0gTG9vcCBvd25lcnNoaXAgcmVnaXN0cnkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIHJlc2VydmVkVmFsdWVOYW1lcywgZmFpbCxcbiAgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcE93bmVycykge1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRlY2xhcmF0aW9uLmZpZWxkcykge1xuICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGZpZWxkLnR5cGUsIGZpZWxkLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMpXG4gIH1cblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yXG4gIGNvbnN0IGFjcXVpc2l0aW9uU3RhdGVtZW50ID0gY29uc3RydWN0b3IuYm9keS5zdGF0ZW1lbnRzWzBdXG4gIGNvbnN0IGFjcXVpc2l0aW9uRXhwcmVzc2lvbiA9IGFjcXVpc2l0aW9uU3RhdGVtZW50Py5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIlxuICAgID8gYWNxdWlzaXRpb25TdGF0ZW1lbnQuZXhwcmVzc2lvbiA6IHVuZGVmaW5lZFxuICBjb25zdCBvd25lZEFjcXVpc2l0aW9uID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiICYmIGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGggPT0gMSAmJlxuICAgIGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPT0gMSAmJiBhY3F1aXNpdGlvblN0YXRlbWVudD8ua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIgJiZcbiAgICBhY3F1aXNpdGlvblN0YXRlbWVudC5maWVsZCA9PSBkZWNsYXJhdGlvbi5vd25lcnNoaXAuZmllbGRJZCAmJiBhY3F1aXNpdGlvblN0YXRlbWVudC5yZWNlaXZlci5raW5kID09IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgJiZcbiAgICBhY3F1aXNpdGlvblN0YXRlbWVudC5yZWNlaXZlci5jbGFzc0lkID09IGRlY2xhcmF0aW9uLmlkICYmIGFjcXVpc2l0aW9uRXhwcmVzc2lvbj8ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgJiZcbiAgICBhY3F1aXNpdGlvbkV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cua2luZCA9PSBcImFjcXVpcmVcIiAmJlxuICAgIGFjcXVpc2l0aW9uRXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvdy5yZXNvdXJjZUlkID09IGRlY2xhcmF0aW9uLm93bmVyc2hpcC5yZXNvdXJjZUlkXG5cbiAgaWYgKHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhjb25zdHJ1Y3Rvci5ib2R5LCBjYWxsRWZmZWN0cykuc2l6ZSA+IDAgJiYgIW93bmVkQWNxdWlzaXRpb24pIHtcbiAgICBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsIFwiUmVmZXJlbmNlIGNvbnN0cnVjdG9ycyBjYW5ub3QgZXhwb3NlIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGluIFRhc2sgMDMzLlwiLCBjb25zdHJ1Y3Rvci5sb2NhdGlvbilcbiAgfVxuXG4gIGlmICghb3duZWRBY3F1aXNpdGlvbiAmJlxuICAgIChjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoIHx8IGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCkpIHtcbiAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtdXN0IGluaXRpYWxpemUgZXZlcnkgcHJpdmF0ZSBmaWVsZCBleGFjdGx5IG9uY2UgaW4gZGVjbGFyYXRpb24gb3JkZXIuYCxcbiAgICAgIGNvbnN0cnVjdG9yLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNvbnN0cnVjdG9yU2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBuZXcgU2V0KCksIGRlY2xhcmF0aW9uKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbaW5kZXhdXG4gICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbaW5kZXhdXG4gICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcylcblxuICAgIGlmICghb3duZWRBY3F1aXNpdGlvbiAmJiAhc2FtZVR5cGUodHlwZSwgZmllbGQudHlwZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9JyBtdXN0IGV4YWN0bHkgbWF0Y2ggcHJpdmF0ZSBmaWVsZCAnJHtmaWVsZC5uYW1lfScuYCwgcGFyYW1ldGVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBkZWNsYXJlQmluZGluZyhwYXJhbWV0ZXIubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGV9LCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIiksIGNvbnN0cnVjdG9yU2NvcGUsIGZhaWwpXG4gICAgaWYgKG93bmVkQWNxdWlzaXRpb24pIGNvbnRpbnVlXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gY29uc3RydWN0b3IuYm9keS5zdGF0ZW1lbnRzW2luZGV4XVxuICAgIGNvbnN0IGluaXRpYWxpemVyID0gc3RhdGVtZW50Py5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIlxuICAgICAgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24uZXhwcmVzc2lvbiA6IHN0YXRlbWVudC5leHByZXNzaW9uXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFzdGF0ZW1lbnQgfHwgc3RhdGVtZW50LmtpbmQgIT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5maWVsZCAhPSBmaWVsZC5pZCB8fFxuICAgICAgc3RhdGVtZW50LnJlY2VpdmVyPy5raW5kICE9IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgfHwgc3RhdGVtZW50LnJlY2VpdmVyLmNsYXNzSWQgIT0gZGVjbGFyYXRpb24uaWQgfHxcbiAgICAgIGluaXRpYWxpemVyPy5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiB8fCBpbml0aWFsaXplci5uYW1lICE9IHBhcmFtZXRlci5uYW1lKSB7XG4gICAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtdXN0IGluaXRpYWxpemUgJyR7ZmllbGQubmFtZX0nIGZyb20gaXRzIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyLmAsXG4gICAgICAgIHN0YXRlbWVudD8ubG9jYXRpb24gPz8gY29uc3RydWN0b3IubG9jYXRpb24pXG4gICAgfVxuICB9XG4gIHZhbGlkYXRlQmxvY2soY29uc3RydWN0b3IuYm9keSwgY29uc3RydWN0b3JTY29wZSwge2tpbmQ6IFwiVHlwZVJlZmVyZW5jZVwiLCBuYW1lOiBcInZvaWRcIn0sIGZ1bmN0aW9ucywgcmVjb3JkcyxcbiAgICBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IGNvbnN0cnVjdG9yLCBvd25lcnM6IGxvb3BPd25lcnN9KVxuXG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICBjb25zdCB1bnN1cHBvcnRlZE1ldGhvZEVmZmVjdHMgPSBbLi4uc3ludGFjdGljQmxvY2tFZmZlY3RzKG1ldGhvZC5ib2R5LCBjYWxsRWZmZWN0cyldXG4gICAgICAuZmlsdGVyKChpZCkgPT4gIS9eKD86bW9kdWxlOlswLTldK1xcLyk/Y2FwYWJpbGl0eTpbMC05XStcXC9mYWlsdXJlOlswLTldKyQvdS50ZXN0KGlkKSlcblxuICAgIGlmIChkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgIT0gXCJvd25lZFJlc291cmNlXCIgJiYgdW5zdXBwb3J0ZWRNZXRob2RFZmZlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZhaWwoXCJVTlNVUFBPUlRFRF9TVEFURU1FTlRcIiwgYFJlZmVyZW5jZSBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBjYW5ub3QgZXhwb3NlIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGluIFRhc2sgMDMzLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgc2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIG1ldGhvZC5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgbmV3IFNldCgpLCBkZWNsYXJhdGlvbilcblxuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCB0eXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhwYXJhbWV0ZXIubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGV9LCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIiksIHNjb3BlLCBmYWlsKVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKG1ldGhvZC5yZXR1cm5UeXBlLCBtZXRob2QubG9jYXRpb24sIGZhaWwsIHJlY29yZHMpXG4gICAgY29uc3QgZmxvdyA9IHZhbGlkYXRlQmxvY2sobWV0aG9kLmJvZHksIHNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IG1ldGhvZCwgb3duZXJzOiBsb29wT3duZXJzfSlcblxuICAgIGlmIChkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgPT0gXCJvd25lZFJlc291cmNlXCIpIG93bmVkTWV0aG9kUmVzb3VyY2VGbG93KGRlY2xhcmF0aW9uLCBtZXRob2QsIGZhaWwpXG5cbiAgICBpZiAoIWlzVm9pZFR5cGUocmV0dXJuVHlwZSkgJiYgZmxvdy5ub3JtYWwpIHtcbiAgICAgIGZhaWwoXCJNSVNTSU5HX1JFVFVSTlwiLCBgTWV0aG9kICcke21ldGhvZC5uYW1lfScgZG9lcyBub3QgcmV0dXJuIG9uIGV2ZXJ5IHJlYWNoYWJsZSBwYXRoLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHt1bmtub3dufSBkZWNsYXJhdGlvbnMgLSBDYW5kaWRhdGUgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IFt2aXNpYmxlRXJyb3JzXSAtIEltcG9ydGVkIGVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtFcnJvclJlZ2lzdHJ5fSBWYWxpZGF0ZWQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVycm9yRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZUVycm9ycyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiRXJyb3IgZGVjbGFyYXRpb25zIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgLyoqIEB0eXBlIHtuZXZlcn0gKi8gKHVuZGVmaW5lZCkpXG4gIC8qKiBAdHlwZSB7RXJyb3JSZWdpc3RyeX0gKi9cbiAgY29uc3QgZXJyb3JzID0gbmV3IE1hcCh2aXNpYmxlRXJyb3JzKVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnNbaW5kZXhdXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uIHx8IGRlY2xhcmF0aW9uLmtpbmQgIT0gXCJFcnJvckRlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBlcnJvciBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uaWQgPSBgZXJyb3I6JHtpbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/ZXJyb3I6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8IGVycm9ycy5oYXMoZGVjbGFyYXRpb24uaWQpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0VSUk9SXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXCIsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBuYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRVJST1JcIiwgYER1cGxpY2F0ZSBvciBpbnZhbGlkIGVycm9yICcke1N0cmluZyhkZWNsYXJhdGlvbi5uYW1lKX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICBlcnJvcnMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGFuZCB2YWxpZGF0ZXMgb25lIGRlY2xhcmF0aW9uJ3MgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gT3duaW5nIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUeXBlUGFyYW1ldGVycyhkZWNsYXJhdGlvbiwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucykge1xuICBpZiAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmICghQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycykpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlR5cGUgcGFyYW1ldGVycyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcGFyYW1ldGVyID0gZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnNbaW5kZXhdXG4gICAgY29uc3Qga2V5cyA9IHBhcmFtZXRlciAmJiB0eXBlb2YgcGFyYW1ldGVyID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1ldGVyKVxuICAgICAgPyBPYmplY3Qua2V5cyhwYXJhbWV0ZXIpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSA6IFwiXCJcblxuICAgIGlmICghT2JqZWN0Lmhhc093bihkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycywgaW5kZXgpIHx8ICFwYXJhbWV0ZXIgfHwgcGFyYW1ldGVyLmtpbmQgIT0gXCJUeXBlUGFyYW1ldGVyXCIgfHxcbiAgICAgIGtleXMgIT0gXCJpZCxraW5kLGxvY2F0aW9uLG5hbWVcIiB8fCB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBwYXJhbWV0ZXIubmFtZS5sZW5ndGggPT0gMCkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uXCIsIHBhcmFtZXRlcj8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChuYW1lcy5oYXMocGFyYW1ldGVyLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX1RZUEVfUEFSQU1FVEVSXCIsIGBEdXBsaWNhdGUgdHlwZSBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIikpXG4gICAgfVxuICAgIG5hbWVzLmFkZChwYXJhbWV0ZXIubmFtZSlcbiAgICBjb25zdCBleHBlY3RlZElkID0gYCR7ZGVjbGFyYXRpb24uaWR9OnR5cGU6JHtpbmRleH1gXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgcGFyYW1ldGVyLmlkID0gZXhwZWN0ZWRJZFxuICAgIGlmIChwYXJhbWV0ZXIuaWQgIT0gZXhwZWN0ZWRJZCkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9UWVBFX1BBUkFNRVRFUlwiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIHR5cGUgcGFyYW1ldGVyIGlkZW50aXR5LlwiLCBwYXJhbWV0ZXIubG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2xvc2VkIGlkZW50aXR5IHNjb3BlIG93bmVkIGJ5IG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gRGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IFR5cGUtcGFyYW1ldGVyIGlkZW50aXRpZXMuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcklkcyhkZWNsYXJhdGlvbikge1xuICByZXR1cm4gbmV3IFNldCgoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgoe2lkfSkgPT4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpZCkpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBub21pbmFsIGRlY2xhcmF0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBzdGFibGUgaWRlbnRpdHkgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge3Vua25vd259IGRlY2xhcmF0aW9ucyAtIENhbmRpZGF0ZSBvcmRlcmVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gW3Zpc2libGVSZWNvcmRzXSAtIEltcG9ydGVkIHJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0NsYXNzUmVnaXN0cnl9IFtjbGFzc2VzXSAtIE1vZHVsZSByZWZlcmVuY2UgY2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWNvcmRSZWdpc3RyeX0gVmFsaWRhdGVkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWNvcmREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlUmVjb3JkcyA9IG5ldyBNYXAoKSwgY2xhc3NlcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjb3JkIGRlY2xhcmF0aW9ucyBtdXN0IGJlIGFuIG9yZGVyZWQgYXJyYXkuXCIsIC8qKiBAdHlwZSB7bmV2ZXJ9ICovICh1bmRlZmluZWQpKVxuICAvKiogQHR5cGUge1JlY29yZFJlZ2lzdHJ5fSAqL1xuICBjb25zdCByZWNvcmRzID0gbmV3IE1hcCh2aXNpYmxlUmVjb3JkcylcblxuICByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeS5zZXQocmVjb3JkcywgY2xhc3NlcylcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCByZWNvcmRJbmRleCA9IDA7IHJlY29yZEluZGV4IDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zW3JlY29yZEluZGV4XVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiUmVjb3JkRGVjbGFyYXRpb25cIiB8fCAhQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi5maWVsZHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgcmVjb3JkIGRlY2xhcmF0aW9uLlwiLCBkZWNsYXJhdGlvbj8ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBkZWNsYXJhdGlvbi5pZCA9IGByZWNvcmQ6JHtyZWNvcmRJbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/cmVjb3JkOlswLTldKyQvdS50ZXN0KGRlY2xhcmF0aW9uLmlkKSB8fCByZWNvcmRzLmhhcyhkZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUkVDT1JEXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9SRUNPUkRcIiwgYER1cGxpY2F0ZSByZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICB2YWxpZGF0ZVR5cGVQYXJhbWV0ZXJzKGRlY2xhcmF0aW9uLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIHJlY29yZHMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgY29uc3QgZmllbGROYW1lcyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGRlY2xhcmF0aW9uKVxuXG4gICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOyBmaWVsZEluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2ZpZWxkSW5kZXhdXG5cbiAgICAgIGlmICghZmllbGQgfHwgZmllbGQua2luZCAhPSBcIlJlY29yZEZpZWxkXCIpIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFsZm9ybWVkIHJlY29yZCBmaWVsZC5cIiwgZmllbGQ/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZpZWxkLmlkID0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLmlkICE9IFwic3RyaW5nXCIgfHwgZmllbGQuaWQgIT0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRklFTERcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCByZWNvcmQgZmllbGQgaWRlbnRpdHkuXCIsIGZpZWxkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkTmFtZXMuaGFzKGZpZWxkLm5hbWUpKSBmYWlsKFwiRFVQTElDQVRFX0ZJRUxEXCIsIGBEdXBsaWNhdGUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihmaWVsZCwgXCJuYW1lXCIpKVxuICAgICAgZmllbGROYW1lcy5hZGQoZmllbGQubmFtZSlcbiAgICAgIGlmIChjb250YWluc093bmVkVHlwZShmaWVsZC50eXBlKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgXCJPd25lZCByZXNvdXJjZXMgY2Fubm90IGJlIHN0b3JlZCBpbiBpbW11dGFibGUgcmVjb3Jkcy5cIiwgZmllbGQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbiAgICB9XG4gIH1cbiAgdmFsaWRhdGVEaXJlY3RSZWNvcmRSZWN1cnNpb24oZGVjbGFyYXRpb25zLCByZWNvcmRzLCBmYWlsKVxuXG4gIHJldHVybiByZWNvcmRzXG59XG5cbi8qKlxuICogUmVqZWN0cyBjeWNsZXMgY29tcG9zZWQgc29sZWx5IG9mIHVubWVkaWF0ZWQgcmVjb3JkIGZpZWxkcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbltdfSBkZWNsYXJhdGlvbnMgLSBWYWxpZCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gRGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0UmVjb3JkUmVjdXJzaW9uKGRlY2xhcmF0aW9ucywgcmVjb3JkcywgZmFpbCkge1xuICBjb25zdCBjb21wbGV0ZSA9IG5ldyBTZXQoKVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGRlY2xhcmF0aW9uIGFsb25nIGFuIHVubWVkaWF0ZWQgcmVjb3JkIHBhdGguXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBDdXJyZW50IGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhY3RpdmUgLSBEZWNsYXJhdGlvbiBpZGVudGl0aWVzIGFjdGl2ZSBvbiB0aGlzIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQoZGVjbGFyYXRpb24sIGFjdGl2ZSkge1xuICAgIGlmIChjb21wbGV0ZS5oYXMoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCkpKSByZXR1cm5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChhY3RpdmUpXG5cbiAgICBuZXh0LmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSlcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRlY2xhcmF0aW9uLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikgY29udGludWVcbiAgICAgIGlmIChuZXh0LmhhcyhmaWVsZC50eXBlLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICAgIGZhaWwoXCJJTExFR0FMX1JFQ09SRF9SRUNVUlNJT05cIiwgYERpcmVjdCB2YWx1ZS1yZWN1cnNpdmUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHR5cGVMb2NhdGlvbihmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCByZWZlcmVuY2VkID0gcmVjb3Jkcy5nZXQoZmllbGQudHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgICBpZiAocmVmZXJlbmNlZCkgdmlzaXQocmVmZXJlbmNlZCwgbmV4dClcbiAgICB9XG4gICAgY29tcGxldGUuYWRkKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpKVxuICB9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHZpc2l0KGRlY2xhcmF0aW9uLCBuZXcgU2V0KCkpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBub24tdm9pZCBmdW5jdGlvbiBhbmQgaXRzIGNvbXBsZXRlIGNvbnRyb2wgZmxvdy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIEZ1bmN0aW9uIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBGdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0Vycm9yUmVnaXN0cnl9IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjYWxsRWZmZWN0cyAtIEludGVybmFsbHkgaW5mZXJyZWQgdW5jaGVja2VkLWVycm9yIGVmZmVjdHMuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSByZXNlcnZlZFZhbHVlTmFtZXMgLSBNb2R1bGUgZnVuY3Rpb25zIGFuZCBub21pbmFsIGNvbnN0cnVjdG9ycyB1bmF2YWlsYWJsZSB0byBsZXhpY2FsIGJpbmRpbmdzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBsb29wT3duZXJzIC0gTG9vcCBvd25lciBieSBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbihkZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BPd25lcnMpIHtcbiAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZGVjbGFyYXRpb24pXG4gIGNvbnN0IHNjb3BlID0gY3JlYXRlU2NvcGUodW5kZWZpbmVkLCBkZWNsYXJhdGlvbi5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZGVjbGFyYXRpb24ucGFyYW1ldGVycykge1xuICAgIGNvbnN0IHR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgZGVjbGFyZUJpbmRpbmcocGFyYW1ldGVyLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlfSwgcm9sZUxvY2F0aW9uKHBhcmFtZXRlciwgXCJuYW1lXCIpLCBzY29wZSwgZmFpbClcbiAgfVxuXG4gIGNvbnN0IHJldHVyblR5cGUgPSB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgZGVjbGFyYXRpb24ubG9jYXRpb24sIGZhaWwsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuICBjb25zdCByZXR1cm5zID0gdmFsaWRhdGVCbG9jayhkZWNsYXJhdGlvbi5ib2R5LCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtvd25lcjogZGVjbGFyYXRpb24sIG93bmVyczogbG9vcE93bmVyc30pXG5cbiAgaWYgKCFpc1ZvaWRUeXBlKHJldHVyblR5cGUpICYmIHJldHVybnMubm9ybWFsKSB7XG4gICAgZmFpbChcIk1JU1NJTkdfUkVUVVJOXCIsIGBGdW5jdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScgZG9lcyBub3QgcmV0dXJuIG9uIGV2ZXJ5IHJlYWNoYWJsZSBwYXRoLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBvcmRlcmVkIGJsb2NrIGFuZCByZXBvcnRzIHdoZXRoZXIgZXZlcnkgcGF0aCByZXR1cm5zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBTY29wZSBiZWxvbmdpbmcgdG8gdGhpcyBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IHVuZGVmaW5lZH0gcmV0dXJuVHlwZSAtIEZ1bmN0aW9uIHJldHVybiB0eXBlLCBhYnNlbnQgZm9yIGVudHJ5IHBvaW50cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gRnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtFcnJvclJlZ2lzdHJ5fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY2FsbEVmZmVjdHMgLSBJbnRlcm5hbGx5IGluZmVycmVkIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtMb29wRmxvd0NvbnRleHR9IGxvb3BDb250ZXh0IC0gQWN0aXZlIGxvb3AgYW5kIG93bmVyIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7e25vcm1hbDogYm9vbGVhbiwgcmFpc2VzOiBTZXQ8c3RyaW5nPn19IFJlYWNoYWJsZSBub3JtYWwgY29udGludWF0aW9uIGFuZCBlc2NhcGluZyBlcnJvciBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJsb2NrKGJsb2NrLCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dCkge1xuICBsZXQgbm9ybWFsID0gdHJ1ZVxuICBjb25zdCByYWlzZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKCFub3JtYWwpIGZhaWwoXCJVTlJFQUNIQUJMRV9TVEFURU1FTlRcIiwgXCJTdGF0ZW1lbnQgaXMgdW5yZWFjaGFibGUuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcblxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikge1xuICAgICAgY29uc3QgZGVjbGFyZWRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LnR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBzY29wZS50eXBlUGFyYW1ldGVycylcbiAgICAgIHN0YXRlbWVudC5pbml0aWFsaXplciA9IG5vcm1hbGl6ZU93bmVkTW92ZShzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGRlY2xhcmVkVHlwZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmluaXRpYWxpemVyLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIGluaXRpYWxpemVyXCIsIGRlY2xhcmVkVHlwZVxuICAgICAgKVxuXG4gICAgICBzY29wZS5wZW5kaW5nLmRlbGV0ZShzdGF0ZW1lbnQubmFtZSlcbiAgICAgIGlmICghYXNzaWduYWJsZVR5cGUoaW5pdGlhbGl6ZXJUeXBlLCBkZWNsYXJlZFR5cGUsIHJlY29yZHMpKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplclR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIGRlY2xhcmVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgICBmYWlsKFwiRkFJTFVSRV9BQlNFTkNFX0NPTkZMQVRJT05cIiwgXCJPcHRpb25hbCBhYnNlbmNlIGNhbm5vdCBiZSBjb2VyY2VkIGludG8gYSB2YWx1ZSBvciB0eXBlZCBmYWlsdXJlLlwiLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZmFpbChub21pbmFsTWlzbWF0Y2hDb2RlKGRlY2xhcmVkVHlwZSksIGBJbml0aWFsaXplciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGluaXRpYWxpemVyVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihkZWNsYXJlZFR5cGUpfS5gLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQubmFtZSwge1xuICAgICAgICBrbm93blZhbHVlOiBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIHNjb3BlKSxcbiAgICAgICAgbXV0YWJsZTogc3RhdGVtZW50Lm11dGFibGUsXG4gICAgICAgIHR5cGU6IGRlY2xhcmVkVHlwZVxuICAgICAgfSwgcm9sZUxvY2F0aW9uKHN0YXRlbWVudCwgXCJuYW1lXCIpLCBzY29wZSwgZmFpbClcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmluaXRpYWxpemVyLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgYmluZGluZyA9IHJlc29sdmVCaW5kaW5nKHN0YXRlbWVudC50YXJnZXQubmFtZSwgc3RhdGVtZW50LnRhcmdldC5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpXG5cbiAgICAgIGlmIChiaW5kaW5nLnR5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJJTU1VVEFCTEVfQVNTSUdOTUVOVFwiLCBgQ2Fubm90IGFzc2lnbiB0byBpbW11dGFibGUgY2F0Y2ggYmluZGluZyAnJHtzdGF0ZW1lbnQudGFyZ2V0Lm5hbWV9Jy5gLCBzdGF0ZW1lbnQudGFyZ2V0LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGJpbmRpbmcudHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBiaW5kaW5nLnR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBcIk93bmVkIHJlc291cmNlcyBjYW5ub3QgYmUgcmVhc3NpZ25lZCBvciBhbGlhc2VkLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBleHByZXNzaW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gYXNzaWdubWVudFwiLCBiaW5kaW5nLnR5cGVcbiAgICAgIClcblxuICAgICAgaWYgKCFiaW5kaW5nLm11dGFibGUpIHtcbiAgICAgICAgZmFpbChcIklNTVVUQUJMRV9BU1NJR05NRU5UXCIsIGBDYW5ub3QgYXNzaWduIHRvIGltbXV0YWJsZSBiaW5kaW5nICcke3N0YXRlbWVudC50YXJnZXQubmFtZX0nLmAsIHN0YXRlbWVudC50YXJnZXQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoIWFzc2lnbmFibGVUeXBlKGV4cHJlc3Npb25UeXBlLCBiaW5kaW5nLnR5cGUsIHJlY29yZHMpKSB7XG4gICAgICAgIGZhaWwobm9taW5hbE1pc21hdGNoQ29kZShiaW5kaW5nLnR5cGUpLCBgQXNzaWdubWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGV4cHJlc3Npb25UeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGJpbmRpbmcudHlwZSl9LmAsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgYmluZGluZy5rbm93blZhbHVlID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlKVxuICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5leHByZXNzaW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gc2NvcGUuY3VycmVudENsYXNzXG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24gfHwgIXN0YXRlbWVudC5yZWNlaXZlciB8fCBzdGF0ZW1lbnQucmVjZWl2ZXIua2luZCAhPSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiIHx8XG4gICAgICAgIHN0YXRlbWVudC5yZWNlaXZlci5jbGFzc0lkICE9IGRlY2xhcmF0aW9uLmlkKSB7XG4gICAgICAgIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCByZWNlaXZlciBtdXN0IGJlIHRoZSBkZWNsYXJpbmcgY2xhc3MgcmVjZWl2ZXIuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHN0YXRlbWVudC5maWVsZClcblxuICAgICAgaWYgKCFmaWVsZCkgZmFpbChcIklMTEVHQUxfUFJJVkFURV9BQ0NFU1NcIiwgXCJQcml2YXRlIGZpZWxkIGlkZW50aXR5IGlzIG5vdCBvd25lZCBieSB0aGUgZGVjbGFyaW5nIGNsYXNzLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IG5vcm1hbGl6ZU93bmVkTW92ZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgZmllbGQudHlwZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGV4cHJlc3Npb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIHByaXZhdGUgZmllbGQgYXNzaWdubWVudFwiLCBmaWVsZC50eXBlXG4gICAgICApXG5cbiAgICAgIGlmICghc2FtZVR5cGUoZXhwcmVzc2lvblR5cGUsIGZpZWxkLnR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBQcml2YXRlIGZpZWxkIGFzc2lnbm1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihleHByZXNzaW9uVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmaWVsZC50eXBlKX0uYCxcbiAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgcHJpbnRlZFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBwcmludCB2YWx1ZVwiKVxuXG4gICAgICBpZiAocHJpbnRlZFR5cGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgfHwgcHJpbnRlZFR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJCT1JST1dfRVNDQVBFXCIsIFwiT3duZWQgdmFsdWVzIGNhbm5vdCBlc2NhcGUgdGhyb3VnaCBwcmludGluZyBvciBzZXJpYWxpemF0aW9uLlwiLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChwcmludGVkVHlwZS5raW5kICE9IFwiVHlwZVJlZmVyZW5jZVwiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ29sbGVjdGlvbnMgYW5kIHJlY29yZHMgY2Fubm90IGJlIHByaW50ZWQgZGlyZWN0bHkuXCIsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHtcbiAgICAgIGlmICghc3RhdGVtZW50LmV4cHJlc3Npb24gfHwgIVtcIkNhbGxFeHByZXNzaW9uXCIsIFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIiwgXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiXS5pbmNsdWRlcyhzdGF0ZW1lbnQuZXhwcmVzc2lvbi5raW5kKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkV4cHJlc3Npb24gc3RhdGVtZW50IG11c3QgY29udGFpbiBhIGRpcmVjdCBvciByZWNlaXZlciBjYWxsLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBleHByZXNzaW9uVHlwZSA9IGluZmVyRXhwcmVzc2lvblR5cGUoc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG5cbiAgICAgIGlmIChleHByZXNzaW9uVHlwZSAhPSBcInZvaWRcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkV4cHJlc3Npb24gc3RhdGVtZW50cyBtYXkgY29udGFpbiBvbmx5IHZvaWQgY2FsbHMuXCIsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJCcmVha1N0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiQ29udGludWVTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY29udHJvbCA9IHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiA/IFwiYnJlYWtcIiA6IFwiY29udGludWVcIlxuXG4gICAgICBpZiAoIWxvb3BDb250ZXh0Lm5lYXJlc3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZW1lbnQudGFyZ2V0TG9vcElkID09IFwic3RyaW5nXCIgJiYgbG9vcENvbnRleHQub3duZXJzLmhhcyhzdGF0ZW1lbnQudGFyZ2V0TG9vcElkKSAmJlxuICAgICAgICAgIGxvb3BDb250ZXh0Lm93bmVycy5nZXQoc3RhdGVtZW50LnRhcmdldExvb3BJZCkgIT09IGxvb3BDb250ZXh0Lm93bmVyKSB7XG4gICAgICAgICAgZmFpbChcIkNST1NTX0ZVTkNUSU9OX0xPT1BfVEFSR0VUXCIsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IHRhcmdldCBjcm9zc2VzIGEgZnVuY3Rpb24gYm91bmRhcnkuYCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGZhaWwoYElMTEVHQUxfJHtjb250cm9sLnRvVXBwZXJDYXNlKCl9X0NPTlRFWFRgLCBgJHtjb250cm9sWzBdLnRvVXBwZXJDYXNlKCl9JHtjb250cm9sLnNsaWNlKDEpfSBzdGF0ZW1lbnQgb3V0c2lkZSBhIGxvb3AuYCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzdGF0ZW1lbnQudGFyZ2V0TG9vcElkICE9IFwic3RyaW5nXCIgfHwgIWxvb3BDb250ZXh0Lm93bmVycy5oYXMoc3RhdGVtZW50LnRhcmdldExvb3BJZCkpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfTE9PUF9UQVJHRVRcIiwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gaGFzIGFuIGludmFsaWQgbG9vcCB0YXJnZXQgaWRlbnRpdHkuYCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGxvb3BDb250ZXh0Lm93bmVycy5nZXQoc3RhdGVtZW50LnRhcmdldExvb3BJZCkgIT09IGxvb3BDb250ZXh0Lm93bmVyKSB7XG4gICAgICAgIGZhaWwoXCJDUk9TU19GVU5DVElPTl9MT09QX1RBUkdFVFwiLCBgJHtjb250cm9sWzBdLnRvVXBwZXJDYXNlKCl9JHtjb250cm9sLnNsaWNlKDEpfSB0YXJnZXQgY3Jvc3NlcyBhIGZ1bmN0aW9uIGJvdW5kYXJ5LmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQudGFyZ2V0TG9vcElkICE9IGxvb3BDb250ZXh0Lm5lYXJlc3QuaWQpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfTE9PUF9UQVJHRVRcIiwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gbXVzdCB0YXJnZXQgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AuYCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgbm9ybWFsID0gZmFsc2VcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIXJldHVyblR5cGUpIGZhaWwoXCJJTExFR0FMX1JFVFVSTl9DT05URVhUXCIsIFwiUmV0dXJuIHN0YXRlbWVudCBvdXRzaWRlIGEgZnVuY3Rpb24uXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIGlmIChpc1ZvaWRUeXBlKHJldHVyblR5cGUpKSB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbikge1xuICAgICAgICAgIGZhaWwoXCJWT0lEX1JFVFVSTl9WQUxVRVwiLCBcIlZvaWQgZnVuY3Rpb24gY2Fubm90IHJldHVybiBhIHZhbHVlLlwiLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFzdGF0ZW1lbnQuZXhwcmVzc2lvbikge1xuICAgICAgICAgIGZhaWwoXCJNSVNTSU5HX1JFVFVSTl9WQUxVRVwiLCBgRnVuY3Rpb24gcmV0dXJuIHJlcXVpcmVzIGEgJHt0eXBlRGVzY3JpcHRpb24ocmV0dXJuVHlwZSl9IHZhbHVlLmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IG5vcm1hbGl6ZU93bmVkTW92ZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgcmV0dXJuVHlwZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBmdW5jdGlvbnMsXG4gICAgICAgICAgcmVjb3JkcyxcbiAgICAgICAgICBmYWlsLFxuICAgICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICAgICAgXCJhIHJldHVybmVkIHZhbHVlXCIsXG4gICAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKCFhc3NpZ25hYmxlVHlwZShhY3R1YWxUeXBlLCByZXR1cm5UeXBlLCByZWNvcmRzKSkge1xuICAgICAgICAgIGZhaWwobm9taW5hbE1pc21hdGNoQ29kZShyZXR1cm5UeXBlKSwgYFJldHVybiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbFR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocmV0dXJuVHlwZSl9LmAsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgbm9ybWFsID0gZmFsc2VcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoc3RhdGVtZW50LmNvbmRpdGlvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbmRpdGlvblwiKVxuXG4gICAgICBpZiAoIWlzU2NhbGFyVHlwZShjb25kaXRpb25UeXBlLCBcImJvb2xlYW5cIikpIHtcbiAgICAgICAgZmFpbChcIk5PTl9CT09MRUFOX0NPTkRJVElPTlwiLCBgSWYgY29uZGl0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29uZGl0aW9uVHlwZSl9OyBleHBlY3RlZCBib29sZWFuLmAsIHN0YXRlbWVudC5jb25kaXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlQmluZGluZ3MgPSBiaW5kaW5nc1Zpc2libGVGcm9tKHNjb3BlKVxuICAgICAgY29uc3QgaW5pdGlhbEtub3duVmFsdWVzID0gdmlzaWJsZUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5rbm93blZhbHVlKVxuICAgICAgY29uc3QgY29uc2VxdWVudFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5jb25zZXF1ZW50LnN0YXRlbWVudHMpXG4gICAgICBjb25zdCBhbHRlcm5hdGVTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYWx0ZXJuYXRlPy5zdGF0ZW1lbnRzID8/IFtdKVxuICAgICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgY29uc2VxdWVudFNjb3BlLCB0cnVlKVxuICAgICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgYWx0ZXJuYXRlU2NvcGUsIGZhbHNlKVxuICAgICAgY29uc3QgY29uc2VxdWVudFJldHVybnMgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBjb25zZXF1ZW50U2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG4gICAgICBjb25zdCBjb25zZXF1ZW50S25vd25WYWx1ZXMgPSB2aXNpYmxlQmluZGluZ3MubWFwKChiaW5kaW5nKSA9PiBiaW5kaW5nLmtub3duVmFsdWUpXG5cbiAgICAgIHZpc2libGVCaW5kaW5ncy5mb3JFYWNoKChiaW5kaW5nLCBpbmRleCkgPT4ge1xuICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSBpbml0aWFsS25vd25WYWx1ZXNbaW5kZXhdXG4gICAgICB9KVxuICAgICAgbGV0IGFsdGVybmF0ZVJldHVybnMgPSB7bm9ybWFsOiB0cnVlLCByYWlzZXM6IG5ldyBTZXQoKX1cblxuICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICAgICAgYWx0ZXJuYXRlUmV0dXJucyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYWx0ZXJuYXRlU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG4gICAgICB9XG4gICAgICBjb25zdCBhbHRlcm5hdGVLbm93blZhbHVlcyA9IHZpc2libGVCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcua25vd25WYWx1ZSlcblxuICAgICAgdmlzaWJsZUJpbmRpbmdzLmZvckVhY2goKGJpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICghY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmIGFsdGVybmF0ZVJldHVybnMubm9ybWFsKSBiaW5kaW5nLmtub3duVmFsdWUgPSBhbHRlcm5hdGVLbm93blZhbHVlc1tpbmRleF1cbiAgICAgICAgZWxzZSBpZiAoY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmICFhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbCkgYmluZGluZy5rbm93blZhbHVlID0gY29uc2VxdWVudEtub3duVmFsdWVzW2luZGV4XVxuICAgICAgICBlbHNlIGlmIChjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWwgJiYgY29uc2VxdWVudEtub3duVmFsdWVzW2luZGV4XSA9PT0gYWx0ZXJuYXRlS25vd25WYWx1ZXNbaW5kZXhdKSB7XG4gICAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gY29uc2VxdWVudEtub3duVmFsdWVzW2luZGV4XVxuICAgICAgICB9IGVsc2UgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICB9KVxuICAgICAgY29uc3QgY29udGludWluZ1Byb29mcyA9ICFjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWxcbiAgICAgICAgPyBhbHRlcm5hdGVTY29wZS5wcmVzZW5jZVByb29mc1xuICAgICAgICA6IGNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCAmJiAhYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWxcbiAgICAgICAgICA/IGNvbnNlcXVlbnRTY29wZS5wcmVzZW5jZVByb29mc1xuICAgICAgICAgIDogY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmIGFsdGVybmF0ZVJldHVybnMubm9ybWFsXG4gICAgICAgICAgICA/IG5ldyBTZXQoWy4uLmNvbnNlcXVlbnRTY29wZS5wcmVzZW5jZVByb29mc10uZmlsdGVyKChiaW5kaW5nKSA9PiBhbHRlcm5hdGVTY29wZS5wcmVzZW5jZVByb29mcy5oYXMoYmluZGluZykpKVxuICAgICAgICAgICAgOiBuZXcgU2V0KClcbiAgICAgIGNvbnN0IHZpc2libGVTZXQgPSBuZXcgU2V0KHZpc2libGVCaW5kaW5ncylcblxuICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGNvbnRpbnVpbmdQcm9vZnMpIHtcbiAgICAgICAgaWYgKHZpc2libGVTZXQuaGFzKGJpbmRpbmcpKSBzY29wZS5wcmVzZW5jZVByb29mcy5hZGQoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmNvbmRpdGlvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBjb25zZXF1ZW50UmV0dXJucy5yYWlzZXMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBhbHRlcm5hdGVSZXR1cm5zLnJhaXNlcylcbiAgICAgIG5vcm1hbCA9IGNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCB8fCBhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbFxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgYXNzaWduZWRPdXRlckJpbmRpbmdzID0gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBzY29wZSlcblxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncykge1xuICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSB1bmRlZmluZWRcbiAgICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICB9XG4gICAgICBjb25zdCBjb25kaXRpb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uLWNvbnRyb2xsZWQgbG9vcCBjb25kaXRpb25cIlxuICAgICAgKVxuXG4gICAgICBpZiAoIWlzU2NhbGFyVHlwZShjb25kaXRpb25UeXBlLCBcImJvb2xlYW5cIikpIHtcbiAgICAgICAgZmFpbChcIk5PTl9CT09MRUFOX0NPTkRJVElPTlwiLCBgV2hpbGUgY29uZGl0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29uZGl0aW9uVHlwZSl9OyBleHBlY3RlZCBib29sZWFuLmAsIHN0YXRlbWVudC5jb25kaXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBsb29wU2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgc3RhdGVtZW50LmJvZHkuc3RhdGVtZW50cylcblxuICAgICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgbG9vcFNjb3BlLCB0cnVlKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBsb29wU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywge25lYXJlc3Q6IHN0YXRlbWVudCwgb3duZXI6IGxvb3BDb250ZXh0Lm93bmVyLCBvd25lcnM6IGxvb3BDb250ZXh0Lm93bmVyc30pXG5cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmNvbmRpdGlvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBib2R5Rmxvdy5yYWlzZXMpXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgbGlzdFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoc3RhdGVtZW50Lmxpc3QsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gaXRlcmF0aW9uIGNvbGxlY3Rpb25cIilcblxuICAgICAgaWYgKGxpc3RUeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBJdGVyYXRpb24gY29sbGVjdGlvbiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGxpc3RUeXBlKX07IGV4cGVjdGVkIGxpc3QuYCwgc3RhdGVtZW50Lmxpc3QubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoIXN0YXRlbWVudC52YWx1ZUJpbmRpbmcgfHwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5raW5kICE9IFwiVmFsdWVCaW5kaW5nXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJdGVyYXRpb24gcmVxdWlyZXMgb25lIHR5cGVkIHZhbHVlIGJpbmRpbmcuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm11dGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiSXRlcmF0aW9uIGJpbmRpbmcgbXVzdCBiZSBpbW11dGFibGUuXCIsIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24gPz8gc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgYmluZGluZ1R5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYmluZGluZ1R5cGUsIGxpc3RUeXBlLmVsZW1lbnRUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgSXRlcmF0aW9uIGJpbmRpbmcgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihiaW5kaW5nVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihsaXN0VHlwZS5lbGVtZW50VHlwZSl9LmAsXG4gICAgICAgICAgdHlwZUxvY2F0aW9uKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCBhc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb3BTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm5hbWUsIHtcbiAgICAgICAga25vd25WYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogYmluZGluZ1R5cGVcbiAgICAgIH0sIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBcIm5hbWVcIiksIGxvb3BTY29wZSwgZmFpbClcbiAgICAgIGNvbnN0IGJvZHlGbG93ID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYm9keSwgbG9vcFNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtuZWFyZXN0OiBzdGF0ZW1lbnQsIG93bmVyOiBsb29wQ29udGV4dC5vd25lciwgb3duZXJzOiBsb29wQ29udGV4dC5vd25lcnN9KVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQubGlzdCwgY2FsbEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBib2R5Rmxvdy5yYWlzZXMpXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgbWFwVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQubWFwLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgICBcImEgbWFwIGl0ZXJhdGlvbiBjb2xsZWN0aW9uXCIpXG5cbiAgICAgIGlmIChtYXBUeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihtYXBUeXBlKX07IGV4cGVjdGVkIG9yZGVyZWQgbWFwLmAsIHN0YXRlbWVudC5tYXAubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoIXN0YXRlbWVudC5rZXlCaW5kaW5nIHx8IHN0YXRlbWVudC5rZXlCaW5kaW5nLmtpbmQgIT0gXCJWYWx1ZUJpbmRpbmdcIiB8fFxuICAgICAgICAhc3RhdGVtZW50LnZhbHVlQmluZGluZyB8fCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmtpbmQgIT0gXCJWYWx1ZUJpbmRpbmdcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBpdGVyYXRpb24gcmVxdWlyZXMgZXhhY3Qga2V5IGFuZCB2YWx1ZSBiaW5kaW5ncy5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlbWVudC5rZXlCaW5kaW5nLm11dGFibGUgIT09IGZhbHNlIHx8IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAgaXRlcmF0aW9uIGJpbmRpbmdzIG11c3QgYmUgaW1tdXRhYmxlLlwiLFxuICAgICAgICAgIHN0YXRlbWVudC5rZXlCaW5kaW5nLm11dGFibGUgIT09IGZhbHNlID8gc3RhdGVtZW50LmtleUJpbmRpbmcubG9jYXRpb24gOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3Qga2V5VHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHN0YXRlbWVudC5rZXlCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC5rZXlCaW5kaW5nLmxvY2F0aW9uLCBmYWlsLFxuICAgICAgICB1bmRlZmluZWQsIHJlY29yZHMsIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LnZhbHVlQmluZGluZy50eXBlLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uLCBmYWlsLFxuICAgICAgICB1bmRlZmluZWQsIHJlY29yZHMsIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGtleVR5cGUsIG1hcFR5cGUua2V5VHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBpdGVyYXRpb24ga2V5IGJpbmRpbmcgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihrZXlUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKG1hcFR5cGUua2V5VHlwZSl9LmAsXG4gICAgICAgICAgdHlwZUxvY2F0aW9uKHN0YXRlbWVudC5rZXlCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC5rZXlCaW5kaW5nLmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGlmICghc2FtZVR5cGUodmFsdWVUeXBlLCBtYXBUeXBlLnZhbHVlVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBpdGVyYXRpb24gdmFsdWUgYmluZGluZyB0eXBlICR7dHlwZURlc2NyaXB0aW9uKHZhbHVlVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihtYXBUeXBlLnZhbHVlVHlwZSl9LmAsXG4gICAgICAgICAgdHlwZUxvY2F0aW9uKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCBhc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb3BTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQua2V5QmluZGluZy5uYW1lLCB7a25vd25WYWx1ZTogdW5kZWZpbmVkLCBtdXRhYmxlOiBmYWxzZSwgdHlwZToga2V5VHlwZX0sXG4gICAgICAgIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQua2V5QmluZGluZywgXCJuYW1lXCIpLCBsb29wU2NvcGUsIGZhaWwpXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlOiB2YWx1ZVR5cGV9LFxuICAgICAgICByb2xlTG9jYXRpb24oc3RhdGVtZW50LnZhbHVlQmluZGluZywgXCJuYW1lXCIpLCBsb29wU2NvcGUsIGZhaWwpXG4gICAgICBjb25zdCBib2R5RmxvdyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmJvZHksIGxvb3BTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLFxuICAgICAgICBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB7bmVhcmVzdDogc3RhdGVtZW50LCBvd25lcjogbG9vcENvbnRleHQub3duZXIsIG93bmVyczogbG9vcENvbnRleHQub3duZXJzfSlcblxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQubWFwLCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmFpc2VTdGF0ZW1lbnRcIikge1xuICAgICAgaWYgKCFzdGF0ZW1lbnQuZXJyb3IgfHwgc3RhdGVtZW50LmVycm9yLmtpbmQgIT0gXCJFcnJvckNvbnN0cnVjdGlvblwiKSB7XG4gICAgICAgIGZhaWwoXCJOT05fRVJST1JfUkFJU0VcIiwgXCJSYWlzZSByZXF1aXJlcyBvbmUgY29uc3RydWN0ZWQgc2VtYW50aWMgZXJyb3IuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhaXNlZFR5cGUgPSB2YWxpZGF0ZUVycm9yVHlwZShzdGF0ZW1lbnQuZXJyb3IuZXJyb3IsIHN0YXRlbWVudC5lcnJvci5sb2NhdGlvbiwgZXJyb3JzLCBmYWlsKVxuICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIHN0YXRlbWVudC5lcnJvci5tZXNzYWdlLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIGVycm9yIG1lc3NhZ2VcIiwgc2NhbGFyVHlwZShcInN0cmluZ1wiKVxuICAgICAgKVxuXG4gICAgICBpZiAoIWlzU2NhbGFyVHlwZShtZXNzYWdlVHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgICAgZmFpbChcIk5PTl9FUlJPUl9SQUlTRVwiLCBgRXJyb3IgbWVzc2FnZSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKG1lc3NhZ2VUeXBlKX07IGV4cGVjdGVkIHN0cmluZy5gLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIGNhbGxFZmZlY3RzKVxuICAgICAgcmFpc2VzLmFkZChyYWlzZWRUeXBlLmRlY2xhcmF0aW9uSWQpXG4gICAgICBub3JtYWwgPSBmYWxzZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0aHJvd1N0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gZmluZEJpbmRpbmcoc3RhdGVtZW50LmJpbmRpbmcsIHNjb3BlKVxuXG4gICAgICBpZiAoIWJpbmRpbmcgfHwgYmluZGluZy5tdXRhYmxlICE9PSBmYWxzZSB8fCBiaW5kaW5nLnR5cGUua2luZCAhPSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX1JFVEhST1dcIiwgXCJSZXRocm93IHJlcXVpcmVzIGEgY2F0Y2ggYmluZGluZyBpbiBzY29wZS5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgcmFpc2VzLmFkZCgvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JUeXBlfSAqLyAoYmluZGluZy50eXBlKS5kZWNsYXJhdGlvbklkKVxuICAgICAgbm9ybWFsID0gZmFsc2VcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGVtZW50LmhhbmRsZXJzKSB8fCAoc3RhdGVtZW50LmhhbmRsZXJzLmxlbmd0aCA9PSAwICYmICFzdGF0ZW1lbnQuZmluYWxseUJvZHkpKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX0VSUk9SX0hBTkRMRVJcIiwgXCJUcnkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGV4YWN0IHR5cGVkIGhhbmRsZXIgb3IgYSBmaW5hbGx5IGJsb2NrLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBib2R5QXNzaWduZWRPdXRlckJpbmRpbmdzID0gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBzY29wZSlcbiAgICAgIGNvbnN0IGFzc2lnbmVkT3V0ZXJCaW5kaW5ncyA9IG5ldyBTZXQoYm9keUFzc2lnbmVkT3V0ZXJCaW5kaW5ncylcblxuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHN0YXRlbWVudC5oYW5kbGVycykgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KGhhbmRsZXIuY2F0Y2hCb2R5LCBzY29wZSwgYXNzaWduZWRPdXRlckJpbmRpbmdzKVxuICAgICAgaWYgKHN0YXRlbWVudC5maW5hbGx5Qm9keSkgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5maW5hbGx5Qm9keSwgc2NvcGUsIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncylcbiAgICAgIGNvbnN0IGJvZHlTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBib2R5U2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG5cbiAgICAgIGxldCByZW1haW5pbmdSYWlzZXMgPSBuZXcgU2V0KGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGxldCBub3JtYWxDb21wbGV0aW9uID0gYm9keUZsb3cubm9ybWFsXG4gICAgICBjb25zdCBoYW5kbGVyUmFpc2VzID0gbmV3IFNldCgpXG4gICAgICBjb25zdCBzZWVuSGFuZGxlck5hbWVzID0gbmV3IFNldCgpXG5cbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBzdGF0ZW1lbnQuaGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgY2F1Z2h0VHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKGhhbmRsZXIuY2F0Y2hUeXBlLCBoYW5kbGVyLmxvY2F0aW9uLCBlcnJvcnMsIGZhaWwpXG5cbiAgICAgICAgaWYgKCFoYW5kbGVyLmNhdGNoQmluZGluZyB8fCBoYW5kbGVyLmNhdGNoQmluZGluZy5raW5kICE9IFwiQ2F0Y2hCaW5kaW5nXCIgfHwgaGFuZGxlci5jYXRjaEJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBmYWlsKFwiSU5WQUxJRF9FUlJPUl9IQU5ETEVSXCIsIFwiQ2F0Y2ggcmVxdWlyZXMgb25lIGltbXV0YWJsZSB0eXBlZCBiaW5kaW5nLlwiLCBoYW5kbGVyLmNhdGNoQmluZGluZz8ubG9jYXRpb24gPz8gaGFuZGxlci5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaW5kaW5nVHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKGhhbmRsZXIuY2F0Y2hCaW5kaW5nLnR5cGUsIGhhbmRsZXIuY2F0Y2hCaW5kaW5nLmxvY2F0aW9uLCBlcnJvcnMsIGZhaWwpXG5cbiAgICAgICAgaWYgKGJpbmRpbmdUeXBlLmRlY2xhcmF0aW9uSWQgIT0gY2F1Z2h0VHlwZS5kZWNsYXJhdGlvbklkKSB7XG4gICAgICAgICAgZmFpbChcIklOVkFMSURfRVJST1JfSEFORExFUlwiLCBcIkNhdGNoIGJpbmRpbmcgdHlwZSBtdXN0IGV4YWN0bHkgbWF0Y2ggaXRzIGhhbmRsZXIgdHlwZS5cIiwgaGFuZGxlci5jYXRjaEJpbmRpbmcubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZW1haW5pbmdSYWlzZXMuaGFzKGNhdWdodFR5cGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgICAgICBmYWlsKFwiVU5SRUFDSEFCTEVfSEFORExFUlwiLCBgSGFuZGxlciBmb3IgJyR7ZXJyb3JzLmdldChjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpPy5uYW1lfScgY2Fubm90IGJlIHJlYWNoZWQuYCxcbiAgICAgICAgICAgIHR5cGVMb2NhdGlvbihoYW5kbGVyLmNhdGNoVHlwZSwgaGFuZGxlci5sb2NhdGlvbikpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZW5IYW5kbGVyTmFtZXMuaGFzKGhhbmRsZXIuY2F0Y2hCaW5kaW5nLm5hbWUpKSB7XG4gICAgICAgICAgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIGBEdXBsaWNhdGUgb3Igc2hhZG93ZWQgYmluZGluZyAnJHtoYW5kbGVyLmNhdGNoQmluZGluZy5uYW1lfScuYCwgaGFuZGxlci5jYXRjaEJpbmRpbmcubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgc2VlbkhhbmRsZXJOYW1lcy5hZGQoaGFuZGxlci5jYXRjaEJpbmRpbmcubmFtZSlcbiAgICAgICAgcmVtYWluaW5nUmFpc2VzLmRlbGV0ZShjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpXG4gICAgICAgIGNvbnN0IGNhdGNoU2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgaGFuZGxlci5jYXRjaEJvZHkuc3RhdGVtZW50cylcblxuICAgICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYm9keUFzc2lnbmVkT3V0ZXJCaW5kaW5ncykge1xuICAgICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIGNhdGNoU2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICAgIH1cbiAgICAgICAgZGVjbGFyZUJpbmRpbmcoaGFuZGxlci5jYXRjaEJpbmRpbmcubmFtZSwge1xuICAgICAgICAgIGtub3duVmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICAgICAgICB9LCByb2xlTG9jYXRpb24oaGFuZGxlci5jYXRjaEJpbmRpbmcsIFwibmFtZVwiKSwgY2F0Y2hTY29wZSwgZmFpbClcbiAgICAgICAgY29uc3QgY2F0Y2hGbG93ID0gdmFsaWRhdGVCbG9jayhoYW5kbGVyLmNhdGNoQm9keSwgY2F0Y2hTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BDb250ZXh0KVxuXG4gICAgICAgIG5vcm1hbENvbXBsZXRpb24gPSBub3JtYWxDb21wbGV0aW9uIHx8IGNhdGNoRmxvdy5ub3JtYWxcbiAgICAgICAgYWRkQWxsKGhhbmRsZXJSYWlzZXMsIGNhdGNoRmxvdy5yYWlzZXMpXG4gICAgICB9XG4gICAgICBjb25zdCBwZW5kaW5nUmFpc2VzID0gbmV3IFNldChyZW1haW5pbmdSYWlzZXMpXG5cbiAgICAgIGFkZEFsbChwZW5kaW5nUmFpc2VzLCBoYW5kbGVyUmFpc2VzKVxuICAgICAgaWYgKHN0YXRlbWVudC5maW5hbGx5Qm9keSkge1xuICAgICAgICBjb25zdCBmaW5hbGx5U2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgc3RhdGVtZW50LmZpbmFsbHlCb2R5LnN0YXRlbWVudHMpXG4gICAgICAgIGNvbnN0IGZpbmFsbHlGbG93ID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuZmluYWxseUJvZHksIGZpbmFsbHlTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLFxuICAgICAgICAgIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BDb250ZXh0KVxuICAgICAgICAvLyBgcmFpc2VzYCBpcyB0aGUgZW5jbG9zaW5nIGJsb2NrJ3MgYWNjdW11bGF0b3IuIEEgY29tcGxldGlvbiBibG9jayByZXBsYWNlcyBvbmx5IHRoaXMgdHJ5J3NcbiAgICAgICAgLy8gcGVuZGluZyBjb21wbGV0aW9uOyBlc2NhcGVzIGNvbnRyaWJ1dGVkIGJ5IGVhcmxpZXIgc3RhdGVtZW50cyBvZiB0aGUgZW5jbG9zaW5nIGJsb2NrIHN1cnZpdmVcbiAgICAgICAgLy8gd2hpY2hldmVyIHdheSB0aGUgY29tcGxldGlvbiBibG9jayBjb21wbGV0ZXMuXG4gICAgICAgIGlmIChmaW5hbGx5Rmxvdy5ub3JtYWwpIGFkZEFsbChyYWlzZXMsIHBlbmRpbmdSYWlzZXMpXG4gICAgICAgIGFkZEFsbChyYWlzZXMsIGZpbmFsbHlGbG93LnJhaXNlcylcbiAgICAgICAgbm9ybWFsID0gZmluYWxseUZsb3cubm9ybWFsID8gbm9ybWFsQ29tcGxldGlvbiA6IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRBbGwocmFpc2VzLCBwZW5kaW5nUmFpc2VzKVxuICAgICAgICBub3JtYWwgPSBub3JtYWxDb21wbGV0aW9uXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdW5leHBlY3RlZCA9IC8qKiBAdHlwZSB7e2tpbmQ6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259fSAqLyAoc3RhdGVtZW50KVxuXG4gICAgZmFpbChcIlVOU1VQUE9SVEVEX1NUQVRFTUVOVFwiLCB1bmV4cGVjdGVkLmtpbmQsIHVuZXhwZWN0ZWQubG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4ge25vcm1hbCwgcmFpc2VzfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgZXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3duaW5nIGxvY2F0aW9uLlxuICogQHBhcmFtIHtFcnJvclJlZ2lzdHJ5fSBlcnJvcnMgLSBWaXNpYmxlIGVycm9yIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yVHlwZX0gVmFsaWRhdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXJyb3JUeXBlKHR5cGUsIGxvY2F0aW9uLCBlcnJvcnMsIGZhaWwpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIHJldHVybiBmYWlsKFwiVU5LTk9XTl9FUlJPUlwiLCBcIkhhbmRsZXIgb3IgcmFpc2UgaXMgbWlzc2luZyBhbiBleGFjdCBlcnJvciB0eXBlLlwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JUeXBlfSAqLyAodHlwZSlcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgIT0gXCJFcnJvclR5cGVcIiB8fFxuICAgIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZGVjbGFyYXRpb25JZCxraW5kXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhZXJyb3JzLmhhcyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICBmYWlsKFwiVU5LTk9XTl9FUlJPUlwiLCBgVW5rbm93biBlcnJvciBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZVxufVxuXG4vKipcbiAqIEFkZHMgZXZlcnkgc291cmNlIHZhbHVlIHRvIG9uZSBzZXQuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB0YXJnZXQgLSBEZXN0aW5hdGlvbiBpZGVudGl0aWVzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gc291cmNlIC0gU291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkQWxsKHRhcmdldCwgc291cmNlKSB7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB0YXJnZXQuYWRkKHZhbHVlKVxufVxuXG4vKipcbiAqIEFkZHMgdW5jaGVja2VkIGVycm9ycyByYWlzZWQgd2hpbGUgZXZhbHVhdGluZyBvbmUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHRhcmdldCAtIERlc3RpbmF0aW9uIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IGV4cHJlc3Npb24gLSBDYW5kaWRhdGUgc2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjYWxsRWZmZWN0cyAtIEluZmVycmVkIGNhbGwgZWZmZWN0cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbbWV0aG9kRWZmZWN0c10gLSBJbmZlcnJlZCBlZmZlY3RzIGJ5IHJlc29sdmVkIG1ldGhvZCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZGRFeHByZXNzaW9uRWZmZWN0cyh0YXJnZXQsIGV4cHJlc3Npb24sIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSBbZXhwcmVzc2lvbl1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcblxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiQ2FsbEV4cHJlc3Npb25cIikgYWRkQWxsKHRhcmdldCwgY2FsbEVmZmVjdHMuZ2V0KFJlZmxlY3QuZ2V0KHZhbHVlLCBcImNhbGxlZVwiKSkgPz8gbmV3IFNldCgpKVxuICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGZhaWx1cmVzID0gUmVmbGVjdC5nZXQodmFsdWUsIFwiZmFpbHVyZUlkc1wiKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmFpbHVyZXMpKSBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgZmFpbHVyZXMpIGlmICh0eXBlb2YgZmFpbHVyZSA9PSBcInN0cmluZ1wiKSB0YXJnZXQuYWRkKGZhaWx1cmUpXG4gICAgICBpZiAoUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgYWRkQWxsKHRhcmdldCwgbWV0aG9kRWZmZWN0cy5nZXQoUmVmbGVjdC5nZXQodmFsdWUsIFwibWV0aG9kXCIpKSA/PyBuZXcgU2V0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcInJlc29sdXRpb25cIilcbiAgICAgIGNvbnN0IGZhaWx1cmVzID0gcmVzb2x1dGlvbiAmJiB0eXBlb2YgcmVzb2x1dGlvbiA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQocmVzb2x1dGlvbiwgXCJmYWlsdXJlSWRzXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZhaWx1cmVzKSkgZm9yIChjb25zdCBmYWlsdXJlIG9mIGZhaWx1cmVzKSBpZiAodHlwZW9mIGZhaWx1cmUgPT0gXCJzdHJpbmdcIikgdGFyZ2V0LmFkZChmYWlsdXJlKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NhdGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIiwgXCJyZXNvbHV0aW9uXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHBlbmRpbmcucHVzaCguLi5jaGlsZClcbiAgICAgIGVsc2UgaWYgKGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PSBcIm9iamVjdFwiKSBwZW5kaW5nLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24gb3ZlciB0aGUgcmVzb2x2ZWQgZmluaXRlIGZ1bmN0aW9uIGdyYXBoLlxuICogVGhpcyBpcyB2YWxpZGF0b3Igc3RhdGUsIG5ldmVyIGEgY2hlY2tlZCBlZmZlY3QgaW4gdGhlIHB1YmxpYyBmdW5jdGlvbiBzaWduYXR1cmUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIFJlc29sdmVkIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbc2VlZEVmZmVjdHNdIC0gRGVwZW5kZW5jeSBlZmZlY3RzIGtleWVkIGJ5IGxvY2FsIGltcG9ydCBuYW1lLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW2xvY2FsRnVuY3Rpb25OYW1lc10gLSBGdW5jdGlvbnMgd2hvc2UgYm9kaWVzIGJlbG9uZyB0byB0aGUgY3VycmVudCBtb2R1bGUuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBFc2NhcGluZyBlcnJvciBpZGVudGl0aWVzIGJ5IHNvdXJjZS12aXNpYmxlIGZ1bmN0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGluZmVyQ2FsbEVmZmVjdHMoZnVuY3Rpb25zLCBzZWVkRWZmZWN0cyA9IG5ldyBNYXAoKSwgbG9jYWxGdW5jdGlvbk5hbWVzID0gbmV3IFNldChmdW5jdGlvbnMua2V5cygpKSkge1xuICBjb25zdCBlZmZlY3RzID0gbmV3IE1hcChbLi4uZnVuY3Rpb25zLmtleXMoKV0ubWFwKChuYW1lKSA9PiBbbmFtZSwgbmV3IFNldChzZWVkRWZmZWN0cy5nZXQobmFtZSkgPz8gW10pXSkpXG4gIGxldCBjaGFuZ2VkID0gdHJ1ZVxuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGxvY2FsRnVuY3Rpb25OYW1lcykge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBmdW5jdGlvbnMuZ2V0KG5hbWUpXG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24pIGNvbnRpbnVlXG4gICAgICBjb25zdCBuZXh0ID0gc3ludGFjdGljQmxvY2tFZmZlY3RzKGRlY2xhcmF0aW9uLmJvZHksIGVmZmVjdHMpXG4gICAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKGVmZmVjdHMuZ2V0KG5hbWUpKVxuXG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIG5leHQpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50LmhhcyhlcnJvcikpIHtcbiAgICAgICAgICBjdXJyZW50LmFkZChlcnJvcilcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdHNcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBlc2NhcGluZyBpZGVudGl0aWVzIGZyb20gb25lIGJsb2NrIGZvciB0aGUgY2FsbC1lZmZlY3QgZml4ZWQgcG9pbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IGJsb2NrIC0gQ2FuZGlkYXRlIGJsb2NrLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gQ3VycmVudCBmaXhlZC1wb2ludCBzdGF0ZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbbWV0aG9kRWZmZWN0c10gLSBDdXJyZW50IG1ldGhvZCBmaXhlZC1wb2ludCBzdGF0ZS5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gRXNjYXBpbmcgaWRlbnRpdGllcy5cbiAqL1xuZnVuY3Rpb24gc3ludGFjdGljQmxvY2tFZmZlY3RzKGJsb2NrLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cyA9IG5ldyBNYXAoKSkge1xuICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KClcbiAgY29uc3Qgc3RhdGVtZW50cyA9IFJlZmxlY3QuZ2V0KC8qKiBAdHlwZSB7b2JqZWN0fSAqLyAoYmxvY2sgPz8ge30pLCBcInN0YXRlbWVudHNcIilcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGVtZW50cykpIHJldHVybiByZXN1bHRcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgIGlmICghc3RhdGVtZW50IHx8IHR5cGVvZiBzdGF0ZW1lbnQgIT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICBjb25zdCBraW5kID0gUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImtpbmRcIilcblxuICAgIGlmIChraW5kID09IFwiUmFpc2VTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY29uc3RydWN0aW9uID0gUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImVycm9yXCIpXG4gICAgICBjb25zdCB0eXBlID0gY29uc3RydWN0aW9uICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24gPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KGNvbnN0cnVjdGlvbiwgXCJlcnJvclwiKSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgZGVjbGFyYXRpb25JZCA9IHR5cGUgJiYgdHlwZW9mIHR5cGUgPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KHR5cGUsIFwiZGVjbGFyYXRpb25JZFwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIikgcmVzdWx0LmFkZChkZWNsYXJhdGlvbklkKVxuICAgICAgaWYgKGNvbnN0cnVjdGlvbiAmJiB0eXBlb2YgY29uc3RydWN0aW9uID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChjb25zdHJ1Y3Rpb24sIFwibWVzc2FnZVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoa2luZCA9PSBcIlJldGhyb3dTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgYmluZGluZ05vZGUgPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiYmluZGluZ05vZGVcIilcbiAgICAgIGNvbnN0IGJpbmRpbmdUeXBlID0gYmluZGluZ05vZGUgJiYgdHlwZW9mIGJpbmRpbmdOb2RlID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChiaW5kaW5nTm9kZSwgXCJ0eXBlXCIpIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gYmluZGluZ1R5cGUgJiYgdHlwZW9mIGJpbmRpbmdUeXBlID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChiaW5kaW5nVHlwZSwgXCJkZWNsYXJhdGlvbklkXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiKSByZXN1bHQuYWRkKGRlY2xhcmF0aW9uSWQpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoa2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICBsZXQgYm9keUVmZmVjdHMgPSBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImJvZHlcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKVxuXG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImhhbmRsZXJzXCIpID8/IFtdKSB7XG4gICAgICAgIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlciAhPSBcIm9iamVjdFwiKSBjb250aW51ZVxuICAgICAgICBjb25zdCBjYXRjaFR5cGUgPSBSZWZsZWN0LmdldChoYW5kbGVyLCBcImNhdGNoVHlwZVwiKVxuICAgICAgICBjb25zdCBjYXVnaHRJZCA9IGNhdGNoVHlwZSAmJiB0eXBlb2YgY2F0Y2hUeXBlID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChjYXRjaFR5cGUsIFwiZGVjbGFyYXRpb25JZFwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2F1Z2h0SWQgPT0gXCJzdHJpbmdcIiAmJiBib2R5RWZmZWN0cy5kZWxldGUoY2F1Z2h0SWQpKSB7XG4gICAgICAgICAgYWRkQWxsKGJvZHlFZmZlY3RzLCBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoaGFuZGxlciwgXCJjYXRjaEJvZHlcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWRkQWxsKGJvZHlFZmZlY3RzLCBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImZpbmFsbHlCb2R5XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpXG4gICAgICBhZGRBbGwocmVzdWx0LCBib2R5RWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY29uZGl0aW9uXCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIGFkZEFsbChyZXN1bHQsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY29uc2VxdWVudFwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgYWRkQWxsKHJlc3VsdCwgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJhbHRlcm5hdGVcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiIHx8IGtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIpIHtcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJlc3VsdCwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBraW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiID8gXCJsaXN0XCIgOiBcIm1hcFwiKSwgY2FsbEVmZmVjdHMsXG4gICAgICAgIG1ldGhvZEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmVzdWx0LCBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImJvZHlcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY29uZGl0aW9uXCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIGFkZEFsbChyZXN1bHQsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiYm9keVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgW1wiZXhwcmVzc2lvblwiLCBcImluaXRpYWxpemVyXCJdKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwga2V5KSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIGVzY2FwaW5nIHVzZXItZGVmaW5lZCBlcnJvciBzZXRzIGZvciBsb2NhbCBmdW5jdGlvbnMgYW5kIHJlc29sdmVkIGNsYXNzIG1ldGhvZHMuXG4gKiBUaGUgZml4ZWQgcG9pbnQgaXMgY29tcHV0ZWQgb3ZlciBldmVyeSB1bmNoZWNrZWQgZXJyb3I7IGNhcGFiaWxpdHkgZmFpbHVyZXMgYXJlIHByb2plY3RlZCBvdXRcbiAqIGJlY2F1c2UgY2FsbCBzaXRlcyBhbHJlYWR5IGNhcnJ5IHRoZWlyIGNhcGFiaWxpdHktZmFpbHVyZSBib3VuZGFyeSB0aHJvdWdoIHJlc29sdXRpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFJlc29sdmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbc2VlZEVmZmVjdHNdIC0gRGVwZW5kZW5jeSBlZmZlY3RzIGtleWVkIGJ5IGxvY2FsIGltcG9ydCBuYW1lLlxuICogQHJldHVybnMge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gRXNjYXBpbmcgdXNlci1kZWZpbmVkIGVycm9yIGlkZW50aXRpZXMgYnkgZnVuY3Rpb24gbmFtZSBhbmQgbWV0aG9kIGlkZW50aXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJFc2NhcGluZ0Vycm9yRWZmZWN0cyhtb2R1bGUsIHNlZWRFZmZlY3RzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IGZ1bmN0aW9ucyA9IG5ldyBNYXAobW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgZnVuY3Rpb25FZmZlY3RzID0gbmV3IE1hcChbLi4uZnVuY3Rpb25zLmtleXMoKV0ubWFwKChuYW1lKSA9PiBbbmFtZSwgbmV3IFNldChzZWVkRWZmZWN0cy5nZXQobmFtZSkgPz8gW10pXSkpXG4gIGNvbnN0IGNsYXNzZXMgPSBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICBjb25zdCBtZXRob2RFZmZlY3RzID0gbmV3IE1hcCgpXG4gIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlSWRzID0gbmV3IFNldCgobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMpLm1hcCgoe2lkfSkgPT4gaWQpKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgY2xhc3NlcykgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcykgbWV0aG9kRWZmZWN0cy5zZXQobWV0aG9kLmlkLCBuZXcgU2V0KCkpXG4gIGxldCBjaGFuZ2VkID0gdHJ1ZVxuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKGZ1bmN0aW9uRWZmZWN0cy5nZXQoZGVjbGFyYXRpb24ubmFtZSkpXG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhkZWNsYXJhdGlvbi5ib2R5LCBmdW5jdGlvbkVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKSB7XG4gICAgICAgIGlmICghY3VycmVudC5oYXMoZXJyb3IpKSB7IGN1cnJlbnQuYWRkKGVycm9yKTsgY2hhbmdlZCA9IHRydWUgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGNsYXNzZXMpIHtcbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovIChtZXRob2RFZmZlY3RzLmdldChtZXRob2QuaWQpKVxuICAgICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhtZXRob2QuYm9keSwgZnVuY3Rpb25FZmZlY3RzLCBtZXRob2RFZmZlY3RzKSkge1xuICAgICAgICAgIGlmICghY3VycmVudC5oYXMoZXJyb3IpKSB7IGN1cnJlbnQuYWRkKGVycm9yKTsgY2hhbmdlZCA9IHRydWUgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlZmZlY3RzIG9mIFtmdW5jdGlvbkVmZmVjdHMsIG1ldGhvZEVmZmVjdHNdKSB7XG4gICAgZm9yIChjb25zdCBlcnJvcnMgb2YgZWZmZWN0cy52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBbLi4uZXJyb3JzXSkgaWYgKGNhcGFiaWxpdHlGYWlsdXJlSWRzLmhhcyhlcnJvcikpIGVycm9ycy5kZWxldGUoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtmdW5jdGlvbnM6IGZ1bmN0aW9uRWZmZWN0cywgbWV0aG9kczogbWV0aG9kRWZmZWN0c31cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGV4aWNhbCBzY29wZSB3aXRoIGRlY2xhcmF0aW9ucyBtYXJrZWQgcGVuZGluZyB1bnRpbCB2aXNpdGVkLlxuICogQHBhcmFtIHtTY29wZSB8IHVuZGVmaW5lZH0gcGFyZW50IC0gRW5jbG9zaW5nIHNjb3BlLlxuICogQHBhcmFtIHt7a2luZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nfVtdfSBzdGF0ZW1lbnRzIC0gU2NvcGUgc3RhdGVtZW50cy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFtyZXNlcnZlZE5hbWVzXSAtIE5hbWVzIHVuYXZhaWxhYmxlIHRvIHJvb3QgYmluZGluZ3MuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBbY3VycmVudENsYXNzXSAtIERlY2xhcmluZyBjbGFzcyBmb3IgcmVjZWl2ZXItcHJpdmF0ZSBhY2Nlc3MuXG4gKiBAcmV0dXJucyB7U2NvcGV9IFNjb3BlLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTY29wZShwYXJlbnQsIHN0YXRlbWVudHMsIHJlc2VydmVkTmFtZXMgPSBuZXcgU2V0KCksIHR5cGVQYXJhbWV0ZXJzID0gcGFyZW50Py50eXBlUGFyYW1ldGVycyA/PyBuZXcgU2V0KCksXG4gIGN1cnJlbnRDbGFzcyA9IHBhcmVudD8uY3VycmVudENsYXNzKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgU2V0KHN0YXRlbWVudHMuZmlsdGVyKChzdGF0ZW1lbnQpID0+IHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKVxuICAgIC5tYXAoKHN0YXRlbWVudCkgPT4gLyoqIEB0eXBlIHt7bmFtZTogc3RyaW5nfX0gKi8gKHN0YXRlbWVudCkubmFtZSkpXG5cbiAgcmV0dXJuIHtcbiAgICBiaW5kaW5nczogbmV3IE1hcCgpLFxuICAgIGN1cnJlbnRDbGFzcyxcbiAgICBwYXJlbnQsXG4gICAgcGVuZGluZyxcbiAgICBwcmVzZW5jZVByb29mczogbmV3IFNldChwYXJlbnQ/LnByZXNlbmNlUHJvb2ZzID8/IFtdKSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICB1c2VkTmFtZXM6IHBhcmVudD8udXNlZE5hbWVzID8/IG5ldyBTZXQocmVzZXJ2ZWROYW1lcylcbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW1wbGUtaWRlbnRpZmllciBwcmVzZW5jZSBwcm9vZiB0byBleGFjdGx5IHRoZSBicmFuY2ggd2hlcmUgdGhlIHRlc3QgaXMgdHJ1ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb25kaXRpb24gLSBWYWxpZGF0ZWQgYnJhbmNoIGNvbmRpdGlvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNvdXJjZVNjb3BlIC0gU2NvcGUgY29udGFpbmluZyB0aGUgdGVzdGVkIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSBicmFuY2hTY29wZSAtIEJyYW5jaC1sb2NhbCBwcm9vZiBzY29wZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYnJhbmNoV2hlblRydWUgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIGNvbmRpdGlvbidzIHRydWUgYnJhbmNoLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFwcGx5UHJlc2VuY2VOYXJyb3dpbmcoY29uZGl0aW9uLCBzb3VyY2VTY29wZSwgYnJhbmNoU2NvcGUsIGJyYW5jaFdoZW5UcnVlKSB7XG4gIGxldCB0ZXN0ID0gY29uZGl0aW9uXG4gIGxldCBwcmVzZW50V2hlblRydWUgPSB0cnVlXG5cbiAgaWYgKGNvbmRpdGlvbi5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIgJiYgY29uZGl0aW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5Ob3RcIiAmJlxuICAgIGNvbmRpdGlvbi5vcGVyYW5kLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSB7XG4gICAgdGVzdCA9IGNvbmRpdGlvbi5vcGVyYW5kXG4gICAgcHJlc2VudFdoZW5UcnVlID0gZmFsc2VcbiAgfVxuICBpZiAodGVzdC5raW5kICE9IFwiT3B0aW9uYWxJc1ByZXNlbnRcIikgcmV0dXJuXG4gIGNvbnN0IGJpbmRpbmcgPSBmaW5kQmluZGluZyh0ZXN0Lm9wZXJhbmQubmFtZSwgc291cmNlU2NvcGUpXG5cbiAgaWYgKCFiaW5kaW5nKSByZXR1cm5cbiAgaWYgKGJyYW5jaFdoZW5UcnVlID09IHByZXNlbnRXaGVuVHJ1ZSkgYnJhbmNoU2NvcGUucHJlc2VuY2VQcm9vZnMuYWRkKGJpbmRpbmcpXG4gIGVsc2UgYnJhbmNoU2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG59XG5cbi8qKlxuICogQWRkcyBvbmUgYmluZGluZyB3aGlsZSByZWplY3RpbmcgZHVwbGljYXRlcyBhbmQgc2hhZG93aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBCaW5kaW5nIG5hbWUuXG4gKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgLSBCaW5kaW5nIG1ldGFkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBDdXJyZW50IHNjb3BlLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVCaW5kaW5nKG5hbWUsIGJpbmRpbmcsIGxvY2F0aW9uLCBzY29wZSwgZmFpbCkge1xuICBpZiAoc2NvcGUudXNlZE5hbWVzLmhhcyhuYW1lKSkgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIGBEdXBsaWNhdGUgb3Igc2hhZG93ZWQgYmluZGluZyAnJHtuYW1lfScuYCwgbG9jYXRpb24pXG5cbiAgc2NvcGUuYmluZGluZ3Muc2V0KG5hbWUsIGJpbmRpbmcpXG4gIHNjb3BlLnVzZWROYW1lcy5hZGQobmFtZSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgaWRlbnRpZmllciBhbmQgZGlzdGluZ3Vpc2hlcyB1c2UtYmVmb3JlLWRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBCaW5kaW5nIG5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUmVmZXJlbmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBDdXJyZW50IHNjb3BlLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge0JpbmRpbmd9IEJpbmRpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCaW5kaW5nKG5hbWUsIGxvY2F0aW9uLCBzY29wZSwgZmFpbCkge1xuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGN1cnJlbnQuYmluZGluZ3MuZ2V0KG5hbWUpXG5cbiAgICBpZiAoYmluZGluZykgcmV0dXJuIGJpbmRpbmdcbiAgICBpZiAoY3VycmVudC5wZW5kaW5nLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVU0VfQkVGT1JFX0RFQ0xBUkFUSU9OXCIsIGBCaW5kaW5nICcke25hbWV9JyBpcyB1c2VkIGJlZm9yZSBpdHMgZGVjbGFyYXRpb24uYCwgbG9jYXRpb24pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJVTlJFU09MVkVEX0JJTkRJTkdcIiwgYFVua25vd24gYmluZGluZyAnJHtuYW1lfScuYCwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzZW1hbnRpYyB2YWx1ZSB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2l2ZSB0eXBlIHBhdGguXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSBbcmVjb3Jkc10gLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIFR5cGUtdmFyaWFibGUgaWRlbnRpdGllcyBpbiBkZWNsYXJhdGlvbiBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBWYWxpZGF0ZWQgdmFsdWUgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UodHlwZSwgbG9jYXRpb24sIGZhaWwsIHNlZW4sIHJlY29yZHMgPSBuZXcgTWFwKCksIHR5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCgpKSB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbGlkYXRlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgaWYgKGlzVm9pZFR5cGUoY2FuZGlkYXRlKSkgcmV0dXJuIGZhaWwoXCJWT0lEX0FTX1ZBTFVFXCIsIFwiVm9pZCBpcyB2YWxpZCBvbmx5IGFzIGEgZnVuY3Rpb24gcmV0dXJuIHR5cGUuXCIsIHR5cGVMb2NhdGlvbih0eXBlLCBsb2NhdGlvbikpXG5cbiAgcmV0dXJuIGNhbmRpZGF0ZVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHJldHVybiB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gW3JlY29yZHNdIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFt0eXBlUGFyYW1ldGVyc10gLSBUeXBlLXZhcmlhYmxlIGlkZW50aXRpZXMgaW4gZGVjbGFyYXRpb24gc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gVmFsaWRhdGVkIHJldHVybiB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UodHlwZSwgbG9jYXRpb24sIGZhaWwsIHJlY29yZHMgPSBuZXcgTWFwKCksIHR5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCgpKSB7XG4gIHJldHVybiB2YWxpZGF0ZVR5cGVSZWZlcmVuY2UodHlwZSwgbG9jYXRpb24sIGZhaWwsIG5ldyBTZXQoKSwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSByZWN1cnNpdmUgc2VtYW50aWMgdHlwZS1yZWZlcmVuY2Ugc2hhcGUuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgc2VtYW50aWMgdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3duaW5nIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7U2V0PG9iamVjdD59IFtzZWVuXSAtIEFjdGl2ZSByZWN1cnNpdmUgdHlwZSBwYXRoLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gW3JlY29yZHNdIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFt0eXBlUGFyYW1ldGVyc10gLSBUeXBlLXZhcmlhYmxlIGlkZW50aXRpZXMgaW4gZGVjbGFyYXRpb24gc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gVmFsaWRhdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgc2VlbiA9IG5ldyBTZXQoKSwgcmVjb3JkcyA9IG5ldyBNYXAoKSwgdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KCkpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIHNlbWFudGljIHR5cGUuXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSAqLyAodHlwZSlcblxuICBpZiAoW1wiTGlzdFR5cGVcIiwgXCJNYXBUeXBlXCIsIFwiT3B0aW9uYWxUeXBlXCIsIFwiT3JkZXJlZE1hcFR5cGVcIiwgXCJSZWNvcmRUeXBlXCJdLmluY2x1ZGVzKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgIGNvbnRhaW5zT3duZWRUeXBlKGNhbmRpZGF0ZSkpIHtcbiAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgXCJPd25lZCByZXNvdXJjZXMgYW5kIHJlZmVyZW5jZXMgY2Fubm90IGJlIG5lc3RlZCBpbiB2YWx1ZSBvciBnZW5lcmljIHR5cGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gIH1cblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICBpZiAoIWlzU2NhbGFyVHlwZU5hbWUoY2FuZGlkYXRlLm5hbWUpICYmIGNhbmRpZGF0ZS5uYW1lICE9IFwidm9pZFwiKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIHNjYWxhciBvciB2b2lkIHJldHVybiB0eXBlLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwia2luZCxsb2NhdGlvbixwYXJhbWV0ZXJJZFwiIHx8XG4gICAgICB0eXBlb2YgY2FuZGlkYXRlLnBhcmFtZXRlcklkICE9IFwic3RyaW5nXCIgfHwgIXR5cGVQYXJhbWV0ZXJzLmhhcyhjYW5kaWRhdGUucGFyYW1ldGVySWQpKSB7XG4gICAgICBmYWlsKFwiRlJFRV9UWVBFX1ZBUklBQkxFXCIsIGBGcmVlIG9yIHVua25vd24gdHlwZSB2YXJpYWJsZSAnJHtTdHJpbmcoY2FuZGlkYXRlLnBhcmFtZXRlcklkKX0nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmRzLmdldChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghKFtcImFyZ3VtZW50cyxkZWNsYXJhdGlvbklkLGtpbmRcIiwgXCJkZWNsYXJhdGlvbklkLGtpbmRcIl0uaW5jbHVkZXMoa2V5cykpIHx8XG4gICAgICB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhZGVjbGFyYXRpb24pIHtcbiAgICAgIGZhaWwoXCJVTktOT1dOX1JFQ09SRFwiLCBgVW5rbm93biByZWNvcmQgZGVjbGFyYXRpb24gJyR7U3RyaW5nKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKX0nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgY29uc3QgZXhwZWN0ZWRBcml0eSA9IGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMFxuXG4gICAgaWYgKGV4cGVjdGVkQXJpdHkgPiAwICYmIGNhbmRpZGF0ZS5hcmd1bWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFpbChcIlJBV19HRU5FUklDX0FQUExJQ0FUSU9OXCIsIGBHZW5lcmljIHJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgcmVxdWlyZXMgJHtleHBlY3RlZEFyaXR5fSB0eXBlIGFyZ3VtZW50cy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChleHBlY3RlZEFyaXR5ID09IDAgJiYgY2FuZGlkYXRlLmFyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmYWlsKFwiR0VORVJJQ19BUklUWV9NSVNNQVRDSFwiLCBgTm9uLWdlbmVyaWMgcmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9JyBkb2VzIG5vdCBhY2NlcHQgdHlwZSBhcmd1bWVudHMuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBjYW5kaWRhdGVBcmd1bWVudHMgPSBjYW5kaWRhdGUuYXJndW1lbnRzXG5cbiAgICBpZiAoY2FuZGlkYXRlQXJndW1lbnRzICE9PSB1bmRlZmluZWQgJiYgKCFBcnJheS5pc0FycmF5KGNhbmRpZGF0ZUFyZ3VtZW50cykgfHxcbiAgICAgIGNhbmRpZGF0ZUFyZ3VtZW50cy5zb21lKChfYXJndW1lbnQsIGluZGV4KSA9PiAhT2JqZWN0Lmhhc093bihjYW5kaWRhdGVBcmd1bWVudHMsIGluZGV4KSkpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkdlbmVyaWMgcmVjb3JkIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBhcmd1bWVudHNfID0gY2FuZGlkYXRlLmFyZ3VtZW50cyA/PyBbXVxuXG4gICAgaWYgKGFyZ3VtZW50c18ubGVuZ3RoICE9IGV4cGVjdGVkQXJpdHkpIHtcbiAgICAgIGZhaWwoXCJHRU5FUklDX0FSSVRZX01JU01BVENIXCIsIGBSZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyAke2FyZ3VtZW50c18ubGVuZ3RofSB0eXBlIGFyZ3VtZW50czsgZXhwZWN0ZWQgJHtleHBlY3RlZEFyaXR5fS5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgZ2VuZXJpYyBhcHBsaWNhdGlvbnMgY2Fubm90IGNvbnRhaW4gY3ljbGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIHNlZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGFyZ3VtZW50c18pIHtcbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGFyZ3VtZW50LCB0eXBlTG9jYXRpb24oYXJndW1lbnQsIGxvY2F0aW9uKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG4gICAgfVxuICAgIHNlZW4uZGVsZXRlKGNhbmRpZGF0ZSlcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZGVjbGFyYXRpb25JZCxraW5kXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFjbGFzc2VzLmhhcyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgIGZhaWwoXCJVTktOT1dOX0NMQVNTXCIsIGBVbmtub3duIHJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJJbnRlcmZhY2VUeXBlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgIWludGVyZmFjZXNCeVJlY29yZFJlZ2lzdHJ5LmdldChyZWNvcmRzKT8uaGFzKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgZmFpbChcIlVOS05PV05fSU5URVJGQUNFXCIsIGBVbmtub3duIGludGVyZmFjZSBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwia2luZCxyZXNvdXJjZUlkXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUucmVzb3VyY2VJZCAhPSBcInN0cmluZ1wiIHx8ICFyZXNvdXJjZUlkc0J5UmVjb3JkUmVnaXN0cnkuZ2V0KHJlY29yZHMpPy5oYXMoY2FuZGlkYXRlLnJlc291cmNlSWQpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biBvd25lZCByZXNvdXJjZSAnJHtTdHJpbmcoY2FuZGlkYXRlLnJlc291cmNlSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZGVjbGFyYXRpb25JZCxraW5kXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8IGNsYXNzZXMuZ2V0KGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKT8ub3duZXJzaGlwPy5raW5kICE9IFwib3duZWRSZXNvdXJjZVwiKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biBvd25lZCByZWZlcmVuY2UgJyR7U3RyaW5nKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKX0nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICBpZiAoc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjdXJzaXZlIGNvbGxlY3Rpb24gdHlwZXMgY2Fubm90IGNvbnRhaW4gY3ljbGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoY2FuZGlkYXRlLmVsZW1lbnRUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJlbGVtZW50VHlwZVwiKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgICBzZWVuLmRlbGV0ZShjYW5kaWRhdGUpXG5cbiAgICBpZiAoY2FuZGlkYXRlLmVsZW1lbnRUeXBlICE9PSBlbGVtZW50VHlwZSkgY2FuZGlkYXRlLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgY2FuZGlkYXRlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRGaWVsZHMgPSBjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBcImtleVR5cGUsa2luZCxvcmRlcix2YWx1ZVR5cGVcIiA6IFwia2V5VHlwZSxraW5kLHZhbHVlVHlwZVwiXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gZXhwZWN0ZWRGaWVsZHMpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFsZm9ybWVkICR7Y2FuZGlkYXRlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gXCJvcmRlcmVkIG1hcFwiIDogXCJtYXBcIn0gdHlwZS5gLFxuICAgICAgICB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgJiYgY2FuZGlkYXRlLm9yZGVyICE9IFwiaW5zZXJ0aW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk9yZGVyZWQgbWFwIHR5cGUgcmVxdWlyZXMgaW5zZXJ0aW9uIG9yZGVyLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgY29sbGVjdGlvbiB0eXBlcyBjYW5ub3QgY29udGFpbiBjeWNsZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICBzZWVuLmFkZChjYW5kaWRhdGUpXG4gICAgY29uc3Qga2V5VHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGNhbmRpZGF0ZS5rZXlUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJrZXlUeXBlXCIpLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICAgIGlmICghaXNTY2FsYXJUeXBlKGtleVR5cGUsIFwic3RyaW5nXCIpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGtleSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGtleVR5cGUpfTsgZXhwZWN0ZWQgc3RyaW5nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUua2V5VHlwZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShjYW5kaWRhdGUudmFsdWVUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJ2YWx1ZVR5cGVcIiksIGZhaWwsIHNlZW4sIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgc2Vlbi5kZWxldGUoY2FuZGlkYXRlKVxuXG4gICAgaWYgKGNhbmRpZGF0ZS5rZXlUeXBlICE9PSBrZXlUeXBlKSBjYW5kaWRhdGUua2V5VHlwZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5UeXBlUmVmZXJlbmNlfSAqLyAoa2V5VHlwZSlcbiAgICBpZiAoY2FuZGlkYXRlLnZhbHVlVHlwZSAhPT0gdmFsdWVUeXBlKSBjYW5kaWRhdGUudmFsdWVUeXBlID0gdmFsdWVUeXBlXG5cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJraW5kLHZhbHVlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgb3B0aW9uYWwgdHlwZS5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjdXJzaXZlIG9wdGlvbmFsIHR5cGVzIGNhbm5vdCBjb250YWluIGN5Y2xlcy5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIHNlZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShjYW5kaWRhdGUudmFsdWVUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJ2YWx1ZVR5cGVcIiksIGZhaWwsIHNlZW4sIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgc2Vlbi5kZWxldGUoY2FuZGlkYXRlKVxuICAgIGlmICh2YWx1ZVR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBmYWlsKFwiSU5WQUxJRF9PUFRJT05BTF9DT05TVElUVUVOVFwiLCBcIk9wdGlvbmFsIHZhbHVlcyBjYW5ub3QgZGlyZWN0bHkgY29udGFpbiBhbm90aGVyIG9wdGlvbmFsLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJ2YWx1ZVR5cGVcIikpXG4gICAgfVxuICAgIGlmIChjYW5kaWRhdGUudmFsdWVUeXBlICE9PSB2YWx1ZVR5cGUpIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPSB2YWx1ZVR5cGVcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuXG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIHNlbWFudGljIHR5cGUuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZS1jbGFzcyByZWdpc3RyeSBhdHRhY2hlZCB0byB0aGUgcmVjb3JkIHZhbGlkYXRpb24gY29udGV4dC5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgdmFsaWRhdGlvbiByZWdpc3RyeS5cbiAqIEByZXR1cm5zIHtDbGFzc1JlZ2lzdHJ5fSBSZWZlcmVuY2UgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKSB7XG4gIHJldHVybiByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeS5nZXQocmVjb3JkcykgPz8gbmV3IE1hcCgpXG59XG5cbi8qKlxuICogSW5mZXJzIGEgdmFsdWUgZXhwcmVzc2lvbiBhbmQgcmVqZWN0cyB0aGUgbm9uLXZhbHVlIHJlc3VsdCBvZiBhIHZvaWQgY2FsbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byBub3JtYWxpemUgZnJvbnRlbmQgaW50ZW50IGFuZCBjYWxsIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dCAtIFZhbHVlIGNvbnRleHQgZm9yIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBbZXhwZWN0ZWRUeXBlXSAtIENvbnRleHR1YWwgY29sbGVjdGlvbiB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNdIC0gV2hldGhlciBhIGdlbmVyaWMtY2FsbCBldmlkZW5jZSBwYXNzIG1heSBpbmZlciBub25lbXB0eSBjb2xsZWN0aW9uIGxpdGVyYWxzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IEV4cHJlc3Npb24gdmFsdWUgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGNvbnRleHQsIGV4cGVjdGVkVHlwZSxcbiAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMgPSBmYWxzZSkge1xuICBjb25zdCBhbGxvd093bmVkQm9ycm93ID0gY29udGV4dCA9PSBcImFuIGVmZmVjdCBhcmd1bWVudFwiIHx8IGNvbnRleHQgPT0gXCJhIG1ldGhvZCByZWNlaXZlclwiXG4gIGNvbnN0IHR5cGUgPSBpbmZlckV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGV4cGVjdGVkVHlwZSxcbiAgICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cywgYWxsb3dPd25lZEJvcnJvdylcblxuICBpZiAodHlwZSA9PSBcInZvaWRcIikgcmV0dXJuIGZhaWwoXCJWT0lEX0FTX1ZBTFVFXCIsIGBWb2lkIGNhbGwgY2Fubm90IGJlIHVzZWQgYXMgJHtjb250ZXh0fS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICBpZiAodHlwZS5raW5kID09IFwiRXJyb3JUeXBlXCIpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgRXJyb3IgdmFsdWUgY2Fubm90IGJlIHVzZWQgYXMgJHtjb250ZXh0fS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuXG4gIHJldHVybiB0eXBlXG59XG5cbi8qKlxuICogSW5mZXJzIGFuZCB2YWxpZGF0ZXMgb25lIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFNlbWFudGljIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgbGV4aWNhbCBzY29wZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gcmVwbGFjZSB0cmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uIGludGVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gW2V4cGVjdGVkVHlwZV0gLSBDb250ZXh0dWFsIGNvbGxlY3Rpb24gdHlwZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZmVyQ29sbGVjdGlvbkVsZW1lbnRzXSAtIFdoZXRoZXIgYSBnZW5lcmljLWNhbGwgZXZpZGVuY2UgcGFzcyBtYXkgaW5mZXIgbm9uZW1wdHkgY29sbGVjdGlvbiBsaXRlcmFscy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93T3duZWRCb3Jyb3ddIC0gV2hldGhlciB0aGlzIGV4YWN0IGNhbGwgcG9zaXRpb24gYWRtaXRzIGFuIGltbWVkaWF0ZSBib3Jyb3cuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmRpbmdUeXBlIHwgXCJ2b2lkXCJ9IEV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBleHBlY3RlZFR5cGUsXG4gIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzID0gZmFsc2UsIGFsbG93T3duZWRCb3Jyb3cgPSBmYWxzZSkge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ubmFtZSwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpLnR5cGVcblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAoIXNjb3BlLmN1cnJlbnRDbGFzcyB8fCBleHByZXNzaW9uLmNsYXNzSWQgIT0gc2NvcGUuY3VycmVudENsYXNzLmlkKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklMTEVHQUxfUFJJVkFURV9BQ0NFU1NcIiwgXCJSZWNlaXZlciBleHByZXNzaW9uIGlzIHZhbGlkIG9ubHkgaW5zaWRlIGl0cyBkZWNsYXJpbmcgY2xhc3MuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHNjb3BlLmN1cnJlbnRDbGFzcy5pZCksIGtpbmQ6IFwiUmVmZXJlbmNlVHlwZVwifVxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gc2NvcGUuY3VycmVudENsYXNzXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uIHx8ICFleHByZXNzaW9uLnJlY2VpdmVyIHx8IGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCAhPSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiIHx8XG4gICAgICBleHByZXNzaW9uLnJlY2VpdmVyLmNsYXNzSWQgIT0gZGVjbGFyYXRpb24uaWQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlByaXZhdGUgZmllbGQgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgZGVjbGFyaW5nIGNsYXNzIHJlY2VpdmVyLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLmZpZWxkKVxuXG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCBpZGVudGl0eSBpcyBub3Qgb3duZWQgYnkgdGhlIGRlY2xhcmluZyBjbGFzcy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcblxuICAgIHJldHVybiBmaWVsZC50eXBlXG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAoIWFsbG93T3duZWRCb3Jyb3cpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiQk9SUk9XX0VTQ0FQRVwiLCBcIkJPUlJPV19FU0NBUEU6IE93bmVkIGJvcnJvd3MgYXJlIHZhbGlkIG9ubHkgYXMgaW1tZWRpYXRlIGNhcGFiaWxpdHkgYXJndW1lbnRzIG9yIG1ldGhvZCByZWNlaXZlcnMuXCIsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLm1vZGUgIT0gXCJzaGFyZWRcIiAmJiBleHByZXNzaW9uLm1vZGUgIT0gXCJleGNsdXNpdmVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XOiBPd25lZCBib3Jyb3cgbW9kZSBtdXN0IGJlIHNoYXJlZCBvciBleGNsdXNpdmUuXCIsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGJvcnJvd2VkID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvd25lZCBib3Jyb3dcIilcblxuICAgIGlmIChib3Jyb3dlZC5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBib3Jyb3dlZC5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgXCJCb3Jyb3dlZCBleHByZXNzaW9uIG11c3QgYmUgYW4gb3duZWQgcmVzb3VyY2Ugb3Igb3duZWQgcmVmZXJlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIXNhbWVUeXBlKGJvcnJvd2VkLCBleHByZXNzaW9uLnR5cGUpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBcIkJvcnJvdyBtZXRhZGF0YSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVzb3VyY2UgcGxhY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBib3Jyb3dlZFxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IG1vdmVkID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvd25lZCBtb3ZlXCIpXG5cbiAgICBpZiAobW92ZWQua2luZCAhPSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgJiYgbW92ZWQua2luZCAhPSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfVFJBTlNGRVJcIiwgXCJNb3ZlZCBleHByZXNzaW9uIG11c3QgYmUgYW4gb3duZWQgcmVzb3VyY2Ugb3Igb3duZWQgcmVmZXJlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIXNhbWVUeXBlKG1vdmVkLCBleHByZXNzaW9uLnR5cGUpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBcIk1vdmUgbWV0YWRhdGEgZG9lcyBub3QgbWF0Y2ggaXRzIHJlc291cmNlIHBsYWNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gbW92ZWRcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJFcnJvck1lc3NhZ2VSZWFkXCIpIHtcbiAgICBpZiAoIWV4cHJlc3Npb24ucmVjZWl2ZXIgfHwgZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FTUJFUl9SRUNFSVZFUlwiLCBcIkVycm9yIG1lc3NhZ2UgcmVjZWl2ZXIgbXVzdCBiZSBvbmUgY2F0Y2ggYmluZGluZy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXIgPSByZXNvbHZlQmluZGluZyhleHByZXNzaW9uLnJlY2VpdmVyLm5hbWUsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24sIHNjb3BlLCBmYWlsKVxuXG4gICAgaWYgKHJlY2VpdmVyLnR5cGUua2luZCAhPSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfTUVNQkVSX1JFQ0VJVkVSXCIsIFwiTWVzc2FnZSBtZW1iZXIgcmVxdWlyZXMgYSB0eXBlZCBlcnJvciBjYXRjaCBiaW5kaW5nLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoZXhwcmVzc2lvbi52YWx1ZSkpIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTm9uLXNhZmUgaW50ZWdlciBsaXRlcmFsLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwiaW50ZWdlclwiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSB7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0LmdldChleHByZXNzaW9uLCBcInZhbHVlXCIpICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkludmFsaWQgYm9vbGVhbiBsaXRlcmFsIHZhbHVlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImJvb2xlYW5cIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiKSB7XG4gICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldChleHByZXNzaW9uLCBcInZhbHVlXCIpXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIgfHwgIWhhc09ubHlVbmljb2RlU2NhbGFycyh2YWx1ZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiSW52YWxpZCBVbmljb2RlIHN0cmluZyBsaXRlcmFsLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcInN0cmluZ1wiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbE5vbmVcIikge1xuICAgIGlmICghZXhwZWN0ZWRUeXBlIHx8IGV4cGVjdGVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiT3B0aW9uYWwgYWJzZW5jZSByZXF1aXJlcyBhbiBleHBsaWNpdCBvcHRpb25hbCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RlZFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxTb21lXCIpIHtcbiAgICBpZiAoIWV4cGVjdGVkVHlwZSB8fCBleHBlY3RlZFR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIGV4cHJlc3Npb24udmFsdWUsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gb3B0aW9uYWwgcHJlc2VudCB2YWx1ZVwiXG4gICAgICApXG5cbiAgICAgIGlmICh2YWx1ZVR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUFRJT05BTF9DT05TVElUVUVOVFwiLCBcIk9wdGlvbmFsIHZhbHVlcyBjYW5ub3QgZGlyZWN0bHkgY29udGFpbiBhbm90aGVyIG9wdGlvbmFsLlwiLCBleHByZXNzaW9uLnZhbHVlLmxvY2F0aW9uKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZX1cbiAgICB9XG4gICAgY29uc3QgdmFsdWVUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgZXhwcmVzc2lvbi52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvcHRpb25hbCBwcmVzZW50IHZhbHVlXCIsIGV4cGVjdGVkVHlwZS52YWx1ZVR5cGVcbiAgICApXG5cbiAgICBpZiAoIWFzc2lnbmFibGVUeXBlKHZhbHVlVHlwZSwgZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSwgcmVjb3JkcykpIHtcbiAgICAgIGZhaWwobm9taW5hbE1pc21hdGNoQ29kZShleHBlY3RlZFR5cGUudmFsdWVUeXBlKSwgYE9wdGlvbmFsIHByZXNlbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbih2YWx1ZVR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSl9LmAsIGV4cHJlc3Npb24udmFsdWUubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSB7XG4gICAgaWYgKCFleHByZXNzaW9uLm9wZXJhbmQgfHwgZXhwcmVzc2lvbi5vcGVyYW5kLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJPcHRpb25hbCBwcmVzZW5jZSB0ZXN0IHJlcXVpcmVzIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFR5cGUgPSByZXNvbHZlQmluZGluZyhleHByZXNzaW9uLm9wZXJhbmQubmFtZSwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBzY29wZSwgZmFpbCkudHlwZVxuXG4gICAgaWYgKG9wZXJhbmRUeXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBQcmVzZW5jZSB0ZXN0IHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKG9wZXJhbmRUeXBlKX07IGV4cGVjdGVkIG9wdGlvbmFsLmAsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImJvb2xlYW5cIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxVbndyYXBcIikge1xuICAgIGlmICghZXhwcmVzc2lvbi5vcGVyYW5kIHx8IGV4cHJlc3Npb24ub3BlcmFuZC5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3B0aW9uYWwgdW53cmFwIHJlcXVpcmVzIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgYmluZGluZyA9IHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ub3BlcmFuZC5uYW1lLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24sIHNjb3BlLCBmYWlsKVxuXG4gICAgaWYgKGJpbmRpbmcudHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgT3B0aW9uYWwgdW53cmFwIHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKGJpbmRpbmcudHlwZSl9OyBleHBlY3RlZCBvcHRpb25hbC5gLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2NvcGUucHJlc2VuY2VQcm9vZnMuaGFzKGJpbmRpbmcpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOQ0hFQ0tFRF9PUFRJT05BTF9VTldSQVBcIiwgYE9wdGlvbmFsIGJpbmRpbmcgJyR7ZXhwcmVzc2lvbi5vcGVyYW5kLm5hbWV9JyBpcyBub3QgcHJvdmVuIHByZXNlbnQuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gYmluZGluZy50eXBlLnZhbHVlVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0TGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJMaXN0IGxpdGVyYWwgZWxlbWVudHMgbXVzdCBiZSBhIGRlbnNlIHNvdXJjZS1vcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoKCFleHBlY3RlZFR5cGUgfHwgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSAmJlxuICAgICAgKCFpbmZlckNvbGxlY3Rpb25FbGVtZW50cyB8fCBleHByZXNzaW9uLmVsZW1lbnRzLmxlbmd0aCA9PSAwKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJMaXN0IGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIGxpc3QgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBpbmZlcnJlZEVsZW1lbnRUeXBlXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZXhwcmVzc2lvbi5lbGVtZW50cywgaW5kZXgpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiU3BhcnNlIGxpc3QgbGl0ZXJhbHMgYXJlIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHN1YnNldC5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBleHByZXNzaW9uLmVsZW1lbnRzW2luZGV4XVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBlbGVtZW50LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbGlzdCBlbGVtZW50XCIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIkxpc3RUeXBlXCIgPyBleHBlY3RlZFR5cGUuZWxlbWVudFR5cGUgOiBpbmZlcnJlZEVsZW1lbnRUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuXG4gICAgICBpbmZlcnJlZEVsZW1lbnRUeXBlID8/PSBhY3R1YWxcbiAgICAgIGNvbnN0IHJlcXVpcmVkRWxlbWVudFR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiID8gZXhwZWN0ZWRUeXBlLmVsZW1lbnRUeXBlIDogaW5mZXJyZWRFbGVtZW50VHlwZVxuXG4gICAgICBpZiAoIWFzc2lnbmFibGVUeXBlKGFjdHVhbCwgcmVxdWlyZWRFbGVtZW50VHlwZSwgcmVjb3JkcykpIHtcbiAgICAgICAgZmFpbChub21pbmFsTWlzbWF0Y2hDb2RlKHJlcXVpcmVkRWxlbWVudFR5cGUpLCBgTGlzdCBlbGVtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHJlcXVpcmVkRWxlbWVudFR5cGUpfS5gLCBlbGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiXG4gICAgICA/IGV4cGVjdGVkVHlwZVxuICAgICAgOiB7ZWxlbWVudFR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKGluZmVycmVkRWxlbWVudFR5cGUpLCBraW5kOiBcIkxpc3RUeXBlXCJ9XG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExpdGVyYWxcIikge1xuICAgIGlmIChleHBlY3RlZFR5cGUgJiYgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJNYXBUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGxpdGVyYWwgY29udGV4dCAke3R5cGVEZXNjcmlwdGlvbihleHBlY3RlZFR5cGUpfTsgZXhwZWN0ZWQgbWFwLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghZXhwZWN0ZWRUeXBlICYmICFpbmZlckNvbGxlY3Rpb25FbGVtZW50cykge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJNYXAgbGl0ZXJhbCByZXF1aXJlcyBhbiBleHBsaWNpdCByZWN1cnNpdmUgbWFwIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgJiYgIWlzU2NhbGFyVHlwZShleHBlY3RlZFR5cGUua2V5VHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBrZXkgdHlwZSBtdXN0IGJlIHN0cmluZy5cIiwgdHlwZUxvY2F0aW9uKGV4cGVjdGVkVHlwZS5rZXlUeXBlLCBleHByZXNzaW9uLmxvY2F0aW9uKSlcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IHZhbGlkYXRlTWFwTGl0ZXJhbEVudHJpZXMoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgICAgIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzKVxuXG4gICAgaWYgKCFleHBlY3RlZFR5cGUgJiYgZW50cmllcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJFbXB0eSBtYXAgbGl0ZXJhbCByZXF1aXJlcyBhbiBleHBsaWNpdCByZWN1cnNpdmUgbWFwIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgaW5mZXJyZWRWYWx1ZVR5cGVcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBlbnRyeS52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIG1hcCB2YWx1ZVwiLFxuICAgICAgICBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUudmFsdWVUeXBlIDogaW5mZXJyZWRWYWx1ZVR5cGUsIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzXG4gICAgICApXG4gICAgICBpbmZlcnJlZFZhbHVlVHlwZSA/Pz0gYWN0dWFsXG4gICAgICBjb25zdCByZXF1aXJlZFZhbHVlVHlwZSA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZS52YWx1ZVR5cGUgOiBpbmZlcnJlZFZhbHVlVHlwZVxuXG4gICAgICBpZiAoIWFzc2lnbmFibGVUeXBlKGFjdHVhbCwgcmVxdWlyZWRWYWx1ZVR5cGUsIHJlY29yZHMpKSB7XG4gICAgICAgIGZhaWwobm9taW5hbE1pc21hdGNoQ29kZShyZXF1aXJlZFZhbHVlVHlwZSksIGBNYXAgdmFsdWUgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocmVxdWlyZWRWYWx1ZVR5cGUpfS5gLCBlbnRyeS52YWx1ZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlIDoge1xuICAgICAga2V5VHlwZTogc2NhbGFyVHlwZShcInN0cmluZ1wiKSxcbiAgICAgIGtpbmQ6IFwiTWFwVHlwZVwiLFxuICAgICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChpbmZlcnJlZFZhbHVlVHlwZSlcbiAgICB9XG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9yZGVyZWRNYXBMaXRlcmFsXCIpIHtcbiAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBPcmRlcmVkLW1hcCBsaXRlcmFsIGNvbnRleHQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlKX07IGV4cGVjdGVkIG9yZGVyZWQgbWFwLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghZXhwZWN0ZWRUeXBlICYmICFpbmZlckNvbGxlY3Rpb25FbGVtZW50cykge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJPcmRlcmVkLW1hcCBsaXRlcmFsIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHJlY3Vyc2l2ZSBvcmRlcmVkLW1hcCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJiAhaXNTY2FsYXJUeXBlKGV4cGVjdGVkVHlwZS5rZXlUeXBlLCBcInN0cmluZ1wiKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3JkZXJlZC1tYXAga2V5IHR5cGUgbXVzdCBiZSBzdHJpbmcuXCIsIHR5cGVMb2NhdGlvbihleHBlY3RlZFR5cGUua2V5VHlwZSwgZXhwcmVzc2lvbi5sb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXMgPSB2YWxpZGF0ZU1hcExpdGVyYWxFbnRyaWVzKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cylcblxuICAgIGlmICghZXhwZWN0ZWRUeXBlICYmIGVudHJpZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiRW1wdHkgb3JkZXJlZC1tYXAgbGl0ZXJhbCByZXF1aXJlcyBhbiBleHBsaWNpdCByZWN1cnNpdmUgb3JkZXJlZC1tYXAgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBpbmZlcnJlZFZhbHVlVHlwZVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIGVudHJ5LnZhbHVlLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG9yZGVyZWQtbWFwIHZhbHVlXCIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUudmFsdWVUeXBlIDogaW5mZXJyZWRWYWx1ZVR5cGUsIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzXG4gICAgICApXG4gICAgICBpbmZlcnJlZFZhbHVlVHlwZSA/Pz0gYWN0dWFsXG4gICAgICBjb25zdCByZXF1aXJlZFZhbHVlVHlwZSA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUudmFsdWVUeXBlIDogaW5mZXJyZWRWYWx1ZVR5cGVcblxuICAgICAgaWYgKCFhc3NpZ25hYmxlVHlwZShhY3R1YWwsIHJlcXVpcmVkVmFsdWVUeXBlLCByZWNvcmRzKSkge1xuICAgICAgICBmYWlsKG5vbWluYWxNaXNtYXRjaENvZGUocmVxdWlyZWRWYWx1ZVR5cGUpLCBgT3JkZXJlZC1tYXAgdmFsdWUgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocmVxdWlyZWRWYWx1ZVR5cGUpfS5gLFxuICAgICAgICAgIGVudHJ5LnZhbHVlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlIDoge1xuICAgICAga2V5VHlwZTogc2NhbGFyVHlwZShcInN0cmluZ1wiKSxcbiAgICAgIGtpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIixcbiAgICAgIG9yZGVyOiBcImluc2VydGlvblwiLFxuICAgICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChpbmZlcnJlZFZhbHVlVHlwZSlcbiAgICB9XG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkxpc3RJbmRleEV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGxpc3QgcmVjZWl2ZXJcIilcbiAgICBjb25zdCBpbmRleFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5pbmRleCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGxpc3QgaW5kZXhcIiwgc2NhbGFyVHlwZShcImludGVnZXJcIikpXG5cbiAgICBpZiAoY29sbGVjdGlvblR5cGUua2luZCAhPSBcIkxpc3RUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTGlzdCBpbmRleCByZWNlaXZlciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGNvbGxlY3Rpb25UeXBlKX07IGV4cGVjdGVkIGxpc3QuYCwgZXhwcmVzc2lvbi5jb2xsZWN0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWlzU2NhbGFyVHlwZShpbmRleFR5cGUsIFwiaW50ZWdlclwiKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYExpc3QgaW5kZXggdHlwZSAke3R5cGVEZXNjcmlwdGlvbihpbmRleFR5cGUpfTsgZXhwZWN0ZWQgaW50ZWdlci5gLCBleHByZXNzaW9uLmluZGV4LmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBrbm93bkNvbGxlY3Rpb24gPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlKVxuICAgIGNvbnN0IGtub3duSW5kZXggPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLmluZGV4LCBzY29wZSlcblxuICAgIGlmIChrbm93bkNvbGxlY3Rpb24/LmtpbmQgPT0gXCJMaXN0TGl0ZXJhbFwiICYmIGtub3duSW5kZXg/LmtpbmQgPT0gXCJJbnRlZ2VyTGl0ZXJhbFwiICYmXG4gICAgICAoa25vd25JbmRleC52YWx1ZSA8IDAgfHwga25vd25JbmRleC52YWx1ZSA+PSBrbm93bkNvbGxlY3Rpb24uZWxlbWVudHMubGVuZ3RoKSkge1xuICAgICAgZmFpbChcIklOREVYX09VVF9PRl9CT1VORFNcIiwgYExpc3QgaW5kZXggJHtrbm93bkluZGV4LnZhbHVlfSBpcyBvdXRzaWRlIGEgbGl0ZXJhbCBsaXN0IG9mIHNpemUgJHtrbm93bkNvbGxlY3Rpb24uZWxlbWVudHMubGVuZ3RofS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBwcm92ZW4gPSBwcm92ZW5MaXN0RWxlbWVudChleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlKVxuXG4gICAgdmFsaWRhdGVBY2Nlc3NUb3RhbGl0eShleHByZXNzaW9uLCBwcm92ZW4gIT09IHVuZGVmaW5lZCwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcblxuICAgIHJldHVybiBjb2xsZWN0aW9uVHlwZS5lbGVtZW50VHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMb29rdXBFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtYXAgcmVjZWl2ZXJcIilcbiAgICBjb25zdCBrZXlUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ua2V5LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWFwIGtleVwiLCBzY2FsYXJUeXBlKFwic3RyaW5nXCIpKVxuXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJNYXBUeXBlXCIgJiYgY29sbGVjdGlvblR5cGUua2luZCAhPSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGxvb2t1cCByZWNlaXZlciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGNvbGxlY3Rpb25UeXBlKX07IGV4cGVjdGVkIG1hcC5gLCBleHByZXNzaW9uLmNvbGxlY3Rpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghaXNTY2FsYXJUeXBlKGtleVR5cGUsIFwic3RyaW5nXCIpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGxvb2t1cCBrZXkgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihrZXlUeXBlKX07IGV4cGVjdGVkIHN0cmluZy5gLCBleHByZXNzaW9uLmtleS5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qga25vd25Db2xsZWN0aW9uID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSlcbiAgICBjb25zdCBrbm93bktleSA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGV4cHJlc3Npb24ua2V5LCBzY29wZSlcblxuICAgIGlmICgoa25vd25Db2xsZWN0aW9uPy5raW5kID09IFwiTWFwTGl0ZXJhbFwiIHx8IGtub3duQ29sbGVjdGlvbj8ua2luZCA9PSBcIk9yZGVyZWRNYXBMaXRlcmFsXCIpICYmXG4gICAgICBrbm93bktleT8ua2luZCA9PSBcIlN0cmluZ0xpdGVyYWxcIiAmJlxuICAgICAgIWtub3duQ29sbGVjdGlvbi5lbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5rZXkudmFsdWUgPT0ga25vd25LZXkudmFsdWUpKSB7XG4gICAgICBmYWlsKFwiTUlTU0lOR19NQVBfS0VZXCIsIGBNYXAga2V5ICcke2tub3duS2V5LnZhbHVlfScgaXMgYWJzZW50IGZyb20gdGhlIGxpdGVyYWwgaW5pdGlhbGl6ZXIuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcHJvdmVuID0gcHJvdmVuTWFwVmFsdWUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmtleSwgc2NvcGUpXG5cbiAgICB2YWxpZGF0ZUFjY2Vzc1RvdGFsaXR5KGV4cHJlc3Npb24sIHByb3ZlbiAhPT0gdW5kZWZpbmVkLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuXG4gICAgcmV0dXJuIGNvbGxlY3Rpb25UeXBlLnZhbHVlVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbGxlY3Rpb24tc2l6ZSByZWNlaXZlclwiKVxuXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiICYmIGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJNYXBUeXBlXCIgJiYgY29sbGVjdGlvblR5cGUua2luZCAhPSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ29sbGVjdGlvbiBzaXplIHJlY2VpdmVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29sbGVjdGlvblR5cGUpfTsgZXhwZWN0ZWQgbGlzdCBvciBtYXAuYCwgZXhwcmVzc2lvbi5jb2xsZWN0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0aW9uS2luZCA9IGNvbGxlY3Rpb25UeXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiID8gXCJsaXN0XCIgOiBcIm1hcFwiXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykge1xuICAgICAgaWYgKGV4cHJlc3Npb24uY29sbGVjdGlvbktpbmQgIT09IHVuZGVmaW5lZCAmJiBleHByZXNzaW9uLmNvbGxlY3Rpb25LaW5kICE9IGNvbGxlY3Rpb25LaW5kKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ29sbGVjdGlvbiBzaXplIG9wZXJhdGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgcmVjZWl2ZXIgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGV4cHJlc3Npb24uY29sbGVjdGlvbktpbmQgPSBjb2xsZWN0aW9uS2luZFxuICAgIH1cbiAgICBlbHNlIGlmIChleHByZXNzaW9uLmNvbGxlY3Rpb25LaW5kICE9IGNvbGxlY3Rpb25LaW5kKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNvbGxlY3Rpb24gc2l6ZSBraW5kIGRvZXMgbm90IG1hdGNoIGl0cyByZWNlaXZlciB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwiaW50ZWdlclwiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uYXJndW1lbnRzKSB8fCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnBhcmFtZXRlclR5cGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiRWZmZWN0IGNhbGwgYXJndW1lbnQgY291bnQgZG9lcyBub3QgbWF0Y2ggaXRzIGF1dGhvcml6ZWQgb3BlcmF0aW9uLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCByZXNvdXJjZUZsb3cgPSBleHByZXNzaW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93XG5cbiAgICBpZiAocmVzb3VyY2VGbG93LmtpbmQgPT0gXCJib3Jyb3dcIiB8fCByZXNvdXJjZUZsb3cua2luZCA9PSBcImNsb3NlXCIpIHtcbiAgICAgIGNvbnN0IGJvcnJvdyA9IGV4cHJlc3Npb24uYXJndW1lbnRzW3Jlc291cmNlRmxvdy5wYXJhbWV0ZXJJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkTW9kZSA9IHJlc291cmNlRmxvdy5raW5kID09IFwiY2xvc2VcIiA/IFwiZXhjbHVzaXZlXCIgOiBcInNoYXJlZFwiXG5cbiAgICAgIGlmIChib3Jyb3c/LmtpbmQgIT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIiB8fCBib3Jyb3cubW9kZSAhPSBleHBlY3RlZE1vZGUpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIGBJTlZBTElEX1JFU09VUkNFX0JPUlJPVzogJHtyZXNvdXJjZUZsb3cua2luZH0gcmVxdWlyZXMgYW4gaW1tZWRpYXRlICR7ZXhwZWN0ZWRNb2RlfSBib3Jyb3cuYCxcbiAgICAgICAgICBib3Jyb3c/LmxvY2F0aW9uID8/IGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gaWRlbnRpdHlBc1ZhbHVlVHlwZShleHByZXNzaW9uLnJlc29sdXRpb24ucGFyYW1ldGVyVHlwZXNbaW5kZXhdLCBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0ubG9jYXRpb24sIGZhaWwpXG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgICBcImFuIGVmZmVjdCBhcmd1bWVudFwiLCBleHBlY3RlZClcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIGV4cGVjdGVkKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgRWZmZWN0IGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkKX0uYCxcbiAgICAgICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLnJlc29sdXRpb24ucmV0dXJuVHlwZSA9PSBcInZvaWRcIikgcmV0dXJuIFwidm9pZFwiXG4gICAgcmV0dXJuIGlkZW50aXR5QXNWYWx1ZVR5cGUoZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJldHVyblR5cGUsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlJlZmVyZW5jZUNvbnN0cnVjdGlvblwiKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGV4cHJlc3Npb24ucmVmZXJlbmNlLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsXG4gICAgICBzY29wZS50eXBlUGFyYW1ldGVycylcblxuICAgIGlmIChyZWZlcmVuY2VUeXBlLmtpbmQgIT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgcmVmZXJlbmNlVHlwZS5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlZmVyZW5jZSBjb25zdHJ1Y3Rpb24gcmVxdWlyZXMgYSBub21pbmFsIHJlZmVyZW5jZSBjbGFzcyB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUNsYXNzZXNGb3IocmVjb3JkcykuZ2V0KHJlZmVyZW5jZVR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBmYWlsKFwiVU5LTk9XTl9DTEFTU1wiLCBgVW5rbm93biByZWZlcmVuY2UgY2xhc3MgJyR7cmVmZXJlbmNlVHlwZS5kZWNsYXJhdGlvbklkfScuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAoIWlzRGVuc2VBcnJheShleHByZXNzaW9uLmFyZ3VtZW50cykpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNvbnN0cnVjdG9yIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJDT05TVFJVQ1RPUl9BUklUWV9NSVNNQVRDSFwiLFxuICAgICAgICBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBoYXMgJHtleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGh9IGFyZ3VtZW50czsgZXhwZWN0ZWQgJHtkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aH0uYCxcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKSlcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSA9IG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHBhcmFtZXRlclR5cGVzW2luZGV4XSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb25zdHJ1Y3RvciBhcmd1bWVudFwiLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0pXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0pKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDb25zdHJ1Y3RvciBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihwYXJhbWV0ZXJUeXBlc1tpbmRleF0pfS5gLFxuICAgICAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzb2x1dGlvbiA9IHtcbiAgICAgIGRlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQpLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVwiKSxcbiAgICAgIHBhcmFtZXRlclR5cGVzOiBwYXJhbWV0ZXJUeXBlcy5tYXAoKHR5cGUpID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlKSkpXG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24ucmVzb2x1dGlvbiA9IHJlc29sdXRpb25cbiAgICBlbHNlIHZhbGlkYXRlUmVmZXJlbmNlUmVzb2x1dGlvbihleHByZXNzaW9uLnJlc29sdXRpb24sIHJlc29sdXRpb24sIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwsIFwiY29uc3RydWN0b3JcIilcblxuICAgIHJldHVybiByZWZlcmVuY2VUeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCByZWNlaXZlclR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5yZWNlaXZlciwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZXRob2QgcmVjZWl2ZXJcIilcblxuICAgIGlmIChyZWNlaXZlclR5cGUua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIikge1xuICAgICAgY29uc3QgaW50ZXJmYWNlcyA9IGludGVyZmFjZXNCeVJlY29yZFJlZ2lzdHJ5LmdldChyZWNvcmRzKSA/PyBuZXcgTWFwKClcbiAgICAgIGNvbnN0IHJlY2VpdmVySW50ZXJmYWNlID0gaW50ZXJmYWNlcy5nZXQocmVjZWl2ZXJUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICAgIGlmICghcmVjZWl2ZXJJbnRlcmZhY2UpIHJldHVybiBmYWlsKFwiVU5LTk9XTl9JTlRFUkZBQ0VcIiwgYFVua25vd24gaW50ZXJmYWNlICcke3JlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkfScuYCwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICAgIGNvbnN0IG1lbWJlcnMgPSBmbGF0dGVuZWRJbnRlcmZhY2VNZW1iZXJzKHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkLCBpbnRlcmZhY2VzLCBmYWlsLCBuZXcgU2V0KCksIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgICBjb25zdCBtZW1iZXIgPSBtZW1iZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm1ldGhvZElkID09IGV4cHJlc3Npb24ubWV0aG9kKSA/P1xuICAgICAgICAobm9ybWFsaXplT3BlcmF0aW9ucyA/IG1lbWJlcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBleHByZXNzaW9uLm1ldGhvZCkgOiB1bmRlZmluZWQpXG5cbiAgICAgIGlmICghbWVtYmVyKSByZXR1cm4gZmFpbChcIlVOS05PV05fTUVUSE9EXCIsIGBJbnRlcmZhY2UgJyR7cmVjZWl2ZXJJbnRlcmZhY2UubmFtZX0nIGhhcyBubyBtZXRob2QgJyR7ZXhwcmVzc2lvbi5tZXRob2R9Jy5gLFxuICAgICAgICByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJtZW1iZXJcIikpXG4gICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZXhwcmVzc2lvbi5tZXRob2QgPSBtZW1iZXIubWV0aG9kSWRcbiAgICAgIGlmICghaXNEZW5zZUFycmF5KGV4cHJlc3Npb24uYXJndW1lbnRzKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gbWVtYmVyLnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWlsKFwiTUVUSE9EX0FSSVRZX01JU01BVENIXCIsXG4gICAgICAgICAgYE1ldGhvZCAnJHttZW1iZXIubmFtZX0nIGhhcyAke2V4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aH0gYXJndW1lbnRzOyBleHBlY3RlZCAke21lbWJlci5wYXJhbWV0ZXJzLmxlbmd0aH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gbWVtYmVyLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcykpXG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdID0gbm9ybWFsaXplT3duZWRNb3ZlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuICAgICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZXRob2QgYXJndW1lbnRcIiwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKVxuXG4gICAgICAgIGlmICghYXNzaWduYWJsZVR5cGUoYWN0dWFsLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0sIHJlY29yZHMpKSB7XG4gICAgICAgICAgZmFpbChub21pbmFsTWlzbWF0Y2hDb2RlKHBhcmFtZXRlclR5cGVzW2luZGV4XSksIGBNZXRob2QgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocGFyYW1ldGVyVHlwZXNbaW5kZXhdKX0uYCxcbiAgICAgICAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShtZW1iZXIucmV0dXJuVHlwZSwgbWVtYmVyLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzKVxuICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IHtcbiAgICAgICAgZGVjbGFyYXRpb25JZDogbWVtYmVyLm1ldGhvZElkLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwiKSxcbiAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlclR5cGVzLm1hcCgodHlwZSkgPT4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUpKSksXG4gICAgICAgIHJldHVyblR5cGU6IHR5cGVJZGVudGl0eShyZXR1cm5UeXBlKVxuICAgICAgfVxuXG4gICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZXhwcmVzc2lvbi5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuICAgICAgZWxzZSB2YWxpZGF0ZVJlZmVyZW5jZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCBcIm1ldGhvZFwiKVxuXG4gICAgICByZXR1cm4gaXNWb2lkVHlwZShyZXR1cm5UeXBlKSA/IFwidm9pZFwiIDogcmV0dXJuVHlwZVxuICAgIH1cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgcmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FVEhPRF9SRUNFSVZFUlwiLCBcIk1ldGhvZCBjYWxsIHJlY2VpdmVyIG11c3QgaGF2ZSBhIHJlZmVyZW5jZSBjbGFzcyB0eXBlLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUNsYXNzZXNGb3IocmVjb3JkcykuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX0NMQVNTXCIsIGBVbmtub3duIHJlZmVyZW5jZSBjbGFzcyAnJHtyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZH0nLmAsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLm1ldGhvZCkgPz9cbiAgICAgIChub3JtYWxpemVPcGVyYXRpb25zID8gZGVjbGFyYXRpb24ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IGV4cHJlc3Npb24ubWV0aG9kKSA6IHVuZGVmaW5lZClcblxuICAgIGlmICghbWV0aG9kKSByZXR1cm4gZmFpbChcIlVOS05PV05fTUVUSE9EXCIsIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzIG5vIG1ldGhvZCAnJHtleHByZXNzaW9uLm1ldGhvZH0nLmAsXG4gICAgICByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJtZW1iZXJcIikpXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24ubWV0aG9kID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZXRob2QuaWQpXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNZXRob2QgYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1FVEhPRF9BUklUWV9NSVNNQVRDSFwiLFxuICAgICAgICBgTWV0aG9kICcke21ldGhvZC5uYW1lfScgaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7bWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RofS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKSlcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSA9IG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHBhcmFtZXRlclR5cGVzW2luZGV4XSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZXRob2QgYXJndW1lbnRcIiwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKVxuXG4gICAgICBpZiAoIWFzc2lnbmFibGVUeXBlKGFjdHVhbCwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdLCByZWNvcmRzKSkge1xuICAgICAgICBmYWlsKG5vbWluYWxNaXNtYXRjaENvZGUocGFyYW1ldGVyVHlwZXNbaW5kZXhdKSwgYE1ldGhvZCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihwYXJhbWV0ZXJUeXBlc1tpbmRleF0pfS5gLFxuICAgICAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShtZXRob2QucmV0dXJuVHlwZSwgbWV0aG9kLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzKVxuICAgIGNvbnN0IHJlc291cmNlRmxvdyA9IGRlY2xhcmF0aW9uLm93bmVyc2hpcD8ua2luZCA9PSBcIm93bmVkUmVzb3VyY2VcIlxuICAgICAgPyBvd25lZE1ldGhvZFJlc291cmNlRmxvdyhkZWNsYXJhdGlvbiwgbWV0aG9kLCBmYWlsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHJlc29sdXRpb24gPSB7XG4gICAgICBkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKG1ldGhvZC5pZCksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwiKSxcbiAgICAgIHBhcmFtZXRlclR5cGVzOiBwYXJhbWV0ZXJUeXBlcy5tYXAoKHR5cGUpID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlKSkpLFxuICAgICAgcmV0dXJuVHlwZTogdHlwZUlkZW50aXR5KHJldHVyblR5cGUpLFxuICAgICAgLi4uKHJlc291cmNlRmxvdyA/IHtyZXNvdXJjZUZsb3d9IDoge30pXG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiICYmIHJlc291cmNlRmxvdykge1xuICAgICAgY29uc3QgZXhwZWN0ZWRNb2RlID0gcmVzb3VyY2VGbG93LmtpbmQgPT0gXCJ0ZXJtaW5hbFwiID8gXCJleGNsdXNpdmVcIiA6IFwic2hhcmVkXCJcblxuICAgICAgaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIubW9kZSAhPSBleHBlY3RlZE1vZGUpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIGBJTlZBTElEX1JFU09VUkNFX0JPUlJPVzogT3duZWQgbWV0aG9kIHJlcXVpcmVzIGFuIGltbWVkaWF0ZSAke2V4cGVjdGVkTW9kZX0gcmVjZWl2ZXIgYm9ycm93LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiAmJiBleHByZXNzaW9uLnJlY2VpdmVyLmtpbmQgIT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIikge1xuICAgICAgaWYgKCFub3JtYWxpemVPcGVyYXRpb25zKSBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgXCJPd25lZCBtZXRob2QgcmVjZWl2ZXIgcmVxdWlyZXMgYW4gaW1tZWRpYXRlIGJvcnJvdy5cIiwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICAgIGlmIChleHByZXNzaW9uLnJlY2VpdmVyLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGZhaWwoXCJCT1JST1dfRVNDQVBFXCIsIFwiT3duZWQgbWV0aG9kIHJlY2VpdmVyIGJvcnJvdyBtdXN0IG5hbWUgb25lIGltbWVkaWF0ZSBiaW5kaW5nLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZXhwcmVzc2lvbi5yZWNlaXZlciA9IHtcbiAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbi5yZWNlaXZlcixcbiAgICAgICAga2luZDogXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIixcbiAgICAgICAgbG9jYXRpb246IGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24sXG4gICAgICAgIG1vZGU6IHJlc291cmNlRmxvdz8ua2luZCA9PSBcInRlcm1pbmFsXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIixcbiAgICAgICAgc291cmNlUHJvdmVuYW5jZTogZXhwcmVzc2lvbi5yZWNlaXZlci5zb3VyY2VQcm92ZW5hbmNlLFxuICAgICAgICB0eXBlOiByZWNlaXZlclR5cGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZXhwcmVzc2lvbi5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuICAgIGVsc2UgdmFsaWRhdGVSZWZlcmVuY2VSZXNvbHV0aW9uKGV4cHJlc3Npb24ucmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbCwgXCJtZXRob2RcIilcblxuICAgIHJldHVybiBpc1ZvaWRUeXBlKHJldHVyblR5cGUpID8gXCJ2b2lkXCIgOiByZXR1cm5UeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlJlY29yZENvbnN0cnVjdGlvblwiKSB7XG4gICAgY29uc3QgcmVjb3JkVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGV4cHJlc3Npb24ucmVjb3JkLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgaWYgKHJlY29yZFR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjb3JkIGNvbnN0cnVjdGlvbiByZXF1aXJlcyBhIG5vbWluYWwgcmVjb3JkIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gcmVjb3Jkcy5nZXQocmVjb3JkVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX1JFQ09SRFwiLCBgVW5rbm93biByZWNvcmQgZGVjbGFyYXRpb24gJyR7cmVjb3JkVHlwZS5kZWNsYXJhdGlvbklkfScuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpIHx8IGV4cHJlc3Npb24uYXJndW1lbnRzLnNvbWUoKF9hcmd1bWVudCwgaW5kZXgpID0+ICFPYmplY3QuaGFzT3duKGV4cHJlc3Npb24uYXJndW1lbnRzLCBpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWNvcmQgY29uc3RydWN0aW9uIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcbiAgICAgICAgXCJSRUNPUkRfQVJJVFlfTUlTTUFUQ0hcIixcbiAgICAgICAgYFJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgY29uc3RydWN0aW9uIGhhcyAke2V4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aH0gYXJndW1lbnRzOyBleHBlY3RlZCAke2RlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGh9LmAsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb25cbiAgICAgIClcbiAgICB9XG4gICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IHJlY29yZFR5cGVTdWJzdGl0dXRpb25zKHJlY29yZFR5cGUsIGRlY2xhcmF0aW9uKVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdXG4gICAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkc1tpbmRleF1cbiAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHN1YnN0aXR1dGVWYWx1ZVR5cGUoZmllbGQudHlwZSwgc3Vic3RpdHV0aW9ucylcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgYXJndW1lbnQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGByZWNvcmQgZmllbGQgJyR7ZmllbGQubmFtZX0nYCwgZmllbGRUeXBlXG4gICAgICApXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBmaWVsZFR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBSZWNvcmQgZmllbGQgJyR7ZmllbGQubmFtZX0nIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZpZWxkVHlwZSl9LmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWNvcmRUeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1lbWJlclJlYWRcIikge1xuICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLnJlY2VpdmVyLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWVtYmVyIHJlY2VpdmVyXCIpXG5cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9NRU1CRVJfUkVDRUlWRVJcIiwgYE1lbWJlciByZWNlaXZlciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKHJlY2VpdmVyVHlwZSl9OyBleHBlY3RlZCByZWNvcmQuYCwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmRzLmdldChyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBmYWlsKFwiVU5LTk9XTl9SRUNPUkRcIiwgYFVua25vd24gcmVjb3JkIGRlY2xhcmF0aW9uICcke3JlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkfScuYCwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLmZpZWxkKSA/P1xuICAgICAgKG5vcm1hbGl6ZU9wZXJhdGlvbnMgPyBkZWNsYXJhdGlvbi5maWVsZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBleHByZXNzaW9uLmZpZWxkKSA6IHVuZGVmaW5lZClcblxuICAgIGlmICghZmllbGQpIGZhaWwoXCJVTktOT1dOX0ZJRUxEXCIsIGBSZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyBubyBmaWVsZCAnJHtleHByZXNzaW9uLmZpZWxkfScuYCwgcm9sZUxvY2F0aW9uKGV4cHJlc3Npb24sIFwibWVtYmVyXCIpKVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLmZpZWxkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZClcblxuICAgIHJldHVybiBzdWJzdGl0dXRlVmFsdWVUeXBlKGZpZWxkLnR5cGUsIHJlY29yZFR5cGVTdWJzdGl0dXRpb25zKHJlY2VpdmVyVHlwZSwgZGVjbGFyYXRpb24pKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgZnVuY3Rpb25EZWNsYXJhdGlvbiA9IGZ1bmN0aW9ucy5nZXQoZXhwcmVzc2lvbi5jYWxsZWUpXG5cbiAgICBpZiAoIWZ1bmN0aW9uRGVjbGFyYXRpb24pIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVU5SRVNPTFZFRF9CSU5ESU5HXCIsIGBVbmtub3duIGZ1bmN0aW9uICcke2V4cHJlc3Npb24uY2FsbGVlfScuYCwgcm9sZUxvY2F0aW9uKGV4cHJlc3Npb24sIFwiY2FsbGVlXCIpKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCBjb3VudCBmb3IgJyR7ZXhwcmVzc2lvbi5jYWxsZWV9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGZ1bmN0aW9uRGVjbGFyYXRpb24pXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gKi9cbiAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gbmV3IE1hcCgpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKFxuICAgICAgcGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJzXG4gICAgKSlcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0gPSBub3JtYWxpemVPd25lZE1vdmUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tpbmRleF1cbiAgICAgIGNvbnN0IGdhdGhlcnNHZW5lcmljRXZpZGVuY2UgPSB0eXBlQ29udGFpbnNBbnlWYXJpYWJsZShleHBlY3RlZFR5cGUpXG5cbiAgICAgIGlmIChnYXRoZXJzR2VuZXJpY0V2aWRlbmNlKSB7XG4gICAgICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZXhwZWN0ZWRUeXBlLCBhcmd1bWVudCwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgYXJndW1lbnQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjYWxsIGFyZ3VtZW50XCIsIGV4cGVjdGVkVHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoKGZ1bmN0aW9uRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgICAgaW5mZXJUeXBlQXJndW1lbnRzKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSwgc3Vic3RpdHV0aW9ucywgYXJndW1lbnQubG9jYXRpb24sIGZhaWwpXG4gICAgICB9IGVsc2UgaWYgKCFhc3NpZ25hYmxlVHlwZShhY3R1YWxUeXBlLCBleHBlY3RlZFR5cGUsIHJlY29yZHMpKSB7XG4gICAgICAgIGZhaWwobm9taW5hbE1pc21hdGNoQ29kZShleHBlY3RlZFR5cGUpLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbFR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlKX0uYCwgYXJndW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGZ1bmN0aW9uRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghc3Vic3RpdHV0aW9ucy5oYXMoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIuaWQpKSkge1xuICAgICAgICBjb25zdCBldmlkZW5jZUZyZWVJbmRleCA9IHBhcmFtZXRlclR5cGVzLmZpbmRJbmRleCgodHlwZSkgPT5cbiAgICAgICAgICB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLCAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmFtZXRlci5pZCkpKVxuXG4gICAgICAgIGlmIChldmlkZW5jZUZyZWVJbmRleCA+PSAwKSB7XG4gICAgICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX0ZBSUxVUkVcIiwgXCJDYW5ub3QgaW5mZXIgYSB0eXBlIHBhcmFtZXRlciBmcm9tIGFuIGV2aWRlbmNlLWZyZWUgY2FsbCBhcmd1bWVudC5cIixcbiAgICAgICAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2V2aWRlbmNlRnJlZUluZGV4XS5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBmYWlsKFwiR0VORVJJQ19JTkZFUkVOQ0VfRkFJTFVSRVwiLCBgQ2Fubm90IGluZmVyIHR5cGUgcGFyYW1ldGVyICcke3BhcmFtZXRlci5uYW1lfScgZnJvbSBjYWxsIGFyZ3VtZW50cy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoWy4uLnN1YnN0aXR1dGlvbnMudmFsdWVzKCldLnNvbWUoKHR5cGUpID0+IGNvbnRhaW5zT3duZWRUeXBlKHR5cGUpKSkge1xuICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIFwiT3duZWQgcmVzb3VyY2VzIGFuZCByZWZlcmVuY2VzIGNhbm5vdCBiZSBpbmZlcnJlZCBhcyBnZW5lcmljIGFyZ3VtZW50cy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gc3Vic3RpdHV0ZVZhbHVlVHlwZShmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnNbaW5kZXhdLnR5cGUsIHN1YnN0aXR1dGlvbnMpXG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY2FsbCBhcmd1bWVudFwiLCBleHBlY3RlZClcblxuICAgICAgaWYgKCFhc3NpZ25hYmxlVHlwZShhY3R1YWwsIGV4cGVjdGVkLCByZWNvcmRzKSkge1xuICAgICAgICBmYWlsKG5vbWluYWxNaXNtYXRjaENvZGUoZXhwZWN0ZWQpLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihleHBlY3RlZCl9LmAsIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzb2x1dGlvbiA9IHNpZ25hdHVyZUZvcihmdW5jdGlvbkRlY2xhcmF0aW9uLCByZWNvcmRzLCBmYWlsLCBzdWJzdGl0dXRpb25zKVxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24ucmVzb2x1dGlvbiA9IHJlc29sdXRpb25cbiAgICBlbHNlIHZhbGlkYXRlUmVzb2x1dGlvbihleHByZXNzaW9uLnJlc29sdXRpb24sIHJlc29sdXRpb24sIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHN1YnN0aXR1dGVSZXR1cm5UeXBlKHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShmdW5jdGlvbkRlY2xhcmF0aW9uLnJldHVyblR5cGUsXG4gICAgICBmdW5jdGlvbkRlY2xhcmF0aW9uLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzLCBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJzKSwgc3Vic3RpdHV0aW9ucylcblxuICAgIHJldHVybiBpc1ZvaWRUeXBlKHJldHVyblR5cGUpID8gXCJ2b2lkXCIgOiByZXR1cm5UeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3Qgb3BlcmFuZCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLm9wZXJhbmQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSB1bmFyeSBvcGVyYW5kXCIpXG4gICAgY29uc3Qgb3BlcmFuZFR5cGUgPSBzY2FsYXJOYW1lRm9yT3BlcmF0aW9uKG9wZXJhbmQsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbiwgZmFpbClcbiAgICBjb25zdCBvcGVyYXRpb24gPSBub3JtYWxpemVPcGVyYXRpb25zXG4gICAgICA/IG5vcm1hbGl6ZVVuYXJ5T3BlcmF0aW9uKGFkYXB0ZWRPcGVyYXRpb25Gb3IoZXhwcmVzc2lvbiksIG9wZXJhbmRUeXBlLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24sIGZhaWwpXG4gICAgICA6IGV4cHJlc3Npb24ub3BlcmF0aW9uXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgc2V0Tm9ybWFsaXplZE9wZXJhdGlvbihleHByZXNzaW9uLCBvcGVyYXRpb24sIHVuYXJ5T3BlcmF0aW9uU2lnbmF0dXJlc1tvcGVyYXRpb25dLnJlc3VsdClcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHVuYXJ5T3BlcmF0aW9uU2lnbmF0dXJlc1tvcGVyYXRpb25dXG5cbiAgICBpZiAoIXNpZ25hdHVyZSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIHVuYXJ5IG9wZXJhdGlvbiAke1N0cmluZyhvcGVyYXRpb24pfS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBzaWduYXR1cmUub3BlcmFuZCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgJHtvcGVyYXRpb259IHJlcXVpcmVzICR7c2lnbmF0dXJlLm9wZXJhbmR9OyByZWNlaXZlZCAke29wZXJhbmRUeXBlfS5gLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLnR5cGUgIT0gc2lnbmF0dXJlLnJlc3VsdCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGAke29wZXJhdGlvbn0gcmVzdWx0IHR5cGUgJHtTdHJpbmcoZXhwcmVzc2lvbi50eXBlKX07IGV4cGVjdGVkICR7c2lnbmF0dXJlLnJlc3VsdH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoc2lnbmF0dXJlLnJlc3VsdClcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjb25kaXRpb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uY29uZGl0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbmRpdGlvblwiKVxuXG4gICAgaWYgKCFpc1NjYWxhclR5cGUoY29uZGl0aW9uVHlwZSwgXCJib29sZWFuXCIpKSB7XG4gICAgICBmYWlsKFwiTk9OX0JPT0xFQU5fQ09ORElUSU9OXCIsIGBDb25kaXRpb25hbCBleHByZXNzaW9uIGNvbmRpdGlvbiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGNvbmRpdGlvblR5cGUpfTsgZXhwZWN0ZWQgYm9vbGVhbi5gLFxuICAgICAgICBleHByZXNzaW9uLmNvbmRpdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgY29uc2VxdWVudFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIFtdKVxuICAgIGNvbnN0IGFsdGVybmF0ZVNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIFtdKVxuXG4gICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhleHByZXNzaW9uLmNvbmRpdGlvbiwgc2NvcGUsIGNvbnNlcXVlbnRTY29wZSwgdHJ1ZSlcbiAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKGV4cHJlc3Npb24uY29uZGl0aW9uLCBzY29wZSwgYWx0ZXJuYXRlU2NvcGUsIGZhbHNlKVxuICAgIGNvbnN0IGNvbnNlcXVlbnRUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uY29uc2VxdWVudCwgY29uc2VxdWVudFNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBjb25zZXF1ZW50XCIpXG4gICAgY29uc3QgYWx0ZXJuYXRlVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFsdGVybmF0ZSwgYWx0ZXJuYXRlU2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGFsdGVybmF0ZVwiKVxuXG4gICAgaWYgKCFzYW1lVHlwZShjb25zZXF1ZW50VHlwZSwgYWx0ZXJuYXRlVHlwZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDb25kaXRpb25hbCBleHByZXNzaW9uIGFybXMgJHt0eXBlRGVzY3JpcHRpb24oY29uc2VxdWVudFR5cGUpfSBhbmQgJHt0eXBlRGVzY3JpcHRpb24oYWx0ZXJuYXRlVHlwZSl9OyBleHBlY3RlZCBvbmUgam9pbmVkIHR5cGUuYCxcbiAgICAgICAgZXhwcmVzc2lvbi5hbHRlcm5hdGUubG9jYXRpb24pXG4gICAgfVxuICAgIFJlZmxlY3Quc2V0KGV4cHJlc3Npb24sIFwidHlwZVwiLCBjb25zZXF1ZW50VHlwZSlcblxuICAgIHJldHVybiBjb25zZXF1ZW50VHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBsZWZ0ID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ubGVmdCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGJpbmFyeSBvcGVyYW5kXCIpXG4gICAgY29uc3QgcmlnaHQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5yaWdodCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGJpbmFyeSBvcGVyYW5kXCIpXG4gICAgY29uc3QgbGVmdFR5cGUgPSBzY2FsYXJOYW1lRm9yT3BlcmF0aW9uKGxlZnQsIGV4cHJlc3Npb24ubGVmdC5sb2NhdGlvbiwgZmFpbClcbiAgICBjb25zdCByaWdodFR5cGUgPSBzY2FsYXJOYW1lRm9yT3BlcmF0aW9uKHJpZ2h0LCBleHByZXNzaW9uLnJpZ2h0LmxvY2F0aW9uLCBmYWlsKVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IG5vcm1hbGl6ZU9wZXJhdGlvbnNcbiAgICAgID8gbm9ybWFsaXplQmluYXJ5T3BlcmF0aW9uKGFkYXB0ZWRPcGVyYXRpb25Gb3IoZXhwcmVzc2lvbiksIGxlZnRUeXBlLCByaWdodFR5cGUsIGV4cHJlc3Npb24ubGVmdC5sb2NhdGlvbiwgZXhwcmVzc2lvbi5yaWdodC5sb2NhdGlvbiwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcbiAgICAgIDogZXhwcmVzc2lvbi5vcGVyYXRpb25cblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBzZXROb3JtYWxpemVkT3BlcmF0aW9uKGV4cHJlc3Npb24sIG9wZXJhdGlvbiwgYmluYXJ5T3BlcmF0aW9uU2lnbmF0dXJlc1tvcGVyYXRpb25dLnJlc3VsdClcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGJpbmFyeU9wZXJhdGlvblNpZ25hdHVyZXNbb3BlcmF0aW9uXVxuXG4gICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biBiaW5hcnkgb3BlcmF0aW9uICR7U3RyaW5nKG9wZXJhdGlvbil9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgaWYgKGxlZnRUeXBlICE9IHNpZ25hdHVyZS5sZWZ0KSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke29wZXJhdGlvbn0gcmVxdWlyZXMgJHtzaWduYXR1cmUubGVmdH0gbGVmdCBvcGVyYW5kOyByZWNlaXZlZCAke2xlZnRUeXBlfS5gLCBleHByZXNzaW9uLmxlZnQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChyaWdodFR5cGUgIT0gc2lnbmF0dXJlLnJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke29wZXJhdGlvbn0gcmVxdWlyZXMgJHtzaWduYXR1cmUucmlnaHR9IHJpZ2h0IG9wZXJhbmQ7IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCBleHByZXNzaW9uLnJpZ2h0LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi50eXBlICE9IHNpZ25hdHVyZS5yZXN1bHQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgJHtvcGVyYXRpb259IHJlc3VsdCB0eXBlICR7U3RyaW5nKGV4cHJlc3Npb24udHlwZSl9OyBleHBlY3RlZCAke3NpZ25hdHVyZS5yZXN1bHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKHNpZ25hdHVyZS5yZXN1bHQpXG4gIH1cblxuICBjb25zdCB1bmV4cGVjdGVkID0gLyoqIEB0eXBlIHt7a2luZDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn19ICovIChleHByZXNzaW9uKVxuXG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCB1bmV4cGVjdGVkLmtpbmQsIHVuZXhwZWN0ZWQubG9jYXRpb24pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG1hcCBsYXlvdXQgYW5kIGZpeGVkIHN0cmluZyBrZXlzIGluZGVwZW5kZW50bHkgb2YgY29udGV4dHVhbCB2YWx1ZSBpbmZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuTWFwTGl0ZXJhbCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuT3JkZXJlZE1hcExpdGVyYWx9IGV4cHJlc3Npb24gLSBDYW5kaWRhdGUgbWFwIGxpdGVyYWwuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgbGV4aWNhbCBzY29wZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gbm9ybWFsaXplIGZyb250ZW5kIGludGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMgLSBXaGV0aGVyIG5lc3RlZCBjb2xsZWN0aW9uIGV2aWRlbmNlIG1heSBiZSBpbmZlcnJlZC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1hcEVudHJ5W119IFZhbGlkYXRlZCBkZW5zZSBlbnRyaWVzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1hcExpdGVyYWxFbnRyaWVzKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmVudHJpZXMpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFwIGxpdGVyYWwgZW50cmllcyBtdXN0IGJlIGEgZGVuc2Ugc291cmNlLW9yZGVyZWQgYXJyYXkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gIH1cbiAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5lbnRyaWVzKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlNwYXJzZSBtYXAgbGl0ZXJhbHMgYXJlIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHN1YnNldC5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBrZXlzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleHByZXNzaW9uLmVudHJpZXMpIHtcbiAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmtpbmQgIT0gXCJNYXBFbnRyeVwiIHx8ICFlbnRyeS5rZXkgfHwgZW50cnkua2V5LmtpbmQgIT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFwIGVudHJpZXMgcmVxdWlyZSBsaXRlcmFsIHN0cmluZyBrZXlzLlwiLCBlbnRyeT8ubG9jYXRpb24gPz8gZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGVudHJ5LmtleSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIG1hcCBrZXlcIixcbiAgICAgIHNjYWxhclR5cGUoXCJzdHJpbmdcIiksIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzKVxuICAgIGlmIChpc051bWVyaWNTdHJpbmcoZW50cnkua2V5LnZhbHVlKSkge1xuICAgICAgZmFpbChcIklOVkFMSURfTUFQX0tFWVwiLCBcIk1hcCBpbml0aWFsaXplciBrZXlzIG11c3QgYmUgbm9ubnVtZXJpYyBzdHJpbmdzLlwiLCBlbnRyeS5rZXkubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChrZXlzLmhhcyhlbnRyeS5rZXkudmFsdWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX01BUF9LRVlcIiwgYER1cGxpY2F0ZSAke2V4cHJlc3Npb24ua2luZCA9PSBcIk9yZGVyZWRNYXBMaXRlcmFsXCIgPyBcIm9yZGVyZWQtbWFwXCIgOiBcIm1hcFwifSBrZXkgJyR7ZW50cnkua2V5LnZhbHVlfScuYCxcbiAgICAgICAgZW50cnkua2V5LmxvY2F0aW9uKVxuICAgIH1cbiAgICBrZXlzLmFkZChlbnRyeS5rZXkudmFsdWUpXG4gIH1cblxuICByZXR1cm4gZXhwcmVzc2lvbi5lbnRyaWVzXG59XG5cbi8qKlxuICogQ29sbGVjdHMgYXJndW1lbnQtb25seSBnZW5lcmljIGV2aWRlbmNlIHdoaWxlIGRlZmVycmluZyByZWN1cnNpdmVseSBjb250ZXh0dWFsIGxpdGVyYWxzLlxuICogVGhlIGNvbXBsZXRlIGFyZ3VtZW50IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IGl0cyBjbG9zZWQgc3Vic3RpdHV0ZWQgdHlwZSBhZnRlciBpbmZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IGZvcm1hbCAtIE9wZW4gZGVjbGFyYXRpb24gcGFyYW1ldGVyIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbGwgYXJndW1lbnQgb3IgbmVzdGVkIGNvbGxlY3Rpb24gdmFsdWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSBzdWJzdGl0dXRpb25zIC0gSW5mZXJlbmNlIHN0YXRlLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIGxleGljYWwgc2NvcGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHRvIG5vcm1hbGl6ZSBmcm9udGVuZCBpbnRlbnQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gaW5mZXJHZW5lcmljQXJndW1lbnRFdmlkZW5jZShmb3JtYWwsIGV4cHJlc3Npb24sIHN1YnN0aXR1dGlvbnMsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gIG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHtcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsTm9uZVwiKSByZXR1cm5cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgJiYgZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxTb21lXCIpIHtcbiAgICBpbmZlckdlbmVyaWNBcmd1bWVudEV2aWRlbmNlKGZvcm1hbC52YWx1ZVR5cGUsIGV4cHJlc3Npb24udmFsdWUsIHN1YnN0aXR1dGlvbnMsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIkxpc3RUeXBlXCIgJiYgZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdExpdGVyYWxcIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmVsZW1lbnRzKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJMaXN0IGxpdGVyYWwgZWxlbWVudHMgbXVzdCBiZSBhIGRlbnNlIHNvdXJjZS1vcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWlzRGVuc2VBcnJheShleHByZXNzaW9uLmVsZW1lbnRzKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJTcGFyc2UgbGlzdCBsaXRlcmFscyBhcmUgb3V0c2lkZSB0aGUgaW1wbGVtZW50ZWQgc3Vic2V0LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZXhwcmVzc2lvbi5lbGVtZW50cykge1xuICAgICAgaW5mZXJHZW5lcmljQXJndW1lbnRFdmlkZW5jZShmb3JtYWwuZWxlbWVudFR5cGUsIGVsZW1lbnQsIHN1YnN0aXR1dGlvbnMsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmICgoZm9ybWFsLmtpbmQgPT0gXCJNYXBUeXBlXCIgJiYgZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTGl0ZXJhbFwiKSB8fFxuICAgIChmb3JtYWwua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgJiYgZXhwcmVzc2lvbi5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIikpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsaWRhdGVNYXBMaXRlcmFsRW50cmllcyhleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB0cnVlKVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpbmZlckdlbmVyaWNBcmd1bWVudEV2aWRlbmNlKGZvcm1hbC52YWx1ZVR5cGUsIGVudHJ5LnZhbHVlLCBzdWJzdGl0dXRpb25zLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNhbGwgYXJndW1lbnRcIiwgdW5kZWZpbmVkLCB0cnVlXG4gIClcblxuICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLCBhY3R1YWwsIHN1YnN0aXR1dGlvbnMsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG59XG5cbi8qKlxuICogVW5pZmllcyBvbmUgZGVjbGFyYXRpb24tb3duZWQgZm9ybWFsIHR5cGUgd2l0aCBvbmUgYXJndW1lbnQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gZm9ybWFsIC0gR2VuZXJpYyBzaWduYXR1cmUgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gYWN0dWFsIC0gSW5mZXJyZWQgYXJndW1lbnQgdHlwZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZT59IHN1YnN0aXR1dGlvbnMgLSBJbmZlcmVuY2Ugc3RhdGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXJndW1lbnQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gaW5mZXJUeXBlQXJndW1lbnRzKGZvcm1hbCwgYWN0dWFsLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbCkge1xuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgIGNvbnN0IHByaW9yID0gc3Vic3RpdHV0aW9ucy5nZXQoZm9ybWFsLnBhcmFtZXRlcklkKVxuXG4gICAgaWYgKHByaW9yKSB7XG4gICAgICBpZiAoIXNhbWVUeXBlKHByaW9yLCBhY3R1YWwpKSB7XG4gICAgICAgIGZhaWwoXCJHRU5FUklDX0lORkVSRU5DRV9DT05GTElDVFwiLCBgQ29uZmxpY3RpbmcgaW5mZXJlbmNlIGZvciB0eXBlIHBhcmFtZXRlciAnJHtmb3JtYWwucGFyYW1ldGVySWR9Jy5gLCBsb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIShhY3R1YWwua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiICYmIGFjdHVhbC5wYXJhbWV0ZXJJZCA9PSBmb3JtYWwucGFyYW1ldGVySWQpICYmXG4gICAgICB0eXBlQ29udGFpbnNWYXJpYWJsZShhY3R1YWwsIGZvcm1hbC5wYXJhbWV0ZXJJZCkpIHtcbiAgICAgIGZhaWwoXCJHRU5FUklDX0lORkVSRU5DRV9SRUNVUlNJT05cIiwgYFJlY3Vyc2l2ZSBpbmZlcmVuY2UgZm9yIHR5cGUgcGFyYW1ldGVyICcke2Zvcm1hbC5wYXJhbWV0ZXJJZH0nLmAsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBzdWJzdGl0dXRpb25zLnNldChmb3JtYWwucGFyYW1ldGVySWQsIGFjdHVhbClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgIT0gYWN0dWFsLmtpbmQpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmb3JtYWwpfS5gLCBsb2NhdGlvbilcbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICBpZiAoIXNhbWVUeXBlKGZvcm1hbCwgYWN0dWFsKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZm9ybWFsKX0uYCwgbG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgIGlmIChmb3JtYWwuZGVjbGFyYXRpb25JZCAhPSBhY3R1YWwuZGVjbGFyYXRpb25JZCkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZm9ybWFsKX0uYCwgbG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIlJlY29yZFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIGlmIChmb3JtYWwuZGVjbGFyYXRpb25JZCAhPSBhY3R1YWwuZGVjbGFyYXRpb25JZCB8fCAoZm9ybWFsLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDApICE9IChhY3R1YWwuYXJndW1lbnRzPy5sZW5ndGggPz8gMCkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZvcm1hbCl9LmAsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgKGZvcm1hbC5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwKTsgaW5kZXggKz0gMSkge1xuICAgICAgaW5mZXJUeXBlQXJndW1lbnRzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKGZvcm1hbC5hcmd1bWVudHM/LltpbmRleF0pLFxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChhY3R1YWwuYXJndW1lbnRzPy5baW5kZXhdKSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIkxpc3RUeXBlXCIgJiYgYWN0dWFsLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgaW5mZXJUeXBlQXJndW1lbnRzKGZvcm1hbC5lbGVtZW50VHlwZSwgYWN0dWFsLmVsZW1lbnRUeXBlLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgaW5mZXJUeXBlQXJndW1lbnRzKGZvcm1hbC52YWx1ZVR5cGUsIGFjdHVhbC52YWx1ZVR5cGUsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKVxuICAgIHJldHVyblxuICB9XG4gIGlmICgoZm9ybWFsLmtpbmQgPT0gXCJNYXBUeXBlXCIgJiYgYWN0dWFsLmtpbmQgPT0gXCJNYXBUeXBlXCIpIHx8XG4gICAgKGZvcm1hbC5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpKSB7XG4gICAgaW5mZXJUeXBlQXJndW1lbnRzKGZvcm1hbC5rZXlUeXBlLCBhY3R1YWwua2V5VHlwZSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gICAgaW5mZXJUeXBlQXJndW1lbnRzKGZvcm1hbC52YWx1ZVR5cGUsIGFjdHVhbC52YWx1ZVR5cGUsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBvY2N1cnMgY29uc3RyYWludCBmb3IgZmlyc3Qtb3JkZXIgaW5mZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gQ2FuZGlkYXRlIGluZmVycmVkIHR5cGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVySWQgLSBQYXJhbWV0ZXIgYmVpbmcgaW5mZXJyZWQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHlwZSByZWN1cnNpdmVseSBjb250YWlucyB0aGUgcGFyYW1ldGVyLlxuICovXG5mdW5jdGlvbiB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLCBwYXJhbWV0ZXJJZCkge1xuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHJldHVybiB0eXBlLnBhcmFtZXRlcklkID09IHBhcmFtZXRlcklkXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHJldHVybiB0eXBlLmFyZ3VtZW50cz8uc29tZSgoYXJndW1lbnQpID0+IHR5cGVDb250YWluc1ZhcmlhYmxlKGFyZ3VtZW50LCBwYXJhbWV0ZXJJZCkpID8/IGZhbHNlXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZS5lbGVtZW50VHlwZSwgcGFyYW1ldGVySWQpXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgdHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgIHJldHVybiB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLmtleVR5cGUsIHBhcmFtZXRlcklkKSB8fCB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLnZhbHVlVHlwZSwgcGFyYW1ldGVySWQpXG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZS52YWx1ZVR5cGUsIHBhcmFtZXRlcklkKVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEFwcGxpZXMgc3Vic3RpdHV0aW9ucyB0byBhIHZhbHVlIG9yIHZvaWQgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBPcGVuIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gc3Vic3RpdHV0aW9ucyAtIENsb3NlZCBzdWJzdGl0dXRpb25zLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IFN1YnN0aXR1dGVkIHJldHVybiB0eXBlLlxuICovXG5mdW5jdGlvbiBzdWJzdGl0dXRlUmV0dXJuVHlwZSh0eXBlLCBzdWJzdGl0dXRpb25zKSB7XG4gIHJldHVybiBpc1ZvaWRUeXBlKHR5cGUpID8gdHlwZSA6IHN1YnN0aXR1dGVWYWx1ZVR5cGUodHlwZSwgc3Vic3RpdHV0aW9ucylcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGV4YWN0IHNlbWFudGljIHNpZ25hdHVyZSBib3VuZCB0byBvbmUgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBSZXNvbHZlZCBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gW3N1YnN0aXR1dGlvbnNdIC0gSW5mZXJyZWQgZ2VuZXJpYyBzdWJzdGl0dXRpb25zLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gRGV0YWNoZWQgc2lnbmF0dXJlIGJpbmRpbmcuXG4gKi9cbmZ1bmN0aW9uIHNpZ25hdHVyZUZvcihkZWNsYXJhdGlvbiwgcmVjb3JkcywgZmFpbCwgc3Vic3RpdHV0aW9ucyA9IG5ldyBNYXAoKSkge1xuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcklkcyhkZWNsYXJhdGlvbilcbiAgY29uc3QgZGVjbGFyZWRQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW11cbiAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgIHN1YnN0aXR1dGVWYWx1ZVR5cGUodmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycyksIHN1YnN0aXR1dGlvbnMpKVxuICBjb25zdCByZXR1cm5UeXBlID0gc3Vic3RpdHV0ZVJldHVyblR5cGUoXG4gICAgdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGRlY2xhcmF0aW9uLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycyksIHN1YnN0aXR1dGlvbnMpXG5cbiAgcmV0dXJuIHtcbiAgICBkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSxcbiAgICBraW5kOiBcIlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcIixcbiAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyVHlwZXMubWFwKCh0eXBlKSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZSkpKSxcbiAgICByZXR1cm5UeXBlOiB0eXBlSWRlbnRpdHkocmV0dXJuVHlwZSksXG4gICAgLi4uKGRlY2xhcmVkUGFyYW1ldGVycy5sZW5ndGggPiAwID8ge1xuICAgICAgdHlwZUFyZ3VtZW50czogZGVjbGFyZWRQYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoXG4gICAgICAgICAgc3Vic3RpdHV0aW9ucy5nZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIuaWQpKVxuICAgICAgICApKSkpXG4gICAgfSA6IHt9KVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuIGV4dGVybmFsbHkgc3VwcGxpZWQgY2FsbCBiaW5kaW5nIGFnYWluc3QgdGhlIGRlY2xhcmF0aW9uIGNvbGxlY3RlZCBmb3IgdGhpcyBtb2R1bGUuXG4gKiBAcGFyYW0ge3Vua25vd259IGFjdHVhbCAtIENhbmRpZGF0ZSBjYWxsIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gZXhwZWN0ZWQgLSBFeGFjdCBkZWNsYXJhdGlvbiBzaWduYXR1cmUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ2FsbCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlc29sdXRpb24oYWN0dWFsLCBleHBlY3RlZCwgbG9jYXRpb24sIGZhaWwpIHtcbiAgY29uc3QgZXhwZWN0ZWRLZXlzID0gZXhwZWN0ZWQudHlwZUFyZ3VtZW50cyA/IFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzLHJldHVyblR5cGUsdHlwZUFyZ3VtZW50c1wiIDpcbiAgICBcImRlY2xhcmF0aW9uSWQsa2luZCxwYXJhbWV0ZXJUeXBlcyxyZXR1cm5UeXBlXCJcblxuICBpZiAoIWFjdHVhbCB8fCB0eXBlb2YgYWN0dWFsICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShhY3R1YWwpIHx8XG4gICAgT2JqZWN0LmtleXMoYWN0dWFsKS5zb3J0KCkuam9pbihcIixcIikgIT0gZXhwZWN0ZWRLZXlzKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDYWxsIGlzIG1pc3NpbmcgYW4gZXhhY3QgcmVzb2x2ZWQgZnVuY3Rpb24gc2lnbmF0dXJlLlwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gKi8gKGFjdHVhbClcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgIT0gXCJSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXCIgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHxcbiAgICAhQXJyYXkuaXNBcnJheShjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMpIHx8ICF2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUucmV0dXJuVHlwZSwgdHJ1ZSkgfHxcbiAgICBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBleHBlY3RlZC5kZWNsYXJhdGlvbklkIHx8XG4gICAgIXNhbWVUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnJldHVyblR5cGUsIGV4cGVjdGVkLnJldHVyblR5cGUpIHx8IGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGggIT0gZXhwZWN0ZWQucGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDYWxsIHJlc29sdXRpb24gZG9lcyBub3QgbWF0Y2ggaXRzIGRlY2xhcmF0aW9uIHNpZ25hdHVyZS5cIiwgbG9jYXRpb24pXG4gIH1cbiAgaWYgKGV4cGVjdGVkLnR5cGVBcmd1bWVudHMpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVUeXBlQXJndW1lbnRzID0gY2FuZGlkYXRlLnR5cGVBcmd1bWVudHNcblxuICAgIGlmICghaXNEZW5zZUFycmF5KGNhbmRpZGF0ZVR5cGVBcmd1bWVudHMpIHx8IGNhbmRpZGF0ZVR5cGVBcmd1bWVudHMubGVuZ3RoICE9IGV4cGVjdGVkLnR5cGVBcmd1bWVudHMubGVuZ3RoIHx8XG4gICAgICBjYW5kaWRhdGVUeXBlQXJndW1lbnRzLnNvbWUoKHR5cGUsIGluZGV4KSA9PlxuICAgICAgICAhdmFsaWRUeXBlSWRlbnRpdHkodHlwZSwgZmFsc2UpIHx8ICFzYW1lVHlwZUlkZW50aXR5KHR5cGUsIGV4cGVjdGVkLnR5cGVBcmd1bWVudHM/LltpbmRleF0pKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDYWxsIHJlc29sdXRpb24gZG9lcyBub3QgbWF0Y2ggaXRzIGluZmVycmVkIHR5cGUgYXJndW1lbnRzLlwiLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCB0eXBlID0gY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzW2luZGV4XVxuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcywgaW5kZXgpIHx8ICF2YWxpZFR5cGVJZGVudGl0eSh0eXBlLCBmYWxzZSkgfHxcbiAgICAgICFzYW1lVHlwZUlkZW50aXR5KHR5cGUsIGV4cGVjdGVkLnBhcmFtZXRlclR5cGVzW2luZGV4XSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ2FsbCByZXNvbHV0aW9uIGRvZXMgbm90IG1hdGNoIGl0cyBkZWNsYXJhdGlvbiBzaWduYXR1cmUuXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBleGFjdCBjYWxsZXItb3duZWQgY29uc3RydWN0b3Igb3IgbWV0aG9kIHJlc29sdXRpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge3Vua25vd259IGFjdHVhbCAtIENhbmRpZGF0ZSByZXNvbHV0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmUgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlfSBleHBlY3RlZCAtIEV4YWN0IHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhwcmVzc2lvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7XCJjb25zdHJ1Y3RvclwiIHwgXCJtZXRob2RcIn0gcm9sZSAtIFJlc29sdXRpb24gcm9sZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlZmVyZW5jZVJlc29sdXRpb24oYWN0dWFsLCBleHBlY3RlZCwgbG9jYXRpb24sIGZhaWwsIHJvbGUpIHtcbiAgY29uc3QgZXhwZWN0ZWRNZXRob2QgPSByb2xlID09IFwibWV0aG9kXCIgPyAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9ICovIChleHBlY3RlZCkgOiB1bmRlZmluZWRcbiAgY29uc3QgZXhwZWN0ZWRLZXlzID0gcm9sZSA9PSBcImNvbnN0cnVjdG9yXCIgPyBcImRlY2xhcmF0aW9uSWQsa2luZCxwYXJhbWV0ZXJUeXBlc1wiIDpcbiAgICBleHBlY3RlZE1ldGhvZD8ucmVzb3VyY2VGbG93ID8gXCJkZWNsYXJhdGlvbklkLGtpbmQscGFyYW1ldGVyVHlwZXMscmVzb3VyY2VGbG93LHJldHVyblR5cGVcIiA6XG4gICAgICBcImRlY2xhcmF0aW9uSWQsa2luZCxwYXJhbWV0ZXJUeXBlcyxyZXR1cm5UeXBlXCJcblxuICBpZiAoIWFjdHVhbCB8fCB0eXBlb2YgYWN0dWFsICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShhY3R1YWwpIHx8IE9iamVjdC5rZXlzKGFjdHVhbCkuc29ydCgpLmpvaW4oXCIsXCIpICE9IGV4cGVjdGVkS2V5cykge1xuICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBSZWZlcmVuY2UgJHtyb2xlfSBjYWxsIGlzIG1pc3NpbmcgYW4gZXhhY3QgcmVzb2x2ZWQgJHtyb2xlfSBzaWduYXR1cmUuYCwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGFjdHVhbClcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgIT0gZXhwZWN0ZWQua2luZCB8fCBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBleHBlY3RlZC5kZWNsYXJhdGlvbklkIHx8XG4gICAgIWlzRGVuc2VBcnJheShjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMpIHx8IGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGggIT0gZXhwZWN0ZWQucGFyYW1ldGVyVHlwZXMubGVuZ3RoIHx8XG4gICAgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLnNvbWUoKHR5cGUsIGluZGV4KSA9PiAhdmFsaWRUeXBlSWRlbnRpdHkodHlwZSwgZmFsc2UpIHx8XG4gICAgICAhc2FtZVR5cGVJZGVudGl0eSh0eXBlLCBleHBlY3RlZC5wYXJhbWV0ZXJUeXBlc1tpbmRleF0pKSB8fFxuICAgIHJvbGUgPT0gXCJtZXRob2RcIiAmJiAoIXZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS5yZXR1cm5UeXBlLCB0cnVlKSB8fFxuICAgICAgIXNhbWVUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnJldHVyblR5cGUsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZE1ldGhvZFNpZ25hdHVyZX0gKi8gKGV4cGVjdGVkKS5yZXR1cm5UeXBlKSB8fFxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2FuZGlkYXRlLnJlc291cmNlRmxvdykgIT0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRNZXRob2Q/LnJlc291cmNlRmxvdykpKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFJlc29sdmVkICR7cm9sZX0gc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIGl0cyBkZWNsYXJhdGlvbi5gLCBsb2NhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIGEgc291cmNlIGlkZW50aWZpZXIncyBvd25lcnNoaXAgdHJhbnNmZXIgZXhwbGljaXQgaW4gbm9ybWFsaXplZCBJUi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQ2FuZGlkYXRlIHRyYW5zZmVyIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IGV4cGVjdGVkIC0gRGVzdGluYXRpb24gdHlwZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplIC0gV2hldGhlciBwYXJzZXIgaW50ZW50IG1heSBiZSBub3JtYWxpemVkLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBFeHBsaWNpdCBleHByZXNzaW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVPd25lZE1vdmUoZXhwcmVzc2lvbiwgZXhwZWN0ZWQsIG5vcm1hbGl6ZSwgZmFpbCkge1xuICBpZiAoZXhwZWN0ZWQua2luZCAhPSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgJiYgZXhwZWN0ZWQua2luZCAhPSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUHJpdmF0ZUZpZWxkUmVhZFwiKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX1RSQU5TRkVSXCIsIFwiUHJpdmF0ZSByZXNvdXJjZSBmaWVsZHMgY2Fubm90IGJlIG1vdmVkIG9yIGV4cG9zZWQ7IHRyYW5zZmVyIHRoZSBvd25pbmcgcmVmZXJlbmNlLlwiLFxuICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIGV4cHJlc3Npb25cbiAgaWYgKCFub3JtYWxpemUpIHJldHVybiBmYWlsKFwiUkVTT1VSQ0VfTU9WRV9SRVFVSVJFRFwiLCBcIk93bmVkIHRyYW5zZmVyIHJlcXVpcmVzIGFuIGV4cGxpY2l0IG1vdmUgZXhwcmVzc2lvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcblxuICByZXR1cm4ge1xuICAgIGV4cHJlc3Npb24sXG4gICAga2luZDogXCJPd25lZE1vdmVFeHByZXNzaW9uXCIsXG4gICAgbG9jYXRpb246IGV4cHJlc3Npb24ubG9jYXRpb24sXG4gICAgc291cmNlUHJvdmVuYW5jZTogZXhwcmVzc2lvbi5zb3VyY2VQcm92ZW5hbmNlLFxuICAgIHR5cGU6IGV4cGVjdGVkXG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzc2lmaWVzIHRoZSBkZWxpYmVyYXRlbHkgYm91bmRlZCBUYXNrIDAzNCByZWNlaXZlciB0cmFuc2l0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gT3duZWQgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuTWV0aG9kRGVjbGFyYXRpb259IG1ldGhvZCAtIENhbmRpZGF0ZSBtZXRob2QuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHt7a2luZDogXCJwcmVzZXJ2ZVwiIHwgXCJ0ZXJtaW5hbFwiLCB0ZXJtaW5hbEZhaWx1cmVJZD86IHN0cmluZ319IFJlY2VpdmVyIHRyYW5zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIG93bmVkTWV0aG9kUmVzb3VyY2VGbG93KGRlY2xhcmF0aW9uLCBtZXRob2QsIGZhaWwpIHtcbiAgY29uc3QgZWZmZWN0U3RhdGVtZW50cyA9IG1ldGhvZC5ib2R5LnN0YXRlbWVudHMuZmxhdE1hcCgoc3RhdGVtZW50KSA9PiB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6XG4gICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiA/IHN0YXRlbWVudC5pbml0aWFsaXplciA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGV4cHJlc3Npb24/LmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiID8gW2V4cHJlc3Npb25dIDogW11cbiAgfSlcbiAgY29uc3QgYWxsRWZmZWN0cyA9IG1ldGhvZEVmZmVjdEV4cHJlc3Npb25zKG1ldGhvZC5ib2R5KVxuXG4gIGlmIChhbGxFZmZlY3RzLmxlbmd0aCA9PSAwKSByZXR1cm4ge2tpbmQ6IFwicHJlc2VydmVcIn1cbiAgaWYgKG1ldGhvZC5ib2R5LnN0YXRlbWVudHMubGVuZ3RoICE9IDEgfHwgZWZmZWN0U3RhdGVtZW50cy5sZW5ndGggIT0gMSB8fCBhbGxFZmZlY3RzLmxlbmd0aCAhPSAxIHx8XG4gICAgYWxsRWZmZWN0c1swXSAhPT0gZWZmZWN0U3RhdGVtZW50c1swXSkge1xuICAgIHJldHVybiBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsXG4gICAgICBgT3duZWQgbWV0aG9kICcke21ldGhvZC5uYW1lfScgbXVzdCBjb250YWluIG9uZSBkaXJlY3QgcmVzb3VyY2Ugb3BlcmF0aW9uIG9yIG9ubHkgcHVyZSBzdGF0ZW1lbnRzLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBvcGVyYXRpb24gPSBlZmZlY3RTdGF0ZW1lbnRzWzBdXG4gIGNvbnN0IGZsb3cgPSBvcGVyYXRpb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3dcblxuICBpZiAoZmxvdy5raW5kID09IFwibm9uZVwiIHx8IGZsb3cua2luZCA9PSBcImFjcXVpcmVcIikgcmV0dXJuIHtraW5kOiBcInByZXNlcnZlXCJ9XG4gIGNvbnN0IGFyZ3VtZW50ID0gb3BlcmF0aW9uLmFyZ3VtZW50c1tmbG93LnBhcmFtZXRlckluZGV4XVxuXG4gIGNvbnN0IG93bmVkID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiID8gZGVjbGFyYXRpb24ub3duZXJzaGlwIDogdW5kZWZpbmVkXG4gIGNvbnN0IGJvcnJvd2VkUGFyYW1ldGVyTmFtZSA9IGFyZ3VtZW50Py5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgJiYgYXJndW1lbnQuZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIlxuICAgID8gYXJndW1lbnQuZXhwcmVzc2lvbi5uYW1lIDogdW5kZWZpbmVkXG4gIGNvbnN0IGJvcnJvd2VkUGFyYW1ldGVyID0gYm9ycm93ZWRQYXJhbWV0ZXJOYW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICBtZXRob2QucGFyYW1ldGVycy5zb21lKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5uYW1lID09IGJvcnJvd2VkUGFyYW1ldGVyTmFtZSAmJiBjb250YWluc093bmVkVHlwZShwYXJhbWV0ZXIudHlwZSkpXG5cbiAgaWYgKGJvcnJvd2VkUGFyYW1ldGVyKSByZXR1cm4ge2tpbmQ6IFwicHJlc2VydmVcIn1cblxuICBpZiAoIWFyZ3VtZW50IHx8IGFyZ3VtZW50LmtpbmQgIT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIiB8fCBhcmd1bWVudC5leHByZXNzaW9uLmtpbmQgIT0gXCJQcml2YXRlRmllbGRSZWFkXCIgfHxcbiAgICBhcmd1bWVudC5leHByZXNzaW9uLmZpZWxkICE9IG93bmVkPy5maWVsZElkKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBgT3duZWQgbWV0aG9kICcke21ldGhvZC5uYW1lfScgbXVzdCBvcGVyYXRlIG9uIGl0cyBwcml2YXRlIHJlc291cmNlIGZpZWxkLmAsIG9wZXJhdGlvbi5sb2NhdGlvbilcbiAgfVxuICByZXR1cm4ge2tpbmQ6IGZsb3cua2luZCA9PSBcImNsb3NlXCIgPyBcInRlcm1pbmFsXCIgOiBcInByZXNlcnZlXCIsIHRlcm1pbmFsRmFpbHVyZUlkOiBmbG93LnRlcm1pbmFsRmFpbHVyZUlkfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIGV2ZXJ5IGhvc3QtZWZmZWN0IHNpdGUgbmVzdGVkIGluIG9uZSBvd25lZCBtZXRob2QgYm9keS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBNZXRob2QgYm9keS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb25bXX0gRWZmZWN0ZnVsIGV4cHJlc3Npb25zLlxuICovXG5mdW5jdGlvbiBtZXRob2RFZmZlY3RFeHByZXNzaW9ucyhibG9jaykge1xuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSAqL1xuICBjb25zdCBlZmZlY3RzID0gW11cbiAgY29uc3QgcGVuZGluZyA9IFsvKiogQHR5cGUge3Vua25vd259ICovIChibG9jayldXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpXG5cbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIiB8fFxuICAgICAgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCBcImVmZmVjdFNpdGVJZFwiKSA9PSBcInN0cmluZ1wiKSkge1xuICAgICAgZWZmZWN0cy5wdXNoKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSAqLyAodmFsdWUpKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NhdGlvblwiLCBcInJlc29sdXRpb25cIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHBlbmRpbmcucHVzaCguLi5jaGlsZClcbiAgICAgIGVsc2UgaWYgKGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PSBcIm9iamVjdFwiKSBwZW5kaW5nLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG4gIHJldHVybiBlZmZlY3RzXG59XG5cbi8qKlxuICogUmVoeWRyYXRlcyBhIGNsb3NlZCBjYXBhYmlsaXR5IHR5cGUgaWRlbnRpdHkgZm9yIG9yZGluYXJ5IGV4cHJlc3Npb24gY2hlY2tzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSBpZGVudGl0eSAtIENsb3NlZCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBEaWFnbm9zdGljIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gVmFsdWUgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHlBc1ZhbHVlVHlwZShpZGVudGl0eSwgbG9jYXRpb24sIGZhaWwpIHtcbiAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKCFpc1NjYWxhclR5cGVOYW1lKGlkZW50aXR5KSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVm9pZCBvciBpbnZhbGlkIGlkZW50aXR5IHVzZWQgYXMgYW4gZWZmZWN0IHZhbHVlIHR5cGUuXCIsIGxvY2F0aW9uKVxuICAgIHJldHVybiBzY2FsYXJUeXBlKGlkZW50aXR5KVxuICB9XG4gIGlmICghaWRlbnRpdHkgfHwgdHlwZW9mIGlkZW50aXR5ICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShpZGVudGl0eSkpIHtcbiAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgZWZmZWN0IHR5cGUgaWRlbnRpdHkuXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7RXhjbHVkZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5LCBzdHJpbmc+fSAqLyAoaWRlbnRpdHkpXG5cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IGNhbmRpZGF0ZS5yZXNvdXJjZUlkfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCwga2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIn1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBpZGVudGl0eUFzVmFsdWVUeXBlKGNhbmRpZGF0ZS52YWx1ZVR5cGUsIGxvY2F0aW9uLCBmYWlsKX1cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgZWZmZWN0IHR5cGUgaWRlbnRpdHkuXCIsIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc2VtYW50aWMgdHlwZSB0byBpdHMgZGV0YWNoZWQgY2FsbC1yZXNvbHV0aW9uIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gVmFsaWRhdGVkIHNlbWFudGljIHR5cGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gRGV0YWNoZWQgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHR5cGVJZGVudGl0eSh0eXBlKSB7XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHJldHVybiB0eXBlLm5hbWVcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZXR1cm4ge2tpbmQ6IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIsIHBhcmFtZXRlcklkOiB0eXBlLnBhcmFtZXRlcklkfVxuICBpZiAodHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4ge1xuICAgIGRlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCxcbiAgICBraW5kOiBcIlJlY29yZFR5cGVcIixcbiAgICAuLi4odHlwZS5hcmd1bWVudHMgPyB7YXJndW1lbnRzOiB0eXBlLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50KSA9PlxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KGFyZ3VtZW50KSkpfSA6IHt9KVxuICB9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB7ZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLCBraW5kOiBcIlJlZmVyZW5jZVR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIikgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiB0eXBlLmRlY2xhcmF0aW9uSWQsIGtpbmQ6IFwiSW50ZXJmYWNlVHlwZVwifVxuICBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHR5cGUucmVzb3VyY2VJZH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCwga2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiB7ZWxlbWVudFR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmVsZW1lbnRUeXBlKSksIGtpbmQ6IFwiTGlzdFR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUudmFsdWVUeXBlKSl9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSByZXR1cm4ge1xuICAgIGtleVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmtleVR5cGUpKSxcbiAgICBraW5kOiBcIk9yZGVyZWRNYXBUeXBlXCIsXG4gICAgb3JkZXI6IFwiaW5zZXJ0aW9uXCIsXG4gICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5rZXlUeXBlKSksXG4gICAga2luZDogXCJNYXBUeXBlXCIsXG4gICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBleHRlcm5hbGx5IHN1cHBsaWVkIHJlY3Vyc2l2ZSB0eXBlIGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd1ZvaWQgLSBXaGV0aGVyIHZvaWQgaXMgcGVybWl0dGVkLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2lvbiBwYXRoLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGlkZW50aXR5IGlzIGNsb3NlZCBhbmQgYWN5Y2xpYy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRUeXBlSWRlbnRpdHkodHlwZSwgYWxsb3dWb2lkLCBzZWVuID0gbmV3IFNldCgpKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gaXNTY2FsYXJUeXBlTmFtZSh0eXBlKSB8fCBhbGxvd1ZvaWQgJiYgdHlwZSA9PSBcInZvaWRcIlxuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpIHx8IHNlZW4uaGFzKHR5cGUpKSByZXR1cm4gZmFsc2VcblxuICBzZWVuLmFkZCh0eXBlKVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodHlwZSlcbiAgbGV0IHZhbGlkID0gZmFsc2VcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJMaXN0VHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwiZWxlbWVudFR5cGUsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUuZWxlbWVudFR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiTWFwVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2V5VHlwZSxraW5kLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSBjYW5kaWRhdGUua2V5VHlwZSA9PSBcInN0cmluZ1wiICYmIHZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS52YWx1ZVR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJlxuICAgIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2V5VHlwZSxraW5kLG9yZGVyLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSBjYW5kaWRhdGUua2V5VHlwZSA9PSBcInN0cmluZ1wiICYmIGNhbmRpZGF0ZS5vcmRlciA9PSBcImluc2VydGlvblwiICYmXG4gICAgICB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUudmFsdWVUeXBlLCBmYWxzZSwgc2VlbilcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2luZCx2YWx1ZVR5cGVcIikge1xuICAgIHZhbGlkID0gdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnZhbHVlVHlwZSwgZmFsc2UsIHNlZW4pICYmXG4gICAgICAhKGNhbmRpZGF0ZS52YWx1ZVR5cGUgJiYgdHlwZW9mIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPT0gXCJvYmplY3RcIiAmJiBSZWZsZWN0LmdldChjYW5kaWRhdGUudmFsdWVUeXBlLCBcImtpbmRcIikgPT0gXCJPcHRpb25hbFR5cGVcIilcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2luZCxwYXJhbWV0ZXJJZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLnBhcmFtZXRlcklkID09IFwic3RyaW5nXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpPyg/OnJlY29yZHxmdW5jdGlvbik6WzAtOV0rOnR5cGU6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLnBhcmFtZXRlcklkKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmXG4gICAgW1wiYXJndW1lbnRzLGRlY2xhcmF0aW9uSWQsa2luZFwiLCBcImRlY2xhcmF0aW9uSWQsa2luZFwiXS5pbmNsdWRlcyhPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSkpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVBcmd1bWVudHMgPSBjYW5kaWRhdGUuYXJndW1lbnRzXG5cbiAgICB2YWxpZCA9IHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9yZWNvcmQ6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpICYmXG4gICAgICAoY2FuZGlkYXRlQXJndW1lbnRzID09PSB1bmRlZmluZWQgfHwgaXNEZW5zZUFycmF5KGNhbmRpZGF0ZUFyZ3VtZW50cykgJiZcbiAgICAgICAgY2FuZGlkYXRlQXJndW1lbnRzLmV2ZXJ5KChhcmd1bWVudCkgPT4gdmFsaWRUeXBlSWRlbnRpdHkoYXJndW1lbnQsIGZhbHNlLCBzZWVuKSkpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIikge1xuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiZcbiAgICAgIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9jbGFzczpbMC05XSskL3UudGVzdChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIiAmJiBPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSA9PSBcImRlY2xhcmF0aW9uSWQsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2ludGVyZmFjZTpbMC05XSskL3UudGVzdChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJraW5kLHJlc291cmNlSWRcIikge1xuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5yZXNvdXJjZUlkID09IFwic3RyaW5nXCIgJiYgL14oPzptb2R1bGU6WzAtOV0rXFwvKT9jYXBhYmlsaXR5OlswLTldK1xcL3Jlc291cmNlOlswLTldKyQvdVxuICAgICAgLnRlc3QoY2FuZGlkYXRlLnJlc291cmNlSWQpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiAmJiBPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSA9PSBcImRlY2xhcmF0aW9uSWQsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpXG4gIH1cbiAgc2Vlbi5kZWxldGUodHlwZSlcblxuICByZXR1cm4gdmFsaWRcbn1cblxuLyoqXG4gKiBDaGVja3MgYXJyYXkgaWRlbnRpdHkgd2l0aG91dCByZWx5aW5nIG9uIGl0ZXJhdGlvbiBtZXRob2RzIHRoYXQgc2tpcCBzcGFyc2Ugc2xvdHMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHVua25vd25bXX0gV2hldGhlciBldmVyeSBpbmRleGVkIHNsb3QgaXMgcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gaXNEZW5zZUFycmF5KHZhbHVlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24odmFsdWUsIGluZGV4KSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBjbG9zZWQgdHlwZSBpZGVudGl0aWVzIHN0cnVjdHVyYWxseS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIEZpcnN0IGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFNlY29uZCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBpZGVudGl0aWVzIGFyZSBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZVR5cGVJZGVudGl0eShsZWZ0LCByaWdodCkge1xuICBpZiAodHlwZW9mIGxlZnQgPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcmlnaHQgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gIGlmICghbGVmdCB8fCAhcmlnaHQgfHwgdHlwZW9mIGxlZnQgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgcmlnaHQgIT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGxlZnRUeXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGxlZnQpXG4gIGNvbnN0IHJpZ2h0VHlwZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChyaWdodClcblxuICBpZiAobGVmdFR5cGUua2luZCAhPSByaWdodFR5cGUua2luZCkgcmV0dXJuIGZhbHNlXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUuZWxlbWVudFR5cGUsIHJpZ2h0VHlwZS5lbGVtZW50VHlwZSlcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUudmFsdWVUeXBlLCByaWdodFR5cGUudmFsdWVUeXBlKVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZXR1cm4gbGVmdFR5cGUucGFyYW1ldGVySWQgPT0gcmlnaHRUeXBlLnBhcmFtZXRlcklkXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgY29uc3QgbGVmdEFyZ3VtZW50cyA9IEFycmF5LmlzQXJyYXkobGVmdFR5cGUuYXJndW1lbnRzKSA/IGxlZnRUeXBlLmFyZ3VtZW50cyA6IFtdXG4gICAgY29uc3QgcmlnaHRBcmd1bWVudHMgPSBBcnJheS5pc0FycmF5KHJpZ2h0VHlwZS5hcmd1bWVudHMpID8gcmlnaHRUeXBlLmFyZ3VtZW50cyA6IFtdXG5cbiAgICByZXR1cm4gbGVmdFR5cGUuZGVjbGFyYXRpb25JZCA9PSByaWdodFR5cGUuZGVjbGFyYXRpb25JZCAmJiBsZWZ0QXJndW1lbnRzLmxlbmd0aCA9PSByaWdodEFyZ3VtZW50cy5sZW5ndGggJiZcbiAgICAgIGxlZnRBcmd1bWVudHMuZXZlcnkoKGFyZ3VtZW50LCBpbmRleCkgPT4gc2FtZVR5cGVJZGVudGl0eShhcmd1bWVudCwgcmlnaHRBcmd1bWVudHNbaW5kZXhdKSlcbiAgfVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGxlZnRUeXBlLmRlY2xhcmF0aW9uSWQgPT0gcmlnaHRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJJbnRlcmZhY2VUeXBlXCIpIHJldHVybiBsZWZ0VHlwZS5kZWNsYXJhdGlvbklkID09IHJpZ2h0VHlwZS5kZWNsYXJhdGlvbklkXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIGxlZnRUeXBlLnJlc291cmNlSWQgPT0gcmlnaHRUeXBlLnJlc291cmNlSWRcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGxlZnRUeXBlLmRlY2xhcmF0aW9uSWQgPT0gcmlnaHRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgbGVmdFR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gc2FtZVR5cGVJZGVudGl0eShsZWZ0VHlwZS5rZXlUeXBlLCByaWdodFR5cGUua2V5VHlwZSkgJiYgc2FtZVR5cGVJZGVudGl0eShsZWZ0VHlwZS52YWx1ZVR5cGUsIHJpZ2h0VHlwZS52YWx1ZVR5cGUpXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gdmFsaWRhdGVkIHNlbWFudGljIHR5cGVzIHN0cnVjdHVyYWxseS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gbGVmdCAtIEZpcnN0IHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJpZ2h0IC0gU2Vjb25kIHR5cGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHlwZXMgYXJlIGVxdWFsLlxuICovXG5mdW5jdGlvbiBzYW1lVHlwZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gc2FtZVR5cGVJZGVudGl0eSh0eXBlSWRlbnRpdHkobGVmdCksIHR5cGVJZGVudGl0eShyaWdodCkpXG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIG9uZSB2YWxpZGF0ZWQgdHlwZSBtYXkgZmxvdyB0byBhIGRlY2xhcmVkIHBvc2l0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBhY3R1YWwgLSBJbmZlcnJlZCBzb3VyY2UgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gZXhwZWN0ZWQgLSBEZWNsYXJlZCBwb3NpdGlvbiB0eXBlLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBhbmQgcmVmZXJlbmNlLWNsYXNzIHJlZ2lzdHJpZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdmFsdWUgZmxvdyBpcyBhZG1pdHRlZC5cbiAqL1xuZnVuY3Rpb24gYXNzaWduYWJsZVR5cGUoYWN0dWFsLCBleHBlY3RlZCwgcmVjb3Jkcykge1xuICBpZiAoc2FtZVR5cGUoYWN0dWFsLCBleHBlY3RlZCkpIHJldHVybiB0cnVlXG4gIGlmIChleHBlY3RlZC5raW5kICE9IFwiSW50ZXJmYWNlVHlwZVwiKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgaW50ZXJmYWNlcyA9IGludGVyZmFjZXNCeVJlY29yZFJlZ2lzdHJ5LmdldChyZWNvcmRzKSA/PyBuZXcgTWFwKClcblxuICBpZiAoYWN0dWFsLmtpbmQgPT0gXCJJbnRlcmZhY2VUeXBlXCIpIHJldHVybiBpbnRlcmZhY2VFeHRlbmRzVHJhbnNpdGl2ZWx5KGFjdHVhbC5kZWNsYXJhdGlvbklkLCBleHBlY3RlZC5kZWNsYXJhdGlvbklkLCBpbnRlcmZhY2VzKVxuICBpZiAoYWN0dWFsLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUNsYXNzZXNGb3IocmVjb3JkcykuZ2V0KGFjdHVhbC5kZWNsYXJhdGlvbklkKVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oZGVjbGFyYXRpb24/LmltcGxlbWVudHM/LnNvbWUoKGltcGxlbWVudGVkKSA9PlxuICAgICAgaW1wbGVtZW50ZWQuZGVjbGFyYXRpb25JZCA9PSBleHBlY3RlZC5kZWNsYXJhdGlvbklkIHx8XG4gICAgICBpbnRlcmZhY2VFeHRlbmRzVHJhbnNpdGl2ZWx5KGltcGxlbWVudGVkLmRlY2xhcmF0aW9uSWQsIGV4cGVjdGVkLmRlY2xhcmF0aW9uSWQsIGludGVyZmFjZXMpKSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBvbmUgaW50ZXJmYWNlIHRyYW5zaXRpdmVseSBleHRlbmRzIGFub3RoZXIgdGhyb3VnaCB0aGUgY2xvc2VkIERBRy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcmZhY2VJZCAtIERlc2NlbmRhbnQgaW50ZXJmYWNlIGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFuY2VzdG9ySWQgLSBBbmNlc3RvciBpbnRlcmZhY2UgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0ludGVyZmFjZVJlZ2lzdHJ5fSBpbnRlcmZhY2VzIC0gSW50ZXJmYWNlcyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWxhdGlvbiBob2xkcy5cbiAqL1xuZnVuY3Rpb24gaW50ZXJmYWNlRXh0ZW5kc1RyYW5zaXRpdmVseShpbnRlcmZhY2VJZCwgYW5jZXN0b3JJZCwgaW50ZXJmYWNlcykge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IGludGVyZmFjZXMuZ2V0KGludGVyZmFjZUlkKVxuXG4gIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBmYWxzZVxuICByZXR1cm4gKGRlY2xhcmF0aW9uLmV4dGVuZHMgPz8gW10pLnNvbWUoKHBhcmVudCkgPT4gcGFyZW50LmRlY2xhcmF0aW9uSWQgPT0gYW5jZXN0b3JJZCB8fFxuICAgIGludGVyZmFjZUV4dGVuZHNUcmFuc2l0aXZlbHkocGFyZW50LmRlY2xhcmF0aW9uSWQsIGFuY2VzdG9ySWQsIGludGVyZmFjZXMpKVxufVxuXG4vKipcbiAqIENob29zZXMgdGhlIHN0YWJsZSBkaWFnbm9zdGljIGNvZGUgZm9yIG9uZSBmYWlsZWQgbm9taW5hbCB2YWx1ZSBmbG93LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBleHBlY3RlZCAtIERlY2xhcmVkIHBvc2l0aW9uIHR5cGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgZGlhZ25vc3RpYyBjb2RlLlxuICovXG5mdW5jdGlvbiBub21pbmFsTWlzbWF0Y2hDb2RlKGV4cGVjdGVkKSB7XG4gIHJldHVybiBleHBlY3RlZC5raW5kID09IFwiSW50ZXJmYWNlVHlwZVwiID8gXCJJTlRFUkZBQ0VfVFlQRV9NSVNNQVRDSFwiIDogXCJUWVBFX01JU01BVENIXCJcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG9uZSB2YWxpZGF0ZWQgc2VtYW50aWMgdHlwZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgcmVjdXJzaXZlIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiB0eXBlRGVzY3JpcHRpb24odHlwZSkge1xuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiKSByZXR1cm4gdHlwZS5uYW1lXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIGB0eXBlLXZhcmlhYmxlPCR7dHlwZS5wYXJhbWV0ZXJJZH0+YFxuICBpZiAodHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gYHJlY29yZDwke3R5cGUuZGVjbGFyYXRpb25JZH0ke3R5cGUuYXJndW1lbnRzPy5sZW5ndGhcbiAgICA/IGAsICR7dHlwZS5hcmd1bWVudHMubWFwKHR5cGVEZXNjcmlwdGlvbikuam9pbihcIiwgXCIpfWAgOiBcIlwifT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHJldHVybiBgcmVmZXJlbmNlPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJJbnRlcmZhY2VUeXBlXCIpIHJldHVybiBgaW50ZXJmYWNlPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4gYG93bmVkLXJlc291cmNlPCR7dHlwZS5yZXNvdXJjZUlkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGBvd25lZC1yZWZlcmVuY2U8JHt0eXBlLmRlY2xhcmF0aW9uSWR9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiKSByZXR1cm4gYGVycm9yPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gYGxpc3Q8JHt0eXBlRGVzY3JpcHRpb24odHlwZS5lbGVtZW50VHlwZSl9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gYG9wdGlvbmFsPCR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0+YFxuICBpZiAodHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikgcmV0dXJuIGBvcmRlcmVkLW1hcDxzdHJpbmcsICR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0sIGluc2VydGlvbj5gXG5cbiAgcmV0dXJuIGBtYXA8c3RyaW5nLCAke3R5cGVEZXNjcmlwdGlvbih0eXBlLnZhbHVlVHlwZSl9PmBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHR5cGUgZ3JhcGggY29udGFpbnMgbGluZWFyIG93bmVyc2hpcC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gVmlzaXRlZCB0eXBlIGNvbnRhaW5lcnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBvd25lcnNoaXAgb2NjdXJzIGF0IGFueSBkZXB0aC5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNPd25lZFR5cGUodHlwZSwgc2VlbiA9IG5ldyBTZXQoKSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpIHx8IHNlZW4uaGFzKHR5cGUpKSByZXR1cm4gZmFsc2VcbiAgc2Vlbi5hZGQodHlwZSlcbiAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHR5cGUsIFwia2luZFwiKVxuXG4gIGlmIChraW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBraW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB0cnVlXG4gIGlmIChraW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIGNvbnRhaW5zT3duZWRUeXBlKFJlZmxlY3QuZ2V0KHR5cGUsIFwiZWxlbWVudFR5cGVcIiksIHNlZW4pXG4gIGlmIChraW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcInZhbHVlVHlwZVwiKSwgc2VlbilcbiAgaWYgKGtpbmQgPT0gXCJNYXBUeXBlXCIgfHwga2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gY29udGFpbnNPd25lZFR5cGUoUmVmbGVjdC5nZXQodHlwZSwgXCJrZXlUeXBlXCIpLCBzZWVuKSB8fCBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcInZhbHVlVHlwZVwiKSwgc2VlbilcbiAgfVxuICBpZiAoa2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIGNvbnN0IGFyZ3VtZW50c18gPSBSZWZsZWN0LmdldCh0eXBlLCBcImFyZ3VtZW50c1wiKVxuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzXykgJiYgYXJndW1lbnRzXy5zb21lKChhcmd1bWVudCkgPT4gY29udGFpbnNPd25lZFR5cGUoYXJndW1lbnQsIHNlZW4pKVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENoZWNrcyBvbmUgc2NhbGFyIHNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IFtuYW1lXSAtIE9wdGlvbmFsIHJlcXVpcmVkIHNjYWxhci5cbiAqIEByZXR1cm5zIHt0eXBlIGlzIGltcG9ydChcIi4vdHlwZXMuanNcIikuVHlwZVJlZmVyZW5jZX0gV2hldGhlciBpdCBpcyB0aGUgcmVxdWVzdGVkIHNjYWxhci5cbiAqL1xuZnVuY3Rpb24gaXNTY2FsYXJUeXBlKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIiAmJiBpc1NjYWxhclR5cGVOYW1lKHR5cGUubmFtZSkgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlLm5hbWUgPT0gbmFtZSlcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHNvbGUgbm9uLXZhbHVlIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHt0eXBlIGlzIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBXaGV0aGVyIGl0IGlzIHZvaWQuXG4gKi9cbmZ1bmN0aW9uIGlzVm9pZFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiICYmIHR5cGUubmFtZSA9PSBcInZvaWRcIlxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgc2NhbGFyIHR5cGUgZm9yIHRoZSBwcmUtY29sbGVjdGlvbiBvcGVyYXRvciBjb250cmFjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIE9wZXJhbmQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPcGVyYW5kIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0gU2NhbGFyIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNjYWxhck5hbWVGb3JPcGVyYXRpb24odHlwZSwgbG9jYXRpb24sIGZhaWwpIHtcbiAgaWYgKCFpc1NjYWxhclR5cGUodHlwZSkpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTY2FsYXIgb3BlcmF0aW9uIHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKHR5cGUpfS5gLCBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB0eXBlLm5hbWVcbn1cblxuLyoqXG4gKiBFbmZvcmNlcyB0aGF0IGEgdG90YWwgY29sbGVjdGlvbiBhY2Nlc3MgaXMgcHJvdmVuIG9yIHVzZXMgYSBzb3VyY2Ugb3BlcmF0aW9uIHRoYXQgZmFpbHMgb24gYWJzZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5MaXN0SW5kZXhFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NYXBMb29rdXBFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQWNjZXNzLlxuICogQHBhcmFtIHtib29sZWFufSBwcm92ZW4gLSBXaGV0aGVyIHN0YXRpYyBsaXRlcmFsIHByb3BhZ2F0aW9uIHByb3ZlcyBwcmVzZW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdGhpcyBpcyBmcm9udGVuZCBhZG1pc3Npb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBY2Nlc3NUb3RhbGl0eShleHByZXNzaW9uLCBwcm92ZW4sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpIHtcbiAgaWYgKHByb3Zlbikge1xuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnRvdGFsaXR5ID0gXCJwcm92ZW5cIlxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24udG90YWxpdHkgIT0gXCJwcm92ZW5cIiAmJiBleHByZXNzaW9uLnRvdGFsaXR5ICE9IFwiZmFpbC1vbi1hYnNlbmNlXCIpIHtcbiAgICAgIGZhaWwoXCJVTkNIRUNLRURfQ09MTEVDVElPTl9BQ0NFU1NcIiwgXCJDb2xsZWN0aW9uIGFjY2VzcyBsYWNrcyBhIHRvdGFsaXR5IGd1YXJhbnRlZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi50b3RhbGl0eSAhPSBcImZhaWwtb24tYWJzZW5jZVwiKSB7XG4gICAgZmFpbChcIlVOQ0hFQ0tFRF9DT0xMRUNUSU9OX0FDQ0VTU1wiLCBcIkNvbGxlY3Rpb24gYWNjZXNzIGlzIG5vdCBzdGF0aWNhbGx5IHByb3ZlbiBhbmQgZG9lcyBub3QgZmFpbCBvbiBhYnNlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBiaW5kaW5nIHdpdGhvdXQgcHJvZHVjaW5nIGEgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQmluZGluZyBuYW1lLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge0JpbmRpbmcgfCB1bmRlZmluZWR9IEJpbmRpbmcgd2hlbiB2aXNpYmxlLlxuICovXG5mdW5jdGlvbiBmaW5kQmluZGluZyhuYW1lLCBzY29wZSkge1xuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGN1cnJlbnQuYmluZGluZ3MuZ2V0KG5hbWUpXG5cbiAgICBpZiAoYmluZGluZykgcmV0dXJuIGJpbmRpbmdcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGlzdGluZyBiaW5kaW5ncyB3aG9zZSBrbm93biB2YWx1ZXMgbXVzdCBiZSBtZXJnZWQgYWNyb3NzIGEgY29uZGl0aW9uYWwuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7QmluZGluZ1tdfSBOZWFyZXN0LXRvLWZhcnRoZXN0IGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiBiaW5kaW5nc1Zpc2libGVGcm9tKHNjb3BlKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gW11cblxuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgYmluZGluZ3MucHVzaCguLi5jdXJyZW50LmJpbmRpbmdzLnZhbHVlcygpKVxuICB9XG5cbiAgcmV0dXJuIGJpbmRpbmdzXG59XG5cbi8qKlxuICogRmluZHMgdmlzaWJsZSBtdXRhYmxlIGJpbmRpbmdzIHRoYXQgYSBsb29wIGJvZHkgbWF5IGFzc2lnbiBvbiBhbnkgbmVzdGVkIHBhdGguXG4gKiBUaGUgc2V0IGlzIGNvbXB1dGVkIGFmdGVyIHZhbGlkYXRpbmcgdGhlIGxpc3QgZXhwcmVzc2lvbiBiZWNhdXNlIGNvbGxlY3Rpb24gZXZhbHVhdGlvbiBwcmVjZWRlcyBib2R5IGVmZmVjdHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gQ2FuZGlkYXRlIGxvb3AgYm9keS5cbiAqIEBwYXJhbSB7U2NvcGV9IG91dGVyU2NvcGUgLSBTY29wZSB2aXNpYmxlIGJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcC5cbiAqIEBwYXJhbSB7U2V0PEJpbmRpbmc+fSBbYXNzaWduZWRdIC0gQWNjdW11bGF0ZWQgYmluZGluZyBpZGVudGl0aWVzLlxuICogQHJldHVybnMge1NldDxCaW5kaW5nPn0gRXhhY3RseSB0aGUgdmlzaWJsZSBtdXRhYmxlIGJpbmRpbmdzIHRhcmdldGVkIGJ5IG5lc3RlZCBhc3NpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KGJsb2NrLCBvdXRlclNjb3BlLCBhc3NpZ25lZCA9IG5ldyBTZXQoKSkge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gZmluZEJpbmRpbmcoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBvdXRlclNjb3BlKVxuXG4gICAgICBpZiAoYmluZGluZz8ubXV0YWJsZSkgYXNzaWduZWQuYWRkKGJpbmRpbmcpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuY29uc2VxdWVudCwgb3V0ZXJTY29wZSwgYXNzaWduZWQpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5hbHRlcm5hdGUsIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBzdGF0ZW1lbnQuaGFuZGxlcnMgPz8gW10pIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShoYW5kbGVyLmNhdGNoQm9keSwgb3V0ZXJTY29wZSwgYXNzaWduZWQpXG4gICAgICBpZiAoc3RhdGVtZW50LmZpbmFsbHlCb2R5KSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmZpbmFsbHlCb2R5LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXNzaWduZWRcbn1cblxuLyoqXG4gKiBQcm9wYWdhdGVzIG9ubHkgaW1tdXRhYmxlIHZhbHVlcyB3aG9zZSBleGFjdCBjb2xsZWN0aW9uIGNvbnRlbnRzIHJlbWFpbiBrbm93bi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9IEtub3duIHZhbHVlLlxuICovXG5mdW5jdGlvbiBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLCBzY29wZSkge1xuICBpZiAoW1wiSW50ZWdlckxpdGVyYWxcIiwgXCJCb29sZWFuTGl0ZXJhbFwiLCBcIlN0cmluZ0xpdGVyYWxcIiwgXCJMaXN0TGl0ZXJhbFwiLCBcIk1hcExpdGVyYWxcIiwgXCJPcmRlcmVkTWFwTGl0ZXJhbFwiXS5pbmNsdWRlcyhleHByZXNzaW9uLmtpbmQpKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIGZpbmRCaW5kaW5nKGV4cHJlc3Npb24ubmFtZSwgc2NvcGUpPy5rbm93blZhbHVlXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHJldHVybiBwcm92ZW5MaXN0RWxlbWVudChleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlKVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSByZXR1cm4gcHJvdmVuTWFwVmFsdWUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmtleSwgc2NvcGUpXG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBzdGF0aWNhbGx5IHNlbGVjdGVkIGxpc3QgZWxlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdCByZWNlaXZlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBpbmRleCAtIEluZGV4IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkfSBQcm92ZW4gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gcHJvdmVuTGlzdEVsZW1lbnQoY29sbGVjdGlvbiwgaW5kZXgsIHNjb3BlKSB7XG4gIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGNvbGxlY3Rpb24sIHNjb3BlKVxuICBjb25zdCBrbm93bkluZGV4ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oaW5kZXgsIHNjb3BlKVxuXG4gIGlmIChrbm93bkNvbGxlY3Rpb24/LmtpbmQgIT0gXCJMaXN0TGl0ZXJhbFwiIHx8IGtub3duSW5kZXg/LmtpbmQgIT0gXCJJbnRlZ2VyTGl0ZXJhbFwiIHx8XG4gICAga25vd25JbmRleC52YWx1ZSA8IDAgfHwga25vd25JbmRleC52YWx1ZSA+PSBrbm93bkNvbGxlY3Rpb24uZWxlbWVudHMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGtub3duQ29sbGVjdGlvbi5lbGVtZW50c1trbm93bkluZGV4LnZhbHVlXVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBzdGF0aWNhbGx5IHNlbGVjdGVkIG1hcCB2YWx1ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTWFwIHJlY2VpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGtleSAtIEtleSBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0gUHJvdmVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBwcm92ZW5NYXBWYWx1ZShjb2xsZWN0aW9uLCBrZXksIHNjb3BlKSB7XG4gIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGNvbGxlY3Rpb24sIHNjb3BlKVxuICBjb25zdCBrbm93bktleSA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGtleSwgc2NvcGUpXG5cbiAgaWYgKGtub3duQ29sbGVjdGlvbj8ua2luZCAhPSBcIk1hcExpdGVyYWxcIiAmJiBrbm93bkNvbGxlY3Rpb24/LmtpbmQgIT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiIHx8XG4gICAga25vd25LZXk/LmtpbmQgIT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4ga25vd25Db2xsZWN0aW9uLmVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5LmtleS52YWx1ZSA9PSBrbm93bktleS52YWx1ZSk/LnZhbHVlXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBudW1lcmljIHN0cmluZ3MgaW5kZXBlbmRlbnRseSBmcm9tIGFueSB0YXJnZXQncyBrZXkgY29lcmNpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gTGl0ZXJhbCBrZXkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpdCBpcyBudW1lcmljLlxuICovXG5mdW5jdGlvbiBpc051bWVyaWNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIC9eWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/JC9pdS50ZXN0KHZhbHVlLnRyaW0oKSlcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGFuIGV4YWN0IHNlbWFudGljIHRva2VuIGxvY2F0aW9uIHdoZW4gcGFyc2VyIHByb3ZlbmFuY2UgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHt7bG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVByb3ZlbmFuY2U/OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9fSBub2RlIC0gTG9jYXRlZCBzZW1hbnRpYyBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBUb2tlbiByb2xlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IEV4YWN0IG9yIG93bmluZyBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcm9sZUxvY2F0aW9uKG5vZGUsIHJvbGUpIHtcbiAgcmV0dXJuIG5vZGUuc291cmNlUHJvdmVuYW5jZT8ucmFuZ2VzW3JvbGVdID8/IHBhcnNlclJhbmdlRm9yKG5vZGUsIHJvbGUpID8/IG5vZGUubG9jYXRpb25cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBleGFjdCB0eXBlIHRva2VuIG9yIHRoZSBvd25pbmcgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IG93bmVyTG9jYXRpb24gLSBPd25pbmcgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JvbGVdIC0gUmVjdXJzaXZlIHR5cGUgcm9sZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBFeGFjdCB0eXBlIGxvY2F0aW9uIHdoZW4ga25vd24uXG4gKi9cbmZ1bmN0aW9uIHR5cGVMb2NhdGlvbih0eXBlLCBvd25lckxvY2F0aW9uLCByb2xlID0gXCJ0eXBlXCIpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkgcmV0dXJuIG93bmVyTG9jYXRpb25cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSAqLyAodHlwZSlcblxuICByZXR1cm4gY2FuZGlkYXRlLnNvdXJjZVByb3ZlbmFuY2U/LnJhbmdlc1tyb2xlXSA/PyBwYXJzZXJSYW5nZUZvcihjYW5kaWRhdGUsIHJvbGUpID8/XG4gICAgY2FuZGlkYXRlLnNvdXJjZVByb3ZlbmFuY2U/LnJhbmdlcy50eXBlID8/IHBhcnNlclJhbmdlRm9yKGNhbmRpZGF0ZSwgXCJ0eXBlXCIpID8/IG93bmVyTG9jYXRpb25cbn1cblxuLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9uLCB7b3BlcmFuZDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByZXN1bHQ6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0+Pn0gKi9cbmNvbnN0IHVuYXJ5T3BlcmF0aW9uU2lnbmF0dXJlcyA9IE9iamVjdC5mcmVlemUoe1xuICBCb29sZWFuTm90OiBPYmplY3QuZnJlZXplKHtvcGVyYW5kOiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIn0pLFxuICBJbnRlZ2VyTmVnYXRlOiBPYmplY3QuZnJlZXplKHtvcGVyYW5kOiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIn0pXG59KVxuXG4vKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9uLCB7bGVmdDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByaWdodDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByZXN1bHQ6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0+Pn0gKi9cbmNvbnN0IGJpbmFyeU9wZXJhdGlvblNpZ25hdHVyZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgQm9vbGVhbkFuZDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBCb29sZWFuRXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiYm9vbGVhblwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJib29sZWFuXCJ9KSxcbiAgQm9vbGVhbk5vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiYm9vbGVhblwifSksXG4gIEJvb2xlYW5PcjogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBJbnRlZ2VyQWRkOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyR3JlYXRlclRoYW46IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTGVzc1RoYW46IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckxlc3NUaGFuT3JFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTXVsdGlwbHk6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiaW50ZWdlclwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlck5vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJTdWJ0cmFjdDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJpbnRlZ2VyXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBTdHJpbmdDb25jYXQ6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJzdHJpbmdcIiwgcmlnaHQ6IFwic3RyaW5nXCJ9KSxcbiAgU3RyaW5nRXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcInN0cmluZ1wifSksXG4gIFN0cmluZ05vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcInN0cmluZ1wiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJzdHJpbmdcIn0pXG59KVxuXG4vKipcbiAqIFNlbGVjdHMgb25lIHR5cGVkIHVuYXJ5IG1lYW5pbmcgZnJvbSBwYXJzZXItbm9ybWFsaXplZCBzb3VyY2UgaW50ZW50LlxuICogQHBhcmFtIHt1bmtub3dufSBzb3VyY2VPcGVyYXRpb24gLSBUcmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IG9wZXJhbmRUeXBlIC0gUmVzb2x2ZWQgb3BlcmFuZCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBTZW1hbnRpYyBvcGVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuYXJ5T3BlcmF0aW9uKHNvdXJjZU9wZXJhdGlvbiwgb3BlcmFuZFR5cGUsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJOZWdhdGVcIikge1xuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBcImludGVnZXJcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBJbnRlZ2VyIG5lZ2F0aW9uIHJlcXVpcmVzIGludGVnZXI7IHJlY2VpdmVkICR7b3BlcmFuZFR5cGV9LmAsIGxvY2F0aW9uKVxuICAgIHJldHVybiBcIkludGVnZXJOZWdhdGVcIlxuICB9XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJOb3RcIikge1xuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBcImJvb2xlYW5cIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBCb29sZWFuIG5vdCByZXF1aXJlcyBib29sZWFuOyByZWNlaXZlZCAke29wZXJhbmRUeXBlfS5gLCBsb2NhdGlvbilcbiAgICByZXR1cm4gXCJCb29sZWFuTm90XCJcbiAgfVxuXG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biB1bmFyeSBzb3VyY2Ugb3BlcmF0aW9uICR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9LmAsIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIFNlbGVjdHMgb25lIHR5cGVkIGJpbmFyeSBtZWFuaW5nIGZyb20gcGFyc2VyLW5vcm1hbGl6ZWQgc291cmNlIGludGVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gc291cmNlT3BlcmF0aW9uIC0gVHJhbnNpZW50IGZyb250ZW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSBsZWZ0VHlwZSAtIFJlc29sdmVkIGxlZnQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSByaWdodFR5cGUgLSBSZXNvbHZlZCByaWdodCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsZWZ0TG9jYXRpb24gLSBMZWZ0IG9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IHJpZ2h0TG9jYXRpb24gLSBSaWdodCBvcGVyYW5kIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBleHByZXNzaW9uTG9jYXRpb24gLSBXaG9sZSBvcGVyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gU2VtYW50aWMgb3BlcmF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVCaW5hcnlPcGVyYXRpb24oc291cmNlT3BlcmF0aW9uLCBsZWZ0VHlwZSwgcmlnaHRUeXBlLCBsZWZ0TG9jYXRpb24sIHJpZ2h0TG9jYXRpb24sIGV4cHJlc3Npb25Mb2NhdGlvbiwgZmFpbCkge1xuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiUGhwQWRkXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJzdHJpbmdcIiAmJiByaWdodFR5cGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVTlNVUFBPUlRFRF9TWU5UQVhcIiwgXCJQSFAgYmluYXJ5ICsgZG9lcyBub3QgY29uY2F0ZW5hdGUgc3RyaW5nczsgdXNlIC4gaW5zdGVhZC5cIiwgZXhwcmVzc2lvbkxvY2F0aW9uKVxuICAgIH1cblxuICAgIHNvdXJjZU9wZXJhdGlvbiA9IFwiQWRkXCJcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikge1xuICAgIGlmIChsZWZ0VHlwZSAhPSBcInN0cmluZ1wiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYFN0cmluZyBjb25jYXRlbmF0aW9uIHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgY29uY2F0ZW5hdGlvbiByZXF1aXJlcyBzdHJpbmc7IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuICAgIHJldHVybiBcIlN0cmluZ0NvbmNhdFwiXG4gIH1cblxuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiQWRkXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgJiYgcmlnaHRUeXBlID09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJJbnRlZ2VyQWRkXCJcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJzdHJpbmdcIiAmJiByaWdodFR5cGUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiU3RyaW5nQ29uY2F0XCJcblxuICAgIGNvbnN0IGxvY2F0aW9uID0gbGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgfHwgbGVmdFR5cGUgPT0gXCJzdHJpbmdcIiA/IHJpZ2h0TG9jYXRpb24gOiBsZWZ0TG9jYXRpb25cblxuICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYEFkZGl0aW9uIHJlcXVpcmVzIHR3byBpbnRlZ2VycyBvciB0d28gc3RyaW5nczsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0gYW5kICR7cmlnaHRUeXBlfS5gLCBsb2NhdGlvbilcbiAgfVxuXG4gIGNvbnN0IGZpeGVkT3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gICAgQW5kOiBbXCJib29sZWFuXCIsIFwiQm9vbGVhbkFuZFwiXSxcbiAgICBHcmVhdGVyVGhhbjogW1wiaW50ZWdlclwiLCBcIkludGVnZXJHcmVhdGVyVGhhblwiXSxcbiAgICBHcmVhdGVyVGhhbk9yRXF1YWw6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICAgIExlc3NUaGFuOiBbXCJpbnRlZ2VyXCIsIFwiSW50ZWdlckxlc3NUaGFuXCJdLFxuICAgIExlc3NUaGFuT3JFcXVhbDogW1wiaW50ZWdlclwiLCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIl0sXG4gICAgTXVsdGlwbHk6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyTXVsdGlwbHlcIl0sXG4gICAgT3I6IFtcImJvb2xlYW5cIiwgXCJCb29sZWFuT3JcIl0sXG4gICAgU3VidHJhY3Q6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyU3VidHJhY3RcIl1cbiAgfSlcbiAgY29uc3QgZml4ZWQgPSBSZWZsZWN0LmdldChmaXhlZE9wZXJhdGlvbnMsIFN0cmluZyhzb3VyY2VPcGVyYXRpb24pKVxuXG4gIGlmIChmaXhlZCkge1xuICAgIGNvbnN0IFtyZXF1aXJlZFR5cGUsIG9wZXJhdGlvbl0gPSBmaXhlZFxuXG4gICAgaWYgKGxlZnRUeXBlICE9IHJlcXVpcmVkVHlwZSkgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke1N0cmluZyhzb3VyY2VPcGVyYXRpb24pfSByZXF1aXJlcyAke3JlcXVpcmVkVHlwZX07IHJlY2VpdmVkICR7bGVmdFR5cGV9LmAsIGxlZnRMb2NhdGlvbilcbiAgICBpZiAocmlnaHRUeXBlICE9IHJlcXVpcmVkVHlwZSkgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke1N0cmluZyhzb3VyY2VPcGVyYXRpb24pfSByZXF1aXJlcyAke3JlcXVpcmVkVHlwZX07IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gKi8gKG9wZXJhdGlvbilcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJKYXZhRXF1YWxcIiB8fCBzb3VyY2VPcGVyYXRpb24gPT0gXCJKYXZhTm90RXF1YWxcIikge1xuICAgIGlmIChsZWZ0VHlwZSA9PSBcInN0cmluZ1wiIHx8IHJpZ2h0VHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOU1VQUE9SVEVEX1NZTlRBWFwiLCBcIkphdmEgcmVmZXJlbmNlIGVxdWFsaXR5IGlzIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHNlbWFudGljIHN1YnNldC5cIiwgZXhwcmVzc2lvbkxvY2F0aW9uKVxuICAgIH1cblxuICAgIHNvdXJjZU9wZXJhdGlvbiA9IHNvdXJjZU9wZXJhdGlvbiA9PSBcIkphdmFFcXVhbFwiID8gXCJFcXVhbFwiIDogXCJOb3RFcXVhbFwiXG4gIH1cblxuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiU3RyaW5nRXF1YWxcIiB8fCBzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdOb3RFcXVhbFwiKSB7XG4gICAgaWYgKGxlZnRUeXBlICE9IFwic3RyaW5nXCIpIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgU3RyaW5nIGVxdWFsaXR5IHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgZXF1YWxpdHkgcmVxdWlyZXMgc3RyaW5nOyByZWNlaXZlZCAke3JpZ2h0VHlwZX0uYCwgcmlnaHRMb2NhdGlvbilcblxuICAgIHJldHVybiAvKiogQHR5cGUge1wiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIn0gKi8gKHNvdXJjZU9wZXJhdGlvbilcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJFcXVhbFwiIHx8IHNvdXJjZU9wZXJhdGlvbiA9PSBcIk5vdEVxdWFsXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgIT0gcmlnaHRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU01BVENIRURfRVFVQUxJVFlfVFlQRVNcIiwgYEVxdWFsaXR5IHJlcXVpcmVzIG1hdGNoaW5nIHNjYWxhciB0eXBlczsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0gYW5kICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGxlZnRUeXBlID09IFwiaW50ZWdlclwiID8gXCJJbnRlZ2VyXCIgOiBsZWZ0VHlwZSA9PSBcImJvb2xlYW5cIiA/IFwiQm9vbGVhblwiIDogXCJTdHJpbmdcIlxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gKi8gKGAke3ByZWZpeH0ke3NvdXJjZU9wZXJhdGlvbn1gKVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIGJpbmFyeSBzb3VyY2Ugb3BlcmF0aW9uICR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9LmAsIGxlZnRMb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0cmFuc2llbnQgZnJvbnRlbmQgaW50ZW50IHdpdGggdGhlIHB1YmxpYyB0eXBlZCBvcGVyYXRpb24gZmllbGRzLlxuICogQHBhcmFtIHtvYmplY3R9IGV4cHJlc3Npb24gLSBNdXRhYmxlIGFkYXB0ZWQgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gVHlwZWQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCByZXN1bHQgdHlwZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBzZXROb3JtYWxpemVkT3BlcmF0aW9uKGV4cHJlc3Npb24sIG9wZXJhdGlvbiwgdHlwZSkge1xuICBSZWZsZWN0LnNldChleHByZXNzaW9uLCBcIm9wZXJhdGlvblwiLCBvcGVyYXRpb24pXG4gIFJlZmxlY3Quc2V0KGV4cHJlc3Npb24sIFwidHlwZVwiLCB0eXBlKVxufVxuIl19