semantifold 0.9.0 → 0.10.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 (171) hide show
  1. package/README.md +6 -3
  2. package/bin/semantifold.js +6 -0
  3. package/build/bin/semantifold.d.ts +3 -0
  4. package/build/bin/semantifold.d.ts.map +1 -0
  5. package/build/bin/semantifold.js +5 -0
  6. package/build/index.d.ts +8 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +9 -1
  9. package/build/src/artifact-path.d.ts +16 -0
  10. package/build/src/artifact-path.d.ts.map +1 -1
  11. package/build/src/artifact-path.js +29 -3
  12. package/build/src/backends/c-check.d.ts +7 -0
  13. package/build/src/backends/c-check.d.ts.map +1 -0
  14. package/build/src/backends/c-check.js +65 -0
  15. package/build/src/backends/check-plan.d.ts +96 -0
  16. package/build/src/backends/check-plan.d.ts.map +1 -0
  17. package/build/src/backends/check-plan.js +135 -0
  18. package/build/src/backends/cpp-check.d.ts +7 -0
  19. package/build/src/backends/cpp-check.d.ts.map +1 -0
  20. package/build/src/backends/cpp-check.js +59 -0
  21. package/build/src/backends/csharp-check.d.ts +7 -0
  22. package/build/src/backends/csharp-check.d.ts.map +1 -0
  23. package/build/src/backends/csharp-check.js +125 -0
  24. package/build/src/backends/csharp.d.ts +1 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -1
  26. package/build/src/backends/csharp.js +5 -4
  27. package/build/src/backends/dart-check.d.ts +7 -0
  28. package/build/src/backends/dart-check.d.ts.map +1 -0
  29. package/build/src/backends/dart-check.js +103 -0
  30. package/build/src/backends/dart.d.ts +2 -0
  31. package/build/src/backends/dart.d.ts.map +1 -1
  32. package/build/src/backends/dart.js +5 -5
  33. package/build/src/backends/go-check.d.ts +7 -0
  34. package/build/src/backends/go-check.d.ts.map +1 -0
  35. package/build/src/backends/go-check.js +77 -0
  36. package/build/src/backends/go.d.ts +1 -0
  37. package/build/src/backends/go.d.ts.map +1 -1
  38. package/build/src/backends/go.js +3 -3
  39. package/build/src/backends/java-check.d.ts +21 -0
  40. package/build/src/backends/java-check.d.ts.map +1 -0
  41. package/build/src/backends/java-check.js +73 -0
  42. package/build/src/backends/javascript-check.d.ts +7 -0
  43. package/build/src/backends/javascript-check.d.ts.map +1 -0
  44. package/build/src/backends/javascript-check.js +29 -0
  45. package/build/src/backends/kotlin-check.d.ts +7 -0
  46. package/build/src/backends/kotlin-check.d.ts.map +1 -0
  47. package/build/src/backends/kotlin-check.js +31 -0
  48. package/build/src/backends/php-check.d.ts +7 -0
  49. package/build/src/backends/php-check.d.ts.map +1 -0
  50. package/build/src/backends/php-check.js +21 -0
  51. package/build/src/backends/program.d.ts +7 -0
  52. package/build/src/backends/program.d.ts.map +1 -1
  53. package/build/src/backends/program.js +16 -1
  54. package/build/src/backends/python-check.d.ts +7 -0
  55. package/build/src/backends/python-check.d.ts.map +1 -0
  56. package/build/src/backends/python-check.js +28 -0
  57. package/build/src/backends/ruby-check.d.ts +7 -0
  58. package/build/src/backends/ruby-check.d.ts.map +1 -0
  59. package/build/src/backends/ruby-check.js +21 -0
  60. package/build/src/backends/rust-check.d.ts +7 -0
  61. package/build/src/backends/rust-check.d.ts.map +1 -0
  62. package/build/src/backends/rust-check.js +65 -0
  63. package/build/src/backends/swift-check.d.ts +7 -0
  64. package/build/src/backends/swift-check.d.ts.map +1 -0
  65. package/build/src/backends/swift-check.js +77 -0
  66. package/build/src/backends/typescript-check.d.ts +7 -0
  67. package/build/src/backends/typescript-check.d.ts.map +1 -0
  68. package/build/src/backends/typescript-check.js +33 -0
  69. package/build/src/backends/zig-check.d.ts +7 -0
  70. package/build/src/backends/zig-check.d.ts.map +1 -0
  71. package/build/src/backends/zig-check.js +70 -0
  72. package/build/src/diagnostic.d.ts +13 -1
  73. package/build/src/diagnostic.d.ts.map +1 -1
  74. package/build/src/diagnostic.js +14 -2
  75. package/build/src/frontends/program.d.ts +6 -0
  76. package/build/src/frontends/program.d.ts.map +1 -1
  77. package/build/src/frontends/program.js +9 -1
  78. package/build/src/language-registry.d.ts +54 -0
  79. package/build/src/language-registry.d.ts.map +1 -1
  80. package/build/src/language-registry.js +107 -5
  81. package/build/src/project-build.d.ts +172 -0
  82. package/build/src/project-build.d.ts.map +1 -0
  83. package/build/src/project-build.js +320 -0
  84. package/build/src/project-cli.d.ts +40 -0
  85. package/build/src/project-cli.d.ts.map +1 -0
  86. package/build/src/project-cli.js +145 -0
  87. package/build/src/project-manifest.d.ts +148 -0
  88. package/build/src/project-manifest.d.ts.map +1 -0
  89. package/build/src/project-manifest.js +432 -0
  90. package/build/src/project-reporter.d.ts +81 -0
  91. package/build/src/project-reporter.d.ts.map +1 -0
  92. package/build/src/project-reporter.js +293 -0
  93. package/build/src/project-snapshot.d.ts +129 -0
  94. package/build/src/project-snapshot.d.ts.map +1 -0
  95. package/build/src/project-snapshot.js +362 -0
  96. package/build/src/project-watch-reporter.d.ts +125 -0
  97. package/build/src/project-watch-reporter.d.ts.map +1 -0
  98. package/build/src/project-watch-reporter.js +280 -0
  99. package/build/src/project-watch.d.ts +133 -0
  100. package/build/src/project-watch.d.ts.map +1 -0
  101. package/build/src/project-watch.js +839 -0
  102. package/build/src/publication.d.ts +69 -5
  103. package/build/src/publication.d.ts.map +1 -1
  104. package/build/src/publication.js +246 -57
  105. package/build/src/semantic/types.d.ts +303 -2
  106. package/build/src/semantic/types.d.ts.map +1 -1
  107. package/build/src/semantic/types.js +79 -2
  108. package/build/src/subprocess.d.ts +8 -0
  109. package/build/src/subprocess.d.ts.map +1 -1
  110. package/build/src/subprocess.js +50 -9
  111. package/build/src/target-check.d.ts +52 -0
  112. package/build/src/target-check.d.ts.map +1 -0
  113. package/build/src/target-check.js +796 -0
  114. package/build/src/toolchains.d.ts.map +1 -1
  115. package/build/src/toolchains.js +3 -3
  116. package/docs/architecture.md +3 -1
  117. package/docs/c.md +4 -0
  118. package/docs/cpp.md +4 -0
  119. package/docs/dart.md +4 -0
  120. package/docs/generated-artifact-publication.md +11 -8
  121. package/docs/kotlin.md +2 -2
  122. package/docs/language-support.md +29 -3
  123. package/docs/project-build-cli.md +147 -0
  124. package/docs/project-watch.md +60 -0
  125. package/docs/rust.md +4 -0
  126. package/docs/swift.md +2 -0
  127. package/docs/testing.md +70 -3
  128. package/docs/watch-build-pipeline.md +39 -23
  129. package/docs/zig.md +2 -0
  130. package/examples/jsdoc-java-watch/expected-output.txt +3 -0
  131. package/examples/jsdoc-java-watch/semantifold.json +23 -0
  132. package/examples/jsdoc-java-watch/src/main.js +21 -0
  133. package/index.js +8 -0
  134. package/package.json +6 -1
  135. package/src/artifact-path.js +31 -2
  136. package/src/backends/c-check.js +80 -0
  137. package/src/backends/check-plan.js +147 -0
  138. package/src/backends/cpp-check.js +73 -0
  139. package/src/backends/csharp-check.js +139 -0
  140. package/src/backends/csharp.js +4 -3
  141. package/src/backends/dart-check.js +117 -0
  142. package/src/backends/dart.js +4 -4
  143. package/src/backends/go-check.js +89 -0
  144. package/src/backends/go.js +2 -2
  145. package/src/backends/java-check.js +77 -0
  146. package/src/backends/javascript-check.js +33 -0
  147. package/src/backends/kotlin-check.js +41 -0
  148. package/src/backends/php-check.js +23 -0
  149. package/src/backends/program.js +17 -0
  150. package/src/backends/python-check.js +30 -0
  151. package/src/backends/ruby-check.js +23 -0
  152. package/src/backends/rust-check.js +78 -0
  153. package/src/backends/swift-check.js +89 -0
  154. package/src/backends/typescript-check.js +37 -0
  155. package/src/backends/zig-check.js +81 -0
  156. package/src/diagnostic.js +9 -1
  157. package/src/frontends/program.js +9 -0
  158. package/src/language-registry.js +113 -4
  159. package/src/project-build.js +353 -0
  160. package/src/project-cli.js +155 -0
  161. package/src/project-manifest.js +479 -0
  162. package/src/project-reporter.js +320 -0
  163. package/src/project-snapshot.js +403 -0
  164. package/src/project-watch-reporter.js +303 -0
  165. package/src/project-watch.js +870 -0
  166. package/src/publication.js +275 -58
  167. package/src/semantic/types.js +87 -1
  168. package/src/subprocess.js +49 -8
  169. package/src/target-check.js +844 -0
  170. package/src/toolchains.js +3 -2
  171. package/tsconfig.json +1 -1
@@ -151,6 +151,12 @@
151
151
  * @property {readonly AcceptanceStage[]} stages - Applicable ordered acceptance stages.
152
152
  * @property {readonly string[]} toolchains - Required canonical toolchain IDs.
153
153
  */
154
+ /**
155
+ * @typedef LanguageCheckCapabilities
156
+ * @property {boolean} supported - Whether the target owns a developer check plan.
157
+ * @property {readonly AcceptanceStage[]} stages - Ordered non-executing developer-check stages.
158
+ * @property {readonly string[]} toolchains - Exact canonical tools required to construct the plan.
159
+ */
154
160
  /**
155
161
  * @typedef LanguageFeatureCapabilities
156
162
  * @property {boolean} generalFunctionsAndCalls - Task 005 arbitrary required signatures, resolved direct calls, and void functions.
@@ -174,6 +180,7 @@
174
180
  * @property {Readonly<LanguageFeatureCapabilities>} features - Semantic feature capabilities.
175
181
  * @property {Readonly<LanguageMappingCapabilities>} mapping - Mapping forms.
176
182
  * @property {Readonly<LanguageAcceptanceCapabilities>} acceptance - Stages and toolchains.
183
+ * @property {Readonly<LanguageCheckCapabilities>} check - Non-executing developer-check capability.
177
184
  */
178
185
  /**
179
186
  * @typedef SourcePoint
@@ -378,9 +385,13 @@
378
385
  */
379
386
  /**
380
387
  * @typedef PublicationRequest
381
- * @property {string} generationId - Unique explicit generation/cycle identity.
388
+ * @property {string} generationId - Explicit generation/cycle identity, fresh or an exact retained validator-free candidate.
382
389
  * @property {readonly PublicationTargetInput[]} targets - Complete ordered project targets.
383
390
  */
391
+ /**
392
+ * @typedef PublicationOptions
393
+ * @property {AbortSignal} [signal] - Cancellation authority through the active-pointer commit boundary.
394
+ */
384
395
  /**
385
396
  * @typedef GenerationContentHash
386
397
  * @property {"sha256"} algorithm - Hash algorithm.
@@ -448,6 +459,72 @@
448
459
  * @property {string} versionOutput - Complete normalized stdout, or normalized stderr when stdout is empty.
449
460
  * @property {readonly string[]} versionArguments - Exact version argument array.
450
461
  */
462
+ /**
463
+ * @typedef TargetCheckPathArgument
464
+ * @property {number} index - Exact argv index containing the path.
465
+ * @property {"source" | "build"} ownership - Candidate subtree that owns the path.
466
+ * @property {string} [prefix] - Exact non-path argv prefix preceding an owned absolute path.
467
+ */
468
+ /**
469
+ * @typedef TargetCheckEnvironmentPath
470
+ * @property {string} name - Exact environment variable containing an owned absolute path.
471
+ * @property {"source" | "build" | "tool"} ownership - Candidate subtree or discovered tool that owns the path.
472
+ * @property {DiscoveredToolchain} [tool] - Exact tool executable bound by a tool-owned environment value.
473
+ */
474
+ /**
475
+ * @typedef TargetCheckOutputOwnership
476
+ * @property {"build"} ownership - Compiler outputs belong only to the candidate build subtree.
477
+ * @property {string} path - Exact generation-scoped build root.
478
+ * @property {string} mediaType - Media type assigned to every produced regular file.
479
+ * @property {string} role - Language-neutral compiler-output role.
480
+ */
481
+ /**
482
+ * @typedef TargetCheckStageRequest
483
+ * @property {AcceptanceStage} stage - Declared non-executing acceptance stage.
484
+ * @property {DiscoveredToolchain} tool - Exact immutable discovered tool record.
485
+ * @property {string} executable - Exact executable copied from the tool record.
486
+ * @property {readonly string[]} argv - Exact shell-free argument vector.
487
+ * @property {readonly TargetCheckPathArgument[]} pathArguments - Complete ownership declaration for argv paths.
488
+ * @property {string} cwd - Exact candidate-scoped working directory.
489
+ * @property {Readonly<Record<string, string>>} environment - Exact deterministic environment.
490
+ * @property {readonly TargetCheckEnvironmentPath[]} environmentPaths - Owned absolute environment paths.
491
+ * @property {string | null} inputHash - SHA-256 of declared restore inputs, or null for unconditional stages.
492
+ * @property {readonly string[]} inputs - Complete staged artifact inputs read by the stage.
493
+ * @property {Readonly<TargetCheckOutputOwnership> | null} output - Build output ownership, or null for non-producing checks.
494
+ * @property {readonly string[]} transientPaths - Candidate source/build cache or intermediate directories removed after checking.
495
+ */
496
+ /**
497
+ * @typedef TargetCheckPlan
498
+ * @property {"SemantifoldTargetCheckPlan"} schema - Plan schema discriminator.
499
+ * @property {1} version - Plan schema version.
500
+ * @property {"developer-check"} mode - Non-executing developer-check mode.
501
+ * @property {string} projectId - Exact project identity.
502
+ * @property {string} targetId - Exact project target identity.
503
+ * @property {string} target - Registered backend target identity.
504
+ * @property {string} sourcePath - Exact staged generated-source root.
505
+ * @property {string} buildPath - Exact staged compiler-output root.
506
+ * @property {readonly string[]} artifactPaths - Exact staged artifact paths.
507
+ * @property {readonly TargetCheckStageRequest[]} stages - Ordered target-owned requests.
508
+ */
509
+ /**
510
+ * @typedef TargetCheckStageResult
511
+ * @property {AcceptanceStage} stage - Completed stage identity.
512
+ * @property {Readonly<{command: string, executable: string, id: string, source: "override" | "canonical", version: string}>} tool - Exact tool identity.
513
+ * @property {readonly string[]} argv - Exact executed argument vector.
514
+ * @property {number} exitCode - Successful process exit code.
515
+ * @property {null} signal - Successful process signal state.
516
+ * @property {string} stdout - Bounded captured standard output.
517
+ * @property {string} stderr - Bounded captured standard error.
518
+ * @property {number} durationMs - Non-negative stage duration.
519
+ */
520
+ /**
521
+ * @typedef TargetCheckResult
522
+ * @property {string} projectId - Exact project identity.
523
+ * @property {string} targetId - Exact project target identity.
524
+ * @property {string} target - Registered backend target identity.
525
+ * @property {readonly TargetCheckStageResult[]} stages - Ordered successful stage evidence.
526
+ * @property {readonly PublicationBuildArtifactInput[]} outputs - Complete compiler-owned build files.
527
+ */
451
528
  /**
452
529
  * @typedef AcceptanceStageResult
453
530
  * @property {AcceptanceStage} stage - Completed stage.
@@ -1220,4 +1297,4 @@
1220
1297
  /** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
1221
1298
  /** @typedef {SemanticNode} SemanticNodeWithoutLocations */
1222
1299
  export {};
1223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLGtMQUFrTDtBQUNsTCxzREFBc0Q7QUFDdEQsOEZBQThGO0FBQzlGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILDhEQUE4RDtBQUU5RDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILGtIQUFrSDtBQUVsSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSCxtTEFBbUw7QUFFbkwseUVBQXlFO0FBRXpFOzs7Ozs7OztHQVFHO0FBRUg7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSCxvTUFBb007QUFDcE0sbUVBQW1FO0FBRW5FOzs7OztHQUtHO0FBRUgsNEZBQTRGO0FBRTVGLDhvQkFBOG9CO0FBQzlvQiwwRUFBMEU7QUFFMUU7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7R0FJRztBQUVILDJLQUEySztBQUUzSzs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsb0ZBQW9GO0FBQ3BGLDZOQUE2TjtBQUM3TixxREFBcUQ7QUFDckQsNFBBQTRQO0FBQzVQLDJZQUEyWTtBQUMzWSx3S0FBd0s7QUFDeEssd0lBQXdJO0FBQ3hJLCtTQUErUztBQUUvUzs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVILG1pQkFBbWlCO0FBRW5pQjs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgsdUVBQXVFO0FBQ3ZFLDZRQUE2UTtBQUU3UTs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgsd2pCQUF3akI7QUFDeGpCLDJEQUEyRDtBQUUzRCxPQUFPLEVBQUUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKiogQHR5cGVkZWYge1wicGhwXCIgfCBcInJ1YnlcIiB8IFwiamF2YXNjcmlwdFwiIHwgXCJ0eXBlc2NyaXB0XCIgfCBcImphdmFcIiB8IFwia290bGluXCIgfCBcInB5dGhvblwiIHwgXCJjc2hhcnBcIiB8IFwiZ29cIiB8IFwiY1wiIHwgXCJjcHBcIiB8IFwicnVzdFwiIHwgXCJzd2lmdFwiIHwgXCJkYXJ0XCIgfCBcInppZ1wifSBTZW1hbnRpY0xhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2V9IFRleHRCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7VGV4dEJhY2tlbmRMYW5ndWFnZSB8IFwid2FzbVwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwiIHwgXCJmbHV0dGVyXCJ9IEJhY2tlbmRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY0xhbmd1YWdlIHwgXCJodG1sXCJ9IEdlbmVyYXRlZFRleHRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImludGVnZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJzdHJpbmdcIn0gU2VtYW50aWNUeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwgXCJ2b2lkXCJ9IEZ1bmN0aW9uUmV0dXJuVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyTmVnYXRlXCIgfCBcIkJvb2xlYW5Ob3RcIn0gU2VtYW50aWNVbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJBZGRcIiB8IFwiSW50ZWdlclN1YnRyYWN0XCIgfCBcIkludGVnZXJNdWx0aXBseVwiIHwgXCJCb29sZWFuQW5kXCIgfCBcIkJvb2xlYW5PclwiIHwgXCJJbnRlZ2VyRXF1YWxcIiB8IFwiSW50ZWdlck5vdEVxdWFsXCIgfCBcIkJvb2xlYW5FcXVhbFwiIHwgXCJCb29sZWFuTm90RXF1YWxcIiB8IFwiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIiB8IFwiSW50ZWdlckxlc3NUaGFuXCIgfCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIiB8IFwiU3RyaW5nQ29uY2F0XCJ9IFNlbWFudGljQmluYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiY2FwYWJpbGl0eVwiIHwgXCJyZXNvdXJjZVwiIHwgXCJmYWlsdXJlXCIgfCBcIm9wZXJhdGlvblwiIHwgXCJyZWNvcmRcIiB8IFwiY2xhc3NcIiB8IFwiZXJyb3JcIiB8IFwiZmllbGRcIiB8IFwiY29uc3RydWN0b3JcIiB8IFwibWV0aG9kXCIgfCBcImZ1bmN0aW9uXCIgfCBcInR5cGVQYXJhbWV0ZXJcIiB8IFwicGFyYW1ldGVyXCIgfCBcImxvY2FsXCIgfCBcIml0ZXJhdGlvblwiIHwgXCJjYXRjaFwifSBTZW1hbnRpY1N5bWJvbEtpbmQgKi9cbi8qKiBAdHlwZWRlZiB7XCJyZWNvcmRcIiB8IFwiY2xhc3NcIiB8IFwiZXJyb3JcIiB8IFwiZnVuY3Rpb25cIn0gU2VtYW50aWNEZWNsYXJhdGlvbktpbmQgKi9cbi8qKiBAdHlwZWRlZiB7XCJkZWNsYXJhdGlvblwiIHwgXCJ0eXBlXCIgfCBcImNvbnN0cnVjdFwiIHwgXCJtZW1iZXJcIiB8IFwicmVhZFwiIHwgXCJ3cml0ZVwiIHwgXCJjYWxsXCJ9IFNlbWFudGljU3ltYm9sUm9sZSAqL1xuLyoqIEB0eXBlZGVmIHtcInBhcnNlXCIgfCBcImdlbmVyYXRlXCIgfCBcInJlc3RvcmVcIiB8IFwiY29tcGlsZVwiIHwgXCJsaW5rXCIgfCBcInZhbGlkYXRlXCIgfCBcImluc3RhbnRpYXRlXCIgfCBcImV4ZWN1dGVcIn0gQWNjZXB0YW5jZVN0YWdlICovXG4vKiogQHR5cGVkZWYge1wiZW50cnlcIiB8IFwic291cmNlXCIgfCBcIm1hbmlmZXN0XCIgfCBcInN1cHBvcnRcIiB8IFwibWFwcGluZ1wiIHwgXCJyZXNvdXJjZVwiIHwgXCJsb2FkZXJcIn0gR2VuZXJhdGVkQXJ0aWZhY3RSb2xlICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFNhZmUgWGNvZGUgcHJvZHVjdC9wYXRoIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBTYWZlIFN3aWZ0IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb25QcmVmaXggLSBDYWxsZXItc3VwcGxpZWQgcmV2ZXJzZS1ETlMgb3JnYW5pemF0aW9uIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZGVudGlmaWVyIC0gQ2FsbGVyLXN1cHBsaWVkIHJldmVyc2UtRE5TIGFwcGxpY2F0aW9uIGJ1bmRsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXBsb3ltZW50VGFyZ2V0IC0gQ2FsbGVyLXN1cHBsaWVkIG1ham9yLm1pbm9yIGlPUyBkZXBsb3ltZW50IHRhcmdldDsgbmV2ZXIgaW5mZXJyZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJTb3VyY2VzXCJ9IFtzb3VyY2VSb290XSAtIEZpeGVkIGdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJBc3NldHMueGNhc3NldHNcIn0gW3Jlc291cmNlUm9vdF0gLSBGaXhlZCBjYWxsZXItcmVzb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJzd2lmdHVpXCJ9IFtsaWZlY3ljbGVdIC0gU29sZSBzdXBwb3J0ZWQgbGlmZWN5Y2xlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBuZXZlcj59IFtpbmZvUGxpc3RdIC0gQ2xvc2VkIGJhc2VsaW5lIGNhbGxlciBwbGlzdCBleHRlbnNpb247IGN1cnJlbnRseSBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcGVybWlzc2lvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW2VudGl0bGVtZW50c10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBlbnRpdGxlbWVudHMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3ByaXZhY3lEZWNsYXJhdGlvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgcHJpdmFjeSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW2NhcGFiaWxpdGllc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBBcHBsZSBjYXBhYmlsaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFZhbGlkYXRlZCBYY29kZSBwcm9kdWN0L3BhdGggaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlTmFtZSAtIFZhbGlkYXRlZCBTd2lmdCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uUHJlZml4IC0gVmFsaWRhdGVkIHJldmVyc2UtRE5TIG9yZ2FuaXphdGlvbiBwcmVmaXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWRlbnRpZmllciAtIFZhbGlkYXRlZCByZXZlcnNlLUROUyBhcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVwbG95bWVudFRhcmdldCAtIFZhbGlkYXRlZCBjYWxsZXItc3VwcGxpZWQgZGVwbG95bWVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBWYWxpZGF0ZWQgZGlzcGxheSBuYW1lLlxuICogQHByb3BlcnR5IHtcIlNvdXJjZXNcIn0gc291cmNlUm9vdCAtIEdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJBc3NldHMueGNhc3NldHNcIn0gcmVzb3VyY2VSb290IC0gQ2FsbGVyLXJlc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wic3dpZnR1aVwifSBsaWZlY3ljbGUgLSBTb2xlIHN1cHBvcnRlZCBsaWZlY3ljbGUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG5ldmVyPj59IGluZm9QbGlzdCAtIEVtcHR5IGNhbGxlciBwbGlzdCBleHRlbnNpb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IHBlcm1pc3Npb25zIC0gRW1wdHkgYmFzZWxpbmUgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IGVudGl0bGVtZW50cyAtIEVtcHR5IGJhc2VsaW5lIGVudGl0bGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gcHJpdmFjeURlY2xhcmF0aW9ucyAtIEVtcHR5IGJhc2VsaW5lIHByaXZhY3kgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBjYXBhYmlsaXRpZXMgLSBFbXB0eSBiYXNlbGluZSBBcHBsZSBjYXBhYmlsaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkFzc2V0SW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gRnVsbCBzYWZlIGRlc3RpbmF0aW9uIGJlbG93IEFzc2V0cy54Y2Fzc2V0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIEV4YWN0IGNhbGxlci1wcm92aWRlZCB0ZXh0IG9yIGJ5dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEV4cGxpY2l0IGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2hhMjU2IC0gTG93ZXJjYXNlIFNIQS0yNTYgb2YgZXhhY3QgVVRGLTggdGV4dCBvciBieXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthcHBsaWNhdGlvbklkXSAtIExvd2VyY2FzZSByZXZlcnNlLUROUyBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lc3BhY2VdIC0gS290bGluL0FuZHJvaWQgbmFtZXNwYWNlOyBkZWZhdWx0cyB0byBhcHBsaWNhdGlvbklkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBHZW5lcmF0ZWQgS290bGluIHBhY2thZ2U7IGRlZmF1bHRzIHRvIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aXZpdHlDbGFzc05hbWVdIC0gTGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJvZHVjdE5hbWVdIC0gRGV0ZXJtaW5pc3RpYyBwcm9qZWN0IHByb2R1Y3QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlzcGxheU5hbWVdIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gW21pbmltdW1TZGtdIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbdGFyZ2V0U2RrXSAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbY29tcGlsZVNka10gLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gW2J1aWxkVG9vbHNWZXJzaW9uXSAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcnNpb25Db2RlXSAtIFBvc2l0aXZlIEFuZHJvaWQgdmVyc2lvbiBjb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJzaW9uTmFtZV0gLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcInVuc3BlY2lmaWVkXCJ9IFtvcmllbnRhdGlvbl0gLSBCYXNlbGluZSBvcmllbnRhdGlvbiBiZWhhdmlvci5cbiAqIEBwcm9wZXJ0eSB7XCJzeXN0ZW1cIn0gW3RoZW1lXSAtIEJhc2VsaW5lIHBsYXRmb3JtLW5hdGl2ZSB0aGVtZS5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcGVybWlzc2lvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgcGVybWlzc2lvbiBzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwbGljYXRpb25JZCAtIFZhbGlkYXRlZCBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVzcGFjZSAtIFZhbGlkYXRlZCBBbmRyb2lkIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlTmFtZSAtIEdlbmVyYXRlZCBLb3RsaW4gcGFja2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpdml0eUNsYXNzTmFtZSAtIExhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBQcm9qZWN0IHByb2R1Y3QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IG1pbmltdW1TZGsgLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IHRhcmdldFNkayAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBjb21waWxlU2RrIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IGJ1aWxkVG9vbHNWZXJzaW9uIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFBvc2l0aXZlIEFuZHJvaWQgdmVyc2lvbiBjb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25OYW1lIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJ1bnNwZWNpZmllZFwifSBvcmllbnRhdGlvbiAtIEJhc2VsaW5lIG9yaWVudGF0aW9uIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtcInN5c3RlbVwifSB0aGVtZSAtIFBsYXRmb3JtLW5hdGl2ZSB0aGVtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbklucHV0RmlsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBTYWZlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGVkIGZpeGVkIEFuZHJvaWQgcmVzb3VyY2Ugb3IgYXNzZXQgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIEV4YWN0IGNhbGxlci1wcm92aWRlZCB0ZXh0IG9yIGJ5dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEV4cGxpY2l0IGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2hhMjU2IC0gTG93ZXJjYXNlIFNIQS0yNTYgb2YgZXhhY3QgVVRGLTggdGV4dCBvciBieXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZsdXR0ZXJBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBMb3dlcmNhc2UgRGFydCBwYWNrYWdlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtvcmdhbml6YXRpb25dIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIG93bmluZyBvcmdhbml6YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FwcGxpY2F0aW9uSWRdIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkgZXh0ZW5kaW5nIHRoZSBvcmdhbml6YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FjdGl2aXR5Q2xhc3NOYW1lXSAtIEdlbmVyYXRlZCBKYXZhIGxhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpc3BsYXlOYW1lXSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IFttaW5pbXVtU2RrXSAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW3RhcmdldFNka10gLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW2NvbXBpbGVTZGtdIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IFtidWlsZFRvb2xzVmVyc2lvbl0gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJzaW9uQ29kZV0gLSBQb3NpdGl2ZSBBbmRyb2lkL0ZsdXR0ZXIgYnVpbGQgbnVtYmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJzaW9uTmFtZV0gLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBwZXJtaXNzaW9uIHNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZsdXR0ZXJBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlTmFtZSAtIFZhbGlkYXRlZCBEYXJ0IHBhY2thZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uIC0gVmFsaWRhdGVkIG93bmluZyBvcmdhbml6YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwbGljYXRpb25JZCAtIFZhbGlkYXRlZCBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5Q2xhc3NOYW1lIC0gR2VuZXJhdGVkIEphdmEgbGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IG1pbmltdW1TZGsgLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IHRhcmdldFNkayAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBjb21waWxlU2RrIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IGJ1aWxkVG9vbHNWZXJzaW9uIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFBvc2l0aXZlIEFuZHJvaWQvRmx1dHRlciBidWlsZCBudW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk5hbWUgLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQXNzZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBTYWZlIHBhdGggYmVsb3cgdGhlIGdlbmVyYXRlZCBGbHV0dGVyIGFzc2V0cyByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSb2xlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZyb250ZW5kIC0gUGFyc2VyIGFkYXB0ZXIgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0ZXh0QmFja2VuZCAtIFNpbmdsZS0gb3IgbXVsdGktZmlsZSB0ZXh0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBiaW5hcnlCYWNrZW5kIC0gQmluYXJ5IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBhcHBsaWNhdGlvbkJhY2tlbmQgLSBBcHBsaWNhdGlvbi1hcnRpZmFjdCBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW50ZXJvcGVyYWJpbGl0eSAtIEludGVyb3BlcmFiaWxpdHkgYnJpZGdlIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJvdmlkZXIgLSBUYXJnZXQgaG9zdCBzdGRsaWIgcHJvdmlkZXIvbmF0aXZlLWJpbmRpbmcgYXZhaWxhYmlsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJpY2hUZXh0IC0gQXV0aG9yaXRhdGl2ZSByaWNoIHRleHQgbWFwcGluZ3MuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNvdXJjZU1hcFYzIC0gU291cmNlIE1hcCB2MyBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBiaW5hcnlSYW5nZXMgLSBCeXRlLWNvb3JkaW5hdGUgYmluYXJ5L3Jlc291cmNlIG1hcHBpbmdzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVtdfSBzdGFnZXMgLSBBcHBsaWNhYmxlIG9yZGVyZWQgYWNjZXB0YW5jZSBzdGFnZXMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB0b29sY2hhaW5zIC0gUmVxdWlyZWQgY2Fub25pY2FsIHRvb2xjaGFpbiBJRHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzIC0gVGFzayAwMDUgYXJiaXRyYXJ5IHJlcXVpcmVkIHNpZ25hdHVyZXMsIHJlc29sdmVkIGRpcmVjdCBjYWxscywgYW5kIHZvaWQgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW11dGFibGVDb2xsZWN0aW9ucyAtIFRhc2sgMDA2IHJlY3Vyc2l2ZSBpbW11dGFibGUgbGlzdHMvbWFwcywgdG90YWwgYWNjZXNzLCBhbmQgc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9uYWxWYWx1ZXMgLSBUYXNrIDAwNyBleHBsaWNpdCBvcHRpb25hbCB2YWx1ZXMsIHByZXNlbmNlIHRlc3RzLCBhbmQgZ3VhcmRlZCB1bndyYXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRMaXN0SXRlcmF0aW9uIC0gVGFzayAwMDggb3JkZXJlZCBpbW11dGFibGUtbGlzdCBpdGVyYXRpb24gYW5kIG5lYXJlc3QtbG9vcCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcmRlcmVkTWFwSXRlcmF0aW9uIC0gVGFzayAwMTQgaW5zZXJ0aW9uLW9yZGVyZWQgaW1tdXRhYmxlLW1hcCBwYWlyIGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZGl0aW9uQ29udHJvbGxlZExvb3BzIC0gVGFzayAwMzIgc3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wcyBhbmQgcmVzb2x2ZWQgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2xvc2VkUmVjb3JkcyAtIFRhc2sgMDA5IG5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmRzLCBjb25zdHJ1Y3Rpb24sIGFuZCBtZW1iZXIgcmVhZHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVkRXJyb3JzIC0gVGFzayAwMTEgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3JzLCByYWlzZXMsIGFuZCBleGFjdCB0eXBlZCBjYXRjaGVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzIC0gVGFzayAwMTIgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMgYW5kIGNsb3NlZCBnZW5lcmljIGFwcGxpY2F0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVmZXJlbmNlQ2xhc3NlcyAtIFRhc2sgMDMzIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMsIHByaXZhdGUgaW5zdGFuY2Ugc3RhdGUsIGV4YWN0IGNvbnN0cnVjdG9ycywgYW5kIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlcyAtIFRhc2sgMDM0IGF1dGhvcml6ZWQgaG9zdCBlZmZlY3RzLCB0eXBlZCBmYWlsdXJlcywgYW5kIG93bmVkIHJlc291cmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTdGFibGUgcmVnaXN0cnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlUm9sZUNhcGFiaWxpdGllcz59IHJvbGVzIC0gSW5kZXBlbmRlbnRseSByZWdpc3RlcmVkIHJvbGVzLlxuICogQHByb3BlcnR5IHtcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwifSBhcnRpZmFjdE11bHRpcGxpY2l0eSAtIFRhcmdldCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFdoZXRoZXIgZnJvbnRlbmQvYmFja2VuZCByb3VuZC10cmlwIGFjY2VwdGFuY2UgaXMgZGVjbGFyZWQuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllcz59IGZlYXR1cmVzIC0gU2VtYW50aWMgZmVhdHVyZSBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllcz59IG1hcHBpbmcgLSBNYXBwaW5nIGZvcm1zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXM+fSBhY2NlcHRhbmNlIC0gU3RhZ2VzIGFuZCB0b29sY2hhaW5zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lIC0gT25lLWJhc2VkIGxpbmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29sdW1uIC0gT25lLWJhc2VkIFVURi0xNiBjb2RlLXVuaXQgY29sdW1uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IHNvdXJjZSBvZmZzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VMb2NhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBzdGFydCAtIEluY2x1c2l2ZSBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IGVuZCAtIEV4Y2x1c2l2ZSBlbmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWdpc3RlcmVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBSZWdpc3RyeS1sb2NhbCBkZXRlcm1pbmlzdGljIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmFsIGZpbGVuYW1lLCBwcmVzZXJ2ZWQgdmVyYmF0aW0uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBPcmlnaW5hbCBzb3VyY2UgY29udGVudCwgcHJlc2VydmVkIHZlcmJhdGltIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBQYXJzZXIgbGFuZ3VhZ2Ugd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7XCJhcHBsaWNhdGlvblwiIHwgXCJmYWNhZGVcIn0gW293bmVyc2hpcF0gLSBDYWxsZXIgb3IgY29tcGlsZXItb3duZWQgc291cmNlIHJvbGUgZm9yIHNlbWFudGljIHByb2dyYW1zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic291cmNlXCJ9IGtpbmQgLSBEaXJlY3Qgc291cmNlIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3Qgb3JpZ2luYWwgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWxhdGVkT3JpZ2luXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUmVsYXRlZCBvcmlnaW5hbCByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gUmVsYXRpb25zaGlwIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBEZXJpdmVkT3JpZ2luXG4gKiBAcHJvcGVydHkge1wiZGVyaXZlZFwifSBraW5kIC0gUHJvdmVuYW5jZSBkZXJpdmVkIGZyb20gb25lIG9yIG1vcmUgb3JpZ2lucy5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSBvcmlnaW5zIC0gT3JkZXJlZCwgbm9uLWVtcHR5IG9yaWdpbmFsIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN5bnRoZXRpY09yaWdpblxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU291cmNlLWZyZWUgZ2VuZXJhdGVkIG9yIHNlbWFudGljIHNjYWZmb2xkaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSBodW1hbi1yZWFkYWJsZSByZWFzb24uXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBPcmRlcmVkIHJlbGF0ZWQgcmFuZ2VzLCBwb3NzaWJseSBlbXB0eS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NvdXJjZU9yaWdpbiB8IERlcml2ZWRPcmlnaW4gfCBTeW50aGV0aWNPcmlnaW59IFNlbWFudGljT3JpZ2luICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQnl0ZVJhbmdlXG4gKiBAcHJvcGVydHkge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IGdlbmVyYXRlZCAtIEhhbGYtb3BlbiBnZW5lcmF0ZWQgYnl0ZSBvZmZzZXRzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gU2VtYW50aWMgb3IgZXhwbGljaXQgc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBPcmlnaW5hdGluZyBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBPcmlnaW5hdGluZyBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgb3IgYmluYXJ5LXJlZ2lvbiByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRCeXRlTWFwcGluZ1xuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJieXRlc1wifSBjb29yZGluYXRlU3lzdGVtIC0gR2VuZXJhdGVkIG9mZnNldHMgYXJlIGJ5dGVzLCBuZXZlciB0ZXh0IGNvbHVtbnMuXG4gKiBAcHJvcGVydHkge3twYXRoOiBzdHJpbmcsIGJ5dGVMZW5ndGg6IG51bWJlcn19IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBhcnRpZmFjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGVkQnl0ZVJhbmdlW119IHJhbmdlcyAtIE9yZGVyZWQgbm9uLW92ZXJsYXBwaW5nIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE5vZGVQcm92ZW5hbmNlXCJ9IHNjaGVtYSAtIEFzc29jaWF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBBc3NvY2lhdGlvbiB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gU291cmNlIGFzc29jaWF0aW9uIGluZGVwZW5kZW50IG9mIHRyYXZlcnNhbCBwb3NpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBKU09OIFBvaW50ZXIgZnJvbSB0aGUgc2VtYW50aWMgbW9kdWxlIHJvb3QuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVtcImtpbmRcIl0gfCBcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFNlbWFudGljIG5vZGUga2luZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBwcm92ZW5hbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVzb2x2ZWQgZGVjbGFyZWQvcmVmZXJlbmNlZCBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5vZGVJZCAtIFJlZmVycmluZyBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFJvbGV9IHJvbGUgLSBSZWZlcmVuY2Ugcm9sZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgcmVmZXJlbmNlIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNlbWFudGljIHN5bWJvbCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbEtpbmR9IGtpbmQgLSBTeW1ib2wgY2F0ZWdvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25Ob2RlSWQgLSBEZWNsYXJpbmcgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VtYW50aWNEZWNsYXJhdGlvbklkXSAtIFN0YWJsZSBzZW1hbnRpYyBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgcmVjb3JkLCBmaWVsZCwgYW5kIGZ1bmN0aW9uIHN5bWJvbHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUmVmZXJlbmNlW119IHJlZmVyZW5jZXMgLSBPcmRlcmVkIHJlc29sdmVkIHJlZmVyZW5jZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gVmVyc2lvbmVkIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIERldGVybWluaXN0aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBEZXRlcm1pbmlzdGljIHN5bWJvbCBpbmRleC5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCIgfCBcInN5bnRoZXRpY1wifSBNYXBwaW5nS2luZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1NwYW5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBoYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcHJvcGVydHkge01hcHBpbmdLaW5kfSBtYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIG9yaWdpbmFsIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBub2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBVc2VmdWwgc3ltYm9sIG5hbWUgZm9yIFNvdXJjZSBNYXAgdjMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkVGV4dExhbmd1YWdlfSBsYW5ndWFnZSAtIE91dHB1dCB0ZXh0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnQgLSBFeGFjdCBnZW5lcmF0ZWQgTEYgc291cmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZFNvdXJjZX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIHByb2dyYW0gaWRlbnRpdHkgYW5kIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIE9yaWdpbmFsIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIENhbm9uaWNhbCBzZW1hbnRpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIENhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIGdlbmVyYXRlZCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvZGUgLSBHZW5lcmF0ZWQgb3V0cHV0IHByb2dyYW0sIGluY2x1ZGluZyBhbnkgcmVxdWVzdGVkIGRpcmVjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIEdlbmVyYXRlZCBvdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIHJpY2ggbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gU291cmNlIE1hcCB2MyBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZU1hcEZpbGVuYW1lIC0gRGVmYXVsdCBleHRlcm5hbCBTb3VyY2UgTWFwIGZpbGVuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGV4dEFydGlmYWN0UHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInRleHRcIn0ga2luZCAtIFJpY2ggdGV4dCBwcm92ZW5hbmNlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmFuZ2UgbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gSW50ZXJvcGVyYWJsZSBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VNYXBGaWxlbmFtZV0gLSBMb2dpY2FsIFNvdXJjZSBNYXAgc2lkZWNhciBwYXRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnl0ZUFydGlmYWN0UHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGtpbmQgLSBCeXRlIHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRCeXRlTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgYnl0ZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBcnRpZmFjdFN5bnRoZXRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFN5bnRoZXRpYyBhcnRpZmFjdCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIEV4cGxpY2l0IHRhcmdldC1zY2FmZm9sZGluZyByZWFzb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFJlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBSZWxhdGVkIHNlbWFudGljIHNvdXJjZSByYW5nZXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlIHwgQnl0ZUFydGlmYWN0UHJvdmVuYW5jZSB8IEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZX0gQXJ0aWZhY3RQcm92ZW5hbmNlICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkU2V0QXJ0aWZhY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVW5pcXVlIHNhZmUgcmVsYXRpdmUgUE9TSVggcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJ0ZXh0XCIgfCBcImJpbmFyeVwifSBjb250ZW50S2luZCAtIENvbnRlbnQgcmVwcmVzZW50YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBUZXh0IG9yIGEgZGV0YWNoZWQgY29weSBvZiB0aGUgZXhhY3QgZ2VuZXJhdGVkIGJ5dGVzIG9uIGV2ZXJ5IGJpbmFyeSByZWFkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0Um9sZX0gcm9sZSAtIEFydGlmYWN0IHJvbGU7IGV4YWN0bHkgb25lIHNldCBhcnRpZmFjdCBpcyBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7XCJnZW5lcmF0ZWRcIn0gb3duZXJzaGlwIC0gVGFzay0wMTUgb3duZXJzaGlwIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtBcnRpZmFjdFByb3ZlbmFuY2V9IHByb3ZlbmFuY2UgLSBUZXh0LCBieXRlLXJhbmdlLCBvciBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0U2V0XG4gKiBAcHJvcGVydHkge1wiR2VuZXJhdGVkQXJ0aWZhY3RTZXRcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBTdGFibGUgbGFuZ3VhZ2Ugb3IgdGFyZ2V0IElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5IC0gUGF0aCBvZiB0aGUgc29sZSBkZWNsYXJlZCBlbnRyeSBhcnRpZmFjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gYXJ0aWZhY3RzIC0gRGV0ZXJtaW5pc3RpYyBhcnRpZmFjdCBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBbbWV0YWRhdGFdIC0gRGV0YWNoZWQgdGFyZ2V0LXNwZWNpZmljIEpTT04gbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvbkJ1aWxkQXJ0aWZhY3RJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBOb3JtYWxpemVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBidWlsZCBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIFN0YWJsZSBtZWRpYSB0eXBlIGZvciB0aGUgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gU3RhYmxlIGxhbmd1YWdlLW5ldXRyYWwgcm9sZSBmb3IgdGhlIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblZhbGlkYXRvckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRJZCAtIEV4cGxpY2l0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgZ2VuZXJhdGVkLXNvdXJjZSBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgY29tcGlsZXItb3V0cHV0IGRpcmVjdG9yeS5cbiAqL1xuXG4vKiogQHR5cGVkZWYgeyhjb250ZXh0OiBSZWFkb25seTxQdWJsaWNhdGlvblZhbGlkYXRvckNvbnRleHQ+KSA9PiBQcm9taXNlPFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W10gfCB2b2lkPiB8IFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W10gfCB2b2lkfSBQdWJsaWNhdGlvblZhbGlkYXRvciAqL1xuXG4vKiogQHR5cGVkZWYge1widGV4dFwiIHwgXCJiaW5hcnlcIiB8IFwiYXBwbGljYXRpb25cIn0gUHVibGljYXRpb25UYXJnZXRSb2xlICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25UYXJnZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXhwbGljaXQgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0U2V0fSBhcnRpZmFjdFNldCAtIENvbXBsZXRlIGFscmVhZHktdmFsaWRhdGVkIGdlbmVyYXRlZCBhcnRpZmFjdHMuXG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uVGFyZ2V0Um9sZX0gcm9sZSAtIEV4cGxpY2l0IGxhbmd1YWdlLW5ldXRyYWwgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUHJvamVjdGlvbiAtIEdlbmVyYXRpb24tcmVsYXRpdmUgZ2VuZXJhdGVkLXNvdXJjZSBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUHJvamVjdGlvbiAtIEdlbmVyYXRpb24tcmVsYXRpdmUgY29tcGlsZXItb3V0cHV0IHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uVmFsaWRhdG9yW119IFt2YWxpZGF0b3JzXSAtIE9yZGVyZWQgY2FuZGlkYXRlIHZhbGlkYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uSWQgLSBVbmlxdWUgZXhwbGljaXQgZ2VuZXJhdGlvbi9jeWNsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25UYXJnZXRJbnB1dFtdfSB0YXJnZXRzIC0gQ29tcGxldGUgb3JkZXJlZCBwcm9qZWN0IHRhcmdldHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uQ29udGVudEhhc2hcbiAqIEBwcm9wZXJ0eSB7XCJzaGEyNTZcIn0gYWxnb3JpdGhtIC0gSGFzaCBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBMb3dlcmNhc2UgaGV4YWRlY2ltYWwgZGlnZXN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkFydGlmYWN0TWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gQXJ0aWZhY3Qtc2V0LXJlbGF0aXZlIHBhdGguXG4gKiBAcHJvcGVydHkge1widGV4dFwiIHwgXCJiaW5hcnlcIn0gY29udGVudEtpbmQgLSBPcmlnaW5hbCBhcnRpZmFjdCBjb250ZW50IHJlcHJlc2VudGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIERlY2xhcmVkIGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0Um9sZX0gcm9sZSAtIERlY2xhcmVkIGFydGlmYWN0IHJvbGUuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIENvbXBsZXRlIHBlcnNpc3RlZCByaWNoLCBieXRlLCBvciBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlTGVuZ3RoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgbGVuZ3RoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uQ29udGVudEhhc2h9IGhhc2ggLSBFeGFjdCBzdGFnZWQgYnl0ZSBoYXNoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkJ1aWxkQXJ0aWZhY3RNYW5pZmVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBCdWlsZC1wcm9qZWN0aW9uLXJlbGF0aXZlIHBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRGVjbGFyZWQgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBEZWNsYXJlZCBsYW5ndWFnZS1uZXV0cmFsIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlTGVuZ3RoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgbGVuZ3RoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uQ29udGVudEhhc2h9IGhhc2ggLSBFeGFjdCBzdGFnZWQgYnl0ZSBoYXNoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvblRhcmdldE1hbmlmZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdC1zZXQgYmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3tzb3VyY2U6IHN0cmluZywgYnVpbGQ6IHN0cmluZ319IHByb2plY3Rpb25zIC0gRGlzam9pbnQgZ2VuZXJhdGlvbi1yZWxhdGl2ZSBwcm9qZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvbkFydGlmYWN0TWFuaWZlc3RbXX0gYXJ0aWZhY3RzIC0gT3JkZXJlZCBnZW5lcmF0ZWQgYXJ0aWZhY3RzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0aW9uQnVpbGRBcnRpZmFjdE1hbmlmZXN0W119IGJ1aWxkQXJ0aWZhY3RzIC0gT3JkZXJlZCB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0cy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBbbWV0YWRhdGFdIC0gUGVyc2lzdGVkIHRhcmdldC1zcGVjaWZpYyBhcnRpZmFjdC1zZXQgbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uTWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEdlbmVyYXRpb25NYW5pZmVzdFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIE1hbmlmZXN0IHNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4cGxpY2l0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gRXhwbGljaXQgZ2VuZXJhdGlvbi9jeWNsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvblRhcmdldE1hbmlmZXN0W119IHRhcmdldHMgLSBDb21wbGV0ZSBvcmRlcmVkIHRhcmdldCByZWNvcmRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGlzaGVkVGFyZ2V0UGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEV4cGxpY2l0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvblRhcmdldFJvbGV9IHJvbGUgLSBFeHBsaWNpdCBsYW5ndWFnZS1uZXV0cmFsIHRhcmdldCByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBpbW11dGFibGUgZ2VuZXJhdGVkLXNvdXJjZSBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3QgaW1tdXRhYmxlIGNvbXBpbGVyLW91dHB1dCBkaXJlY3RvcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaXNoZWRHZW5lcmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gUmVzb2x2ZWQgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uUGF0aCAtIEV4YWN0IGltbXV0YWJsZSBnZW5lcmF0aW9uIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtYW5pZmVzdFBhdGggLSBFeGFjdCBnZW5lcmF0aW9uIG1hbmlmZXN0IHBhdGguXG4gKiBAcHJvcGVydHkge0dlbmVyYXRpb25NYW5pZmVzdH0gbWFuaWZlc3QgLSBWZXJpZmllZCBpbW11dGFibGUgZ2VuZXJhdGlvbiBtYW5pZmVzdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGlzaGVkVGFyZ2V0UGF0aHNbXX0gdGFyZ2V0cyAtIEV4YWN0IGdlbmVyYXRpb24tc2NvcGVkIHRhcmdldCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2xlYW51cFBlbmRpbmcgLSBXaGV0aGVyIHBvc3QtY29tbWl0IGpvdXJuYWwgY2xlYW51cCByZW1haW5zIGZvciByZWNvdmVyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERpc2NvdmVyZWRUb29sY2hhaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kIC0gRG9jdW1lbnRlZCBjYW5vbmljYWwgY29tbWFuZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHByb3BlcnR5IHtcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwifSBzb3VyY2UgLSBSZXNvbHV0aW9uIHJvdXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBGaXJzdCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBsaW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25PdXRwdXQgLSBDb21wbGV0ZSBub3JtYWxpemVkIHN0ZG91dCwgb3Igbm9ybWFsaXplZCBzdGRlcnIgd2hlbiBzdGRvdXQgaXMgZW1wdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCBzY2FsYXIgdmFsdWUgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiVHlwZVBhcmFtZXRlclwifSBraW5kIC0gRGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbi1zY29wZWQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIHR5cGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlVmFyaWFibGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIn0ga2luZCAtIFJlZmVyZW5jZSB0byBvbmUgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gU3RhYmxlIHJlZmVyZW5jZWQgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCByZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0VHlwZVxuICogQHByb3BlcnR5IHtcIkxpc3RUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbGlzdC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSBlbGVtZW50VHlwZSAtIEhvbW9nZW5lb3VzIGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiTWFwVHlwZVwifSBraW5kIC0gUmVjdXJzaXZlIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcFR5cGVcIn0ga2luZCAtIERpc3RpbmN0IGluc2VydGlvbi1vcmRlcmVkIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdXBwb3J0ZWQgc3RyaW5nIGtleSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gSG9tb2dlbmVvdXMgdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7XCJpbnNlcnRpb25cIn0gb3JkZXIgLSBDYW5vbmljYWwgZmlyc3QtaW5zZXJ0aW9uIGVuY291bnRlciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFR5cGVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbmNlL2Fic2VuY2UgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gRXhhY3QgcHJlc2VudC12YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGNvbnN0aXR1ZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZVtdfSBbYXJndW1lbnRzXSAtIEV4YWN0IGludmFyaWFudCB0eXBlIGFyZ3VtZW50czsgcmVxdWlyZWQgZm9yIGdlbmVyaWMgZGVjbGFyYXRpb25zIGFuZCBhYnNlbnQgZm9yIG5vbi1nZW5lcmljIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yVHlwZVxuICogQHByb3BlcnR5IHtcIkVycm9yVHlwZVwifSBraW5kIC0gTm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UtY2xhc3MgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZXNvdXJjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPd25lZFJlc291cmNlVHlwZVwifSBraW5kIC0gQ29tcGlsZXItb3duZWQgbGluZWFyIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIEV4YWN0IGF1dGhvcml0eSByZXNvdXJjZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkUmVmZXJlbmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTGluZWFyIHJlZmVyZW5jZSB0aGF0IG93bnMgb25lIHByb3RlY3RlZCByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3Qgb3duZWQgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUeXBlUmVmZXJlbmNlIHwgVHlwZVZhcmlhYmxlUmVmZXJlbmNlIHwgTGlzdFR5cGUgfCBNYXBUeXBlIHwgT3JkZXJlZE1hcFR5cGUgfCBPcHRpb25hbFR5cGUgfCBSZWNvcmRUeXBlIHwgUmVmZXJlbmNlVHlwZSB8IE93bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSBTZW1hbnRpY1ZhbHVlVHlwZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEVycm9yVHlwZX0gU2VtYW50aWNCaW5kaW5nVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFZvaWQgcmV0dXJuIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1widm9pZFwifSBuYW1lIC0gTm9ybWFsaXplZCBub24tdmFsdWUgZnVuY3Rpb24gcmV0dXJuLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIsIHBhcmFtZXRlcklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiTGlzdFR5cGVcIiwgZWxlbWVudFR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIk1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIG9yZGVyOiBcImluc2VydGlvblwifSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIlJlY29yZFR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nLCBhcmd1bWVudHM/OiBTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSB8IHtraW5kOiBcIlJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfX0gU2VtYW50aWNUeXBlSWRlbnRpdHkgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlSWRlbnRpdHkgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCByZXNvbHZlZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gW3R5cGVBcmd1bWVudHNdIC0gSW5mZXJyZWQgZGVjbGFyYXRpb24tb3JkZXIgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyBjYWxsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiUGFyYW1ldGVyXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhcGFiaWxpdHlJZCAtIEV4YWN0IGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uSWQgLSBFeGFjdCBvcGVyYXRpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3Qgb3BlcmF0aW9uIHJlc3VsdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gRXhhY3Qgb3JkZXJlZCBkZWNsYXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkTW92ZUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZE1vdmVFeHByZXNzaW9uXCJ9IGtpbmQgLSBFeHBsaWNpdCBsaW5lYXIgb3duZXJzaGlwIHRyYW5zZmVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE1vdmVkIG93bmVyLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHRyYW5zZmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBEZXJpdmVkIHNvdXJjZSBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRCb3Jyb3dFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCJ9IGtpbmQgLSBJbW1lZGlhdGUgbm9uZXNjYXBpbmcgcmVzb3VyY2UgYm9ycm93LlxuICogQHByb3BlcnR5IHtcInNoYXJlZFwiIHwgXCJleGNsdXNpdmVcIn0gbW9kZSAtIEJvcnJvdyBtb2RlLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IFByaXZhdGVGaWVsZFJlYWR9IGV4cHJlc3Npb24gLSBCb3Jyb3dlZCBwbGFjZS5cbiAqIEBwcm9wZXJ0eSB7T3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHR5cGUgLSBFeGFjdCBvd25lZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBib3Jyb3cgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBDb21waWxlci1hdXRob3JpemVkIGVmZmVjdCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWZmZWN0U2l0ZUlkIC0gRGV0ZXJtaW5pc3RpYyBzZW1hbnRpYyBldmFsdWF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZX0gcmVzb2x1dGlvbiAtIENvbXBsZXRlIGF1dGhvcml0eSByZXNvbHV0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3BlcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU3RhYmxlIHBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IG9yZGVyZWQgcGFyYW1ldGVyIHR5cGUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZUlkOiBzdHJpbmd9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZUlkOiBzdHJpbmd9fSBFZmZlY3RSZXNvdXJjZUZsb3cgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSByZXNvdXJjZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIHJlc291cmNlIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cIn0ga2luZCAtIENhcGFiaWxpdHkgZmFpbHVyZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIGZhaWx1cmUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgb3BlcmF0aW9uIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG9wZXJhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFZmZlY3RQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gT3JkZXJlZCBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblwifSBraW5kIC0gQXV0aG9yaXplZCBjYXBhYmlsaXR5IGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yaXR5SWQgLSBPcGFxdWUgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBDYXBhYmlsaXR5IG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRGVjbGFyYXRpb25bXX0gcmVzb3VyY2VzIC0gT3JkZXJlZCByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbltdfSBmYWlsdXJlcyAtIE9yZGVyZWQgZmFpbHVyZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uW119IG9wZXJhdGlvbnMgLSBPcmRlcmVkIG9wZXJhdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXBhYmlsaXR5QXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCJ9IHNjaGVtYSAtIEF1dGhvcml0eSBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MSB8IDJ9IHNjaGVtYVZlcnNpb24gLSBBdXRob3JpdHkgcGF5bG9hZCB2ZXJzaW9uLCBub3QgYSBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBPcGFxdWUgY2FsbGVyLXN1cHBsaWVkIGF1dGhvcml0eSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IGNhcGFiaWxpdGllcyAtIE5vcm1hbGl6ZWQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cmFjdFZlcnNpb25dIC0gRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uLCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfVtdfSBbbW9kdWxlc10gLSBTY2hlbWEtdjIgY2Fub25pY2FsIG1vZHVsZSBhdXRob3JpdGllcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3ttb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgdHlwZTogU2VtYW50aWNUeXBlTmFtZSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVOYW1lfX19IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eU5hbWVkSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9uZVwifSB8IHtraW5kOiBcImFjcXVpcmVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcImJvcnJvd1wiIHwgXCJjbG9zZVwiLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB0ZXJtaW5hbEZhaWx1cmU6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fX0gQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dFtdLCByZXR1cm5UeXBlOiBGdW5jdGlvblJldHVyblR5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9LCBlZmZlY3RzOiBbXCJob3N0XCJdLCBmYWlsdXJlczogKHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0KVtdLCByZXNvdXJjZUZsb3c6IENhcGFiaWxpdHlSZXNvdXJjZUZsb3dJbnB1dH19IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCByZXNvdXJjZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIGZhaWx1cmVzOiBDYXBhYmlsaXR5TmFtZWRJbnB1dFtdLCBvcGVyYXRpb25zOiBDYXBhYmlsaXR5T3BlcmF0aW9uSW5wdXRbXX19IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb246IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0ICovXG4vKiogQHR5cGVkZWYge3tzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDEsIGlkOiBzdHJpbmcsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXRbXSwgY29udHJhY3RWZXJzaW9uPzogc3RyaW5nfSB8IHtzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDIsIGlkOiBzdHJpbmcsIG1vZHVsZXM6IENhcGFiaWxpdHlBdXRob3JpdHlNb2R1bGVJbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eUlucHV0ICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJMaXN0TGl0ZXJhbFwifSBraW5kIC0gT3JkZXJlZCBpbW11dGFibGUgbGlzdCBsaXRlcmFsLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGVsZW1lbnRzIC0gU291cmNlLW9yZGVyZWQsIGR1cGxpY2F0ZS1wcmVzZXJ2aW5nIGVsZW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwRW50cnlcbiAqIEBwcm9wZXJ0eSB7XCJNYXBFbnRyeVwifSBraW5kIC0gU291cmNlLW9yZGVyZWQgbWFwIGluaXRpYWxpemVyIGVudHJ5LlxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBrZXkgLSBMaXRlcmFsIG5vbm51bWVyaWMgc3RyaW5nIGtleS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gdmFsdWUgLSBFbnRyeSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJNYXBMaXRlcmFsXCJ9IGtpbmQgLSBJbW11dGFibGUgbWFwIGxpdGVyYWw7IGVudHJ5IG9yZGVyIGlzIGRpYWdub3N0aWMtb25seS5cbiAqIEBwcm9wZXJ0eSB7TWFwRW50cnlbXX0gZW50cmllcyAtIFNvdXJjZSBpbml0aWFsaXplciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbCB3aXRoIG9ic2VydmFibGUgZmlyc3QtaW5zZXJ0aW9uIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlLW9yZGVyZWQgdW5pcXVlIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG9yZGVyZWQgY29uc3RydWN0aW9uIGJvdW5kYXJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RJbmRleEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJMaXN0SW5kZXhFeHByZXNzaW9uXCJ9IGtpbmQgLSBUb3RhbCB6ZXJvLWJhc2VkIGxpc3QgaW5kZXguXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0LXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5kZXggLSBJbnRlZ2VyIGluZGV4LlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTG9va3VwRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1hcExvb2t1cEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHN0cmluZy1rZXkgbWFwIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIE1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGtleSAtIFN0cmluZyBrZXkgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJwcm92ZW5cIiB8IFwiZmFpbC1vbi1hYnNlbmNlXCJ9IHRvdGFsaXR5IC0gQWRtaXNzaW9uIGJhc2lzOyBuZXZlciBvcHRpb25hbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbGxlY3Rpb25TaXplRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwifSBraW5kIC0gRmluaXRlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtIG9yIG1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge1wibGlzdFwiIHwgXCJtYXBcIn0gW2NvbGxlY3Rpb25LaW5kXSAtIFZhbGlkYXRlZCByZWNlaXZlciBraW5kIGZvciB0YXJnZXQgc3BlbGxpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZGVudGlmaWVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIklkZW50aWZpZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlZmVyZW5jZWQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVnZXJMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiSW50ZWdlckxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2YWx1ZSAtIEphdmFTY3JpcHQtc2FmZSBpbnRlZ2VyIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9vbGVhbkxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJCb29sZWFuTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtib29sZWFufSB2YWx1ZSAtIEJvb2xlYW4gdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdHJpbmdMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiU3RyaW5nTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gVW5pY29kZSBzdHJpbmcgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbE5vbmVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbE5vbmVcIn0ga2luZCAtIENvbnRleHR1YWxseSB0eXBlZCBhYnNlbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxTb21lXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxTb21lXCJ9IGtpbmQgLSBFeHBsaWNpdCBwcmVzZW50IG9wdGlvbmFsIHZhbHVlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEV4YWN0IG5vbi1vcHRpb25hbCBwcmVzZW50IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxJc1ByZXNlbnRcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbElzUHJlc2VudFwifSBraW5kIC0gUHJlc2VuY2UgdGVzdCBmb3Igb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFRlc3RlZCBvcHRpb25hbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxVbndyYXBcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFVud3JhcFwifSBraW5kIC0gR3VhcmRlZCB1bndyYXAgb2Ygb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFByb3Zlbi1wcmVzZW50IG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBVbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJVbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNVbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gb3BlcmFuZCAtIE9wZXJhbmQgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJCaW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByaWdodCAtIFJpZ2h0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FsbGVlIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBQb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgc2lnbmF0dXJlIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgcmVzb2x2ZWQgZnVuY3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhpcyBjYWxsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCByZXNvbHZlZCBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBtZXRob2QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gW3Jlc291cmNlRmxvd10gLSBPd25lZCByZWNlaXZlciB0cmFuc2l0aW9uIGFuZCBkZWNsYXJlZCB0ZXJtaW5hbC11c2UgZmFpbHVyZSB3aGVuIGFwcGxpY2FibGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNlaXZlckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNlaXZlckV4cHJlc3Npb25cIn0ga2luZCAtIFRoZSBkZWNsYXJpbmcgY2xhc3MgaW5zdGFuY2UgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NJZCAtIFN0YWJsZSBkZWNsYXJpbmcgY2xhc3MgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSByZWNlaXZlciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY2VpdmVyIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVmZXJlbmNlQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBGcmVzaCBub21pbmFsIHJlZmVyZW5jZSBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlZmVyZW5jZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHJlZmVyZW5jZSAtIEV4YWN0IGNsYXNzIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBjb25zdHJ1Y3RvciBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gY29uc3RydWN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIFJlc29sdmVkIHJlY2VpdmVyLW1ldGhvZCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY2VpdmVyIGV2YWx1YXRlZCBvbmNlIGJlZm9yZSBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIC0gU3RhYmxlIG1ldGhvZCBpZGVudGl0eSBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IG1ldGhvZCBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIG1ldGhvZCByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRSZWFkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkUmVhZFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJlYWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZFR5cGV9IHJlY29yZCAtIFJlc29sdmVkIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBDb21wbGV0ZSBmaWVsZC1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY29yZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWVtYmVyUmVhZFxuICogQHByb3BlcnR5IHtcIk1lbWJlclJlYWRcIn0ga2luZCAtIE5vbWluYWwgaW1tdXRhYmxlIHJlY29yZC1maWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY29yZC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcmVzb2x2ZWQgZmllbGQgaWRlbnRpdHkgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVtYmVyLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVtYmVyLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvck1lc3NhZ2VSZWFkXG4gKiBAcHJvcGVydHkge1wiRXJyb3JNZXNzYWdlUmVhZFwifSBraW5kIC0gVGhlIHNvbGUgcG9ydGFibGUgZXJyb3IgbWVtYmVyIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHJlY2VpdmVyIC0gQ2F0Y2ggYmluZGluZyB3aG9zZSBpbW11dGFibGUgbWVzc2FnZSBpcyByZWFkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXNzYWdlLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVzc2FnZS1tZW1iZXIgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgT3B0aW9uYWxOb25lIHwgT3B0aW9uYWxTb21lIHwgT3B0aW9uYWxJc1ByZXNlbnQgfCBPcHRpb25hbFVud3JhcCB8IExpc3RMaXRlcmFsIHwgTWFwTGl0ZXJhbCB8IE9yZGVyZWRNYXBMaXRlcmFsIHwgTGlzdEluZGV4RXhwcmVzc2lvbiB8IE1hcExvb2t1cEV4cHJlc3Npb24gfCBDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb24gfCBVbmFyeUV4cHJlc3Npb24gfCBCaW5hcnlFeHByZXNzaW9uIHwgQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbiB8IE93bmVkTW92ZUV4cHJlc3Npb24gfCBPd25lZEJvcnJvd0V4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IFJlZmVyZW5jZUNvbnN0cnVjdGlvbiB8IFJlY29yZENvbnN0cnVjdGlvbiB8IE1lbWJlclJlYWQgfCBQcml2YXRlRmllbGRSZWFkIHwgRXJyb3JNZXNzYWdlUmVhZH0gRXhwcmVzc2lvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvY2FsRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJMb2NhbERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIGxvY2FsIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhwbGljaXQgbG9jYWwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgbGF0ZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbml0aWFsaXplciAtIFJlcXVpcmVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBc3NpZ25tZW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQXNzaWdubWVudFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gdGFyZ2V0IC0gU2ltcGxlIGxvY2FsIGFzc2lnbm1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQXNzaWduZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTmV3IGZpZWxkIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXR1cm5TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSZXR1cm5TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gW2V4cHJlc3Npb25dIC0gUmV0dXJuZWQgZXhwcmVzc2lvbjsgYWJzZW50IGV4YWN0bHkgZm9yIGEgYmFyZSB2b2lkIHJldHVybi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJFeHByZXNzaW9uU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0NhbGxFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEEgZGlyZWN0LCByZWNlaXZlciwgb3IgYXV0aG9yaXplZCBjYWxsIHdob3NlIHJlc29sdmVkIHJldHVybiB0eXBlIGlzIHZvaWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZlN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIklmU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJyYW5jaCBjb25kaXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjb25zZXF1ZW50IC0gVHJ1ZSBicmFuY2guXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbYWx0ZXJuYXRlXSAtIEZhbHNlIGJyYW5jaCwgYWJzZW50IHdoZW4gZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWx1ZUJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJWYWx1ZUJpbmRpbmdcIn0ga2luZCAtIEl0ZXJhdGlvbi1iaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEJvZHktbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGxpc3QgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIEl0ZXJhdGlvbiBiaW5kaW5ncyBhcmUgYWx3YXlzIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hTdGF0ZW1lbnRcIn0ga2luZCAtIE9yZGVyZWQgbGlzdC1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGlzdCAtIExpc3QgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaE1hcFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIn0ga2luZCAtIEluc2VydGlvbi1vcmRlcmVkIG1hcCBwYWlyLWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtYXAgLSBPcmRlcmVkLW1hcCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSBrZXlCaW5kaW5nIC0gSW1tdXRhYmxlIHN0cmluZy1rZXkgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGhvbW9nZW5lb3VzIHZhbHVlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2hpbGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJXaGlsZVN0YXRlbWVudFwifSBraW5kIC0gU3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0ZWQgYmVmb3JlIGV2ZXJ5IGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBPcmRlcmVkIGxvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnJlYWtTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJCcmVha1N0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGJyZWFrIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb250aW51ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkNvbnRpbnVlU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgY29udGludWUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiRXJyb3JDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIENvbnN0cnVjdGlvbiBvZiBvbmUgZGVjbGFyZWQgdW5jaGVja2VkIGVycm9yLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGVycm9yIC0gRXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtZXNzYWdlIC0gU29sZSBpbW11dGFibGUgc3RyaW5nIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlIGFuZCBtZXNzYWdlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJhaXNlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmFpc2VTdGF0ZW1lbnRcIn0ga2luZCAtIEFicnVwdCB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge0Vycm9yQ29uc3RydWN0aW9ufSBlcnJvciAtIEV4YWN0IGNvbnN0cnVjdGVkIHNlbWFudGljIGVycm9yLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByYWlzZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByYWlzZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhdGNoQmluZGluZ1xuICogQHByb3BlcnR5IHtcIkNhdGNoQmluZGluZ1wifSBraW5kIC0gRXhhY3QtaGFuZGxlciBiaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEhhbmRsZXItbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IHR5cGUgLSBFeGFjdCBjYXVnaHQgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIENhdGNoIGJpbmRpbmdzIGFyZSBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgYmluZGluZyByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRyeVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlRyeVN0YXRlbWVudFwifSBraW5kIC0gT25lIGJvZHkgYW5kIG9uZSBleGFjdCB0eXBlZCBoYW5kbGVyLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgdHJ5L2hhbmRsZXIgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHJ5L2NhdGNoIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgVHJ5U3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCbG9ja1xuICogQHByb3BlcnR5IHtcIkJsb2NrXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1N0YXRlbWVudFtdfSBzdGF0ZW1lbnRzIC0gT3JkZXJlZCBzdGF0ZW1lbnRzIGluIG9uZSBsZXhpY2FsIHNjb3BlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIFJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZ1bmN0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRGaWVsZFxuICogQHByb3BlcnR5IHtcIlJlY29yZEZpZWxkXCJ9IGtpbmQgLSBDbG9zZWQgcmVjb3JkLWZpZWxkIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlY29yZCBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1JlY29yZEZpZWxkW119IGZpZWxkcyAtIE9yZGVyZWQgdW5pcXVlIHZpc2libGUgZmllbGRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkXCJ9IGtpbmQgLSBEZWNsYXJpbmctY2xhc3MtcHJpdmF0ZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBmaWVsZCBuYW1lIGluc2lkZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9ubHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uc3RydWN0b3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIn0ga2luZCAtIEV4YWN0IGNvbXBsZXRlIHByaXZhdGUtc3RhdGUgaW5pdGlhbGl6ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgY29uc3RydWN0b3IgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRmllbGQtb3JkZXIgaW5pdGlhbGl6YXRpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0b3IgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjb25zdHJ1Y3RvciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFJlY2VpdmVyLWJvdW5kIGNsYXNzIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBtZXRob2QgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgbWV0aG9kIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBNZXRob2QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1ldGhvZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCBFcnJvckRlY2xhcmF0aW9uIHwgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uIHwgRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbiB8IEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uIHwgUmVjb3JkRmllbGQgfCBQcml2YXRlRmllbGQgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlciB8IFBhcmFtZXRlciB8IFZhbHVlQmluZGluZyB8IENhdGNoQmluZGluZyB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBFcnJvckNvbnN0cnVjdGlvbiB8IEVycm9yVHlwZSB8IE1hcEVudHJ5IHwgU2VtYW50aWNWYWx1ZVR5cGUgfCBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZVdpdGhvdXRMb2NhdGlvbnMgKi9cblxuZXhwb3J0IHt9XG4iXX0=
1300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLGtMQUFrTDtBQUNsTCxzREFBc0Q7QUFDdEQsOEZBQThGO0FBQzlGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILDhEQUE4RDtBQUU5RDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILGtIQUFrSDtBQUVsSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSCxtTEFBbUw7QUFFbkwseUVBQXlFO0FBRXpFOzs7Ozs7OztHQVFHO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVILG9NQUFvTTtBQUNwTSxtRUFBbUU7QUFFbkU7Ozs7O0dBS0c7QUFFSCw0RkFBNEY7QUFFNUYsOG9CQUE4b0I7QUFDOW9CLDBFQUEwRTtBQUUxRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7OztHQUlHO0FBRUgsMktBQTJLO0FBRTNLOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCxvRkFBb0Y7QUFDcEYsNk5BQTZOO0FBQzdOLHFEQUFxRDtBQUNyRCw0UEFBNFA7QUFDNVAsMllBQTJZO0FBQzNZLHdLQUF3SztBQUN4Syx3SUFBd0k7QUFDeEksK1NBQStTO0FBRS9TOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUgsbWlCQUFtaUI7QUFFbmlCOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCx1RUFBdUU7QUFDdkUsNlFBQTZRO0FBRTdROzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCx3akJBQXdqQjtBQUN4akIsMkRBQTJEO0FBRTNELE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwiamF2YVwiIHwgXCJrb3RsaW5cIiB8IFwicHl0aG9uXCIgfCBcImNzaGFycFwiIHwgXCJnb1wiIHwgXCJjXCIgfCBcImNwcFwiIHwgXCJydXN0XCIgfCBcInN3aWZ0XCIgfCBcImRhcnRcIiB8IFwiemlnXCJ9IFNlbWFudGljTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNMYW5ndWFnZX0gVGV4dEJhY2tlbmRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtUZXh0QmFja2VuZExhbmd1YWdlIHwgXCJ3YXNtXCIgfCBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcImZsdXR0ZXJcIn0gQmFja2VuZExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2UgfCBcImh0bWxcIn0gR2VuZXJhdGVkVGV4dExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1wiaW50ZWdlclwiIHwgXCJib29sZWFuXCIgfCBcInN0cmluZ1wifSBTZW1hbnRpY1R5cGVOYW1lICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZU5hbWUgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJOZWdhdGVcIiB8IFwiQm9vbGVhbk5vdFwifSBTZW1hbnRpY1VuYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlckFkZFwiIHwgXCJJbnRlZ2VyU3VidHJhY3RcIiB8IFwiSW50ZWdlck11bHRpcGx5XCIgfCBcIkJvb2xlYW5BbmRcIiB8IFwiQm9vbGVhbk9yXCIgfCBcIkludGVnZXJFcXVhbFwiIHwgXCJJbnRlZ2VyTm90RXF1YWxcIiB8IFwiQm9vbGVhbkVxdWFsXCIgfCBcIkJvb2xlYW5Ob3RFcXVhbFwiIHwgXCJTdHJpbmdFcXVhbFwiIHwgXCJTdHJpbmdOb3RFcXVhbFwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5cIiB8IFwiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbFwiIHwgXCJTdHJpbmdDb25jYXRcIn0gU2VtYW50aWNCaW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYXBhYmlsaXR5XCIgfCBcInJlc291cmNlXCIgfCBcImZhaWx1cmVcIiB8IFwib3BlcmF0aW9uXCIgfCBcInJlY29yZFwiIHwgXCJjbGFzc1wiIHwgXCJlcnJvclwiIHwgXCJmaWVsZFwiIHwgXCJjb25zdHJ1Y3RvclwiIHwgXCJtZXRob2RcIiB8IFwiZnVuY3Rpb25cIiB8IFwidHlwZVBhcmFtZXRlclwiIHwgXCJwYXJhbWV0ZXJcIiB8IFwibG9jYWxcIiB8IFwiaXRlcmF0aW9uXCIgfCBcImNhdGNoXCJ9IFNlbWFudGljU3ltYm9sS2luZCAqL1xuLyoqIEB0eXBlZGVmIHtcInJlY29yZFwiIHwgXCJjbGFzc1wiIHwgXCJlcnJvclwiIHwgXCJmdW5jdGlvblwifSBTZW1hbnRpY0RlY2xhcmF0aW9uS2luZCAqL1xuLyoqIEB0eXBlZGVmIHtcImRlY2xhcmF0aW9uXCIgfCBcInR5cGVcIiB8IFwiY29uc3RydWN0XCIgfCBcIm1lbWJlclwiIHwgXCJyZWFkXCIgfCBcIndyaXRlXCIgfCBcImNhbGxcIn0gU2VtYW50aWNTeW1ib2xSb2xlICovXG4vKiogQHR5cGVkZWYge1wicGFyc2VcIiB8IFwiZ2VuZXJhdGVcIiB8IFwicmVzdG9yZVwiIHwgXCJjb21waWxlXCIgfCBcImxpbmtcIiB8IFwidmFsaWRhdGVcIiB8IFwiaW5zdGFudGlhdGVcIiB8IFwiZXhlY3V0ZVwifSBBY2NlcHRhbmNlU3RhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJlbnRyeVwiIHwgXCJzb3VyY2VcIiB8IFwibWFuaWZlc3RcIiB8IFwic3VwcG9ydFwiIHwgXCJtYXBwaW5nXCIgfCBcInJlc291cmNlXCIgfCBcImxvYWRlclwifSBHZW5lcmF0ZWRBcnRpZmFjdFJvbGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gU2FmZSBYY29kZSBwcm9kdWN0L3BhdGggaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlTmFtZSAtIFNhZmUgU3dpZnQgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvblByZWZpeCAtIENhbGxlci1zdXBwbGllZCByZXZlcnNlLUROUyBvcmdhbml6YXRpb24gcHJlZml4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZUlkZW50aWZpZXIgLSBDYWxsZXItc3VwcGxpZWQgcmV2ZXJzZS1ETlMgYXBwbGljYXRpb24gYnVuZGxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlcGxveW1lbnRUYXJnZXQgLSBDYWxsZXItc3VwcGxpZWQgbWFqb3IubWlub3IgaU9TIGRlcGxveW1lbnQgdGFyZ2V0OyBuZXZlciBpbmZlcnJlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcIlNvdXJjZXNcIn0gW3NvdXJjZVJvb3RdIC0gRml4ZWQgZ2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcIkFzc2V0cy54Y2Fzc2V0c1wifSBbcmVzb3VyY2VSb290XSAtIEZpeGVkIGNhbGxlci1yZXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcInN3aWZ0dWlcIn0gW2xpZmVjeWNsZV0gLSBTb2xlIHN1cHBvcnRlZCBsaWZlY3ljbGUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIG5ldmVyPn0gW2luZm9QbGlzdF0gLSBDbG9zZWQgYmFzZWxpbmUgY2FsbGVyIHBsaXN0IGV4dGVuc2lvbjsgY3VycmVudGx5IGVtcHR5LlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbZW50aXRsZW1lbnRzXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIGVudGl0bGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcHJpdmFjeURlY2xhcmF0aW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBwcml2YWN5IGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbY2FwYWJpbGl0aWVzXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIEFwcGxlIGNhcGFiaWxpdGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gVmFsaWRhdGVkIFhjb2RlIHByb2R1Y3QvcGF0aCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVOYW1lIC0gVmFsaWRhdGVkIFN3aWZ0IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb25QcmVmaXggLSBWYWxpZGF0ZWQgcmV2ZXJzZS1ETlMgb3JnYW5pemF0aW9uIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZGVudGlmaWVyIC0gVmFsaWRhdGVkIHJldmVyc2UtRE5TIGFwcGxpY2F0aW9uIGJ1bmRsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXBsb3ltZW50VGFyZ2V0IC0gVmFsaWRhdGVkIGNhbGxlci1zdXBwbGllZCBkZXBsb3ltZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFZhbGlkYXRlZCBkaXNwbGF5IG5hbWUuXG4gKiBAcHJvcGVydHkge1wiU291cmNlc1wifSBzb3VyY2VSb290IC0gR2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcIkFzc2V0cy54Y2Fzc2V0c1wifSByZXNvdXJjZVJvb3QgLSBDYWxsZXItcmVzb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJzd2lmdHVpXCJ9IGxpZmVjeWNsZSAtIFNvbGUgc3VwcG9ydGVkIGxpZmVjeWNsZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbmV2ZXI+Pn0gaW5mb1BsaXN0IC0gRW1wdHkgY2FsbGVyIHBsaXN0IGV4dGVuc2lvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gcGVybWlzc2lvbnMgLSBFbXB0eSBiYXNlbGluZSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gZW50aXRsZW1lbnRzIC0gRW1wdHkgYmFzZWxpbmUgZW50aXRsZW1lbnRzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBwcml2YWN5RGVjbGFyYXRpb25zIC0gRW1wdHkgYmFzZWxpbmUgcHJpdmFjeSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IGNhcGFiaWxpdGllcyAtIEVtcHR5IGJhc2VsaW5lIEFwcGxlIGNhcGFiaWxpdGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQXNzZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBGdWxsIHNhZmUgZGVzdGluYXRpb24gYmVsb3cgQXNzZXRzLnhjYXNzZXRzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FwcGxpY2F0aW9uSWRdIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVzcGFjZV0gLSBLb3RsaW4vQW5kcm9pZCBuYW1lc3BhY2U7IGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uSWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIEdlbmVyYXRlZCBLb3RsaW4gcGFja2FnZTsgZGVmYXVsdHMgdG8gbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpdml0eUNsYXNzTmFtZV0gLSBMYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcm9kdWN0TmFtZV0gLSBEZXRlcm1pbmlzdGljIHByb2plY3QgcHJvZHVjdCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXNwbGF5TmFtZV0gLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBbbWluaW11bVNka10gLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFt0YXJnZXRTZGtdIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFtjb21waWxlU2RrXSAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBbYnVpbGRUb29sc1ZlcnNpb25dIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdmVyc2lvbkNvZGVdIC0gUG9zaXRpdmUgQW5kcm9pZCB2ZXJzaW9uIGNvZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcnNpb25OYW1lXSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1widW5zcGVjaWZpZWRcIn0gW29yaWVudGF0aW9uXSAtIEJhc2VsaW5lIG9yaWVudGF0aW9uIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtcInN5c3RlbVwifSBbdGhlbWVdIC0gQmFzZWxpbmUgcGxhdGZvcm0tbmF0aXZlIHRoZW1lLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBwZXJtaXNzaW9uIHNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIC0gVmFsaWRhdGVkIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZXNwYWNlIC0gVmFsaWRhdGVkIEFuZHJvaWQgbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIC0gR2VuZXJhdGVkIEtvdGxpbiBwYWNrYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5Q2xhc3NOYW1lIC0gTGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFByb2plY3QgcHJvZHVjdCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gbWluaW11bVNkayAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gdGFyZ2V0U2RrIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IGNvbXBpbGVTZGsgLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gYnVpbGRUb29sc1ZlcnNpb24gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gUG9zaXRpdmUgQW5kcm9pZCB2ZXJzaW9uIGNvZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk5hbWUgLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcInVuc3BlY2lmaWVkXCJ9IG9yaWVudGF0aW9uIC0gQmFzZWxpbmUgb3JpZW50YXRpb24gYmVoYXZpb3IuXG4gKiBAcHJvcGVydHkge1wic3lzdGVtXCJ9IHRoZW1lIC0gUGxhdGZvcm0tbmF0aXZlIHRoZW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFNhZmUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc2VsZWN0ZWQgZml4ZWQgQW5kcm9pZCByZXNvdXJjZSBvciBhc3NldCByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIExvd2VyY2FzZSBEYXJ0IHBhY2thZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29yZ2FuaXphdGlvbl0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgb3duaW5nIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXBwbGljYXRpb25JZF0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eSBleHRlbmRpbmcgdGhlIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aXZpdHlDbGFzc05hbWVdIC0gR2VuZXJhdGVkIEphdmEgbGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlzcGxheU5hbWVdIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gW21pbmltdW1TZGtdIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbdGFyZ2V0U2RrXSAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbY29tcGlsZVNka10gLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gW2J1aWxkVG9vbHNWZXJzaW9uXSAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcnNpb25Db2RlXSAtIFBvc2l0aXZlIEFuZHJvaWQvRmx1dHRlciBidWlsZCBudW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcnNpb25OYW1lXSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IHBlcm1pc3Npb24gc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIC0gVmFsaWRhdGVkIERhcnQgcGFja2FnZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb24gLSBWYWxpZGF0ZWQgb3duaW5nIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIC0gVmFsaWRhdGVkIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHlDbGFzc05hbWUgLSBHZW5lcmF0ZWQgSmF2YSBsYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gbWluaW11bVNkayAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gdGFyZ2V0U2RrIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IGNvbXBpbGVTZGsgLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gYnVpbGRUb29sc1ZlcnNpb24gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gUG9zaXRpdmUgQW5kcm9pZC9GbHV0dGVyIGJ1aWxkIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGbHV0dGVyQXBwbGljYXRpb25Bc3NldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFNhZmUgcGF0aCBiZWxvdyB0aGUgZ2VuZXJhdGVkIEZsdXR0ZXIgYXNzZXRzIHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZnJvbnRlbmQgLSBQYXJzZXIgYWRhcHRlciBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRleHRCYWNrZW5kIC0gU2luZ2xlLSBvciBtdWx0aS1maWxlIHRleHQgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeUJhY2tlbmQgLSBCaW5hcnkgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFwcGxpY2F0aW9uQmFja2VuZCAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnRlcm9wZXJhYmlsaXR5IC0gSW50ZXJvcGVyYWJpbGl0eSBicmlkZ2UgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBwcm92aWRlciAtIFRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlci9uYXRpdmUtYmluZGluZyBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2hlY2tDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3VwcG9ydGVkIC0gV2hldGhlciB0aGUgdGFyZ2V0IG93bnMgYSBkZXZlbG9wZXIgY2hlY2sgcGxhbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIE9yZGVyZWQgbm9uLWV4ZWN1dGluZyBkZXZlbG9wZXItY2hlY2sgc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdG9vbGNoYWlucyAtIEV4YWN0IGNhbm9uaWNhbCB0b29scyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgdGhlIHBsYW4uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzIC0gVGFzayAwMDUgYXJiaXRyYXJ5IHJlcXVpcmVkIHNpZ25hdHVyZXMsIHJlc29sdmVkIGRpcmVjdCBjYWxscywgYW5kIHZvaWQgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW11dGFibGVDb2xsZWN0aW9ucyAtIFRhc2sgMDA2IHJlY3Vyc2l2ZSBpbW11dGFibGUgbGlzdHMvbWFwcywgdG90YWwgYWNjZXNzLCBhbmQgc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9uYWxWYWx1ZXMgLSBUYXNrIDAwNyBleHBsaWNpdCBvcHRpb25hbCB2YWx1ZXMsIHByZXNlbmNlIHRlc3RzLCBhbmQgZ3VhcmRlZCB1bndyYXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRMaXN0SXRlcmF0aW9uIC0gVGFzayAwMDggb3JkZXJlZCBpbW11dGFibGUtbGlzdCBpdGVyYXRpb24gYW5kIG5lYXJlc3QtbG9vcCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcmRlcmVkTWFwSXRlcmF0aW9uIC0gVGFzayAwMTQgaW5zZXJ0aW9uLW9yZGVyZWQgaW1tdXRhYmxlLW1hcCBwYWlyIGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZGl0aW9uQ29udHJvbGxlZExvb3BzIC0gVGFzayAwMzIgc3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wcyBhbmQgcmVzb2x2ZWQgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2xvc2VkUmVjb3JkcyAtIFRhc2sgMDA5IG5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmRzLCBjb25zdHJ1Y3Rpb24sIGFuZCBtZW1iZXIgcmVhZHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVkRXJyb3JzIC0gVGFzayAwMTEgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3JzLCByYWlzZXMsIGFuZCBleGFjdCB0eXBlZCBjYXRjaGVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzIC0gVGFzayAwMTIgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMgYW5kIGNsb3NlZCBnZW5lcmljIGFwcGxpY2F0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVmZXJlbmNlQ2xhc3NlcyAtIFRhc2sgMDMzIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMsIHByaXZhdGUgaW5zdGFuY2Ugc3RhdGUsIGV4YWN0IGNvbnN0cnVjdG9ycywgYW5kIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlcyAtIFRhc2sgMDM0IGF1dGhvcml6ZWQgaG9zdCBlZmZlY3RzLCB0eXBlZCBmYWlsdXJlcywgYW5kIG93bmVkIHJlc291cmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTdGFibGUgcmVnaXN0cnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlUm9sZUNhcGFiaWxpdGllcz59IHJvbGVzIC0gSW5kZXBlbmRlbnRseSByZWdpc3RlcmVkIHJvbGVzLlxuICogQHByb3BlcnR5IHtcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwifSBhcnRpZmFjdE11bHRpcGxpY2l0eSAtIFRhcmdldCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFdoZXRoZXIgZnJvbnRlbmQvYmFja2VuZCByb3VuZC10cmlwIGFjY2VwdGFuY2UgaXMgZGVjbGFyZWQuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllcz59IGZlYXR1cmVzIC0gU2VtYW50aWMgZmVhdHVyZSBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllcz59IG1hcHBpbmcgLSBNYXBwaW5nIGZvcm1zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXM+fSBhY2NlcHRhbmNlIC0gU3RhZ2VzIGFuZCB0b29sY2hhaW5zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUNoZWNrQ2FwYWJpbGl0aWVzPn0gY2hlY2sgLSBOb24tZXhlY3V0aW5nIGRldmVsb3Blci1jaGVjayBjYXBhYmlsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lIC0gT25lLWJhc2VkIGxpbmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29sdW1uIC0gT25lLWJhc2VkIFVURi0xNiBjb2RlLXVuaXQgY29sdW1uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IHNvdXJjZSBvZmZzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VMb2NhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBzdGFydCAtIEluY2x1c2l2ZSBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IGVuZCAtIEV4Y2x1c2l2ZSBlbmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWdpc3RlcmVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBSZWdpc3RyeS1sb2NhbCBkZXRlcm1pbmlzdGljIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmFsIGZpbGVuYW1lLCBwcmVzZXJ2ZWQgdmVyYmF0aW0uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBPcmlnaW5hbCBzb3VyY2UgY29udGVudCwgcHJlc2VydmVkIHZlcmJhdGltIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBQYXJzZXIgbGFuZ3VhZ2Ugd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7XCJhcHBsaWNhdGlvblwiIHwgXCJmYWNhZGVcIn0gW293bmVyc2hpcF0gLSBDYWxsZXIgb3IgY29tcGlsZXItb3duZWQgc291cmNlIHJvbGUgZm9yIHNlbWFudGljIHByb2dyYW1zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic291cmNlXCJ9IGtpbmQgLSBEaXJlY3Qgc291cmNlIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3Qgb3JpZ2luYWwgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWxhdGVkT3JpZ2luXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUmVsYXRlZCBvcmlnaW5hbCByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gUmVsYXRpb25zaGlwIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBEZXJpdmVkT3JpZ2luXG4gKiBAcHJvcGVydHkge1wiZGVyaXZlZFwifSBraW5kIC0gUHJvdmVuYW5jZSBkZXJpdmVkIGZyb20gb25lIG9yIG1vcmUgb3JpZ2lucy5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSBvcmlnaW5zIC0gT3JkZXJlZCwgbm9uLWVtcHR5IG9yaWdpbmFsIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN5bnRoZXRpY09yaWdpblxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU291cmNlLWZyZWUgZ2VuZXJhdGVkIG9yIHNlbWFudGljIHNjYWZmb2xkaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSBodW1hbi1yZWFkYWJsZSByZWFzb24uXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBPcmRlcmVkIHJlbGF0ZWQgcmFuZ2VzLCBwb3NzaWJseSBlbXB0eS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NvdXJjZU9yaWdpbiB8IERlcml2ZWRPcmlnaW4gfCBTeW50aGV0aWNPcmlnaW59IFNlbWFudGljT3JpZ2luICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQnl0ZVJhbmdlXG4gKiBAcHJvcGVydHkge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IGdlbmVyYXRlZCAtIEhhbGYtb3BlbiBnZW5lcmF0ZWQgYnl0ZSBvZmZzZXRzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gU2VtYW50aWMgb3IgZXhwbGljaXQgc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBPcmlnaW5hdGluZyBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBPcmlnaW5hdGluZyBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgb3IgYmluYXJ5LXJlZ2lvbiByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRCeXRlTWFwcGluZ1xuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJieXRlc1wifSBjb29yZGluYXRlU3lzdGVtIC0gR2VuZXJhdGVkIG9mZnNldHMgYXJlIGJ5dGVzLCBuZXZlciB0ZXh0IGNvbHVtbnMuXG4gKiBAcHJvcGVydHkge3twYXRoOiBzdHJpbmcsIGJ5dGVMZW5ndGg6IG51bWJlcn19IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBhcnRpZmFjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGVkQnl0ZVJhbmdlW119IHJhbmdlcyAtIE9yZGVyZWQgbm9uLW92ZXJsYXBwaW5nIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE5vZGVQcm92ZW5hbmNlXCJ9IHNjaGVtYSAtIEFzc29jaWF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBBc3NvY2lhdGlvbiB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gU291cmNlIGFzc29jaWF0aW9uIGluZGVwZW5kZW50IG9mIHRyYXZlcnNhbCBwb3NpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBKU09OIFBvaW50ZXIgZnJvbSB0aGUgc2VtYW50aWMgbW9kdWxlIHJvb3QuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVtcImtpbmRcIl0gfCBcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFNlbWFudGljIG5vZGUga2luZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBwcm92ZW5hbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVzb2x2ZWQgZGVjbGFyZWQvcmVmZXJlbmNlZCBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5vZGVJZCAtIFJlZmVycmluZyBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFJvbGV9IHJvbGUgLSBSZWZlcmVuY2Ugcm9sZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgcmVmZXJlbmNlIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNlbWFudGljIHN5bWJvbCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbEtpbmR9IGtpbmQgLSBTeW1ib2wgY2F0ZWdvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25Ob2RlSWQgLSBEZWNsYXJpbmcgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VtYW50aWNEZWNsYXJhdGlvbklkXSAtIFN0YWJsZSBzZW1hbnRpYyBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgcmVjb3JkLCBmaWVsZCwgYW5kIGZ1bmN0aW9uIHN5bWJvbHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUmVmZXJlbmNlW119IHJlZmVyZW5jZXMgLSBPcmRlcmVkIHJlc29sdmVkIHJlZmVyZW5jZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gVmVyc2lvbmVkIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIERldGVybWluaXN0aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBEZXRlcm1pbmlzdGljIHN5bWJvbCBpbmRleC5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCIgfCBcInN5bnRoZXRpY1wifSBNYXBwaW5nS2luZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1NwYW5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBoYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcHJvcGVydHkge01hcHBpbmdLaW5kfSBtYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIG9yaWdpbmFsIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBub2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBVc2VmdWwgc3ltYm9sIG5hbWUgZm9yIFNvdXJjZSBNYXAgdjMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkVGV4dExhbmd1YWdlfSBsYW5ndWFnZSAtIE91dHB1dCB0ZXh0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnQgLSBFeGFjdCBnZW5lcmF0ZWQgTEYgc291cmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZFNvdXJjZX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIHByb2dyYW0gaWRlbnRpdHkgYW5kIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIE9yaWdpbmFsIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIENhbm9uaWNhbCBzZW1hbnRpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIENhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIGdlbmVyYXRlZCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvZGUgLSBHZW5lcmF0ZWQgb3V0cHV0IHByb2dyYW0sIGluY2x1ZGluZyBhbnkgcmVxdWVzdGVkIGRpcmVjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIEdlbmVyYXRlZCBvdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIHJpY2ggbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gU291cmNlIE1hcCB2MyBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZU1hcEZpbGVuYW1lIC0gRGVmYXVsdCBleHRlcm5hbCBTb3VyY2UgTWFwIGZpbGVuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGV4dEFydGlmYWN0UHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInRleHRcIn0ga2luZCAtIFJpY2ggdGV4dCBwcm92ZW5hbmNlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmFuZ2UgbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gSW50ZXJvcGVyYWJsZSBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VNYXBGaWxlbmFtZV0gLSBMb2dpY2FsIFNvdXJjZSBNYXAgc2lkZWNhciBwYXRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnl0ZUFydGlmYWN0UHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGtpbmQgLSBCeXRlIHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRCeXRlTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgYnl0ZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBcnRpZmFjdFN5bnRoZXRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFN5bnRoZXRpYyBhcnRpZmFjdCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIEV4cGxpY2l0IHRhcmdldC1zY2FmZm9sZGluZyByZWFzb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFJlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBSZWxhdGVkIHNlbWFudGljIHNvdXJjZSByYW5nZXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlIHwgQnl0ZUFydGlmYWN0UHJvdmVuYW5jZSB8IEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZX0gQXJ0aWZhY3RQcm92ZW5hbmNlICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkU2V0QXJ0aWZhY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVW5pcXVlIHNhZmUgcmVsYXRpdmUgUE9TSVggcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJ0ZXh0XCIgfCBcImJpbmFyeVwifSBjb250ZW50S2luZCAtIENvbnRlbnQgcmVwcmVzZW50YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBUZXh0IG9yIGEgZGV0YWNoZWQgY29weSBvZiB0aGUgZXhhY3QgZ2VuZXJhdGVkIGJ5dGVzIG9uIGV2ZXJ5IGJpbmFyeSByZWFkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0Um9sZX0gcm9sZSAtIEFydGlmYWN0IHJvbGU7IGV4YWN0bHkgb25lIHNldCBhcnRpZmFjdCBpcyBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7XCJnZW5lcmF0ZWRcIn0gb3duZXJzaGlwIC0gVGFzay0wMTUgb3duZXJzaGlwIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtBcnRpZmFjdFByb3ZlbmFuY2V9IHByb3ZlbmFuY2UgLSBUZXh0LCBieXRlLXJhbmdlLCBvciBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0U2V0XG4gKiBAcHJvcGVydHkge1wiR2VuZXJhdGVkQXJ0aWZhY3RTZXRcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBTdGFibGUgbGFuZ3VhZ2Ugb3IgdGFyZ2V0IElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5IC0gUGF0aCBvZiB0aGUgc29sZSBkZWNsYXJlZCBlbnRyeSBhcnRpZmFjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gYXJ0aWZhY3RzIC0gRGV0ZXJtaW5pc3RpYyBhcnRpZmFjdCBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBbbWV0YWRhdGFdIC0gRGV0YWNoZWQgdGFyZ2V0LXNwZWNpZmljIEpTT04gbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvbkJ1aWxkQXJ0aWZhY3RJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBOb3JtYWxpemVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBidWlsZCBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIFN0YWJsZSBtZWRpYSB0eXBlIGZvciB0aGUgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gU3RhYmxlIGxhbmd1YWdlLW5ldXRyYWwgcm9sZSBmb3IgdGhlIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblZhbGlkYXRvckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRJZCAtIEV4cGxpY2l0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgZ2VuZXJhdGVkLXNvdXJjZSBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgY29tcGlsZXItb3V0cHV0IGRpcmVjdG9yeS5cbiAqL1xuXG4vKiogQHR5cGVkZWYgeyhjb250ZXh0OiBSZWFkb25seTxQdWJsaWNhdGlvblZhbGlkYXRvckNvbnRleHQ+KSA9PiBQcm9taXNlPFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W10gfCB2b2lkPiB8IFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W10gfCB2b2lkfSBQdWJsaWNhdGlvblZhbGlkYXRvciAqL1xuXG4vKiogQHR5cGVkZWYge1widGV4dFwiIHwgXCJiaW5hcnlcIiB8IFwiYXBwbGljYXRpb25cIn0gUHVibGljYXRpb25UYXJnZXRSb2xlICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25UYXJnZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXhwbGljaXQgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0U2V0fSBhcnRpZmFjdFNldCAtIENvbXBsZXRlIGFscmVhZHktdmFsaWRhdGVkIGdlbmVyYXRlZCBhcnRpZmFjdHMuXG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uVGFyZ2V0Um9sZX0gcm9sZSAtIEV4cGxpY2l0IGxhbmd1YWdlLW5ldXRyYWwgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUHJvamVjdGlvbiAtIEdlbmVyYXRpb24tcmVsYXRpdmUgZ2VuZXJhdGVkLXNvdXJjZSBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUHJvamVjdGlvbiAtIEdlbmVyYXRpb24tcmVsYXRpdmUgY29tcGlsZXItb3V0cHV0IHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uVmFsaWRhdG9yW119IFt2YWxpZGF0b3JzXSAtIE9yZGVyZWQgY2FuZGlkYXRlIHZhbGlkYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uSWQgLSBFeHBsaWNpdCBnZW5lcmF0aW9uL2N5Y2xlIGlkZW50aXR5LCBmcmVzaCBvciBhbiBleGFjdCByZXRhaW5lZCB2YWxpZGF0b3ItZnJlZSBjYW5kaWRhdGUuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uVGFyZ2V0SW5wdXRbXX0gdGFyZ2V0cyAtIENvbXBsZXRlIG9yZGVyZWQgcHJvamVjdCB0YXJnZXRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25PcHRpb25zXG4gKiBAcHJvcGVydHkge0Fib3J0U2lnbmFsfSBbc2lnbmFsXSAtIENhbmNlbGxhdGlvbiBhdXRob3JpdHkgdGhyb3VnaCB0aGUgYWN0aXZlLXBvaW50ZXIgY29tbWl0IGJvdW5kYXJ5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkNvbnRlbnRIYXNoXG4gKiBAcHJvcGVydHkge1wic2hhMjU2XCJ9IGFsZ29yaXRobSAtIEhhc2ggYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gTG93ZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2VzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25BcnRpZmFjdE1hbmlmZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEFydGlmYWN0LXNldC1yZWxhdGl2ZSBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gT3JpZ2luYWwgYXJ0aWZhY3QgY29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBEZWNsYXJlZCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRBcnRpZmFjdFJvbGV9IHJvbGUgLSBEZWNsYXJlZCBhcnRpZmFjdCByb2xlLlxuICogQHByb3BlcnR5IHtBcnRpZmFjdFByb3ZlbmFuY2V9IHByb3ZlbmFuY2UgLSBDb21wbGV0ZSBwZXJzaXN0ZWQgcmljaCwgYnl0ZSwgb3Igc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnl0ZUxlbmd0aCAtIEV4YWN0IHN0YWdlZCBieXRlIGxlbmd0aC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGlvbkNvbnRlbnRIYXNofSBoYXNoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgaGFzaC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25CdWlsZEFydGlmYWN0TWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gQnVpbGQtcHJvamVjdGlvbi1yZWxhdGl2ZSBwYXRoLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIERlY2xhcmVkIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gRGVjbGFyZWQgbGFuZ3VhZ2UtbmV1dHJhbCB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0IHJvbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnl0ZUxlbmd0aCAtIEV4YWN0IHN0YWdlZCBieXRlIGxlbmd0aC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGlvbkNvbnRlbnRIYXNofSBoYXNoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgaGFzaC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25UYXJnZXRNYW5pZmVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXhwbGljaXQgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uVGFyZ2V0Um9sZX0gcm9sZSAtIEV4cGxpY2l0IGxhbmd1YWdlLW5ldXRyYWwgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3Qtc2V0IGJhY2tlbmQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHt7c291cmNlOiBzdHJpbmcsIGJ1aWxkOiBzdHJpbmd9fSBwcm9qZWN0aW9ucyAtIERpc2pvaW50IGdlbmVyYXRpb24tcmVsYXRpdmUgcHJvamVjdGlvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRpb25BcnRpZmFjdE1hbmlmZXN0W119IGFydGlmYWN0cyAtIE9yZGVyZWQgZ2VuZXJhdGVkIGFydGlmYWN0cy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvbkJ1aWxkQXJ0aWZhY3RNYW5pZmVzdFtdfSBidWlsZEFydGlmYWN0cyAtIE9yZGVyZWQgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dHMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pn0gW21ldGFkYXRhXSAtIFBlcnNpc3RlZCB0YXJnZXQtc3BlY2lmaWMgYXJ0aWZhY3Qtc2V0IG1ldGFkYXRhLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbk1hbmlmZXN0XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRHZW5lcmF0aW9uTWFuaWZlc3RcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBNYW5pZmVzdCBzY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBFeHBsaWNpdCBwcm9qZWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25JZCAtIEV4cGxpY2l0IGdlbmVyYXRpb24vY3ljbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRpb25UYXJnZXRNYW5pZmVzdFtdfSB0YXJnZXRzIC0gQ29tcGxldGUgb3JkZXJlZCB0YXJnZXQgcmVjb3Jkcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1Ymxpc2hlZFRhcmdldFBhdGhzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gRXhhY3QgaW1tdXRhYmxlIGdlbmVyYXRlZC1zb3VyY2UgZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUGF0aCAtIEV4YWN0IGltbXV0YWJsZSBjb21waWxlci1vdXRwdXQgZGlyZWN0b3J5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGlzaGVkR2VuZXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25JZCAtIFJlc29sdmVkIGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvblBhdGggLSBFeGFjdCBpbW11dGFibGUgZ2VuZXJhdGlvbiBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWFuaWZlc3RQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbiBtYW5pZmVzdCBwYXRoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uTWFuaWZlc3R9IG1hbmlmZXN0IC0gVmVyaWZpZWQgaW1tdXRhYmxlIGdlbmVyYXRpb24gbWFuaWZlc3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1Ymxpc2hlZFRhcmdldFBhdGhzW119IHRhcmdldHMgLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCB0YXJnZXQgcGF0aHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNsZWFudXBQZW5kaW5nIC0gV2hldGhlciBwb3N0LWNvbW1pdCBqb3VybmFsIGNsZWFudXAgcmVtYWlucyBmb3IgcmVjb3ZlcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBEaXNjb3ZlcmVkVG9vbGNoYWluXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29tbWFuZCAtIERvY3VtZW50ZWQgY2Fub25pY2FsIGNvbW1hbmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhlY3V0YWJsZSAtIEV4YWN0IGFic29sdXRlIGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJvdmVycmlkZVwiIHwgXCJjYW5vbmljYWxcIn0gc291cmNlIC0gUmVzb2x1dGlvbiByb3V0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gRmlyc3Qgc2VsZWN0ZWQtc3RyZWFtIHZlcnNpb24gbGluZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uT3V0cHV0IC0gQ29tcGxldGUgbm9ybWFsaXplZCBzdGRvdXQsIG9yIG5vcm1hbGl6ZWQgc3RkZXJyIHdoZW4gc3Rkb3V0IGlzIGVtcHR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnQgYXJyYXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1BhdGhBcmd1bWVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4IC0gRXhhY3QgYXJndiBpbmRleCBjb250YWluaW5nIHRoZSBwYXRoLlxuICogQHByb3BlcnR5IHtcInNvdXJjZVwiIHwgXCJidWlsZFwifSBvd25lcnNoaXAgLSBDYW5kaWRhdGUgc3VidHJlZSB0aGF0IG93bnMgdGhlIHBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByZWZpeF0gLSBFeGFjdCBub24tcGF0aCBhcmd2IHByZWZpeCBwcmVjZWRpbmcgYW4gb3duZWQgYWJzb2x1dGUgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrRW52aXJvbm1lbnRQYXRoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEV4YWN0IGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgYW4gb3duZWQgYWJzb2x1dGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIiB8IFwiYnVpbGRcIiB8IFwidG9vbFwifSBvd25lcnNoaXAgLSBDYW5kaWRhdGUgc3VidHJlZSBvciBkaXNjb3ZlcmVkIHRvb2wgdGhhdCBvd25zIHRoZSBwYXRoLlxuICogQHByb3BlcnR5IHtEaXNjb3ZlcmVkVG9vbGNoYWlufSBbdG9vbF0gLSBFeGFjdCB0b29sIGV4ZWN1dGFibGUgYm91bmQgYnkgYSB0b29sLW93bmVkIGVudmlyb25tZW50IHZhbHVlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tPdXRwdXRPd25lcnNoaXBcbiAqIEBwcm9wZXJ0eSB7XCJidWlsZFwifSBvd25lcnNoaXAgLSBDb21waWxlciBvdXRwdXRzIGJlbG9uZyBvbmx5IHRvIHRoZSBjYW5kaWRhdGUgYnVpbGQgc3VidHJlZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgYnVpbGQgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBNZWRpYSB0eXBlIGFzc2lnbmVkIHRvIGV2ZXJ5IHByb2R1Y2VkIHJlZ3VsYXIgZmlsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gTGFuZ3VhZ2UtbmV1dHJhbCBjb21waWxlci1vdXRwdXQgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrU3RhZ2VSZXF1ZXN0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBEZWNsYXJlZCBub24tZXhlY3V0aW5nIGFjY2VwdGFuY2Ugc3RhZ2UuXG4gKiBAcHJvcGVydHkge0Rpc2NvdmVyZWRUb29sY2hhaW59IHRvb2wgLSBFeGFjdCBpbW11dGFibGUgZGlzY292ZXJlZCB0b29sIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgZXhlY3V0YWJsZSBjb3BpZWQgZnJvbSB0aGUgdG9vbCByZWNvcmQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd2IC0gRXhhY3Qgc2hlbGwtZnJlZSBhcmd1bWVudCB2ZWN0b3IuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFRhcmdldENoZWNrUGF0aEFyZ3VtZW50W119IHBhdGhBcmd1bWVudHMgLSBDb21wbGV0ZSBvd25lcnNoaXAgZGVjbGFyYXRpb24gZm9yIGFyZ3YgcGF0aHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3dkIC0gRXhhY3QgY2FuZGlkYXRlLXNjb3BlZCB3b3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IGVudmlyb25tZW50IC0gRXhhY3QgZGV0ZXJtaW5pc3RpYyBlbnZpcm9ubWVudC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tFbnZpcm9ubWVudFBhdGhbXX0gZW52aXJvbm1lbnRQYXRocyAtIE93bmVkIGFic29sdXRlIGVudmlyb25tZW50IHBhdGhzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpbnB1dEhhc2ggLSBTSEEtMjU2IG9mIGRlY2xhcmVkIHJlc3RvcmUgaW5wdXRzLCBvciBudWxsIGZvciB1bmNvbmRpdGlvbmFsIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGlucHV0cyAtIENvbXBsZXRlIHN0YWdlZCBhcnRpZmFjdCBpbnB1dHMgcmVhZCBieSB0aGUgc3RhZ2UuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFRhcmdldENoZWNrT3V0cHV0T3duZXJzaGlwPiB8IG51bGx9IG91dHB1dCAtIEJ1aWxkIG91dHB1dCBvd25lcnNoaXAsIG9yIG51bGwgZm9yIG5vbi1wcm9kdWNpbmcgY2hlY2tzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdHJhbnNpZW50UGF0aHMgLSBDYW5kaWRhdGUgc291cmNlL2J1aWxkIGNhY2hlIG9yIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyByZW1vdmVkIGFmdGVyIGNoZWNraW5nLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tQbGFuXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRUYXJnZXRDaGVja1BsYW5cIn0gc2NoZW1hIC0gUGxhbiBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFBsYW4gc2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1wiZGV2ZWxvcGVyLWNoZWNrXCJ9IG1vZGUgLSBOb24tZXhlY3V0aW5nIGRldmVsb3Blci1jaGVjayBtb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4YWN0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0SWQgLSBFeGFjdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBSZWdpc3RlcmVkIGJhY2tlbmQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBzdGFnZWQgZ2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUGF0aCAtIEV4YWN0IHN0YWdlZCBjb21waWxlci1vdXRwdXQgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFydGlmYWN0UGF0aHMgLSBFeGFjdCBzdGFnZWQgYXJ0aWZhY3QgcGF0aHMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFRhcmdldENoZWNrU3RhZ2VSZXF1ZXN0W119IHN0YWdlcyAtIE9yZGVyZWQgdGFyZ2V0LW93bmVkIHJlcXVlc3RzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZWFkb25seTx7Y29tbWFuZDogc3RyaW5nLCBleGVjdXRhYmxlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHNvdXJjZTogXCJvdmVycmlkZVwiIHwgXCJjYW5vbmljYWxcIiwgdmVyc2lvbjogc3RyaW5nfT59IHRvb2wgLSBFeGFjdCB0b29sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gYXJndiAtIEV4YWN0IGV4ZWN1dGVkIGFyZ3VtZW50IHZlY3Rvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBleGl0Q29kZSAtIFN1Y2Nlc3NmdWwgcHJvY2VzcyBleGl0IGNvZGUuXG4gKiBAcHJvcGVydHkge251bGx9IHNpZ25hbCAtIFN1Y2Nlc3NmdWwgcHJvY2VzcyBzaWduYWwgc3RhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IC0gQm91bmRlZCBjYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQm91bmRlZCBjYXB0dXJlZCBzdGFuZGFyZCBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbk1zIC0gTm9uLW5lZ2F0aXZlIHN0YWdlIGR1cmF0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBFeGFjdCBwcm9qZWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldElkIC0gRXhhY3QgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gUmVnaXN0ZXJlZCBiYWNrZW5kIHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIHN1Y2Nlc3NmdWwgc3RhZ2UgZXZpZGVuY2UuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W119IG91dHB1dHMgLSBDb21wbGV0ZSBjb21waWxlci1vd25lZCBidWlsZCBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCBzY2FsYXIgdmFsdWUgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiVHlwZVBhcmFtZXRlclwifSBraW5kIC0gRGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbi1zY29wZWQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIHR5cGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlVmFyaWFibGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIn0ga2luZCAtIFJlZmVyZW5jZSB0byBvbmUgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gU3RhYmxlIHJlZmVyZW5jZWQgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCByZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0VHlwZVxuICogQHByb3BlcnR5IHtcIkxpc3RUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbGlzdC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSBlbGVtZW50VHlwZSAtIEhvbW9nZW5lb3VzIGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiTWFwVHlwZVwifSBraW5kIC0gUmVjdXJzaXZlIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcFR5cGVcIn0ga2luZCAtIERpc3RpbmN0IGluc2VydGlvbi1vcmRlcmVkIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdXBwb3J0ZWQgc3RyaW5nIGtleSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gSG9tb2dlbmVvdXMgdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7XCJpbnNlcnRpb25cIn0gb3JkZXIgLSBDYW5vbmljYWwgZmlyc3QtaW5zZXJ0aW9uIGVuY291bnRlciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFR5cGVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbmNlL2Fic2VuY2UgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gRXhhY3QgcHJlc2VudC12YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGNvbnN0aXR1ZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZVtdfSBbYXJndW1lbnRzXSAtIEV4YWN0IGludmFyaWFudCB0eXBlIGFyZ3VtZW50czsgcmVxdWlyZWQgZm9yIGdlbmVyaWMgZGVjbGFyYXRpb25zIGFuZCBhYnNlbnQgZm9yIG5vbi1nZW5lcmljIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yVHlwZVxuICogQHByb3BlcnR5IHtcIkVycm9yVHlwZVwifSBraW5kIC0gTm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UtY2xhc3MgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZXNvdXJjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPd25lZFJlc291cmNlVHlwZVwifSBraW5kIC0gQ29tcGlsZXItb3duZWQgbGluZWFyIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIEV4YWN0IGF1dGhvcml0eSByZXNvdXJjZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkUmVmZXJlbmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTGluZWFyIHJlZmVyZW5jZSB0aGF0IG93bnMgb25lIHByb3RlY3RlZCByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3Qgb3duZWQgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUeXBlUmVmZXJlbmNlIHwgVHlwZVZhcmlhYmxlUmVmZXJlbmNlIHwgTGlzdFR5cGUgfCBNYXBUeXBlIHwgT3JkZXJlZE1hcFR5cGUgfCBPcHRpb25hbFR5cGUgfCBSZWNvcmRUeXBlIHwgUmVmZXJlbmNlVHlwZSB8IE93bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSBTZW1hbnRpY1ZhbHVlVHlwZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEVycm9yVHlwZX0gU2VtYW50aWNCaW5kaW5nVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFZvaWQgcmV0dXJuIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1widm9pZFwifSBuYW1lIC0gTm9ybWFsaXplZCBub24tdmFsdWUgZnVuY3Rpb24gcmV0dXJuLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIsIHBhcmFtZXRlcklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiTGlzdFR5cGVcIiwgZWxlbWVudFR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIk1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIG9yZGVyOiBcImluc2VydGlvblwifSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIlJlY29yZFR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nLCBhcmd1bWVudHM/OiBTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSB8IHtraW5kOiBcIlJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfX0gU2VtYW50aWNUeXBlSWRlbnRpdHkgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlSWRlbnRpdHkgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCByZXNvbHZlZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gW3R5cGVBcmd1bWVudHNdIC0gSW5mZXJyZWQgZGVjbGFyYXRpb24tb3JkZXIgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyBjYWxsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiUGFyYW1ldGVyXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhcGFiaWxpdHlJZCAtIEV4YWN0IGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uSWQgLSBFeGFjdCBvcGVyYXRpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3Qgb3BlcmF0aW9uIHJlc3VsdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gRXhhY3Qgb3JkZXJlZCBkZWNsYXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkTW92ZUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZE1vdmVFeHByZXNzaW9uXCJ9IGtpbmQgLSBFeHBsaWNpdCBsaW5lYXIgb3duZXJzaGlwIHRyYW5zZmVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE1vdmVkIG93bmVyLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHRyYW5zZmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBEZXJpdmVkIHNvdXJjZSBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRCb3Jyb3dFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCJ9IGtpbmQgLSBJbW1lZGlhdGUgbm9uZXNjYXBpbmcgcmVzb3VyY2UgYm9ycm93LlxuICogQHByb3BlcnR5IHtcInNoYXJlZFwiIHwgXCJleGNsdXNpdmVcIn0gbW9kZSAtIEJvcnJvdyBtb2RlLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IFByaXZhdGVGaWVsZFJlYWR9IGV4cHJlc3Npb24gLSBCb3Jyb3dlZCBwbGFjZS5cbiAqIEBwcm9wZXJ0eSB7T3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHR5cGUgLSBFeGFjdCBvd25lZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBib3Jyb3cgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBDb21waWxlci1hdXRob3JpemVkIGVmZmVjdCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWZmZWN0U2l0ZUlkIC0gRGV0ZXJtaW5pc3RpYyBzZW1hbnRpYyBldmFsdWF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZX0gcmVzb2x1dGlvbiAtIENvbXBsZXRlIGF1dGhvcml0eSByZXNvbHV0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3BlcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU3RhYmxlIHBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IG9yZGVyZWQgcGFyYW1ldGVyIHR5cGUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZUlkOiBzdHJpbmd9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZUlkOiBzdHJpbmd9fSBFZmZlY3RSZXNvdXJjZUZsb3cgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSByZXNvdXJjZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIHJlc291cmNlIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cIn0ga2luZCAtIENhcGFiaWxpdHkgZmFpbHVyZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIGZhaWx1cmUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgb3BlcmF0aW9uIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG9wZXJhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFZmZlY3RQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gT3JkZXJlZCBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblwifSBraW5kIC0gQXV0aG9yaXplZCBjYXBhYmlsaXR5IGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yaXR5SWQgLSBPcGFxdWUgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBDYXBhYmlsaXR5IG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRGVjbGFyYXRpb25bXX0gcmVzb3VyY2VzIC0gT3JkZXJlZCByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbltdfSBmYWlsdXJlcyAtIE9yZGVyZWQgZmFpbHVyZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uW119IG9wZXJhdGlvbnMgLSBPcmRlcmVkIG9wZXJhdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXBhYmlsaXR5QXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCJ9IHNjaGVtYSAtIEF1dGhvcml0eSBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MSB8IDJ9IHNjaGVtYVZlcnNpb24gLSBBdXRob3JpdHkgcGF5bG9hZCB2ZXJzaW9uLCBub3QgYSBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBPcGFxdWUgY2FsbGVyLXN1cHBsaWVkIGF1dGhvcml0eSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IGNhcGFiaWxpdGllcyAtIE5vcm1hbGl6ZWQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cmFjdFZlcnNpb25dIC0gRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uLCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfVtdfSBbbW9kdWxlc10gLSBTY2hlbWEtdjIgY2Fub25pY2FsIG1vZHVsZSBhdXRob3JpdGllcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3ttb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgdHlwZTogU2VtYW50aWNUeXBlTmFtZSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVOYW1lfX19IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eU5hbWVkSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9uZVwifSB8IHtraW5kOiBcImFjcXVpcmVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcImJvcnJvd1wiIHwgXCJjbG9zZVwiLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB0ZXJtaW5hbEZhaWx1cmU6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fX0gQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dFtdLCByZXR1cm5UeXBlOiBGdW5jdGlvblJldHVyblR5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9LCBlZmZlY3RzOiBbXCJob3N0XCJdLCBmYWlsdXJlczogKHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0KVtdLCByZXNvdXJjZUZsb3c6IENhcGFiaWxpdHlSZXNvdXJjZUZsb3dJbnB1dH19IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCByZXNvdXJjZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIGZhaWx1cmVzOiBDYXBhYmlsaXR5TmFtZWRJbnB1dFtdLCBvcGVyYXRpb25zOiBDYXBhYmlsaXR5T3BlcmF0aW9uSW5wdXRbXX19IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb246IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0ICovXG4vKiogQHR5cGVkZWYge3tzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDEsIGlkOiBzdHJpbmcsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXRbXSwgY29udHJhY3RWZXJzaW9uPzogc3RyaW5nfSB8IHtzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDIsIGlkOiBzdHJpbmcsIG1vZHVsZXM6IENhcGFiaWxpdHlBdXRob3JpdHlNb2R1bGVJbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eUlucHV0ICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJMaXN0TGl0ZXJhbFwifSBraW5kIC0gT3JkZXJlZCBpbW11dGFibGUgbGlzdCBsaXRlcmFsLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGVsZW1lbnRzIC0gU291cmNlLW9yZGVyZWQsIGR1cGxpY2F0ZS1wcmVzZXJ2aW5nIGVsZW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwRW50cnlcbiAqIEBwcm9wZXJ0eSB7XCJNYXBFbnRyeVwifSBraW5kIC0gU291cmNlLW9yZGVyZWQgbWFwIGluaXRpYWxpemVyIGVudHJ5LlxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBrZXkgLSBMaXRlcmFsIG5vbm51bWVyaWMgc3RyaW5nIGtleS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gdmFsdWUgLSBFbnRyeSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJNYXBMaXRlcmFsXCJ9IGtpbmQgLSBJbW11dGFibGUgbWFwIGxpdGVyYWw7IGVudHJ5IG9yZGVyIGlzIGRpYWdub3N0aWMtb25seS5cbiAqIEBwcm9wZXJ0eSB7TWFwRW50cnlbXX0gZW50cmllcyAtIFNvdXJjZSBpbml0aWFsaXplciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbCB3aXRoIG9ic2VydmFibGUgZmlyc3QtaW5zZXJ0aW9uIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlLW9yZGVyZWQgdW5pcXVlIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG9yZGVyZWQgY29uc3RydWN0aW9uIGJvdW5kYXJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RJbmRleEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJMaXN0SW5kZXhFeHByZXNzaW9uXCJ9IGtpbmQgLSBUb3RhbCB6ZXJvLWJhc2VkIGxpc3QgaW5kZXguXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0LXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5kZXggLSBJbnRlZ2VyIGluZGV4LlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTG9va3VwRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1hcExvb2t1cEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHN0cmluZy1rZXkgbWFwIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIE1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGtleSAtIFN0cmluZyBrZXkgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJwcm92ZW5cIiB8IFwiZmFpbC1vbi1hYnNlbmNlXCJ9IHRvdGFsaXR5IC0gQWRtaXNzaW9uIGJhc2lzOyBuZXZlciBvcHRpb25hbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbGxlY3Rpb25TaXplRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwifSBraW5kIC0gRmluaXRlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtIG9yIG1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge1wibGlzdFwiIHwgXCJtYXBcIn0gW2NvbGxlY3Rpb25LaW5kXSAtIFZhbGlkYXRlZCByZWNlaXZlciBraW5kIGZvciB0YXJnZXQgc3BlbGxpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZGVudGlmaWVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIklkZW50aWZpZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlZmVyZW5jZWQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVnZXJMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiSW50ZWdlckxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2YWx1ZSAtIEphdmFTY3JpcHQtc2FmZSBpbnRlZ2VyIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9vbGVhbkxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJCb29sZWFuTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtib29sZWFufSB2YWx1ZSAtIEJvb2xlYW4gdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdHJpbmdMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiU3RyaW5nTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gVW5pY29kZSBzdHJpbmcgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbE5vbmVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbE5vbmVcIn0ga2luZCAtIENvbnRleHR1YWxseSB0eXBlZCBhYnNlbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxTb21lXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxTb21lXCJ9IGtpbmQgLSBFeHBsaWNpdCBwcmVzZW50IG9wdGlvbmFsIHZhbHVlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEV4YWN0IG5vbi1vcHRpb25hbCBwcmVzZW50IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxJc1ByZXNlbnRcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbElzUHJlc2VudFwifSBraW5kIC0gUHJlc2VuY2UgdGVzdCBmb3Igb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFRlc3RlZCBvcHRpb25hbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxVbndyYXBcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFVud3JhcFwifSBraW5kIC0gR3VhcmRlZCB1bndyYXAgb2Ygb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFByb3Zlbi1wcmVzZW50IG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBVbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJVbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNVbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gb3BlcmFuZCAtIE9wZXJhbmQgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJCaW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByaWdodCAtIFJpZ2h0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FsbGVlIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBQb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgc2lnbmF0dXJlIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgcmVzb2x2ZWQgZnVuY3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhpcyBjYWxsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCByZXNvbHZlZCBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBtZXRob2QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gW3Jlc291cmNlRmxvd10gLSBPd25lZCByZWNlaXZlciB0cmFuc2l0aW9uIGFuZCBkZWNsYXJlZCB0ZXJtaW5hbC11c2UgZmFpbHVyZSB3aGVuIGFwcGxpY2FibGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNlaXZlckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNlaXZlckV4cHJlc3Npb25cIn0ga2luZCAtIFRoZSBkZWNsYXJpbmcgY2xhc3MgaW5zdGFuY2UgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NJZCAtIFN0YWJsZSBkZWNsYXJpbmcgY2xhc3MgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSByZWNlaXZlciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY2VpdmVyIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVmZXJlbmNlQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBGcmVzaCBub21pbmFsIHJlZmVyZW5jZSBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlZmVyZW5jZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHJlZmVyZW5jZSAtIEV4YWN0IGNsYXNzIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBjb25zdHJ1Y3RvciBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gY29uc3RydWN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIFJlc29sdmVkIHJlY2VpdmVyLW1ldGhvZCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY2VpdmVyIGV2YWx1YXRlZCBvbmNlIGJlZm9yZSBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIC0gU3RhYmxlIG1ldGhvZCBpZGVudGl0eSBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IG1ldGhvZCBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIG1ldGhvZCByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRSZWFkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkUmVhZFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJlYWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZFR5cGV9IHJlY29yZCAtIFJlc29sdmVkIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBDb21wbGV0ZSBmaWVsZC1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY29yZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWVtYmVyUmVhZFxuICogQHByb3BlcnR5IHtcIk1lbWJlclJlYWRcIn0ga2luZCAtIE5vbWluYWwgaW1tdXRhYmxlIHJlY29yZC1maWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY29yZC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcmVzb2x2ZWQgZmllbGQgaWRlbnRpdHkgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVtYmVyLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVtYmVyLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvck1lc3NhZ2VSZWFkXG4gKiBAcHJvcGVydHkge1wiRXJyb3JNZXNzYWdlUmVhZFwifSBraW5kIC0gVGhlIHNvbGUgcG9ydGFibGUgZXJyb3IgbWVtYmVyIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHJlY2VpdmVyIC0gQ2F0Y2ggYmluZGluZyB3aG9zZSBpbW11dGFibGUgbWVzc2FnZSBpcyByZWFkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXNzYWdlLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVzc2FnZS1tZW1iZXIgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgT3B0aW9uYWxOb25lIHwgT3B0aW9uYWxTb21lIHwgT3B0aW9uYWxJc1ByZXNlbnQgfCBPcHRpb25hbFVud3JhcCB8IExpc3RMaXRlcmFsIHwgTWFwTGl0ZXJhbCB8IE9yZGVyZWRNYXBMaXRlcmFsIHwgTGlzdEluZGV4RXhwcmVzc2lvbiB8IE1hcExvb2t1cEV4cHJlc3Npb24gfCBDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb24gfCBVbmFyeUV4cHJlc3Npb24gfCBCaW5hcnlFeHByZXNzaW9uIHwgQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbiB8IE93bmVkTW92ZUV4cHJlc3Npb24gfCBPd25lZEJvcnJvd0V4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IFJlZmVyZW5jZUNvbnN0cnVjdGlvbiB8IFJlY29yZENvbnN0cnVjdGlvbiB8IE1lbWJlclJlYWQgfCBQcml2YXRlRmllbGRSZWFkIHwgRXJyb3JNZXNzYWdlUmVhZH0gRXhwcmVzc2lvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvY2FsRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJMb2NhbERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIGxvY2FsIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhwbGljaXQgbG9jYWwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgbGF0ZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbml0aWFsaXplciAtIFJlcXVpcmVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBc3NpZ25tZW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQXNzaWdubWVudFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gdGFyZ2V0IC0gU2ltcGxlIGxvY2FsIGFzc2lnbm1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQXNzaWduZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTmV3IGZpZWxkIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXR1cm5TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSZXR1cm5TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gW2V4cHJlc3Npb25dIC0gUmV0dXJuZWQgZXhwcmVzc2lvbjsgYWJzZW50IGV4YWN0bHkgZm9yIGEgYmFyZSB2b2lkIHJldHVybi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJFeHByZXNzaW9uU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0NhbGxFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEEgZGlyZWN0LCByZWNlaXZlciwgb3IgYXV0aG9yaXplZCBjYWxsIHdob3NlIHJlc29sdmVkIHJldHVybiB0eXBlIGlzIHZvaWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZlN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIklmU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJyYW5jaCBjb25kaXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjb25zZXF1ZW50IC0gVHJ1ZSBicmFuY2guXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbYWx0ZXJuYXRlXSAtIEZhbHNlIGJyYW5jaCwgYWJzZW50IHdoZW4gZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWx1ZUJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJWYWx1ZUJpbmRpbmdcIn0ga2luZCAtIEl0ZXJhdGlvbi1iaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEJvZHktbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGxpc3QgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIEl0ZXJhdGlvbiBiaW5kaW5ncyBhcmUgYWx3YXlzIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hTdGF0ZW1lbnRcIn0ga2luZCAtIE9yZGVyZWQgbGlzdC1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGlzdCAtIExpc3QgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaE1hcFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIn0ga2luZCAtIEluc2VydGlvbi1vcmRlcmVkIG1hcCBwYWlyLWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtYXAgLSBPcmRlcmVkLW1hcCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSBrZXlCaW5kaW5nIC0gSW1tdXRhYmxlIHN0cmluZy1rZXkgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGhvbW9nZW5lb3VzIHZhbHVlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2hpbGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJXaGlsZVN0YXRlbWVudFwifSBraW5kIC0gU3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0ZWQgYmVmb3JlIGV2ZXJ5IGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBPcmRlcmVkIGxvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnJlYWtTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJCcmVha1N0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGJyZWFrIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb250aW51ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkNvbnRpbnVlU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgY29udGludWUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiRXJyb3JDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIENvbnN0cnVjdGlvbiBvZiBvbmUgZGVjbGFyZWQgdW5jaGVja2VkIGVycm9yLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGVycm9yIC0gRXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtZXNzYWdlIC0gU29sZSBpbW11dGFibGUgc3RyaW5nIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlIGFuZCBtZXNzYWdlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJhaXNlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmFpc2VTdGF0ZW1lbnRcIn0ga2luZCAtIEFicnVwdCB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge0Vycm9yQ29uc3RydWN0aW9ufSBlcnJvciAtIEV4YWN0IGNvbnN0cnVjdGVkIHNlbWFudGljIGVycm9yLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByYWlzZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByYWlzZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhdGNoQmluZGluZ1xuICogQHByb3BlcnR5IHtcIkNhdGNoQmluZGluZ1wifSBraW5kIC0gRXhhY3QtaGFuZGxlciBiaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEhhbmRsZXItbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IHR5cGUgLSBFeGFjdCBjYXVnaHQgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIENhdGNoIGJpbmRpbmdzIGFyZSBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgYmluZGluZyByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRyeVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlRyeVN0YXRlbWVudFwifSBraW5kIC0gT25lIGJvZHkgYW5kIG9uZSBleGFjdCB0eXBlZCBoYW5kbGVyLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgdHJ5L2hhbmRsZXIgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHJ5L2NhdGNoIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgVHJ5U3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCbG9ja1xuICogQHByb3BlcnR5IHtcIkJsb2NrXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1N0YXRlbWVudFtdfSBzdGF0ZW1lbnRzIC0gT3JkZXJlZCBzdGF0ZW1lbnRzIGluIG9uZSBsZXhpY2FsIHNjb3BlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIFJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZ1bmN0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRGaWVsZFxuICogQHByb3BlcnR5IHtcIlJlY29yZEZpZWxkXCJ9IGtpbmQgLSBDbG9zZWQgcmVjb3JkLWZpZWxkIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlY29yZCBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1JlY29yZEZpZWxkW119IGZpZWxkcyAtIE9yZGVyZWQgdW5pcXVlIHZpc2libGUgZmllbGRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkXCJ9IGtpbmQgLSBEZWNsYXJpbmctY2xhc3MtcHJpdmF0ZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBmaWVsZCBuYW1lIGluc2lkZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9ubHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uc3RydWN0b3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIn0ga2luZCAtIEV4YWN0IGNvbXBsZXRlIHByaXZhdGUtc3RhdGUgaW5pdGlhbGl6ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgY29uc3RydWN0b3IgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRmllbGQtb3JkZXIgaW5pdGlhbGl6YXRpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0b3IgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjb25zdHJ1Y3RvciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFJlY2VpdmVyLWJvdW5kIGNsYXNzIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBtZXRob2QgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgbWV0aG9kIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBNZXRob2QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1ldGhvZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCBFcnJvckRlY2xhcmF0aW9uIHwgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uIHwgRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbiB8IEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uIHwgUmVjb3JkRmllbGQgfCBQcml2YXRlRmllbGQgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlciB8IFBhcmFtZXRlciB8IFZhbHVlQmluZGluZyB8IENhdGNoQmluZGluZyB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBFcnJvckNvbnN0cnVjdGlvbiB8IEVycm9yVHlwZSB8IE1hcEVudHJ5IHwgU2VtYW50aWNWYWx1ZVR5cGUgfCBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZVdpdGhvdXRMb2NhdGlvbnMgKi9cblxuZXhwb3J0IHt9XG4iXX0=