semantifold 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +1 -0
  2. package/build/src/backends/effects.js +3 -1
  3. package/build/src/backends/php.d.ts.map +1 -1
  4. package/build/src/backends/php.js +56 -3
  5. package/build/src/backends/scalars.js +2 -2
  6. package/build/src/backends/shared.d.ts +2 -1
  7. package/build/src/backends/shared.d.ts.map +1 -1
  8. package/build/src/backends/shared.js +209 -7
  9. package/build/src/backends/writer.d.ts +18 -4
  10. package/build/src/backends/writer.d.ts.map +1 -1
  11. package/build/src/backends/writer.js +40 -4
  12. package/build/src/frontends/java.d.ts +1 -1
  13. package/build/src/frontends/java.d.ts.map +1 -1
  14. package/build/src/frontends/java.js +14 -11
  15. package/build/src/frontends/javascript-typescript.d.ts +1 -1
  16. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  17. package/build/src/frontends/javascript-typescript.js +17 -17
  18. package/build/src/frontends/php.d.ts +5 -1
  19. package/build/src/frontends/php.d.ts.map +1 -1
  20. package/build/src/frontends/php.js +159 -31
  21. package/build/src/frontends/ruby.d.ts +1 -1
  22. package/build/src/frontends/ruby.d.ts.map +1 -1
  23. package/build/src/frontends/ruby.js +12 -9
  24. package/build/src/frontends/types.d.ts +9 -2
  25. package/build/src/frontends/types.d.ts.map +1 -1
  26. package/build/src/frontends/types.js +26 -9
  27. package/build/src/language-registry.d.ts.map +1 -1
  28. package/build/src/language-registry.js +14 -6
  29. package/build/src/mapping.d.ts.map +1 -1
  30. package/build/src/mapping.js +4 -2
  31. package/build/src/semantic/effects.d.ts.map +1 -1
  32. package/build/src/semantic/effects.js +3 -1
  33. package/build/src/semantic/provenance.d.ts.map +1 -1
  34. package/build/src/semantic/provenance.js +37 -4
  35. package/build/src/semantic/types.d.ts +140 -9
  36. package/build/src/semantic/types.d.ts.map +1 -1
  37. package/build/src/semantic/types.js +37 -6
  38. package/build/src/semantic/validate.d.ts +31 -2
  39. package/build/src/semantic/validate.d.ts.map +1 -1
  40. package/build/src/semantic/validate.js +346 -27
  41. package/docs/adr-bounded-subtyping.md +180 -0
  42. package/docs/language-support.md +1 -1
  43. package/package.json +1 -1
  44. package/src/backends/effects.js +1 -0
  45. package/src/backends/php.js +56 -2
  46. package/src/backends/scalars.js +1 -1
  47. package/src/backends/shared.js +210 -6
  48. package/src/backends/writer.js +41 -3
  49. package/src/frontends/java.js +13 -10
  50. package/src/frontends/javascript-typescript.js +16 -16
  51. package/src/frontends/php.js +175 -31
  52. package/src/frontends/ruby.js +11 -8
  53. package/src/frontends/types.js +26 -8
  54. package/src/language-registry.js +13 -5
  55. package/src/mapping.js +3 -1
  56. package/src/semantic/effects.js +1 -0
  57. package/src/semantic/provenance.js +34 -3
  58. package/src/semantic/types.js +39 -5
  59. package/src/semantic/validate.js +377 -26
@@ -7,8 +7,8 @@
7
7
  /** @typedef {SemanticTypeName | "void"} FunctionReturnTypeName */
8
8
  /** @typedef {"IntegerNegate" | "BooleanNot"} SemanticUnaryOperation */
9
9
  /** @typedef {"IntegerAdd" | "IntegerSubtract" | "IntegerMultiply" | "BooleanAnd" | "BooleanOr" | "IntegerEqual" | "IntegerNotEqual" | "BooleanEqual" | "BooleanNotEqual" | "StringEqual" | "StringNotEqual" | "IntegerLessThan" | "IntegerLessThanOrEqual" | "IntegerGreaterThan" | "IntegerGreaterThanOrEqual" | "StringConcat"} SemanticBinaryOperation */
10
- /** @typedef {"capability" | "resource" | "failure" | "operation" | "record" | "class" | "error" | "field" | "constructor" | "method" | "function" | "typeParameter" | "parameter" | "local" | "iteration" | "catch"} SemanticSymbolKind */
11
- /** @typedef {"record" | "class" | "error" | "function"} SemanticDeclarationKind */
10
+ /** @typedef {"capability" | "resource" | "failure" | "operation" | "record" | "interface" | "interfaceMethod" | "class" | "error" | "field" | "constructor" | "method" | "function" | "typeParameter" | "parameter" | "local" | "iteration" | "catch"} SemanticSymbolKind */
11
+ /** @typedef {"record" | "interface" | "class" | "error" | "function"} SemanticDeclarationKind */
12
12
  /** @typedef {"declaration" | "type" | "construct" | "member" | "read" | "write" | "call"} SemanticSymbolRole */
13
13
  /** @typedef {"parse" | "generate" | "restore" | "compile" | "link" | "validate" | "instantiate" | "execute"} AcceptanceStage */
14
14
  /** @typedef {"entry" | "source" | "manifest" | "support" | "mapping" | "resource" | "loader"} GeneratedArtifactRole */
@@ -171,6 +171,7 @@
171
171
  * @property {boolean} typedErrors - Task 011 nominal unchecked errors, raises, and exact typed catches.
172
172
  * @property {boolean} typeParametersAndGenerics - Task 012 invariant unbounded type parameters and closed generic applications.
173
173
  * @property {boolean} referenceClasses - Task 033 nominal reference classes, private instance state, exact constructors, and receiver methods.
174
+ * @property {boolean} boundedSubtyping - Task 048 nominal interfaces with exact implementation contracts and implicit upcast (requires referenceClasses).
174
175
  * @property {boolean} effectfulCapabilitiesAndResources - Task 034 authorized host effects, typed failures, and owned resources.
175
176
  */
176
177
  /**
@@ -621,7 +622,13 @@
621
622
  * @property {string} declarationId - Exact owned class declaration identity.
622
623
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
623
624
  */
624
- /** @typedef {TypeReference | TypeVariableReference | ListType | MapType | OrderedMapType | OptionalType | RecordType | ReferenceType | OwnedResourceType | OwnedReferenceType} SemanticValueType */
625
+ /**
626
+ * @typedef InterfaceType
627
+ * @property {"InterfaceType"} kind - Nominal bounded-subtyping interface type discriminator.
628
+ * @property {string} declarationId - Stable module-local interface declaration identity.
629
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
630
+ */
631
+ /** @typedef {TypeReference | TypeVariableReference | ListType | MapType | OrderedMapType | OptionalType | RecordType | ReferenceType | OwnedResourceType | OwnedReferenceType | InterfaceType} SemanticValueType */
625
632
  /** @typedef {SemanticValueType | ErrorType} SemanticBindingType */
626
633
  /**
627
634
  * @typedef FunctionReturnTypeReference
@@ -630,7 +637,7 @@
630
637
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance that survives semantic transforms.
631
638
  */
632
639
  /** @typedef {SemanticValueType | FunctionReturnTypeReference} SemanticFunctionReturnType */
633
- /** @typedef {SemanticTypeName | {kind: "TypeVariableReference", parameterId: string} | {kind: "ListType", elementType: SemanticTypeIdentity} | {kind: "MapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity} | {kind: "OrderedMapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity, order: "insertion"} | {kind: "OptionalType", valueType: SemanticTypeIdentity} | {kind: "RecordType", declarationId: string, arguments?: SemanticTypeIdentity[]} | {kind: "ReferenceType", declarationId: string} | {kind: "OwnedResourceType", resourceId: string} | {kind: "OwnedReferenceType", declarationId: string}} SemanticTypeIdentity */
640
+ /** @typedef {SemanticTypeName | {kind: "TypeVariableReference", parameterId: string} | {kind: "ListType", elementType: SemanticTypeIdentity} | {kind: "MapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity} | {kind: "OrderedMapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity, order: "insertion"} | {kind: "OptionalType", valueType: SemanticTypeIdentity} | {kind: "RecordType", declarationId: string, arguments?: SemanticTypeIdentity[]} | {kind: "ReferenceType", declarationId: string} | {kind: "OwnedResourceType", resourceId: string} | {kind: "OwnedReferenceType", declarationId: string} | {kind: "InterfaceType", declarationId: string}} SemanticTypeIdentity */
634
641
  /** @typedef {SemanticTypeIdentity | "void"} FunctionReturnTypeIdentity */
635
642
  /**
636
643
  * @typedef ResolvedFunctionSignature
@@ -1194,9 +1201,30 @@
1194
1201
  * @property {Block} body - Method body.
1195
1202
  * @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
1196
1203
  * @property {string[]} [failureIds] - Ordered capability failures reachable through the method.
1204
+ * @property {{interfaceId: string, methodId: string}} [implements] - Exact satisfied interface member, required after validation when the method satisfies an interface contract.
1197
1205
  * @property {SourceLocation} location - Complete method location.
1198
1206
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned method-name range.
1199
1207
  */
1208
+ /**
1209
+ * @typedef InterfaceMethodDeclaration
1210
+ * @property {"InterfaceMethodDeclaration"} kind - Signature-only interface contract member.
1211
+ * @property {string} [id] - Stable interface-scoped method identity, required after validation.
1212
+ * @property {string} name - Source-visible method name.
1213
+ * @property {Parameter[]} parameters - Exact positional required parameters with explicit types.
1214
+ * @property {SemanticFunctionReturnType} returnType - Exact value or void return.
1215
+ * @property {SourceLocation} location - Complete interface method location.
1216
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned method-name range.
1217
+ */
1218
+ /**
1219
+ * @typedef InterfaceDeclaration
1220
+ * @property {"InterfaceDeclaration"} kind - Closed signature-only nominal interface with exact implementation contracts.
1221
+ * @property {string} [id] - Stable module-local interface identity, required after validation.
1222
+ * @property {string} name - Source-visible interface name.
1223
+ * @property {InterfaceType[]} [extends] - Direct interface parents in source order; omitted when empty.
1224
+ * @property {InterfaceMethodDeclaration[]} methods - Ordered closed signature set.
1225
+ * @property {SourceLocation} location - Complete interface location.
1226
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned interface-name range.
1227
+ */
1200
1228
  /**
1201
1229
  * @typedef ClassDeclaration
1202
1230
  * @property {"ClassDeclaration"} kind - Nominal reference class with private mutable state.
@@ -1205,6 +1233,7 @@
1205
1233
  * @property {PrivateField[]} fields - Ordered private instance state.
1206
1234
  * @property {ConstructorDeclaration} constructor - Sole exact constructor.
1207
1235
  * @property {MethodDeclaration[]} methods - Ordered receiver methods.
1236
+ * @property {InterfaceType[]} [implements] - Direct interface contracts in source order; omitted when empty.
1208
1237
  * @property {{kind: "ordinary"} | {kind: "ownedResource", fieldId: string, resourceId: string}} [ownership] - Explicit class ownership profile.
1209
1238
  * @property {SourceLocation} location - Complete class location.
1210
1239
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned class-name range.
@@ -1235,6 +1264,7 @@
1235
1264
  * @typedef SemanticModule
1236
1265
  * @property {"Module"} kind - Node discriminator.
1237
1266
  * @property {RecordDeclaration[]} [records] - Top-level nominal record declarations in source order; omitted when empty.
1267
+ * @property {InterfaceDeclaration[]} [interfaces] - Top-level nominal interface declarations in source order; omitted when empty.
1238
1268
  * @property {ClassDeclaration[]} [classes] - Top-level nominal reference classes in source order; omitted when empty.
1239
1269
  * @property {ErrorDeclaration[]} [errors] - Top-level nominal unchecked error declarations in source order; omitted when empty.
1240
1270
  * @property {EffectCapabilityDeclaration[]} [capabilities] - Compiler-authorized Task 034 declarations; omission is the legacy empty set.
@@ -1281,6 +1311,7 @@
1281
1311
  * @property {string} id - Stable caller-supplied logical module identity.
1282
1312
  * @property {string} sourceFilename - Explicit source filename; never an implicit read request.
1283
1313
  * @property {RecordDeclaration[]} [records] - Top-level nominal record declarations.
1314
+ * @property {InterfaceDeclaration[]} [interfaces] - Top-level nominal interface declarations.
1284
1315
  * @property {ClassDeclaration[]} [classes] - Compiler-owned facade reference classes.
1285
1316
  * @property {ErrorDeclaration[]} [errors] - Top-level nominal unchecked error declarations.
1286
1317
  * @property {FunctionDeclaration[]} functions - Top-level functions.
@@ -1322,7 +1353,7 @@
1322
1353
  * @property {{contractVersion?: string, identity: string}[]} [stdlibContracts] - Ordered declared standard-library contracts; plain, never frozen.
1323
1354
  * @property {StdlibFacadeProgramDescriptor} [stdlibFacades] - Complete selected source-language facade closure.
1324
1355
  */
1325
- /** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | CatchHandler | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
1356
+ /** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | InterfaceDeclaration | InterfaceMethodDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | CatchHandler | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
1326
1357
  /** @typedef {SemanticNode} SemanticNodeWithoutLocations */
1327
1358
  export {};
1328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLGtMQUFrTDtBQUNsTCxzREFBc0Q7QUFDdEQsOEZBQThGO0FBQzlGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUgsK0VBQStFO0FBRS9FOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsOERBQThEO0FBRTlEOzs7Ozs7Ozs7R0FTRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUgsa0hBQWtIO0FBRWxIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVILG1MQUFtTDtBQUVuTCx5RUFBeUU7QUFFekU7Ozs7Ozs7O0dBUUc7QUFFSDs7OztHQUlHO0FBRUg7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUgsb01BQW9NO0FBQ3BNLG1FQUFtRTtBQUVuRTs7Ozs7R0FLRztBQUVILDRGQUE0RjtBQUU1Riw4b0JBQThvQjtBQUM5b0IsMEVBQTBFO0FBRTFFOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7O0dBSUc7QUFFSCwyS0FBMks7QUFFM0s7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILG9GQUFvRjtBQUNwRiw2TkFBNk47QUFDN04scURBQXFEO0FBQ3JELDRQQUE0UDtBQUM1UCwyWUFBMlk7QUFDM1ksd0tBQXdLO0FBQ3hLLHdJQUF3STtBQUN4SSwrU0FBK1M7QUFFL1M7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSCwyakJBQTJqQjtBQUUzakI7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsdUVBQXVFO0FBQ3ZFLGdTQUFnUztBQUVoUzs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgsdWtCQUF1a0I7QUFDdmtCLDJEQUEyRDtBQUUzRCxPQUFPLEVBQUUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKiogQHR5cGVkZWYge1wicGhwXCIgfCBcInJ1YnlcIiB8IFwiamF2YXNjcmlwdFwiIHwgXCJ0eXBlc2NyaXB0XCIgfCBcImphdmFcIiB8IFwia290bGluXCIgfCBcInB5dGhvblwiIHwgXCJjc2hhcnBcIiB8IFwiZ29cIiB8IFwiY1wiIHwgXCJjcHBcIiB8IFwicnVzdFwiIHwgXCJzd2lmdFwiIHwgXCJkYXJ0XCIgfCBcInppZ1wifSBTZW1hbnRpY0xhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2V9IFRleHRCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7VGV4dEJhY2tlbmRMYW5ndWFnZSB8IFwid2FzbVwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwiIHwgXCJmbHV0dGVyXCJ9IEJhY2tlbmRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY0xhbmd1YWdlIHwgXCJodG1sXCJ9IEdlbmVyYXRlZFRleHRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImludGVnZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJzdHJpbmdcIn0gU2VtYW50aWNUeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwgXCJ2b2lkXCJ9IEZ1bmN0aW9uUmV0dXJuVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyTmVnYXRlXCIgfCBcIkJvb2xlYW5Ob3RcIn0gU2VtYW50aWNVbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJBZGRcIiB8IFwiSW50ZWdlclN1YnRyYWN0XCIgfCBcIkludGVnZXJNdWx0aXBseVwiIHwgXCJCb29sZWFuQW5kXCIgfCBcIkJvb2xlYW5PclwiIHwgXCJJbnRlZ2VyRXF1YWxcIiB8IFwiSW50ZWdlck5vdEVxdWFsXCIgfCBcIkJvb2xlYW5FcXVhbFwiIHwgXCJCb29sZWFuTm90RXF1YWxcIiB8IFwiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIiB8IFwiSW50ZWdlckxlc3NUaGFuXCIgfCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIiB8IFwiU3RyaW5nQ29uY2F0XCJ9IFNlbWFudGljQmluYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiY2FwYWJpbGl0eVwiIHwgXCJyZXNvdXJjZVwiIHwgXCJmYWlsdXJlXCIgfCBcIm9wZXJhdGlvblwiIHwgXCJyZWNvcmRcIiB8IFwiY2xhc3NcIiB8IFwiZXJyb3JcIiB8IFwiZmllbGRcIiB8IFwiY29uc3RydWN0b3JcIiB8IFwibWV0aG9kXCIgfCBcImZ1bmN0aW9uXCIgfCBcInR5cGVQYXJhbWV0ZXJcIiB8IFwicGFyYW1ldGVyXCIgfCBcImxvY2FsXCIgfCBcIml0ZXJhdGlvblwiIHwgXCJjYXRjaFwifSBTZW1hbnRpY1N5bWJvbEtpbmQgKi9cbi8qKiBAdHlwZWRlZiB7XCJyZWNvcmRcIiB8IFwiY2xhc3NcIiB8IFwiZXJyb3JcIiB8IFwiZnVuY3Rpb25cIn0gU2VtYW50aWNEZWNsYXJhdGlvbktpbmQgKi9cbi8qKiBAdHlwZWRlZiB7XCJkZWNsYXJhdGlvblwiIHwgXCJ0eXBlXCIgfCBcImNvbnN0cnVjdFwiIHwgXCJtZW1iZXJcIiB8IFwicmVhZFwiIHwgXCJ3cml0ZVwiIHwgXCJjYWxsXCJ9IFNlbWFudGljU3ltYm9sUm9sZSAqL1xuLyoqIEB0eXBlZGVmIHtcInBhcnNlXCIgfCBcImdlbmVyYXRlXCIgfCBcInJlc3RvcmVcIiB8IFwiY29tcGlsZVwiIHwgXCJsaW5rXCIgfCBcInZhbGlkYXRlXCIgfCBcImluc3RhbnRpYXRlXCIgfCBcImV4ZWN1dGVcIn0gQWNjZXB0YW5jZVN0YWdlICovXG4vKiogQHR5cGVkZWYge1wiZW50cnlcIiB8IFwic291cmNlXCIgfCBcIm1hbmlmZXN0XCIgfCBcInN1cHBvcnRcIiB8IFwibWFwcGluZ1wiIHwgXCJyZXNvdXJjZVwiIHwgXCJsb2FkZXJcIn0gR2VuZXJhdGVkQXJ0aWZhY3RSb2xlICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFNhZmUgWGNvZGUgcHJvZHVjdC9wYXRoIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBTYWZlIFN3aWZ0IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb25QcmVmaXggLSBDYWxsZXItc3VwcGxpZWQgcmV2ZXJzZS1ETlMgb3JnYW5pemF0aW9uIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZGVudGlmaWVyIC0gQ2FsbGVyLXN1cHBsaWVkIHJldmVyc2UtRE5TIGFwcGxpY2F0aW9uIGJ1bmRsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXBsb3ltZW50VGFyZ2V0IC0gQ2FsbGVyLXN1cHBsaWVkIG1ham9yLm1pbm9yIGlPUyBkZXBsb3ltZW50IHRhcmdldDsgbmV2ZXIgaW5mZXJyZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJTb3VyY2VzXCJ9IFtzb3VyY2VSb290XSAtIEZpeGVkIGdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJBc3NldHMueGNhc3NldHNcIn0gW3Jlc291cmNlUm9vdF0gLSBGaXhlZCBjYWxsZXItcmVzb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJzd2lmdHVpXCJ9IFtsaWZlY3ljbGVdIC0gU29sZSBzdXBwb3J0ZWQgbGlmZWN5Y2xlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBuZXZlcj59IFtpbmZvUGxpc3RdIC0gQ2xvc2VkIGJhc2VsaW5lIGNhbGxlciBwbGlzdCBleHRlbnNpb247IGN1cnJlbnRseSBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcGVybWlzc2lvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW2VudGl0bGVtZW50c10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBlbnRpdGxlbWVudHMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3ByaXZhY3lEZWNsYXJhdGlvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgcHJpdmFjeSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW2NhcGFiaWxpdGllc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBBcHBsZSBjYXBhYmlsaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFZhbGlkYXRlZCBYY29kZSBwcm9kdWN0L3BhdGggaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlTmFtZSAtIFZhbGlkYXRlZCBTd2lmdCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uUHJlZml4IC0gVmFsaWRhdGVkIHJldmVyc2UtRE5TIG9yZ2FuaXphdGlvbiBwcmVmaXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWRlbnRpZmllciAtIFZhbGlkYXRlZCByZXZlcnNlLUROUyBhcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVwbG95bWVudFRhcmdldCAtIFZhbGlkYXRlZCBjYWxsZXItc3VwcGxpZWQgZGVwbG95bWVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBWYWxpZGF0ZWQgZGlzcGxheSBuYW1lLlxuICogQHByb3BlcnR5IHtcIlNvdXJjZXNcIn0gc291cmNlUm9vdCAtIEdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJBc3NldHMueGNhc3NldHNcIn0gcmVzb3VyY2VSb290IC0gQ2FsbGVyLXJlc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wic3dpZnR1aVwifSBsaWZlY3ljbGUgLSBTb2xlIHN1cHBvcnRlZCBsaWZlY3ljbGUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG5ldmVyPj59IGluZm9QbGlzdCAtIEVtcHR5IGNhbGxlciBwbGlzdCBleHRlbnNpb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IHBlcm1pc3Npb25zIC0gRW1wdHkgYmFzZWxpbmUgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IGVudGl0bGVtZW50cyAtIEVtcHR5IGJhc2VsaW5lIGVudGl0bGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gcHJpdmFjeURlY2xhcmF0aW9ucyAtIEVtcHR5IGJhc2VsaW5lIHByaXZhY3kgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBjYXBhYmlsaXRpZXMgLSBFbXB0eSBiYXNlbGluZSBBcHBsZSBjYXBhYmlsaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkFzc2V0SW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gRnVsbCBzYWZlIGRlc3RpbmF0aW9uIGJlbG93IEFzc2V0cy54Y2Fzc2V0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIEV4YWN0IGNhbGxlci1wcm92aWRlZCB0ZXh0IG9yIGJ5dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEV4cGxpY2l0IGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2hhMjU2IC0gTG93ZXJjYXNlIFNIQS0yNTYgb2YgZXhhY3QgVVRGLTggdGV4dCBvciBieXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthcHBsaWNhdGlvbklkXSAtIExvd2VyY2FzZSByZXZlcnNlLUROUyBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lc3BhY2VdIC0gS290bGluL0FuZHJvaWQgbmFtZXNwYWNlOyBkZWZhdWx0cyB0byBhcHBsaWNhdGlvbklkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBHZW5lcmF0ZWQgS290bGluIHBhY2thZ2U7IGRlZmF1bHRzIHRvIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aXZpdHlDbGFzc05hbWVdIC0gTGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJvZHVjdE5hbWVdIC0gRGV0ZXJtaW5pc3RpYyBwcm9qZWN0IHByb2R1Y3QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlzcGxheU5hbWVdIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gW21pbmltdW1TZGtdIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbdGFyZ2V0U2RrXSAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbY29tcGlsZVNka10gLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gW2J1aWxkVG9vbHNWZXJzaW9uXSAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcnNpb25Db2RlXSAtIFBvc2l0aXZlIEFuZHJvaWQgdmVyc2lvbiBjb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJzaW9uTmFtZV0gLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcInVuc3BlY2lmaWVkXCJ9IFtvcmllbnRhdGlvbl0gLSBCYXNlbGluZSBvcmllbnRhdGlvbiBiZWhhdmlvci5cbiAqIEBwcm9wZXJ0eSB7XCJzeXN0ZW1cIn0gW3RoZW1lXSAtIEJhc2VsaW5lIHBsYXRmb3JtLW5hdGl2ZSB0aGVtZS5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcGVybWlzc2lvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgcGVybWlzc2lvbiBzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwbGljYXRpb25JZCAtIFZhbGlkYXRlZCBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVzcGFjZSAtIFZhbGlkYXRlZCBBbmRyb2lkIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlTmFtZSAtIEdlbmVyYXRlZCBLb3RsaW4gcGFja2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpdml0eUNsYXNzTmFtZSAtIExhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBQcm9qZWN0IHByb2R1Y3QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IG1pbmltdW1TZGsgLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IHRhcmdldFNkayAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBjb21waWxlU2RrIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IGJ1aWxkVG9vbHNWZXJzaW9uIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFBvc2l0aXZlIEFuZHJvaWQgdmVyc2lvbiBjb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25OYW1lIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJ1bnNwZWNpZmllZFwifSBvcmllbnRhdGlvbiAtIEJhc2VsaW5lIG9yaWVudGF0aW9uIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtcInN5c3RlbVwifSB0aGVtZSAtIFBsYXRmb3JtLW5hdGl2ZSB0aGVtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbklucHV0RmlsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBTYWZlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGVkIGZpeGVkIEFuZHJvaWQgcmVzb3VyY2Ugb3IgYXNzZXQgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIEV4YWN0IGNhbGxlci1wcm92aWRlZCB0ZXh0IG9yIGJ5dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEV4cGxpY2l0IGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2hhMjU2IC0gTG93ZXJjYXNlIFNIQS0yNTYgb2YgZXhhY3QgVVRGLTggdGV4dCBvciBieXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZsdXR0ZXJBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBMb3dlcmNhc2UgRGFydCBwYWNrYWdlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtvcmdhbml6YXRpb25dIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIG93bmluZyBvcmdhbml6YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FwcGxpY2F0aW9uSWRdIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkgZXh0ZW5kaW5nIHRoZSBvcmdhbml6YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FjdGl2aXR5Q2xhc3NOYW1lXSAtIEdlbmVyYXRlZCBKYXZhIGxhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpc3BsYXlOYW1lXSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IFttaW5pbXVtU2RrXSAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW3RhcmdldFNka10gLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW2NvbXBpbGVTZGtdIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IFtidWlsZFRvb2xzVmVyc2lvbl0gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJzaW9uQ29kZV0gLSBQb3NpdGl2ZSBBbmRyb2lkL0ZsdXR0ZXIgYnVpbGQgbnVtYmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJzaW9uTmFtZV0gLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBwZXJtaXNzaW9uIHNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZsdXR0ZXJBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlTmFtZSAtIFZhbGlkYXRlZCBEYXJ0IHBhY2thZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uIC0gVmFsaWRhdGVkIG93bmluZyBvcmdhbml6YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwbGljYXRpb25JZCAtIFZhbGlkYXRlZCBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5Q2xhc3NOYW1lIC0gR2VuZXJhdGVkIEphdmEgbGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IG1pbmltdW1TZGsgLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IHRhcmdldFNkayAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBjb21waWxlU2RrIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IGJ1aWxkVG9vbHNWZXJzaW9uIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFBvc2l0aXZlIEFuZHJvaWQvRmx1dHRlciBidWlsZCBudW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk5hbWUgLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQXNzZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBTYWZlIHBhdGggYmVsb3cgdGhlIGdlbmVyYXRlZCBGbHV0dGVyIGFzc2V0cyByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSb2xlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZyb250ZW5kIC0gUGFyc2VyIGFkYXB0ZXIgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0ZXh0QmFja2VuZCAtIFNpbmdsZS0gb3IgbXVsdGktZmlsZSB0ZXh0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBiaW5hcnlCYWNrZW5kIC0gQmluYXJ5IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBhcHBsaWNhdGlvbkJhY2tlbmQgLSBBcHBsaWNhdGlvbi1hcnRpZmFjdCBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW50ZXJvcGVyYWJpbGl0eSAtIEludGVyb3BlcmFiaWxpdHkgYnJpZGdlIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJvdmlkZXIgLSBUYXJnZXQgaG9zdCBzdGRsaWIgcHJvdmlkZXIvbmF0aXZlLWJpbmRpbmcgYXZhaWxhYmlsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJpY2hUZXh0IC0gQXV0aG9yaXRhdGl2ZSByaWNoIHRleHQgbWFwcGluZ3MuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNvdXJjZU1hcFYzIC0gU291cmNlIE1hcCB2MyBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBiaW5hcnlSYW5nZXMgLSBCeXRlLWNvb3JkaW5hdGUgYmluYXJ5L3Jlc291cmNlIG1hcHBpbmdzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVtdfSBzdGFnZXMgLSBBcHBsaWNhYmxlIG9yZGVyZWQgYWNjZXB0YW5jZSBzdGFnZXMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB0b29sY2hhaW5zIC0gUmVxdWlyZWQgY2Fub25pY2FsIHRvb2xjaGFpbiBJRHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUNoZWNrQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN1cHBvcnRlZCAtIFdoZXRoZXIgdGhlIHRhcmdldCBvd25zIGEgZGV2ZWxvcGVyIGNoZWNrIHBsYW4uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVtdfSBzdGFnZXMgLSBPcmRlcmVkIG5vbi1leGVjdXRpbmcgZGV2ZWxvcGVyLWNoZWNrIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBFeGFjdCBjYW5vbmljYWwgdG9vbHMgcmVxdWlyZWQgdG8gY29uc3RydWN0IHRoZSBwbGFuLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxscyAtIFRhc2sgMDA1IGFyYml0cmFyeSByZXF1aXJlZCBzaWduYXR1cmVzLCByZXNvbHZlZCBkaXJlY3QgY2FsbHMsIGFuZCB2b2lkIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW1tdXRhYmxlQ29sbGVjdGlvbnMgLSBUYXNrIDAwNiByZWN1cnNpdmUgaW1tdXRhYmxlIGxpc3RzL21hcHMsIHRvdGFsIGFjY2VzcywgYW5kIHNpemUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wdGlvbmFsVmFsdWVzIC0gVGFzayAwMDcgZXhwbGljaXQgb3B0aW9uYWwgdmFsdWVzLCBwcmVzZW5jZSB0ZXN0cywgYW5kIGd1YXJkZWQgdW53cmFwLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcmRlcmVkTGlzdEl0ZXJhdGlvbiAtIFRhc2sgMDA4IG9yZGVyZWQgaW1tdXRhYmxlLWxpc3QgaXRlcmF0aW9uIGFuZCBuZWFyZXN0LWxvb3AgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3JkZXJlZE1hcEl0ZXJhdGlvbiAtIFRhc2sgMDE0IGluc2VydGlvbi1vcmRlcmVkIGltbXV0YWJsZS1tYXAgcGFpciBpdGVyYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wcyAtIFRhc2sgMDMyIHN0cmljdC1Cb29sZWFuIHByZS1jb25kaXRpb24gbG9vcHMgYW5kIHJlc29sdmVkIGNvbnRyb2wuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbmRpdGlvbmFsRXhwcmVzc2lvbnMgLSBUYXNrIDA0OCBzdHJpY3QtQm9vbGVhbiBjb25kaXRpb25hbCBleHByZXNzaW9ucyB3aXRoIGpvaW5lZCBhcm0gdHlwZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0cmluZ0ludGVycG9sYXRpb24gLSBUYXNrIDA0OCBwYXJzZXItcHJvdmVkIHN0cmluZyBpbnRlcnBvbGF0aW9uIGxvd2VyZWQgdG8gY2hlY2tlZCBzdHJpbmcgY29uY2F0ZW5hdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2xvc2VkUmVjb3JkcyAtIFRhc2sgMDA5IG5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmRzLCBjb25zdHJ1Y3Rpb24sIGFuZCBtZW1iZXIgcmVhZHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVkRXJyb3JzIC0gVGFzayAwMTEgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3JzLCByYWlzZXMsIGFuZCBleGFjdCB0eXBlZCBjYXRjaGVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzIC0gVGFzayAwMTIgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMgYW5kIGNsb3NlZCBnZW5lcmljIGFwcGxpY2F0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVmZXJlbmNlQ2xhc3NlcyAtIFRhc2sgMDMzIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMsIHByaXZhdGUgaW5zdGFuY2Ugc3RhdGUsIGV4YWN0IGNvbnN0cnVjdG9ycywgYW5kIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlcyAtIFRhc2sgMDM0IGF1dGhvcml6ZWQgaG9zdCBlZmZlY3RzLCB0eXBlZCBmYWlsdXJlcywgYW5kIG93bmVkIHJlc291cmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTdGFibGUgcmVnaXN0cnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlUm9sZUNhcGFiaWxpdGllcz59IHJvbGVzIC0gSW5kZXBlbmRlbnRseSByZWdpc3RlcmVkIHJvbGVzLlxuICogQHByb3BlcnR5IHtcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwifSBhcnRpZmFjdE11bHRpcGxpY2l0eSAtIFRhcmdldCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFdoZXRoZXIgZnJvbnRlbmQvYmFja2VuZCByb3VuZC10cmlwIGFjY2VwdGFuY2UgaXMgZGVjbGFyZWQuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllcz59IGZlYXR1cmVzIC0gU2VtYW50aWMgZmVhdHVyZSBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllcz59IG1hcHBpbmcgLSBNYXBwaW5nIGZvcm1zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXM+fSBhY2NlcHRhbmNlIC0gU3RhZ2VzIGFuZCB0b29sY2hhaW5zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUNoZWNrQ2FwYWJpbGl0aWVzPn0gY2hlY2sgLSBOb24tZXhlY3V0aW5nIGRldmVsb3Blci1jaGVjayBjYXBhYmlsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lIC0gT25lLWJhc2VkIGxpbmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29sdW1uIC0gT25lLWJhc2VkIFVURi0xNiBjb2RlLXVuaXQgY29sdW1uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IHNvdXJjZSBvZmZzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VMb2NhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBzdGFydCAtIEluY2x1c2l2ZSBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IGVuZCAtIEV4Y2x1c2l2ZSBlbmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWdpc3RlcmVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBSZWdpc3RyeS1sb2NhbCBkZXRlcm1pbmlzdGljIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmFsIGZpbGVuYW1lLCBwcmVzZXJ2ZWQgdmVyYmF0aW0uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBPcmlnaW5hbCBzb3VyY2UgY29udGVudCwgcHJlc2VydmVkIHZlcmJhdGltIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBQYXJzZXIgbGFuZ3VhZ2Ugd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7XCJhcHBsaWNhdGlvblwiIHwgXCJmYWNhZGVcIn0gW293bmVyc2hpcF0gLSBDYWxsZXIgb3IgY29tcGlsZXItb3duZWQgc291cmNlIHJvbGUgZm9yIHNlbWFudGljIHByb2dyYW1zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic291cmNlXCJ9IGtpbmQgLSBEaXJlY3Qgc291cmNlIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3Qgb3JpZ2luYWwgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWxhdGVkT3JpZ2luXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUmVsYXRlZCBvcmlnaW5hbCByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gUmVsYXRpb25zaGlwIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBEZXJpdmVkT3JpZ2luXG4gKiBAcHJvcGVydHkge1wiZGVyaXZlZFwifSBraW5kIC0gUHJvdmVuYW5jZSBkZXJpdmVkIGZyb20gb25lIG9yIG1vcmUgb3JpZ2lucy5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSBvcmlnaW5zIC0gT3JkZXJlZCwgbm9uLWVtcHR5IG9yaWdpbmFsIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN5bnRoZXRpY09yaWdpblxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU291cmNlLWZyZWUgZ2VuZXJhdGVkIG9yIHNlbWFudGljIHNjYWZmb2xkaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSBodW1hbi1yZWFkYWJsZSByZWFzb24uXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBPcmRlcmVkIHJlbGF0ZWQgcmFuZ2VzLCBwb3NzaWJseSBlbXB0eS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NvdXJjZU9yaWdpbiB8IERlcml2ZWRPcmlnaW4gfCBTeW50aGV0aWNPcmlnaW59IFNlbWFudGljT3JpZ2luICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQnl0ZVJhbmdlXG4gKiBAcHJvcGVydHkge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IGdlbmVyYXRlZCAtIEhhbGYtb3BlbiBnZW5lcmF0ZWQgYnl0ZSBvZmZzZXRzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gU2VtYW50aWMgb3IgZXhwbGljaXQgc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBPcmlnaW5hdGluZyBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBPcmlnaW5hdGluZyBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgb3IgYmluYXJ5LXJlZ2lvbiByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRCeXRlTWFwcGluZ1xuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJieXRlc1wifSBjb29yZGluYXRlU3lzdGVtIC0gR2VuZXJhdGVkIG9mZnNldHMgYXJlIGJ5dGVzLCBuZXZlciB0ZXh0IGNvbHVtbnMuXG4gKiBAcHJvcGVydHkge3twYXRoOiBzdHJpbmcsIGJ5dGVMZW5ndGg6IG51bWJlcn19IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBhcnRpZmFjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGVkQnl0ZVJhbmdlW119IHJhbmdlcyAtIE9yZGVyZWQgbm9uLW92ZXJsYXBwaW5nIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE5vZGVQcm92ZW5hbmNlXCJ9IHNjaGVtYSAtIEFzc29jaWF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBBc3NvY2lhdGlvbiB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gU291cmNlIGFzc29jaWF0aW9uIGluZGVwZW5kZW50IG9mIHRyYXZlcnNhbCBwb3NpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBKU09OIFBvaW50ZXIgZnJvbSB0aGUgc2VtYW50aWMgbW9kdWxlIHJvb3QuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVtcImtpbmRcIl0gfCBcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFNlbWFudGljIG5vZGUga2luZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBwcm92ZW5hbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVzb2x2ZWQgZGVjbGFyZWQvcmVmZXJlbmNlZCBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5vZGVJZCAtIFJlZmVycmluZyBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFJvbGV9IHJvbGUgLSBSZWZlcmVuY2Ugcm9sZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgcmVmZXJlbmNlIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNlbWFudGljIHN5bWJvbCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbEtpbmR9IGtpbmQgLSBTeW1ib2wgY2F0ZWdvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25Ob2RlSWQgLSBEZWNsYXJpbmcgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VtYW50aWNEZWNsYXJhdGlvbklkXSAtIFN0YWJsZSBzZW1hbnRpYyBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgcmVjb3JkLCBmaWVsZCwgYW5kIGZ1bmN0aW9uIHN5bWJvbHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUmVmZXJlbmNlW119IHJlZmVyZW5jZXMgLSBPcmRlcmVkIHJlc29sdmVkIHJlZmVyZW5jZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gVmVyc2lvbmVkIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIERldGVybWluaXN0aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBEZXRlcm1pbmlzdGljIHN5bWJvbCBpbmRleC5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCIgfCBcInN5bnRoZXRpY1wifSBNYXBwaW5nS2luZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1NwYW5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBoYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcHJvcGVydHkge01hcHBpbmdLaW5kfSBtYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIG9yaWdpbmFsIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBub2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBVc2VmdWwgc3ltYm9sIG5hbWUgZm9yIFNvdXJjZSBNYXAgdjMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkVGV4dExhbmd1YWdlfSBsYW5ndWFnZSAtIE91dHB1dCB0ZXh0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnQgLSBFeGFjdCBnZW5lcmF0ZWQgTEYgc291cmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZFNvdXJjZX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIHByb2dyYW0gaWRlbnRpdHkgYW5kIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIE9yaWdpbmFsIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIENhbm9uaWNhbCBzZW1hbnRpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIENhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIGdlbmVyYXRlZCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvZGUgLSBHZW5lcmF0ZWQgb3V0cHV0IHByb2dyYW0sIGluY2x1ZGluZyBhbnkgcmVxdWVzdGVkIGRpcmVjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIEdlbmVyYXRlZCBvdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIHJpY2ggbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gU291cmNlIE1hcCB2MyBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZU1hcEZpbGVuYW1lIC0gRGVmYXVsdCBleHRlcm5hbCBTb3VyY2UgTWFwIGZpbGVuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGV4dEFydGlmYWN0UHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInRleHRcIn0ga2luZCAtIFJpY2ggdGV4dCBwcm92ZW5hbmNlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmFuZ2UgbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gSW50ZXJvcGVyYWJsZSBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VNYXBGaWxlbmFtZV0gLSBMb2dpY2FsIFNvdXJjZSBNYXAgc2lkZWNhciBwYXRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnl0ZUFydGlmYWN0UHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGtpbmQgLSBCeXRlIHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRCeXRlTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgYnl0ZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBcnRpZmFjdFN5bnRoZXRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFN5bnRoZXRpYyBhcnRpZmFjdCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIEV4cGxpY2l0IHRhcmdldC1zY2FmZm9sZGluZyByZWFzb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFJlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBSZWxhdGVkIHNlbWFudGljIHNvdXJjZSByYW5nZXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlIHwgQnl0ZUFydGlmYWN0UHJvdmVuYW5jZSB8IEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZX0gQXJ0aWZhY3RQcm92ZW5hbmNlICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkU2V0QXJ0aWZhY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVW5pcXVlIHNhZmUgcmVsYXRpdmUgUE9TSVggcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJ0ZXh0XCIgfCBcImJpbmFyeVwifSBjb250ZW50S2luZCAtIENvbnRlbnQgcmVwcmVzZW50YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBUZXh0IG9yIGEgZGV0YWNoZWQgY29weSBvZiB0aGUgZXhhY3QgZ2VuZXJhdGVkIGJ5dGVzIG9uIGV2ZXJ5IGJpbmFyeSByZWFkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0Um9sZX0gcm9sZSAtIEFydGlmYWN0IHJvbGU7IGV4YWN0bHkgb25lIHNldCBhcnRpZmFjdCBpcyBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7XCJnZW5lcmF0ZWRcIn0gb3duZXJzaGlwIC0gVGFzay0wMTUgb3duZXJzaGlwIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtBcnRpZmFjdFByb3ZlbmFuY2V9IHByb3ZlbmFuY2UgLSBUZXh0LCBieXRlLXJhbmdlLCBvciBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0U2V0XG4gKiBAcHJvcGVydHkge1wiR2VuZXJhdGVkQXJ0aWZhY3RTZXRcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBTdGFibGUgbGFuZ3VhZ2Ugb3IgdGFyZ2V0IElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5IC0gUGF0aCBvZiB0aGUgc29sZSBkZWNsYXJlZCBlbnRyeSBhcnRpZmFjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gYXJ0aWZhY3RzIC0gRGV0ZXJtaW5pc3RpYyBhcnRpZmFjdCBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBbbWV0YWRhdGFdIC0gRGV0YWNoZWQgdGFyZ2V0LXNwZWNpZmljIEpTT04gbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvbkJ1aWxkQXJ0aWZhY3RJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBOb3JtYWxpemVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBidWlsZCBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIFN0YWJsZSBtZWRpYSB0eXBlIGZvciB0aGUgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gU3RhYmxlIGxhbmd1YWdlLW5ldXRyYWwgcm9sZSBmb3IgdGhlIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblZhbGlkYXRvckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRJZCAtIEV4cGxpY2l0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgZ2VuZXJhdGVkLXNvdXJjZSBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgY29tcGlsZXItb3V0cHV0IGRpcmVjdG9yeS5cbiAqL1xuXG4vKiogQHR5cGVkZWYgeyhjb250ZXh0OiBSZWFkb25seTxQdWJsaWNhdGlvblZhbGlkYXRvckNvbnRleHQ+KSA9PiBQcm9taXNlPFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W10gfCB2b2lkPiB8IFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W10gfCB2b2lkfSBQdWJsaWNhdGlvblZhbGlkYXRvciAqL1xuXG4vKiogQHR5cGVkZWYge1widGV4dFwiIHwgXCJiaW5hcnlcIiB8IFwiYXBwbGljYXRpb25cIn0gUHVibGljYXRpb25UYXJnZXRSb2xlICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25UYXJnZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXhwbGljaXQgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0U2V0fSBhcnRpZmFjdFNldCAtIENvbXBsZXRlIGFscmVhZHktdmFsaWRhdGVkIGdlbmVyYXRlZCBhcnRpZmFjdHMuXG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uVGFyZ2V0Um9sZX0gcm9sZSAtIEV4cGxpY2l0IGxhbmd1YWdlLW5ldXRyYWwgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUHJvamVjdGlvbiAtIEdlbmVyYXRpb24tcmVsYXRpdmUgZ2VuZXJhdGVkLXNvdXJjZSBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUHJvamVjdGlvbiAtIEdlbmVyYXRpb24tcmVsYXRpdmUgY29tcGlsZXItb3V0cHV0IHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uVmFsaWRhdG9yW119IFt2YWxpZGF0b3JzXSAtIE9yZGVyZWQgY2FuZGlkYXRlIHZhbGlkYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uSWQgLSBFeHBsaWNpdCBnZW5lcmF0aW9uL2N5Y2xlIGlkZW50aXR5LCBmcmVzaCBvciBhbiBleGFjdCByZXRhaW5lZCB2YWxpZGF0b3ItZnJlZSBjYW5kaWRhdGUuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uVGFyZ2V0SW5wdXRbXX0gdGFyZ2V0cyAtIENvbXBsZXRlIG9yZGVyZWQgcHJvamVjdCB0YXJnZXRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25PcHRpb25zXG4gKiBAcHJvcGVydHkge0Fib3J0U2lnbmFsfSBbc2lnbmFsXSAtIENhbmNlbGxhdGlvbiBhdXRob3JpdHkgdGhyb3VnaCB0aGUgYWN0aXZlLXBvaW50ZXIgY29tbWl0IGJvdW5kYXJ5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkNvbnRlbnRIYXNoXG4gKiBAcHJvcGVydHkge1wic2hhMjU2XCJ9IGFsZ29yaXRobSAtIEhhc2ggYWxnb3JpdGhtLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gTG93ZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2VzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25BcnRpZmFjdE1hbmlmZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEFydGlmYWN0LXNldC1yZWxhdGl2ZSBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gT3JpZ2luYWwgYXJ0aWZhY3QgY29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBEZWNsYXJlZCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRBcnRpZmFjdFJvbGV9IHJvbGUgLSBEZWNsYXJlZCBhcnRpZmFjdCByb2xlLlxuICogQHByb3BlcnR5IHtBcnRpZmFjdFByb3ZlbmFuY2V9IHByb3ZlbmFuY2UgLSBDb21wbGV0ZSBwZXJzaXN0ZWQgcmljaCwgYnl0ZSwgb3Igc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnl0ZUxlbmd0aCAtIEV4YWN0IHN0YWdlZCBieXRlIGxlbmd0aC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGlvbkNvbnRlbnRIYXNofSBoYXNoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgaGFzaC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25CdWlsZEFydGlmYWN0TWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gQnVpbGQtcHJvamVjdGlvbi1yZWxhdGl2ZSBwYXRoLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIERlY2xhcmVkIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gRGVjbGFyZWQgbGFuZ3VhZ2UtbmV1dHJhbCB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0IHJvbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnl0ZUxlbmd0aCAtIEV4YWN0IHN0YWdlZCBieXRlIGxlbmd0aC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGlvbkNvbnRlbnRIYXNofSBoYXNoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgaGFzaC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25UYXJnZXRNYW5pZmVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXhwbGljaXQgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uVGFyZ2V0Um9sZX0gcm9sZSAtIEV4cGxpY2l0IGxhbmd1YWdlLW5ldXRyYWwgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3Qtc2V0IGJhY2tlbmQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHt7c291cmNlOiBzdHJpbmcsIGJ1aWxkOiBzdHJpbmd9fSBwcm9qZWN0aW9ucyAtIERpc2pvaW50IGdlbmVyYXRpb24tcmVsYXRpdmUgcHJvamVjdGlvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRpb25BcnRpZmFjdE1hbmlmZXN0W119IGFydGlmYWN0cyAtIE9yZGVyZWQgZ2VuZXJhdGVkIGFydGlmYWN0cy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvbkJ1aWxkQXJ0aWZhY3RNYW5pZmVzdFtdfSBidWlsZEFydGlmYWN0cyAtIE9yZGVyZWQgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dHMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pn0gW21ldGFkYXRhXSAtIFBlcnNpc3RlZCB0YXJnZXQtc3BlY2lmaWMgYXJ0aWZhY3Qtc2V0IG1ldGFkYXRhLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbk1hbmlmZXN0XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRHZW5lcmF0aW9uTWFuaWZlc3RcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBNYW5pZmVzdCBzY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBFeHBsaWNpdCBwcm9qZWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25JZCAtIEV4cGxpY2l0IGdlbmVyYXRpb24vY3ljbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRpb25UYXJnZXRNYW5pZmVzdFtdfSB0YXJnZXRzIC0gQ29tcGxldGUgb3JkZXJlZCB0YXJnZXQgcmVjb3Jkcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1Ymxpc2hlZFRhcmdldFBhdGhzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gRXhhY3QgaW1tdXRhYmxlIGdlbmVyYXRlZC1zb3VyY2UgZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUGF0aCAtIEV4YWN0IGltbXV0YWJsZSBjb21waWxlci1vdXRwdXQgZGlyZWN0b3J5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGlzaGVkR2VuZXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25JZCAtIFJlc29sdmVkIGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvblBhdGggLSBFeGFjdCBpbW11dGFibGUgZ2VuZXJhdGlvbiBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWFuaWZlc3RQYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbiBtYW5pZmVzdCBwYXRoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uTWFuaWZlc3R9IG1hbmlmZXN0IC0gVmVyaWZpZWQgaW1tdXRhYmxlIGdlbmVyYXRpb24gbWFuaWZlc3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1Ymxpc2hlZFRhcmdldFBhdGhzW119IHRhcmdldHMgLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCB0YXJnZXQgcGF0aHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNsZWFudXBQZW5kaW5nIC0gV2hldGhlciBwb3N0LWNvbW1pdCBqb3VybmFsIGNsZWFudXAgcmVtYWlucyBmb3IgcmVjb3ZlcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBEaXNjb3ZlcmVkVG9vbGNoYWluXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29tbWFuZCAtIERvY3VtZW50ZWQgY2Fub25pY2FsIGNvbW1hbmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhlY3V0YWJsZSAtIEV4YWN0IGFic29sdXRlIGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJvdmVycmlkZVwiIHwgXCJjYW5vbmljYWxcIn0gc291cmNlIC0gUmVzb2x1dGlvbiByb3V0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gRmlyc3Qgc2VsZWN0ZWQtc3RyZWFtIHZlcnNpb24gbGluZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uT3V0cHV0IC0gQ29tcGxldGUgbm9ybWFsaXplZCBzdGRvdXQsIG9yIG5vcm1hbGl6ZWQgc3RkZXJyIHdoZW4gc3Rkb3V0IGlzIGVtcHR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnQgYXJyYXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1BhdGhBcmd1bWVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4IC0gRXhhY3QgYXJndiBpbmRleCBjb250YWluaW5nIHRoZSBwYXRoLlxuICogQHByb3BlcnR5IHtcInNvdXJjZVwiIHwgXCJidWlsZFwifSBvd25lcnNoaXAgLSBDYW5kaWRhdGUgc3VidHJlZSB0aGF0IG93bnMgdGhlIHBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByZWZpeF0gLSBFeGFjdCBub24tcGF0aCBhcmd2IHByZWZpeCBwcmVjZWRpbmcgYW4gb3duZWQgYWJzb2x1dGUgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrRW52aXJvbm1lbnRQYXRoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEV4YWN0IGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgYW4gb3duZWQgYWJzb2x1dGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIiB8IFwiYnVpbGRcIiB8IFwidG9vbFwifSBvd25lcnNoaXAgLSBDYW5kaWRhdGUgc3VidHJlZSBvciBkaXNjb3ZlcmVkIHRvb2wgdGhhdCBvd25zIHRoZSBwYXRoLlxuICogQHByb3BlcnR5IHtEaXNjb3ZlcmVkVG9vbGNoYWlufSBbdG9vbF0gLSBFeGFjdCB0b29sIGV4ZWN1dGFibGUgYm91bmQgYnkgYSB0b29sLW93bmVkIGVudmlyb25tZW50IHZhbHVlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tPdXRwdXRPd25lcnNoaXBcbiAqIEBwcm9wZXJ0eSB7XCJidWlsZFwifSBvd25lcnNoaXAgLSBDb21waWxlciBvdXRwdXRzIGJlbG9uZyBvbmx5IHRvIHRoZSBjYW5kaWRhdGUgYnVpbGQgc3VidHJlZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgYnVpbGQgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBNZWRpYSB0eXBlIGFzc2lnbmVkIHRvIGV2ZXJ5IHByb2R1Y2VkIHJlZ3VsYXIgZmlsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb2xlIC0gTGFuZ3VhZ2UtbmV1dHJhbCBjb21waWxlci1vdXRwdXQgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrU3RhZ2VSZXF1ZXN0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBEZWNsYXJlZCBub24tZXhlY3V0aW5nIGFjY2VwdGFuY2Ugc3RhZ2UuXG4gKiBAcHJvcGVydHkge0Rpc2NvdmVyZWRUb29sY2hhaW59IHRvb2wgLSBFeGFjdCBpbW11dGFibGUgZGlzY292ZXJlZCB0b29sIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgZXhlY3V0YWJsZSBjb3BpZWQgZnJvbSB0aGUgdG9vbCByZWNvcmQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd2IC0gRXhhY3Qgc2hlbGwtZnJlZSBhcmd1bWVudCB2ZWN0b3IuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFRhcmdldENoZWNrUGF0aEFyZ3VtZW50W119IHBhdGhBcmd1bWVudHMgLSBDb21wbGV0ZSBvd25lcnNoaXAgZGVjbGFyYXRpb24gZm9yIGFyZ3YgcGF0aHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3dkIC0gRXhhY3QgY2FuZGlkYXRlLXNjb3BlZCB3b3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IGVudmlyb25tZW50IC0gRXhhY3QgZGV0ZXJtaW5pc3RpYyBlbnZpcm9ubWVudC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tFbnZpcm9ubWVudFBhdGhbXX0gZW52aXJvbm1lbnRQYXRocyAtIE93bmVkIGFic29sdXRlIGVudmlyb25tZW50IHBhdGhzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpbnB1dEhhc2ggLSBTSEEtMjU2IG9mIGRlY2xhcmVkIHJlc3RvcmUgaW5wdXRzLCBvciBudWxsIGZvciB1bmNvbmRpdGlvbmFsIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGlucHV0cyAtIENvbXBsZXRlIHN0YWdlZCBhcnRpZmFjdCBpbnB1dHMgcmVhZCBieSB0aGUgc3RhZ2UuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFRhcmdldENoZWNrT3V0cHV0T3duZXJzaGlwPiB8IG51bGx9IG91dHB1dCAtIEJ1aWxkIG91dHB1dCBvd25lcnNoaXAsIG9yIG51bGwgZm9yIG5vbi1wcm9kdWNpbmcgY2hlY2tzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdHJhbnNpZW50UGF0aHMgLSBDYW5kaWRhdGUgc291cmNlL2J1aWxkIGNhY2hlIG9yIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyByZW1vdmVkIGFmdGVyIGNoZWNraW5nLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tQbGFuXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRUYXJnZXRDaGVja1BsYW5cIn0gc2NoZW1hIC0gUGxhbiBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFBsYW4gc2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1wiZGV2ZWxvcGVyLWNoZWNrXCJ9IG1vZGUgLSBOb24tZXhlY3V0aW5nIGRldmVsb3Blci1jaGVjayBtb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4YWN0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0SWQgLSBFeGFjdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBSZWdpc3RlcmVkIGJhY2tlbmQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBzdGFnZWQgZ2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUGF0aCAtIEV4YWN0IHN0YWdlZCBjb21waWxlci1vdXRwdXQgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFydGlmYWN0UGF0aHMgLSBFeGFjdCBzdGFnZWQgYXJ0aWZhY3QgcGF0aHMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFRhcmdldENoZWNrU3RhZ2VSZXF1ZXN0W119IHN0YWdlcyAtIE9yZGVyZWQgdGFyZ2V0LW93bmVkIHJlcXVlc3RzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZWFkb25seTx7Y29tbWFuZDogc3RyaW5nLCBleGVjdXRhYmxlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHNvdXJjZTogXCJvdmVycmlkZVwiIHwgXCJjYW5vbmljYWxcIiwgdmVyc2lvbjogc3RyaW5nfT59IHRvb2wgLSBFeGFjdCB0b29sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gYXJndiAtIEV4YWN0IGV4ZWN1dGVkIGFyZ3VtZW50IHZlY3Rvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBleGl0Q29kZSAtIFN1Y2Nlc3NmdWwgcHJvY2VzcyBleGl0IGNvZGUuXG4gKiBAcHJvcGVydHkge251bGx9IHNpZ25hbCAtIFN1Y2Nlc3NmdWwgcHJvY2VzcyBzaWduYWwgc3RhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IC0gQm91bmRlZCBjYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQm91bmRlZCBjYXB0dXJlZCBzdGFuZGFyZCBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbk1zIC0gTm9uLW5lZ2F0aXZlIHN0YWdlIGR1cmF0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBFeGFjdCBwcm9qZWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldElkIC0gRXhhY3QgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gUmVnaXN0ZXJlZCBiYWNrZW5kIHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIHN1Y2Nlc3NmdWwgc3RhZ2UgZXZpZGVuY2UuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0W119IG91dHB1dHMgLSBDb21wbGV0ZSBjb21waWxlci1vd25lZCBidWlsZCBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCBzY2FsYXIgdmFsdWUgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiVHlwZVBhcmFtZXRlclwifSBraW5kIC0gRGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbi1zY29wZWQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIHR5cGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlVmFyaWFibGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIn0ga2luZCAtIFJlZmVyZW5jZSB0byBvbmUgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gU3RhYmxlIHJlZmVyZW5jZWQgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCByZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0VHlwZVxuICogQHByb3BlcnR5IHtcIkxpc3RUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbGlzdC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSBlbGVtZW50VHlwZSAtIEhvbW9nZW5lb3VzIGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiTWFwVHlwZVwifSBraW5kIC0gUmVjdXJzaXZlIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcFR5cGVcIn0ga2luZCAtIERpc3RpbmN0IGluc2VydGlvbi1vcmRlcmVkIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdXBwb3J0ZWQgc3RyaW5nIGtleSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gSG9tb2dlbmVvdXMgdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7XCJpbnNlcnRpb25cIn0gb3JkZXIgLSBDYW5vbmljYWwgZmlyc3QtaW5zZXJ0aW9uIGVuY291bnRlciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFR5cGVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbmNlL2Fic2VuY2UgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gRXhhY3QgcHJlc2VudC12YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGNvbnN0aXR1ZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZVtdfSBbYXJndW1lbnRzXSAtIEV4YWN0IGludmFyaWFudCB0eXBlIGFyZ3VtZW50czsgcmVxdWlyZWQgZm9yIGdlbmVyaWMgZGVjbGFyYXRpb25zIGFuZCBhYnNlbnQgZm9yIG5vbi1nZW5lcmljIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yVHlwZVxuICogQHByb3BlcnR5IHtcIkVycm9yVHlwZVwifSBraW5kIC0gTm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UtY2xhc3MgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZXNvdXJjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPd25lZFJlc291cmNlVHlwZVwifSBraW5kIC0gQ29tcGlsZXItb3duZWQgbGluZWFyIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIEV4YWN0IGF1dGhvcml0eSByZXNvdXJjZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkUmVmZXJlbmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTGluZWFyIHJlZmVyZW5jZSB0aGF0IG93bnMgb25lIHByb3RlY3RlZCByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3Qgb3duZWQgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUeXBlUmVmZXJlbmNlIHwgVHlwZVZhcmlhYmxlUmVmZXJlbmNlIHwgTGlzdFR5cGUgfCBNYXBUeXBlIHwgT3JkZXJlZE1hcFR5cGUgfCBPcHRpb25hbFR5cGUgfCBSZWNvcmRUeXBlIHwgUmVmZXJlbmNlVHlwZSB8IE93bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSBTZW1hbnRpY1ZhbHVlVHlwZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEVycm9yVHlwZX0gU2VtYW50aWNCaW5kaW5nVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFZvaWQgcmV0dXJuIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1widm9pZFwifSBuYW1lIC0gTm9ybWFsaXplZCBub24tdmFsdWUgZnVuY3Rpb24gcmV0dXJuLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIsIHBhcmFtZXRlcklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiTGlzdFR5cGVcIiwgZWxlbWVudFR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIk1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIG9yZGVyOiBcImluc2VydGlvblwifSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIlJlY29yZFR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nLCBhcmd1bWVudHM/OiBTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSB8IHtraW5kOiBcIlJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfX0gU2VtYW50aWNUeXBlSWRlbnRpdHkgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlSWRlbnRpdHkgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCByZXNvbHZlZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gW3R5cGVBcmd1bWVudHNdIC0gSW5mZXJyZWQgZGVjbGFyYXRpb24tb3JkZXIgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyBjYWxsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiUGFyYW1ldGVyXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhcGFiaWxpdHlJZCAtIEV4YWN0IGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uSWQgLSBFeGFjdCBvcGVyYXRpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3Qgb3BlcmF0aW9uIHJlc3VsdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gRXhhY3Qgb3JkZXJlZCBkZWNsYXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkTW92ZUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZE1vdmVFeHByZXNzaW9uXCJ9IGtpbmQgLSBFeHBsaWNpdCBsaW5lYXIgb3duZXJzaGlwIHRyYW5zZmVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE1vdmVkIG93bmVyLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHRyYW5zZmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBEZXJpdmVkIHNvdXJjZSBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRCb3Jyb3dFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCJ9IGtpbmQgLSBJbW1lZGlhdGUgbm9uZXNjYXBpbmcgcmVzb3VyY2UgYm9ycm93LlxuICogQHByb3BlcnR5IHtcInNoYXJlZFwiIHwgXCJleGNsdXNpdmVcIn0gbW9kZSAtIEJvcnJvdyBtb2RlLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IFByaXZhdGVGaWVsZFJlYWR9IGV4cHJlc3Npb24gLSBCb3Jyb3dlZCBwbGFjZS5cbiAqIEBwcm9wZXJ0eSB7T3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHR5cGUgLSBFeGFjdCBvd25lZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBib3Jyb3cgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBDb21waWxlci1hdXRob3JpemVkIGVmZmVjdCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWZmZWN0U2l0ZUlkIC0gRGV0ZXJtaW5pc3RpYyBzZW1hbnRpYyBldmFsdWF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZX0gcmVzb2x1dGlvbiAtIENvbXBsZXRlIGF1dGhvcml0eSByZXNvbHV0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3BlcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU3RhYmxlIHBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IG9yZGVyZWQgcGFyYW1ldGVyIHR5cGUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZUlkOiBzdHJpbmd9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZUlkOiBzdHJpbmd9fSBFZmZlY3RSZXNvdXJjZUZsb3cgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSByZXNvdXJjZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIHJlc291cmNlIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cIn0ga2luZCAtIENhcGFiaWxpdHkgZmFpbHVyZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIGZhaWx1cmUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgb3BlcmF0aW9uIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG9wZXJhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFZmZlY3RQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gT3JkZXJlZCBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblwifSBraW5kIC0gQXV0aG9yaXplZCBjYXBhYmlsaXR5IGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yaXR5SWQgLSBPcGFxdWUgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBDYXBhYmlsaXR5IG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRGVjbGFyYXRpb25bXX0gcmVzb3VyY2VzIC0gT3JkZXJlZCByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbltdfSBmYWlsdXJlcyAtIE9yZGVyZWQgZmFpbHVyZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uW119IG9wZXJhdGlvbnMgLSBPcmRlcmVkIG9wZXJhdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXBhYmlsaXR5QXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCJ9IHNjaGVtYSAtIEF1dGhvcml0eSBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MSB8IDJ9IHNjaGVtYVZlcnNpb24gLSBBdXRob3JpdHkgcGF5bG9hZCB2ZXJzaW9uLCBub3QgYSBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBPcGFxdWUgY2FsbGVyLXN1cHBsaWVkIGF1dGhvcml0eSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IGNhcGFiaWxpdGllcyAtIE5vcm1hbGl6ZWQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cmFjdFZlcnNpb25dIC0gRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uLCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfVtdfSBbbW9kdWxlc10gLSBTY2hlbWEtdjIgY2Fub25pY2FsIG1vZHVsZSBhdXRob3JpdGllcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3ttb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgdHlwZTogU2VtYW50aWNUeXBlTmFtZSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVOYW1lfX19IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eU5hbWVkSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9uZVwifSB8IHtraW5kOiBcImFjcXVpcmVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcImJvcnJvd1wiIHwgXCJjbG9zZVwiLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB0ZXJtaW5hbEZhaWx1cmU6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fX0gQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dFtdLCByZXR1cm5UeXBlOiBGdW5jdGlvblJldHVyblR5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9LCBlZmZlY3RzOiBbXCJob3N0XCJdLCBmYWlsdXJlczogKHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0KVtdLCByZXNvdXJjZUZsb3c6IENhcGFiaWxpdHlSZXNvdXJjZUZsb3dJbnB1dH19IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCByZXNvdXJjZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIGZhaWx1cmVzOiBDYXBhYmlsaXR5TmFtZWRJbnB1dFtdLCBvcGVyYXRpb25zOiBDYXBhYmlsaXR5T3BlcmF0aW9uSW5wdXRbXX19IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb246IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0ICovXG4vKiogQHR5cGVkZWYge3tzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDEsIGlkOiBzdHJpbmcsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXRbXSwgY29udHJhY3RWZXJzaW9uPzogc3RyaW5nfSB8IHtzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDIsIGlkOiBzdHJpbmcsIG1vZHVsZXM6IENhcGFiaWxpdHlBdXRob3JpdHlNb2R1bGVJbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eUlucHV0ICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJMaXN0TGl0ZXJhbFwifSBraW5kIC0gT3JkZXJlZCBpbW11dGFibGUgbGlzdCBsaXRlcmFsLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGVsZW1lbnRzIC0gU291cmNlLW9yZGVyZWQsIGR1cGxpY2F0ZS1wcmVzZXJ2aW5nIGVsZW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwRW50cnlcbiAqIEBwcm9wZXJ0eSB7XCJNYXBFbnRyeVwifSBraW5kIC0gU291cmNlLW9yZGVyZWQgbWFwIGluaXRpYWxpemVyIGVudHJ5LlxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBrZXkgLSBMaXRlcmFsIG5vbm51bWVyaWMgc3RyaW5nIGtleS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gdmFsdWUgLSBFbnRyeSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJNYXBMaXRlcmFsXCJ9IGtpbmQgLSBJbW11dGFibGUgbWFwIGxpdGVyYWw7IGVudHJ5IG9yZGVyIGlzIGRpYWdub3N0aWMtb25seS5cbiAqIEBwcm9wZXJ0eSB7TWFwRW50cnlbXX0gZW50cmllcyAtIFNvdXJjZSBpbml0aWFsaXplciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbCB3aXRoIG9ic2VydmFibGUgZmlyc3QtaW5zZXJ0aW9uIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlLW9yZGVyZWQgdW5pcXVlIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG9yZGVyZWQgY29uc3RydWN0aW9uIGJvdW5kYXJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RJbmRleEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJMaXN0SW5kZXhFeHByZXNzaW9uXCJ9IGtpbmQgLSBUb3RhbCB6ZXJvLWJhc2VkIGxpc3QgaW5kZXguXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0LXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5kZXggLSBJbnRlZ2VyIGluZGV4LlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTG9va3VwRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1hcExvb2t1cEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHN0cmluZy1rZXkgbWFwIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIE1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGtleSAtIFN0cmluZyBrZXkgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJwcm92ZW5cIiB8IFwiZmFpbC1vbi1hYnNlbmNlXCJ9IHRvdGFsaXR5IC0gQWRtaXNzaW9uIGJhc2lzOyBuZXZlciBvcHRpb25hbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbGxlY3Rpb25TaXplRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwifSBraW5kIC0gRmluaXRlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtIG9yIG1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge1wibGlzdFwiIHwgXCJtYXBcIn0gW2NvbGxlY3Rpb25LaW5kXSAtIFZhbGlkYXRlZCByZWNlaXZlciBraW5kIGZvciB0YXJnZXQgc3BlbGxpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZGVudGlmaWVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIklkZW50aWZpZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlZmVyZW5jZWQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVnZXJMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiSW50ZWdlckxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2YWx1ZSAtIEphdmFTY3JpcHQtc2FmZSBpbnRlZ2VyIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9vbGVhbkxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJCb29sZWFuTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtib29sZWFufSB2YWx1ZSAtIEJvb2xlYW4gdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdHJpbmdMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiU3RyaW5nTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gVW5pY29kZSBzdHJpbmcgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbE5vbmVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbE5vbmVcIn0ga2luZCAtIENvbnRleHR1YWxseSB0eXBlZCBhYnNlbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxTb21lXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxTb21lXCJ9IGtpbmQgLSBFeHBsaWNpdCBwcmVzZW50IG9wdGlvbmFsIHZhbHVlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEV4YWN0IG5vbi1vcHRpb25hbCBwcmVzZW50IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxJc1ByZXNlbnRcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbElzUHJlc2VudFwifSBraW5kIC0gUHJlc2VuY2UgdGVzdCBmb3Igb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFRlc3RlZCBvcHRpb25hbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxVbndyYXBcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFVud3JhcFwifSBraW5kIC0gR3VhcmRlZCB1bndyYXAgb2Ygb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFByb3Zlbi1wcmVzZW50IG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBVbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJVbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNVbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gb3BlcmFuZCAtIE9wZXJhbmQgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJCaW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByaWdodCAtIFJpZ2h0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb25kaXRpb25hbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJDb25kaXRpb25hbEV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gU3RyaWN0IGJvb2xlYW4gdGVzdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25zZXF1ZW50IC0gQXJtIGV2YWx1YXRlZCB3aGVuIHRoZSB0ZXN0IGlzIHRydWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGFsdGVybmF0ZSAtIEFybSBldmFsdWF0ZWQgd2hlbiB0aGUgdGVzdCBpcyBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEpvaW5lZCBhcm0gcmVzdWx0IHR5cGUgYXNzaWduZWQgYnkgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjYWxsZWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBEZXRlcm1pbmlzdGljIGRlY2xhcmF0aW9uIGFuZCBzaWduYXR1cmUgYmluZGluZywgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZWZmZWN0U2l0ZUlkXSAtIERldGVybWluaXN0aWMgc2l0ZSBpZGVudGl0eSB3aGVuIHRoZSByZXNvbHZlZCBmdW5jdGlvbiByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGlzIGNhbGwuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIEV4YWN0IHJlc29sdmVkIG1ldGhvZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBtZXRob2QgcGFyYW1ldGVyIHR5cGVzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gcmV0dXJuVHlwZSAtIEV4YWN0IG1ldGhvZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7e2tpbmQ6IFwicHJlc2VydmVcIiB8IFwidGVybWluYWxcIiwgdGVybWluYWxGYWlsdXJlSWQ/OiBzdHJpbmd9fSBbcmVzb3VyY2VGbG93XSAtIE93bmVkIHJlY2VpdmVyIHRyYW5zaXRpb24gYW5kIGRlY2xhcmVkIHRlcm1pbmFsLXVzZSBmYWlsdXJlIHdoZW4gYXBwbGljYWJsZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY2VpdmVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIlJlY2VpdmVyRXhwcmVzc2lvblwifSBraW5kIC0gVGhlIGRlY2xhcmluZyBjbGFzcyBpbnN0YW5jZSByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc0lkIC0gU3RhYmxlIGRlY2xhcmluZyBjbGFzcyBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIHJlY2VpdmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgcmVjZWl2ZXIgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIEZyZXNoIG5vbWluYWwgcmVmZXJlbmNlIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVmZXJlbmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gcmVmZXJlbmNlIC0gRXhhY3QgY2xhc3MgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IGNvbnN0cnVjdG9yIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiBjb25zdHJ1Y3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3Rpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjbGFzcy1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWV0aG9kQ2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJNZXRob2RDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gUmVzb2x2ZWQgcmVjZWl2ZXItbWV0aG9kIGludm9jYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJlY2VpdmVyIC0gUmVjZWl2ZXIgZXZhbHVhdGVkIG9uY2UgYmVmb3JlIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRob2QgLSBTdGFibGUgbWV0aG9kIGlkZW50aXR5IGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRXhhY3QgbWV0aG9kIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgbWV0aG9kIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNhbGwgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXRob2QtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaXZhdGVGaWVsZFJlYWRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRSZWFkXCJ9IGtpbmQgLSBEZWNsYXJpbmctcmVjZWl2ZXItb25seSBwcml2YXRlIGZpZWxkIHJlYWQuXG4gKiBAcHJvcGVydHkge1JlY2VpdmVyRXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBFeGFjdCBkZWNsYXJpbmcgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcHJpdmF0ZSBmaWVsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgcmVhZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRDb25zdHJ1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIE5vbWluYWwgcmVjb3JkIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkVHlwZX0gcmVjb3JkIC0gUmVzb2x2ZWQgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIENvbXBsZXRlIGZpZWxkLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3Rpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgcmVjb3JkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNZW1iZXJSZWFkXG4gKiBAcHJvcGVydHkge1wiTWVtYmVyUmVhZFwifSBraW5kIC0gTm9taW5hbCBpbW11dGFibGUgcmVjb3JkLWZpZWxkIHJlYWQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJlY2VpdmVyIC0gUmVjb3JkLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSByZXNvbHZlZCBmaWVsZCBpZGVudGl0eSBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZW1iZXItcmVhZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZW1iZXItbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yTWVzc2FnZVJlYWRcbiAqIEBwcm9wZXJ0eSB7XCJFcnJvck1lc3NhZ2VSZWFkXCJ9IGtpbmQgLSBUaGUgc29sZSBwb3J0YWJsZSBlcnJvciBtZW1iZXIgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBDYXRjaCBiaW5kaW5nIHdob3NlIGltbXV0YWJsZSBtZXNzYWdlIGlzIHJlYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1lc3NhZ2UtcmVhZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXNzYWdlLW1lbWJlciByYW5nZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0lkZW50aWZpZXJFeHByZXNzaW9uIHwgUmVjZWl2ZXJFeHByZXNzaW9uIHwgSW50ZWdlckxpdGVyYWwgfCBCb29sZWFuTGl0ZXJhbCB8IFN0cmluZ0xpdGVyYWwgfCBPcHRpb25hbE5vbmUgfCBPcHRpb25hbFNvbWUgfCBPcHRpb25hbElzUHJlc2VudCB8IE9wdGlvbmFsVW53cmFwIHwgTGlzdExpdGVyYWwgfCBNYXBMaXRlcmFsIHwgT3JkZXJlZE1hcExpdGVyYWwgfCBMaXN0SW5kZXhFeHByZXNzaW9uIHwgTWFwTG9va3VwRXhwcmVzc2lvbiB8IENvbGxlY3Rpb25TaXplRXhwcmVzc2lvbiB8IFVuYXJ5RXhwcmVzc2lvbiB8IEJpbmFyeUV4cHJlc3Npb24gfCBDb25kaXRpb25hbEV4cHJlc3Npb24gfCBDYWxsRXhwcmVzc2lvbiB8IEVmZmVjdENhbGxFeHByZXNzaW9uIHwgT3duZWRNb3ZlRXhwcmVzc2lvbiB8IE93bmVkQm9ycm93RXhwcmVzc2lvbiB8IE1ldGhvZENhbGxFeHByZXNzaW9uIHwgUmVmZXJlbmNlQ29uc3RydWN0aW9uIHwgUmVjb3JkQ29uc3RydWN0aW9uIHwgTWVtYmVyUmVhZCB8IFByaXZhdGVGaWVsZFJlYWQgfCBFcnJvck1lc3NhZ2VSZWFkfSBFeHByZXNzaW9uICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9jYWxEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkxvY2FsRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRGVjbGFyZWQgbG9jYWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeHBsaWNpdCBsb2NhbCB0eXBlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBtdXRhYmxlIC0gV2hldGhlciBsYXRlciBhc3NpZ25tZW50IGlzIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGluaXRpYWxpemVyIC0gUmVxdWlyZWQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFzc2lnbm1lbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJBc3NpZ25tZW50U3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSB0YXJnZXQgLSBTaW1wbGUgbG9jYWwgYXNzaWdubWVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBBc3NpZ25lZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCJ9IGtpbmQgLSBEZWNsYXJpbmctcmVjZWl2ZXItb25seSBwcml2YXRlIGZpZWxkIG11dGF0aW9uLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBOZXcgZmllbGQgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFzc2lnbm1lbnQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZmllbGQtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJldHVyblN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJldHVyblN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBbZXhwcmVzc2lvbl0gLSBSZXR1cm5lZCBleHByZXNzaW9uOyBhYnNlbnQgZXhhY3RseSBmb3IgYSBiYXJlIHZvaWQgcmV0dXJuLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXhwcmVzc2lvblN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7Q2FsbEV4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IEVmZmVjdENhbGxFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQSBkaXJlY3QsIHJlY2VpdmVyLCBvciBhdXRob3JpemVkIGNhbGwgd2hvc2UgcmVzb2x2ZWQgcmV0dXJuIHR5cGUgaXMgdm9pZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElmU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiSWZTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gQnJhbmNoIGNvbmRpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNvbnNlcXVlbnQgLSBUcnVlIGJyYW5jaC5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IFthbHRlcm5hdGVdIC0gRmFsc2UgYnJhbmNoLCBhYnNlbnQgd2hlbiBleGVjdXRpb24gZmFsbHMgdGhyb3VnaC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFZhbHVlQmluZGluZ1xuICogQHByb3BlcnR5IHtcIlZhbHVlQmluZGluZ1wifSBraW5kIC0gSXRlcmF0aW9uLWJpbmRpbmcgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gQm9keS1sb2NhbCBiaW5kaW5nIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgbGlzdCBlbGVtZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBtdXRhYmxlIC0gSXRlcmF0aW9uIGJpbmRpbmdzIGFyZSBhbHdheXMgaW1tdXRhYmxlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBCaW5kaW5nIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGb3JFYWNoU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiRm9yRWFjaFN0YXRlbWVudFwifSBraW5kIC0gT3JkZXJlZCBsaXN0LWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsaXN0IC0gTGlzdCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSB2YWx1ZUJpbmRpbmcgLSBJbW11dGFibGUgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gTG9vcCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBsb29wIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGb3JFYWNoTWFwU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiRm9yRWFjaE1hcFN0YXRlbWVudFwifSBraW5kIC0gSW5zZXJ0aW9uLW9yZGVyZWQgbWFwIHBhaXItaXRlcmF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG1hcCAtIE9yZGVyZWQtbWFwIGV4cHJlc3Npb24gZXZhbHVhdGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdHJhdmVyc2FsLlxuICogQHByb3BlcnR5IHtWYWx1ZUJpbmRpbmd9IGtleUJpbmRpbmcgLSBJbW11dGFibGUgc3RyaW5nLWtleSBiaW5kaW5nIHNjb3BlZCB0byB0aGUgYm9keS5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSB2YWx1ZUJpbmRpbmcgLSBJbW11dGFibGUgaG9tb2dlbmVvdXMgdmFsdWUgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gTG9vcCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBsb29wIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBXaGlsZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIldoaWxlU3RhdGVtZW50XCJ9IGtpbmQgLSBTdHJpY3QtQm9vbGVhbiBwcmUtY29uZGl0aW9uIGxvb3AgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gQm9vbGVhbiBleHByZXNzaW9uIGV2YWx1YXRlZCBiZWZvcmUgZXZlcnkgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIE9yZGVyZWQgbG9vcCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBsb29wIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCcmVha1N0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkJyZWFrU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgYnJlYWsgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbnRpbnVlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQ29udGludWVTdGF0ZW1lbnRcIn0ga2luZCAtIE5lYXJlc3QtbG9vcCBjb250aW51ZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRMb29wSWRdIC0gUmVzb2x2ZWQgbmVhcmVzdC1sb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uIGluIGxvb3AgY29udGV4dC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gS2V5d29yZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JDb25zdHJ1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckNvbnN0cnVjdGlvblwifSBraW5kIC0gQ29uc3RydWN0aW9uIG9mIG9uZSBkZWNsYXJlZCB1bmNoZWNrZWQgZXJyb3IuXG4gKiBAcHJvcGVydHkge0Vycm9yVHlwZX0gZXJyb3IgLSBFeGFjdCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG1lc3NhZ2UgLSBTb2xlIGltbXV0YWJsZSBzdHJpbmcgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUgYW5kIG1lc3NhZ2UgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmFpc2VTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSYWlzZVN0YXRlbWVudFwifSBraW5kIC0gQWJydXB0IHVuY2hlY2tlZC1lcnJvciBwcm9wYWdhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JDb25zdHJ1Y3Rpb259IGVycm9yIC0gRXhhY3QgY29uc3RydWN0ZWQgc2VtYW50aWMgZXJyb3IuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJhaXNlIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJhaXNlIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmV0aHJvd1N0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJldGhyb3dTdGF0ZW1lbnRcIn0ga2luZCAtIFJlLXByb3BhZ2F0aW9uIG9mIHRoZSBleGFjdCBjYXVnaHQgYmluZGluZyBpbiBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiaW5kaW5nIC0gTmFtZSBvZiB0aGUgbGV4aWNhbGx5IHZpc2libGUgaW1tdXRhYmxlIGNhdGNoIGJpbmRpbmcgYmVpbmcgcmUtcmFpc2VkLlxuICogQHByb3BlcnR5IHtDYXRjaEJpbmRpbmd9IGJpbmRpbmdOb2RlIC0gRXhhY3QgY2F0Y2ggYmluZGluZyBub2RlIGJlaW5nIHJlLXJhaXNlZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgcmV0aHJvdyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByZXRocm93IHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2F0Y2hCaW5kaW5nXG4gKiBAcHJvcGVydHkge1wiQ2F0Y2hCaW5kaW5nXCJ9IGtpbmQgLSBFeGFjdC1oYW5kbGVyIGJpbmRpbmcgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gSGFuZGxlci1sb2NhbCBiaW5kaW5nIG5hbWUuXG4gKiBAcHJvcGVydHkge0Vycm9yVHlwZX0gdHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBtdXRhYmxlIC0gQ2F0Y2ggYmluZGluZ3MgYXJlIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBiaW5kaW5nIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2F0Y2hIYW5kbGVyXG4gKiBAcHJvcGVydHkge1wiQ2F0Y2hIYW5kbGVyXCJ9IGtpbmQgLSBPbmUgZXhhY3Qgbm9taW5hbCBoYW5kbGVyIHdpdGhpbiBhbiBvcmRlcmVkIGhhbmRsZXIgbGlzdC5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JUeXBlfSBjYXRjaFR5cGUgLSBFeGFjdCBjYXVnaHQgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtDYXRjaEJpbmRpbmd9IGNhdGNoQmluZGluZyAtIEltbXV0YWJsZSBoYW5kbGVyLWxvY2FsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjYXRjaEJvZHkgLSBIYW5kbGVyIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGhhbmRsZXIgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2F0Y2ggcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVHJ5U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiVHJ5U3RhdGVtZW50XCJ9IGtpbmQgLSBPbmUgYm9keSwgYW4gb3JkZXJlZCBsaXN0IG9mIGV4YWN0IHR5cGVkIGhhbmRsZXJzLCBhbmQgYW4gb3B0aW9uYWwgY29tcGxldGlvbiBibG9jay5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBQcm90ZWN0ZWQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7Q2F0Y2hIYW5kbGVyW119IGhhbmRsZXJzIC0gT3JkZXJlZCBleGFjdCBoYW5kbGVycywgZXZhbHVhdGVkIHRvcCB0byBib3R0b20gd2l0aCBleGFjdCBub21pbmFsIG1hdGNoaW5nLlxuICogQHByb3BlcnR5IHtCbG9ja30gW2ZpbmFsbHlCb2R5XSAtIENvbXBsZXRpb24gYmxvY2sgZXhlY3V0ZWQgb24gZXZlcnkgbm9ybWFsIGFuZCBhYnJ1cHQgY29tcGxldGlvbiBvZiB0aGUgdHJ5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSB0cnkvaGFuZGxlciBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0cnkvY2F0Y2gvZmluYWxseSByYW5nZXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtMb2NhbERlY2xhcmF0aW9uIHwgQXNzaWdubWVudFN0YXRlbWVudH0gTG9jYWxTdGF0ZW1lbnQgKi9cbi8qKiBAdHlwZWRlZiB7TG9jYWxTdGF0ZW1lbnQgfCBQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudCB8IEV4cHJlc3Npb25TdGF0ZW1lbnQgfCBJZlN0YXRlbWVudCB8IEZvckVhY2hTdGF0ZW1lbnQgfCBGb3JFYWNoTWFwU3RhdGVtZW50IHwgV2hpbGVTdGF0ZW1lbnQgfCBCcmVha1N0YXRlbWVudCB8IENvbnRpbnVlU3RhdGVtZW50IHwgUmV0dXJuU3RhdGVtZW50IHwgUHJpbnRTdGF0ZW1lbnQgfCBSYWlzZVN0YXRlbWVudCB8IFJldGhyb3dTdGF0ZW1lbnQgfCBUcnlTdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJsb2NrXG4gKiBAcHJvcGVydHkge1wiQmxvY2tcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U3RhdGVtZW50W119IHN0YXRlbWVudHMgLSBPcmRlcmVkIHN0YXRlbWVudHMgaW4gb25lIGxleGljYWwgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGdW5jdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRnVuY3Rpb25EZWNsYXJhdGlvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gT3JkZXJlZCBkZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gUmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRnVuY3Rpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZEZpZWxkXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRmllbGRcIn0ga2luZCAtIENsb3NlZCByZWNvcmQtZmllbGQgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBmaWVsZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBmaWVsZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGaWVsZCBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmREZWNsYXJhdGlvblwifSBraW5kIC0gTm9taW5hbCBjbG9zZWQgaW1tdXRhYmxlIHJlY29yZCBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUmVjb3JkIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCB1bmlxdWUgdmlzaWJsZSBmaWVsZHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGRlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRcIn0ga2luZCAtIERlY2xhcmluZy1jbGFzcy1wcml2YXRlIG11dGFibGUgaW5zdGFuY2UgZmllbGQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIGZpZWxkIG5hbWUgaW5zaWRlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb25seS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBmaWVsZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGaWVsZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG5hbWUvdHlwZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiQ29uc3RydWN0b3JEZWNsYXJhdGlvblwifSBraW5kIC0gRXhhY3QgY29tcGxldGUgcHJpdmF0ZS1zdGF0ZSBpbml0aWFsaXplci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBjb25zdHJ1Y3RvciBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBFeGFjdCBwb3NpdGlvbmFsIGNvbnN0cnVjdG9yIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBGaWVsZC1vcmRlciBpbml0aWFsaXphdGlvbiBib2R5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3RvciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGNvbnN0cnVjdG9yIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWV0aG9kRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJNZXRob2REZWNsYXJhdGlvblwifSBraW5kIC0gUmVjZWl2ZXItYm91bmQgY2xhc3MgbWV0aG9kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIG1ldGhvZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgbWV0aG9kIG5hbWUuXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBtZXRob2Qgc2lnbmF0dXJlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIE1ldGhvZCBib2R5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWV0aG9kIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDbGFzc0RlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiQ2xhc3NEZWNsYXJhdGlvblwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UgY2xhc3Mgd2l0aCBwcml2YXRlIG11dGFibGUgc3RhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgY2xhc3MgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge1ByaXZhdGVGaWVsZFtdfSBmaWVsZHMgLSBPcmRlcmVkIHByaXZhdGUgaW5zdGFuY2Ugc3RhdGUuXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yRGVjbGFyYXRpb259IGNvbnN0cnVjdG9yIC0gU29sZSBleGFjdCBjb25zdHJ1Y3Rvci5cbiAqIEBwcm9wZXJ0eSB7TWV0aG9kRGVjbGFyYXRpb25bXX0gbWV0aG9kcyAtIE9yZGVyZWQgcmVjZWl2ZXIgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7e2tpbmQ6IFwib3JkaW5hcnlcIn0gfCB7a2luZDogXCJvd25lZFJlc291cmNlXCIsIGZpZWxkSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nfX0gW293bmVyc2hpcF0gLSBFeHBsaWNpdCBjbGFzcyBvd25lcnNoaXAgcHJvZmlsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY2xhc3MgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjbGFzcy1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVycm9yRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgdW5jaGVja2VkIGVycm9yIHdpdGggb25lIGltbXV0YWJsZSBzdHJpbmcgbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRXJyb3IgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcmludFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUHJpbnRlZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRW50cnlQb2ludFxuICogQHByb3BlcnR5IHtcIkVudHJ5UG9pbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBFbnRyeS1wb2ludCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNNb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucyBpbiBzb3VyY2Ugb3JkZXI7IG9taXR0ZWQgd2hlbiBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBUb3AtbGV2ZWwgbm9taW5hbCByZWZlcmVuY2UgY2xhc3NlcyBpbiBzb3VyY2Ugb3JkZXI7IG9taXR0ZWQgd2hlbiBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JEZWNsYXJhdGlvbltdfSBbZXJyb3JzXSAtIFRvcC1sZXZlbCBub21pbmFsIHVuY2hlY2tlZCBlcnJvciBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0VmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbY2FwYWJpbGl0aWVzXSAtIENvbXBpbGVyLWF1dGhvcml6ZWQgVGFzayAwMzQgZGVjbGFyYXRpb25zOyBvbWlzc2lvbiBpcyB0aGUgbGVnYWN5IGVtcHR5IHNldC5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25EZWNsYXJhdGlvbltdfSBmdW5jdGlvbnMgLSBUb3AtbGV2ZWwgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtFbnRyeVBvaW50fSBlbnRyeVBvaW50IC0gRXhlY3V0YWJsZSBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm92ZW5hbmNlfSBbcHJvdmVuYW5jZV0gLSBQYXJzZXItYXV0aG9yZWQgc291cmNlIGFuZCBpZGVudGl0eSBpbmRleDsgb3B0aW9uYWwgZm9yIGxlZ2FjeSBjYWxsZXItYXV0aG9yZWQgbW9kdWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljSW1wb3J0XG4gKiBAcHJvcGVydHkge1wiSW1wb3J0XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlSWQgLSBTdGFibGUgaW1wb3J0ZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGltcG9ydGVkTmFtZSAtIEV4cG9ydGVkIGRlY2xhcmF0aW9uIG5hbWUgaW4gdGhlIHNvdXJjZSBtb2R1bGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9jYWxOYW1lIC0gQmluZGluZyBuYW1lIHZpc2libGUgaW4gdGhlIGltcG9ydGluZyBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRGVjbGFyYXRpb25LaW5kfSBzeW1ib2xLaW5kIC0gSW1wb3J0ZWQgZGVjbGFyYXRpb24gbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgcmVzb2x2ZWQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVPbmx5IC0gV2hldGhlciBzb3VyY2Ugc3ludGF4IGFkbWl0dGVkIG9ubHkgdHlwZS1wb3NpdGlvbiB1c2UuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGltcG9ydCBkZWNsYXJhdGlvbi9zcGVjaWZpZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBpbXBvcnQgcmFuZ2VzLlxuICogQHByb3BlcnR5IHtTdGRsaWJGYWNhZGVSZXNvbHV0aW9uRXZpZGVuY2V9IFtzdGRsaWJGYWNhZGVdIC0gRXhhY3QgcGFyc2VyLXByb3ZlZCBuYXRpdmUgZmFjYWRlIGlkZW50aXR5IGV2aWRlbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVSZXNvbHV0aW9uXCJ9IHNjaGVtYSAtIEV2aWRlbmNlIHNjaGVtYS5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEV2aWRlbmNlIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmFjYWRlSWRlbnRpdHkgLSBTZWxlY3RlZCBmYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmFjYWRlVmVyc2lvbiAtIFNlbGVjdGVkIGV4YWN0IGZhY2FkZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZU1vZHVsZSAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmF0aXZlU3ltYm9sIC0gUGFyc2VyLXByb3ZlZCBzb3VyY2Ugc3RkbGliIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljRXhwb3J0XG4gKiBAcHJvcGVydHkge1wiRXhwb3J0XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwb3J0ZWROYW1lIC0gTmFtZSB2aXNpYmxlIHRvIGltcG9ydGluZyBtb2R1bGVzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEV4cG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGV4cG9ydGVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBleHBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZXhwb3J0IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbU1vZHVsZVxuICogQHByb3BlcnR5IHtcIk1vZHVsZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU3RhYmxlIGNhbGxlci1zdXBwbGllZCBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VGaWxlbmFtZSAtIEV4cGxpY2l0IHNvdXJjZSBmaWxlbmFtZTsgbmV2ZXIgYW4gaW1wbGljaXQgcmVhZCByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtSZWNvcmREZWNsYXJhdGlvbltdfSBbcmVjb3Jkc10gLSBUb3AtbGV2ZWwgbm9taW5hbCByZWNvcmQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtDbGFzc0RlY2xhcmF0aW9uW119IFtjbGFzc2VzXSAtIENvbXBpbGVyLW93bmVkIGZhY2FkZSByZWZlcmVuY2UgY2xhc3Nlcy5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JEZWNsYXJhdGlvbltdfSBbZXJyb3JzXSAtIFRvcC1sZXZlbCBub21pbmFsIHVuY2hlY2tlZCBlcnJvciBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNJbXBvcnRbXX0gaW1wb3J0cyAtIFJlc29sdmVkIGltcG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0V4cG9ydFtdfSBleHBvcnRzIC0gUmVzb2x2ZWQgZXhwb3J0cyBpbiBzb3VyY2Ugb3JkZXIuXG4gKiBAcHJvcGVydHkge0VmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbY2FwYWJpbGl0aWVzXSAtIEF1dGhvcml0eSBkZWNsYXJhdGlvbnMgc2hhcmVkIGJ5IHJlZmVyZW5jZSB3aGVuIHRoZSBwcm9ncmFtIGRlY2xhcmVzIGEgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gW2VudHJ5UG9pbnRdIC0gU29sZSBleGVjdXRhYmxlIGVudHJ5IHBvaW50LCBwcmVzZW50IG9ubHkgb24gdGhlIHNlbGVjdGVkIG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm92ZW5hbmNlfSBbcHJvdmVuYW5jZV0gLSBQYXJzZXItYXV0aG9yZWQgc291cmNlIGFuZCBpZGVudGl0eSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ319IFtzdGRsaWJGYWNhZGVdIC0gU2VsZWN0ZWQgY29tcGlsZXItb3duZWQgZmFjYWRlIG1vZHVsZSBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCByYW5nZTogc3RyaW5nfVtdfSBkZXBlbmRlbmNpZXMgLSBWZXJzaW9uZWQgZmFjYWRlIGRlcGVuZGVuY2llcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGl0eSAtIEZhY2FkZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7KHtpZGVudGl0eTogc3RyaW5nLCBraW5kOiBcIm1vZHVsZVwiLCBzeW1ib2xzOiBzdHJpbmdbXX0gfCB7Zm9ybXM6IChcInVucXVhbGlmaWVkLWNhbGxcIiB8IFwicmVjZWl2ZXItY2FsbFwiKVtdLCBpZGVudGl0eTogc3RyaW5nLCBraW5kOiBcImJ1aWx0aW5cIiwgc3ltYm9sczogc3RyaW5nW119KVtdfSBuYXRpdmVNb2R1bGVzIC0gRXhhY3QgbmF0aXZlIHNvdXJjZSBpZGVudGl0aWVzLlxuICogQHByb3BlcnR5IHsoe2VmZmVjdHM6IHN0cmluZ1tdLCBmYWlsdXJlczogc3RyaW5nW10sIGZvcm1zOiAoXCJkaXJlY3QtY2FsbFwiIHwgXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwga2luZDogXCJmdW5jdGlvblwiLCBuYW1lOiBzdHJpbmcsIG93bmVyc2hpcDogXCJub3QtYXBwbGljYWJsZVwiLCBwYXJhbWV0ZXJzOiB7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9W10sIHJldHVyblR5cGU6IHN0cmluZ30gfCB7Y29uc3RydWN0b3I6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBvd25lcnNoaXA6IFwiYWNxdWlyZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdfSwgZm9ybXM6IFtcImNvbnN0cnVjdG9yLWNhbGxcIl0sIGtpbmQ6IFwiY2xhc3NcIiwgbWV0aG9kczoge2VmZmVjdHM6IHN0cmluZ1tdLCBmYWlsdXJlczogc3RyaW5nW10sIGZvcm1zOiBbXCJyZWNlaXZlci1jYWxsXCJdLCBuYW1lOiBzdHJpbmcsIG93bmVyc2hpcDogXCJib3Jyb3dlZFwiIHwgXCJjb25zdW1lZFwiLCBwYXJhbWV0ZXJzOiB7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9W10sIHJldHVyblR5cGU6IHN0cmluZ31bXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwib3duZWQtcmVmZXJlbmNlXCJ9KVtdfSBwdWJsaWNEZWNsYXJhdGlvbnMgLSBQdWJsaWMgc291cmNlIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7e21vZHVsZTogc3RyaW5nLCBvcGVyYXRpb25zOiBzdHJpbmdbXSwgcmFuZ2U6IHN0cmluZ31bXX0gcmVxdWlyZW1lbnRzIC0gQ2Fub25pY2FsIGNhcGFiaWxpdHkgcmVxdWlyZW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJ1bnRpbWVQcm9maWxlIC0gRXhhY3Qgc291cmNlIHJ1bnRpbWUgcHJvZmlsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VNb2R1bGUgLSBDb21waWxlci1vd25lZCBzZW1hbnRpYyBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIEV4YWN0IGZhY2FkZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImludGVybmFsXCIgfCBcInB1YmxpY1wifSB2aXNpYmlsaXR5IC0gTmF0aXZlLXNlbGVjdGFibGUgdmlzaWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVzXCJ9IHNjaGVtYSAtIEZhY2FkZSBkZXNjcmlwdG9yIHNjaGVtYS5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEZhY2FkZSBkZXNjcmlwdG9yIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gU291cmNlLWxhbmd1YWdlIGNvbXBhdGliaWxpdHkgcHJvZmlsZS5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUHJvZ3JhbU1vZHVsZURlc2NyaXB0b3JbXX0gbW9kdWxlcyAtIERlcGVuZGVuY3ktZmlyc3Qgc2VsZWN0ZWQgZXhlY3V0YWJsZSBjbG9zdXJlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNQcm9ncmFtXG4gKiBAcHJvcGVydHkge1wiUHJvZ3JhbVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1Byb2dyYW1Nb2R1bGVbXX0gbW9kdWxlcyAtIERlcGVuZGVuY3ktZmlyc3QgZGV0ZXJtaW5pc3RpYyBtb2R1bGUgb3JkZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnlNb2R1bGUgLSBTdGFibGUgaWRlbnRpdHkgb2YgdGhlIHNvbGUgZW50cnkgbW9kdWxlLlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYWxsZXItb3JkZXIgY29tcGxldGUgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfX0gW3N0ZGxpYkNvbnRyYWN0XSAtIERlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3Q7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge3tjb250cmFjdFZlcnNpb24/OiBzdHJpbmcsIGlkZW50aXR5OiBzdHJpbmd9W119IFtzdGRsaWJDb250cmFjdHNdIC0gT3JkZXJlZCBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0czsgcGxhaW4sIG5ldmVyIGZyb3plbi5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3J9IFtzdGRsaWJGYWNhZGVzXSAtIENvbXBsZXRlIHNlbGVjdGVkIHNvdXJjZS1sYW5ndWFnZSBmYWNhZGUgY2xvc3VyZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljTW9kdWxlIHwgU2VtYW50aWNQcm9ncmFtTW9kdWxlIHwgU2VtYW50aWNJbXBvcnQgfCBTZW1hbnRpY0V4cG9ydCB8IFJlY29yZERlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEVycm9yRGVjbGFyYXRpb24gfCBFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb24gfCBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uIHwgRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb24gfCBSZWNvcmRGaWVsZCB8IFByaXZhdGVGaWVsZCB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyIHwgUGFyYW1ldGVyIHwgVmFsdWVCaW5kaW5nIHwgQ2F0Y2hCaW5kaW5nIHwgQ2F0Y2hIYW5kbGVyIHwgQmxvY2sgfCBTdGF0ZW1lbnQgfCBFbnRyeVBvaW50IHwgRXhwcmVzc2lvbiB8IEVycm9yQ29uc3RydWN0aW9uIHwgRXJyb3JUeXBlIHwgTWFwRW50cnkgfCBTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNOb2RlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTm9kZX0gU2VtYW50aWNOb2RlV2l0aG91dExvY2F0aW9ucyAqL1xuXG5leHBvcnQge31cbiJdfQ==
1359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLGtMQUFrTDtBQUNsTCxzREFBc0Q7QUFDdEQsOEZBQThGO0FBQzlGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsNlFBQTZRO0FBQzdRLGlHQUFpRztBQUNqRyxnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCwrRUFBK0U7QUFFL0U7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCw4REFBOEQ7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCxrSEFBa0g7QUFFbEg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUgsbUxBQW1MO0FBRW5MLHlFQUF5RTtBQUV6RTs7Ozs7Ozs7R0FRRztBQUVIOzs7O0dBSUc7QUFFSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVILG9OQUFvTjtBQUNwTixtRUFBbUU7QUFFbkU7Ozs7O0dBS0c7QUFFSCw0RkFBNEY7QUFFNUYsK3JCQUErckI7QUFDL3JCLDBFQUEwRTtBQUUxRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7OztHQUlHO0FBRUgsMktBQTJLO0FBRTNLOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCxvRkFBb0Y7QUFDcEYsNk5BQTZOO0FBQzdOLHFEQUFxRDtBQUNyRCw0UEFBNFA7QUFDNVAsMllBQTJZO0FBQzNZLHdLQUF3SztBQUN4Syx3SUFBd0k7QUFDeEksK1NBQStTO0FBRS9TOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUgsMmpCQUEyakI7QUFFM2pCOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILHVFQUF1RTtBQUN2RSxnU0FBZ1M7QUFFaFM7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCwybkJBQTJuQjtBQUMzbkIsMkRBQTJEO0FBRTNELE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwiamF2YVwiIHwgXCJrb3RsaW5cIiB8IFwicHl0aG9uXCIgfCBcImNzaGFycFwiIHwgXCJnb1wiIHwgXCJjXCIgfCBcImNwcFwiIHwgXCJydXN0XCIgfCBcInN3aWZ0XCIgfCBcImRhcnRcIiB8IFwiemlnXCJ9IFNlbWFudGljTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNMYW5ndWFnZX0gVGV4dEJhY2tlbmRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtUZXh0QmFja2VuZExhbmd1YWdlIHwgXCJ3YXNtXCIgfCBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcImZsdXR0ZXJcIn0gQmFja2VuZExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2UgfCBcImh0bWxcIn0gR2VuZXJhdGVkVGV4dExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1wiaW50ZWdlclwiIHwgXCJib29sZWFuXCIgfCBcInN0cmluZ1wifSBTZW1hbnRpY1R5cGVOYW1lICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZU5hbWUgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJOZWdhdGVcIiB8IFwiQm9vbGVhbk5vdFwifSBTZW1hbnRpY1VuYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlckFkZFwiIHwgXCJJbnRlZ2VyU3VidHJhY3RcIiB8IFwiSW50ZWdlck11bHRpcGx5XCIgfCBcIkJvb2xlYW5BbmRcIiB8IFwiQm9vbGVhbk9yXCIgfCBcIkludGVnZXJFcXVhbFwiIHwgXCJJbnRlZ2VyTm90RXF1YWxcIiB8IFwiQm9vbGVhbkVxdWFsXCIgfCBcIkJvb2xlYW5Ob3RFcXVhbFwiIHwgXCJTdHJpbmdFcXVhbFwiIHwgXCJTdHJpbmdOb3RFcXVhbFwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5cIiB8IFwiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbFwiIHwgXCJTdHJpbmdDb25jYXRcIn0gU2VtYW50aWNCaW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYXBhYmlsaXR5XCIgfCBcInJlc291cmNlXCIgfCBcImZhaWx1cmVcIiB8IFwib3BlcmF0aW9uXCIgfCBcInJlY29yZFwiIHwgXCJpbnRlcmZhY2VcIiB8IFwiaW50ZXJmYWNlTWV0aG9kXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZpZWxkXCIgfCBcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwiIHwgXCJmdW5jdGlvblwiIHwgXCJ0eXBlUGFyYW1ldGVyXCIgfCBcInBhcmFtZXRlclwiIHwgXCJsb2NhbFwiIHwgXCJpdGVyYXRpb25cIiB8IFwiY2F0Y2hcIn0gU2VtYW50aWNTeW1ib2xLaW5kICovXG4vKiogQHR5cGVkZWYge1wicmVjb3JkXCIgfCBcImludGVyZmFjZVwiIHwgXCJjbGFzc1wiIHwgXCJlcnJvclwiIHwgXCJmdW5jdGlvblwifSBTZW1hbnRpY0RlY2xhcmF0aW9uS2luZCAqL1xuLyoqIEB0eXBlZGVmIHtcImRlY2xhcmF0aW9uXCIgfCBcInR5cGVcIiB8IFwiY29uc3RydWN0XCIgfCBcIm1lbWJlclwiIHwgXCJyZWFkXCIgfCBcIndyaXRlXCIgfCBcImNhbGxcIn0gU2VtYW50aWNTeW1ib2xSb2xlICovXG4vKiogQHR5cGVkZWYge1wicGFyc2VcIiB8IFwiZ2VuZXJhdGVcIiB8IFwicmVzdG9yZVwiIHwgXCJjb21waWxlXCIgfCBcImxpbmtcIiB8IFwidmFsaWRhdGVcIiB8IFwiaW5zdGFudGlhdGVcIiB8IFwiZXhlY3V0ZVwifSBBY2NlcHRhbmNlU3RhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJlbnRyeVwiIHwgXCJzb3VyY2VcIiB8IFwibWFuaWZlc3RcIiB8IFwic3VwcG9ydFwiIHwgXCJtYXBwaW5nXCIgfCBcInJlc291cmNlXCIgfCBcImxvYWRlclwifSBHZW5lcmF0ZWRBcnRpZmFjdFJvbGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gU2FmZSBYY29kZSBwcm9kdWN0L3BhdGggaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlTmFtZSAtIFNhZmUgU3dpZnQgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvblByZWZpeCAtIENhbGxlci1zdXBwbGllZCByZXZlcnNlLUROUyBvcmdhbml6YXRpb24gcHJlZml4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZUlkZW50aWZpZXIgLSBDYWxsZXItc3VwcGxpZWQgcmV2ZXJzZS1ETlMgYXBwbGljYXRpb24gYnVuZGxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlcGxveW1lbnRUYXJnZXQgLSBDYWxsZXItc3VwcGxpZWQgbWFqb3IubWlub3IgaU9TIGRlcGxveW1lbnQgdGFyZ2V0OyBuZXZlciBpbmZlcnJlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcIlNvdXJjZXNcIn0gW3NvdXJjZVJvb3RdIC0gRml4ZWQgZ2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcIkFzc2V0cy54Y2Fzc2V0c1wifSBbcmVzb3VyY2VSb290XSAtIEZpeGVkIGNhbGxlci1yZXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcInN3aWZ0dWlcIn0gW2xpZmVjeWNsZV0gLSBTb2xlIHN1cHBvcnRlZCBsaWZlY3ljbGUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIG5ldmVyPn0gW2luZm9QbGlzdF0gLSBDbG9zZWQgYmFzZWxpbmUgY2FsbGVyIHBsaXN0IGV4dGVuc2lvbjsgY3VycmVudGx5IGVtcHR5LlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbZW50aXRsZW1lbnRzXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIGVudGl0bGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcHJpdmFjeURlY2xhcmF0aW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBwcml2YWN5IGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbY2FwYWJpbGl0aWVzXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIEFwcGxlIGNhcGFiaWxpdGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gVmFsaWRhdGVkIFhjb2RlIHByb2R1Y3QvcGF0aCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVOYW1lIC0gVmFsaWRhdGVkIFN3aWZ0IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb25QcmVmaXggLSBWYWxpZGF0ZWQgcmV2ZXJzZS1ETlMgb3JnYW5pemF0aW9uIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZGVudGlmaWVyIC0gVmFsaWRhdGVkIHJldmVyc2UtRE5TIGFwcGxpY2F0aW9uIGJ1bmRsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXBsb3ltZW50VGFyZ2V0IC0gVmFsaWRhdGVkIGNhbGxlci1zdXBwbGllZCBkZXBsb3ltZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFZhbGlkYXRlZCBkaXNwbGF5IG5hbWUuXG4gKiBAcHJvcGVydHkge1wiU291cmNlc1wifSBzb3VyY2VSb290IC0gR2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcIkFzc2V0cy54Y2Fzc2V0c1wifSByZXNvdXJjZVJvb3QgLSBDYWxsZXItcmVzb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJzd2lmdHVpXCJ9IGxpZmVjeWNsZSAtIFNvbGUgc3VwcG9ydGVkIGxpZmVjeWNsZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbmV2ZXI+Pn0gaW5mb1BsaXN0IC0gRW1wdHkgY2FsbGVyIHBsaXN0IGV4dGVuc2lvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gcGVybWlzc2lvbnMgLSBFbXB0eSBiYXNlbGluZSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gZW50aXRsZW1lbnRzIC0gRW1wdHkgYmFzZWxpbmUgZW50aXRsZW1lbnRzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBwcml2YWN5RGVjbGFyYXRpb25zIC0gRW1wdHkgYmFzZWxpbmUgcHJpdmFjeSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IGNhcGFiaWxpdGllcyAtIEVtcHR5IGJhc2VsaW5lIEFwcGxlIGNhcGFiaWxpdGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQXNzZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBGdWxsIHNhZmUgZGVzdGluYXRpb24gYmVsb3cgQXNzZXRzLnhjYXNzZXRzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FwcGxpY2F0aW9uSWRdIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVzcGFjZV0gLSBLb3RsaW4vQW5kcm9pZCBuYW1lc3BhY2U7IGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uSWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIEdlbmVyYXRlZCBLb3RsaW4gcGFja2FnZTsgZGVmYXVsdHMgdG8gbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpdml0eUNsYXNzTmFtZV0gLSBMYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcm9kdWN0TmFtZV0gLSBEZXRlcm1pbmlzdGljIHByb2plY3QgcHJvZHVjdCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXNwbGF5TmFtZV0gLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBbbWluaW11bVNka10gLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFt0YXJnZXRTZGtdIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFtjb21waWxlU2RrXSAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBbYnVpbGRUb29sc1ZlcnNpb25dIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdmVyc2lvbkNvZGVdIC0gUG9zaXRpdmUgQW5kcm9pZCB2ZXJzaW9uIGNvZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcnNpb25OYW1lXSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1widW5zcGVjaWZpZWRcIn0gW29yaWVudGF0aW9uXSAtIEJhc2VsaW5lIG9yaWVudGF0aW9uIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtcInN5c3RlbVwifSBbdGhlbWVdIC0gQmFzZWxpbmUgcGxhdGZvcm0tbmF0aXZlIHRoZW1lLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBwZXJtaXNzaW9uIHNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIC0gVmFsaWRhdGVkIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZXNwYWNlIC0gVmFsaWRhdGVkIEFuZHJvaWQgbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIC0gR2VuZXJhdGVkIEtvdGxpbiBwYWNrYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5Q2xhc3NOYW1lIC0gTGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFByb2plY3QgcHJvZHVjdCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gbWluaW11bVNkayAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gdGFyZ2V0U2RrIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IGNvbXBpbGVTZGsgLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gYnVpbGRUb29sc1ZlcnNpb24gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gUG9zaXRpdmUgQW5kcm9pZCB2ZXJzaW9uIGNvZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk5hbWUgLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcInVuc3BlY2lmaWVkXCJ9IG9yaWVudGF0aW9uIC0gQmFzZWxpbmUgb3JpZW50YXRpb24gYmVoYXZpb3IuXG4gKiBAcHJvcGVydHkge1wic3lzdGVtXCJ9IHRoZW1lIC0gUGxhdGZvcm0tbmF0aXZlIHRoZW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFNhZmUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc2VsZWN0ZWQgZml4ZWQgQW5kcm9pZCByZXNvdXJjZSBvciBhc3NldCByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIExvd2VyY2FzZSBEYXJ0IHBhY2thZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29yZ2FuaXphdGlvbl0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgb3duaW5nIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXBwbGljYXRpb25JZF0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eSBleHRlbmRpbmcgdGhlIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aXZpdHlDbGFzc05hbWVdIC0gR2VuZXJhdGVkIEphdmEgbGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlzcGxheU5hbWVdIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gW21pbmltdW1TZGtdIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbdGFyZ2V0U2RrXSAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbY29tcGlsZVNka10gLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gW2J1aWxkVG9vbHNWZXJzaW9uXSAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcnNpb25Db2RlXSAtIFBvc2l0aXZlIEFuZHJvaWQvRmx1dHRlciBidWlsZCBudW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcnNpb25OYW1lXSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IHBlcm1pc3Npb24gc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIC0gVmFsaWRhdGVkIERhcnQgcGFja2FnZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb24gLSBWYWxpZGF0ZWQgb3duaW5nIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIC0gVmFsaWRhdGVkIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHlDbGFzc05hbWUgLSBHZW5lcmF0ZWQgSmF2YSBsYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gbWluaW11bVNkayAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gdGFyZ2V0U2RrIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IGNvbXBpbGVTZGsgLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gYnVpbGRUb29sc1ZlcnNpb24gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gUG9zaXRpdmUgQW5kcm9pZC9GbHV0dGVyIGJ1aWxkIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGbHV0dGVyQXBwbGljYXRpb25Bc3NldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFNhZmUgcGF0aCBiZWxvdyB0aGUgZ2VuZXJhdGVkIEZsdXR0ZXIgYXNzZXRzIHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZnJvbnRlbmQgLSBQYXJzZXIgYWRhcHRlciBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRleHRCYWNrZW5kIC0gU2luZ2xlLSBvciBtdWx0aS1maWxlIHRleHQgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeUJhY2tlbmQgLSBCaW5hcnkgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFwcGxpY2F0aW9uQmFja2VuZCAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnRlcm9wZXJhYmlsaXR5IC0gSW50ZXJvcGVyYWJpbGl0eSBicmlkZ2UgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBwcm92aWRlciAtIFRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlci9uYXRpdmUtYmluZGluZyBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2hlY2tDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3VwcG9ydGVkIC0gV2hldGhlciB0aGUgdGFyZ2V0IG93bnMgYSBkZXZlbG9wZXIgY2hlY2sgcGxhbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIE9yZGVyZWQgbm9uLWV4ZWN1dGluZyBkZXZlbG9wZXItY2hlY2sgc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdG9vbGNoYWlucyAtIEV4YWN0IGNhbm9uaWNhbCB0b29scyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgdGhlIHBsYW4uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzIC0gVGFzayAwMDUgYXJiaXRyYXJ5IHJlcXVpcmVkIHNpZ25hdHVyZXMsIHJlc29sdmVkIGRpcmVjdCBjYWxscywgYW5kIHZvaWQgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW11dGFibGVDb2xsZWN0aW9ucyAtIFRhc2sgMDA2IHJlY3Vyc2l2ZSBpbW11dGFibGUgbGlzdHMvbWFwcywgdG90YWwgYWNjZXNzLCBhbmQgc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9uYWxWYWx1ZXMgLSBUYXNrIDAwNyBleHBsaWNpdCBvcHRpb25hbCB2YWx1ZXMsIHByZXNlbmNlIHRlc3RzLCBhbmQgZ3VhcmRlZCB1bndyYXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRMaXN0SXRlcmF0aW9uIC0gVGFzayAwMDggb3JkZXJlZCBpbW11dGFibGUtbGlzdCBpdGVyYXRpb24gYW5kIG5lYXJlc3QtbG9vcCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcmRlcmVkTWFwSXRlcmF0aW9uIC0gVGFzayAwMTQgaW5zZXJ0aW9uLW9yZGVyZWQgaW1tdXRhYmxlLW1hcCBwYWlyIGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZGl0aW9uQ29udHJvbGxlZExvb3BzIC0gVGFzayAwMzIgc3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wcyBhbmQgcmVzb2x2ZWQgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZGl0aW9uYWxFeHByZXNzaW9ucyAtIFRhc2sgMDQ4IHN0cmljdC1Cb29sZWFuIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIHdpdGggam9pbmVkIGFybSB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RyaW5nSW50ZXJwb2xhdGlvbiAtIFRhc2sgMDQ4IHBhcnNlci1wcm92ZWQgc3RyaW5nIGludGVycG9sYXRpb24gbG93ZXJlZCB0byBjaGVja2VkIHN0cmluZyBjb25jYXRlbmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjbG9zZWRSZWNvcmRzIC0gVGFzayAwMDkgbm9taW5hbCBjbG9zZWQgaW1tdXRhYmxlIHJlY29yZHMsIGNvbnN0cnVjdGlvbiwgYW5kIG1lbWJlciByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHlwZWRFcnJvcnMgLSBUYXNrIDAxMSBub21pbmFsIHVuY2hlY2tlZCBlcnJvcnMsIHJhaXNlcywgYW5kIGV4YWN0IHR5cGVkIGNhdGNoZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MgLSBUYXNrIDAxMiBpbnZhcmlhbnQgdW5ib3VuZGVkIHR5cGUgcGFyYW1ldGVycyBhbmQgY2xvc2VkIGdlbmVyaWMgYXBwbGljYXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZWZlcmVuY2VDbGFzc2VzIC0gVGFzayAwMzMgbm9taW5hbCByZWZlcmVuY2UgY2xhc3NlcywgcHJpdmF0ZSBpbnN0YW5jZSBzdGF0ZSwgZXhhY3QgY29uc3RydWN0b3JzLCBhbmQgcmVjZWl2ZXIgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm91bmRlZFN1YnR5cGluZyAtIFRhc2sgMDQ4IG5vbWluYWwgaW50ZXJmYWNlcyB3aXRoIGV4YWN0IGltcGxlbWVudGF0aW9uIGNvbnRyYWN0cyBhbmQgaW1wbGljaXQgdXBjYXN0IChyZXF1aXJlcyByZWZlcmVuY2VDbGFzc2VzKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzIC0gVGFzayAwMzQgYXV0aG9yaXplZCBob3N0IGVmZmVjdHMsIHR5cGVkIGZhaWx1cmVzLCBhbmQgb3duZWQgcmVzb3VyY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSByZWdpc3RyeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VSb2xlQ2FwYWJpbGl0aWVzPn0gcm9sZXMgLSBJbmRlcGVuZGVudGx5IHJlZ2lzdGVyZWQgcm9sZXMuXG4gKiBAcHJvcGVydHkge1wic2luZ2xlXCIgfCBcIm11bHRpcGxlXCJ9IGFydGlmYWN0TXVsdGlwbGljaXR5IC0gVGFyZ2V0IGFydGlmYWN0IG11bHRpcGxpY2l0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRUcmlwIC0gV2hldGhlciBmcm9udGVuZC9iYWNrZW5kIHJvdW5kLXRyaXAgYWNjZXB0YW5jZSBpcyBkZWNsYXJlZC5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzPn0gZmVhdHVyZXMgLSBTZW1hbnRpYyBmZWF0dXJlIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzPn0gbWFwcGluZyAtIE1hcHBpbmcgZm9ybXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllcz59IGFjY2VwdGFuY2UgLSBTdGFnZXMgYW5kIHRvb2xjaGFpbnMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlQ2hlY2tDYXBhYmlsaXRpZXM+fSBjaGVjayAtIE5vbi1leGVjdXRpbmcgZGV2ZWxvcGVyLWNoZWNrIGNhcGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VQb2ludFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmUgLSBPbmUtYmFzZWQgbGluZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb2x1bW4gLSBPbmUtYmFzZWQgVVRGLTE2IGNvZGUtdW5pdCBjb2x1bW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgc291cmNlIG9mZnNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZUxvY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hdGluZyBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IHN0YXJ0IC0gSW5jbHVzaXZlIHN0YXJ0LlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gZW5kIC0gRXhjbHVzaXZlIGVuZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZ2lzdGVyZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFJlZ2lzdHJ5LWxvY2FsIGRldGVybWluaXN0aWMgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUsIHByZXNlcnZlZCB2ZXJiYXRpbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCAtIE9yaWdpbmFsIHNvdXJjZSBjb250ZW50LCBwcmVzZXJ2ZWQgdmVyYmF0aW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFBhcnNlciBsYW5ndWFnZSB3aGVuIGtub3duLlxuICogQHByb3BlcnR5IHtcImFwcGxpY2F0aW9uXCIgfCBcImZhY2FkZVwifSBbb3duZXJzaGlwXSAtIENhbGxlciBvciBjb21waWxlci1vd25lZCBzb3VyY2Ugcm9sZSBmb3Igc2VtYW50aWMgcHJvZ3JhbXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIn0ga2luZCAtIERpcmVjdCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBvcmlnaW5hbCByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlbGF0ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSZWxhdGVkIG9yaWdpbmFsIHJhbmdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBSZWxhdGlvbnNoaXAgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERlcml2ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJkZXJpdmVkXCJ9IGtpbmQgLSBQcm92ZW5hbmNlIGRlcml2ZWQgZnJvbSBvbmUgb3IgbW9yZSBvcmlnaW5zLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IG9yaWdpbnMgLSBPcmRlcmVkLCBub24tZW1wdHkgb3JpZ2luYWwgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3ludGhldGljT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic3ludGhldGljXCJ9IGtpbmQgLSBTb3VyY2UtZnJlZSBnZW5lcmF0ZWQgb3Igc2VtYW50aWMgc2NhZmZvbGRpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gU3RhYmxlIGh1bWFuLXJlYWRhYmxlIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIE9yZGVyZWQgcmVsYXRlZCByYW5nZXMsIHBvc3NpYmx5IGVtcHR5LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7U291cmNlT3JpZ2luIHwgRGVyaXZlZE9yaWdpbiB8IFN5bnRoZXRpY09yaWdpbn0gU2VtYW50aWNPcmlnaW4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRCeXRlUmFuZ2VcbiAqIEBwcm9wZXJ0eSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gSGFsZi1vcGVuIGdlbmVyYXRlZCBieXRlIG9mZnNldHMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTZW1hbnRpYyBvciBleHBsaWNpdCBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyBvciBiaW5hcnktcmVnaW9uIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRCeXRlTWFwcGluZ1wifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBHZW5lcmF0ZWQgb2Zmc2V0cyBhcmUgYnl0ZXMsIG5ldmVyIHRleHQgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7e3BhdGg6IHN0cmluZywgYnl0ZUxlbmd0aDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGFydGlmYWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRCeXRlUmFuZ2VbXX0gcmFuZ2VzIC0gT3JkZXJlZCBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gQXNzb2NpYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEFzc29jaWF0aW9uIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTb3VyY2UgYXNzb2NpYXRpb24gaW5kZXBlbmRlbnQgb2YgdHJhdmVyc2FsIHBvc2l0aW9uLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmcm9tIHRoZSBzZW1hbnRpYyBtb2R1bGUgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlW1wia2luZFwiXSB8IFwiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gU2VtYW50aWMgbm9kZSBraW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZXNvbHZlZCBkZWNsYXJlZC9yZWZlcmVuY2VkIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm9kZUlkIC0gUmVmZXJyaW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUm9sZX0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByZWZlcmVuY2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgc3ltYm9sIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBjYXRlZ29yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbk5vZGVJZCAtIERlY2xhcmluZyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZW1hbnRpY0RlY2xhcmF0aW9uSWRdIC0gU3RhYmxlIHNlbWFudGljIGRlY2xhcmF0aW9uIGlkZW50aXR5IGZvciByZWNvcmQsIGZpZWxkLCBhbmQgZnVuY3Rpb24gc3ltYm9scy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSZWZlcmVuY2VbXX0gcmVmZXJlbmNlcyAtIE9yZGVyZWQgcmVzb2x2ZWQgcmVmZXJlbmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcInV0ZjE2XCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBPZmZzZXQgYW5kIGNvbHVtbiB1bml0LlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBWZXJzaW9uZWQgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gRGV0ZXJtaW5pc3RpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIERldGVybWluaXN0aWMgc3ltYm9sIGluZGV4LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7XCJleGFjdFwiIHwgXCJhbmNob3JcIiB8IFwic3ludGhldGljXCJ9IE1hcHBpbmdLaW5kICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nU3BhblxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGhhbGYtb3BlbiByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7TWFwcGluZ0tpbmR9IG1hcHBpbmdLaW5kIC0gTWFwcGluZyBwcmVjaXNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgb3JpZ2luYWwgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIG5vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIHN5bWJvbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyB0b2tlbiByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIFVzZWZ1bCBzeW1ib2wgbmFtZSBmb3IgU291cmNlIE1hcCB2My5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZFNvdXJjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3V0cHV0IGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IHRleHQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBMRiBzb3VyY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbSBpZGVudGl0eSBhbmQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gT3JpZ2luYWwgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gQ2Fub25pY2FsIHNlbWFudGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gQ2Fub25pY2FsIHNlbWFudGljIHN5bWJvbCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgZ2VuZXJhdGVkIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIEdlbmVyYXRlZCBvdXRwdXQgcHJvZ3JhbSwgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQgZGlyZWN0aXZlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gR2VuZXJhdGVkIG91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmljaCBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTWFwRmlsZW5hbWUgLSBEZWZhdWx0IGV4dGVybmFsIFNvdXJjZSBNYXAgZmlsZW5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1widGV4dFwifSBraW5kIC0gUmljaCB0ZXh0IHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByYW5nZSBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBJbnRlcm9wZXJhYmxlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZU1hcEZpbGVuYW1lXSAtIExvZ2ljYWwgU291cmNlIE1hcCBzaWRlY2FyIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0ga2luZCAtIEJ5dGUgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSBieXRlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU3ludGhldGljIGFydGlmYWN0IGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gRXhwbGljaXQgdGFyZ2V0LXNjYWZmb2xkaW5nIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIFJlbGF0ZWQgc2VtYW50aWMgc291cmNlIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1RleHRBcnRpZmFjdFByb3ZlbmFuY2UgfCBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlIHwgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlfSBBcnRpZmFjdFByb3ZlbmFuY2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTZXRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBVbmlxdWUgc2FmZSByZWxhdGl2ZSBQT1NJWCBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gQ29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIFRleHQgb3IgYSBkZXRhY2hlZCBjb3B5IG9mIHRoZSBleGFjdCBnZW5lcmF0ZWQgYnl0ZXMgb24gZXZlcnkgYmluYXJ5IHJlYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gQXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gQXJ0aWZhY3Qgcm9sZTsgZXhhY3RseSBvbmUgc2V0IGFydGlmYWN0IGlzIGVudHJ5LlxuICogQHByb3BlcnR5IHtcImdlbmVyYXRlZFwifSBvd25lcnNoaXAgLSBUYXNrLTAxNSBvd25lcnNoaXAgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIFRleHQsIGJ5dGUtcmFuZ2UsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RTZXRcbiAqIEBwcm9wZXJ0eSB7XCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFN0YWJsZSBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnkgLSBQYXRoIG9mIHRoZSBzb2xlIGRlY2xhcmVkIGVudHJ5IGFydGlmYWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSBhcnRpZmFjdHMgLSBEZXRlcm1pbmlzdGljIGFydGlmYWN0IG9yZGVyLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IFttZXRhZGF0YV0gLSBEZXRhY2hlZCB0YXJnZXQtc3BlY2lmaWMgSlNPTiBtZXRhZGF0YS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIE5vcm1hbGl6ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGJ1aWxkIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gU3RhYmxlIG1lZGlhIHR5cGUgZm9yIHRoZSB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBTdGFibGUgbGFuZ3VhZ2UtbmV1dHJhbCByb2xlIGZvciB0aGUgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uVmFsaWRhdG9yQ29udGV4dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldElkIC0gRXhwbGljaXQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCBnZW5lcmF0ZWQtc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidWlsZFBhdGggLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCBjb21waWxlci1vdXRwdXQgZGlyZWN0b3J5LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7KGNvbnRleHQ6IFJlYWRvbmx5PFB1YmxpY2F0aW9uVmFsaWRhdG9yQ29udGV4dD4pID0+IFByb21pc2U8UHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRbXSB8IHZvaWQ+IHwgUHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRbXSB8IHZvaWR9IFB1YmxpY2F0aW9uVmFsaWRhdG9yICovXG5cbi8qKiBAdHlwZWRlZiB7XCJ0ZXh0XCIgfCBcImJpbmFyeVwiIHwgXCJhcHBsaWNhdGlvblwifSBQdWJsaWNhdGlvblRhcmdldFJvbGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblRhcmdldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGFydGlmYWN0U2V0IC0gQ29tcGxldGUgYWxyZWFkeS12YWxpZGF0ZWQgZ2VuZXJhdGVkIGFydGlmYWN0cy5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQcm9qZWN0aW9uIC0gR2VuZXJhdGlvbi1yZWxhdGl2ZSBnZW5lcmF0ZWQtc291cmNlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQcm9qZWN0aW9uIC0gR2VuZXJhdGlvbi1yZWxhdGl2ZSBjb21waWxlci1vdXRwdXQgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25WYWxpZGF0b3JbXX0gW3ZhbGlkYXRvcnNdIC0gT3JkZXJlZCBjYW5kaWRhdGUgdmFsaWRhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25JZCAtIEV4cGxpY2l0IGdlbmVyYXRpb24vY3ljbGUgaWRlbnRpdHksIGZyZXNoIG9yIGFuIGV4YWN0IHJldGFpbmVkIHZhbGlkYXRvci1mcmVlIGNhbmRpZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25UYXJnZXRJbnB1dFtdfSB0YXJnZXRzIC0gQ29tcGxldGUgb3JkZXJlZCBwcm9qZWN0IHRhcmdldHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IFtzaWduYWxdIC0gQ2FuY2VsbGF0aW9uIGF1dGhvcml0eSB0aHJvdWdoIHRoZSBhY3RpdmUtcG9pbnRlciBjb21taXQgYm91bmRhcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uQ29udGVudEhhc2hcbiAqIEBwcm9wZXJ0eSB7XCJzaGEyNTZcIn0gYWxnb3JpdGhtIC0gSGFzaCBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBMb3dlcmNhc2UgaGV4YWRlY2ltYWwgZGlnZXN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkFydGlmYWN0TWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gQXJ0aWZhY3Qtc2V0LXJlbGF0aXZlIHBhdGguXG4gKiBAcHJvcGVydHkge1widGV4dFwiIHwgXCJiaW5hcnlcIn0gY29udGVudEtpbmQgLSBPcmlnaW5hbCBhcnRpZmFjdCBjb250ZW50IHJlcHJlc2VudGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIERlY2xhcmVkIGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0Um9sZX0gcm9sZSAtIERlY2xhcmVkIGFydGlmYWN0IHJvbGUuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIENvbXBsZXRlIHBlcnNpc3RlZCByaWNoLCBieXRlLCBvciBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlTGVuZ3RoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgbGVuZ3RoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uQ29udGVudEhhc2h9IGhhc2ggLSBFeGFjdCBzdGFnZWQgYnl0ZSBoYXNoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkJ1aWxkQXJ0aWZhY3RNYW5pZmVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBCdWlsZC1wcm9qZWN0aW9uLXJlbGF0aXZlIHBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRGVjbGFyZWQgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBEZWNsYXJlZCBsYW5ndWFnZS1uZXV0cmFsIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlTGVuZ3RoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgbGVuZ3RoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uQ29udGVudEhhc2h9IGhhc2ggLSBFeGFjdCBzdGFnZWQgYnl0ZSBoYXNoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvblRhcmdldE1hbmlmZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdC1zZXQgYmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3tzb3VyY2U6IHN0cmluZywgYnVpbGQ6IHN0cmluZ319IHByb2plY3Rpb25zIC0gRGlzam9pbnQgZ2VuZXJhdGlvbi1yZWxhdGl2ZSBwcm9qZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvbkFydGlmYWN0TWFuaWZlc3RbXX0gYXJ0aWZhY3RzIC0gT3JkZXJlZCBnZW5lcmF0ZWQgYXJ0aWZhY3RzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0aW9uQnVpbGRBcnRpZmFjdE1hbmlmZXN0W119IGJ1aWxkQXJ0aWZhY3RzIC0gT3JkZXJlZCB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0cy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBbbWV0YWRhdGFdIC0gUGVyc2lzdGVkIHRhcmdldC1zcGVjaWZpYyBhcnRpZmFjdC1zZXQgbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uTWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEdlbmVyYXRpb25NYW5pZmVzdFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIE1hbmlmZXN0IHNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4cGxpY2l0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gRXhwbGljaXQgZ2VuZXJhdGlvbi9jeWNsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvblRhcmdldE1hbmlmZXN0W119IHRhcmdldHMgLSBDb21wbGV0ZSBvcmRlcmVkIHRhcmdldCByZWNvcmRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGlzaGVkVGFyZ2V0UGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEV4cGxpY2l0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvblRhcmdldFJvbGV9IHJvbGUgLSBFeHBsaWNpdCBsYW5ndWFnZS1uZXV0cmFsIHRhcmdldCByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBpbW11dGFibGUgZ2VuZXJhdGVkLXNvdXJjZSBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3QgaW1tdXRhYmxlIGNvbXBpbGVyLW91dHB1dCBkaXJlY3RvcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaXNoZWRHZW5lcmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gUmVzb2x2ZWQgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uUGF0aCAtIEV4YWN0IGltbXV0YWJsZSBnZW5lcmF0aW9uIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtYW5pZmVzdFBhdGggLSBFeGFjdCBnZW5lcmF0aW9uIG1hbmlmZXN0IHBhdGguXG4gKiBAcHJvcGVydHkge0dlbmVyYXRpb25NYW5pZmVzdH0gbWFuaWZlc3QgLSBWZXJpZmllZCBpbW11dGFibGUgZ2VuZXJhdGlvbiBtYW5pZmVzdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGlzaGVkVGFyZ2V0UGF0aHNbXX0gdGFyZ2V0cyAtIEV4YWN0IGdlbmVyYXRpb24tc2NvcGVkIHRhcmdldCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2xlYW51cFBlbmRpbmcgLSBXaGV0aGVyIHBvc3QtY29tbWl0IGpvdXJuYWwgY2xlYW51cCByZW1haW5zIGZvciByZWNvdmVyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERpc2NvdmVyZWRUb29sY2hhaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kIC0gRG9jdW1lbnRlZCBjYW5vbmljYWwgY29tbWFuZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHByb3BlcnR5IHtcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwifSBzb3VyY2UgLSBSZXNvbHV0aW9uIHJvdXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBGaXJzdCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBsaW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25PdXRwdXQgLSBDb21wbGV0ZSBub3JtYWxpemVkIHN0ZG91dCwgb3Igbm9ybWFsaXplZCBzdGRlcnIgd2hlbiBzdGRvdXQgaXMgZW1wdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrUGF0aEFyZ3VtZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXggLSBFeGFjdCBhcmd2IGluZGV4IGNvbnRhaW5pbmcgdGhlIHBhdGguXG4gKiBAcHJvcGVydHkge1wic291cmNlXCIgfCBcImJ1aWxkXCJ9IG93bmVyc2hpcCAtIENhbmRpZGF0ZSBzdWJ0cmVlIHRoYXQgb3ducyB0aGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJlZml4XSAtIEV4YWN0IG5vbi1wYXRoIGFyZ3YgcHJlZml4IHByZWNlZGluZyBhbiBvd25lZCBhYnNvbHV0ZSBwYXRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tFbnZpcm9ubWVudFBhdGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRXhhY3QgZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyBhbiBvd25lZCBhYnNvbHV0ZSBwYXRoLlxuICogQHByb3BlcnR5IHtcInNvdXJjZVwiIHwgXCJidWlsZFwiIHwgXCJ0b29sXCJ9IG93bmVyc2hpcCAtIENhbmRpZGF0ZSBzdWJ0cmVlIG9yIGRpc2NvdmVyZWQgdG9vbCB0aGF0IG93bnMgdGhlIHBhdGguXG4gKiBAcHJvcGVydHkge0Rpc2NvdmVyZWRUb29sY2hhaW59IFt0b29sXSAtIEV4YWN0IHRvb2wgZXhlY3V0YWJsZSBib3VuZCBieSBhIHRvb2wtb3duZWQgZW52aXJvbm1lbnQgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja091dHB1dE93bmVyc2hpcFxuICogQHByb3BlcnR5IHtcImJ1aWxkXCJ9IG93bmVyc2hpcCAtIENvbXBpbGVyIG91dHB1dHMgYmVsb25nIG9ubHkgdG8gdGhlIGNhbmRpZGF0ZSBidWlsZCBzdWJ0cmVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCBidWlsZCByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIE1lZGlhIHR5cGUgYXNzaWduZWQgdG8gZXZlcnkgcHJvZHVjZWQgcmVndWxhciBmaWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBMYW5ndWFnZS1uZXV0cmFsIGNvbXBpbGVyLW91dHB1dCByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tTdGFnZVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7QWNjZXB0YW5jZVN0YWdlfSBzdGFnZSAtIERlY2xhcmVkIG5vbi1leGVjdXRpbmcgYWNjZXB0YW5jZSBzdGFnZS5cbiAqIEBwcm9wZXJ0eSB7RGlzY292ZXJlZFRvb2xjaGFpbn0gdG9vbCAtIEV4YWN0IGltbXV0YWJsZSBkaXNjb3ZlcmVkIHRvb2wgcmVjb3JkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIGNvcGllZCBmcm9tIHRoZSB0b29sIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3YgLSBFeGFjdCBzaGVsbC1mcmVlIGFyZ3VtZW50IHZlY3Rvci5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tQYXRoQXJndW1lbnRbXX0gcGF0aEFyZ3VtZW50cyAtIENvbXBsZXRlIG93bmVyc2hpcCBkZWNsYXJhdGlvbiBmb3IgYXJndiBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjd2QgLSBFeGFjdCBjYW5kaWRhdGUtc2NvcGVkIHdvcmtpbmcgZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gZW52aXJvbm1lbnQgLSBFeGFjdCBkZXRlcm1pbmlzdGljIGVudmlyb25tZW50LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBUYXJnZXRDaGVja0Vudmlyb25tZW50UGF0aFtdfSBlbnZpcm9ubWVudFBhdGhzIC0gT3duZWQgYWJzb2x1dGUgZW52aXJvbm1lbnQgcGF0aHMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGlucHV0SGFzaCAtIFNIQS0yNTYgb2YgZGVjbGFyZWQgcmVzdG9yZSBpbnB1dHMsIG9yIG51bGwgZm9yIHVuY29uZGl0aW9uYWwgc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gaW5wdXRzIC0gQ29tcGxldGUgc3RhZ2VkIGFydGlmYWN0IGlucHV0cyByZWFkIGJ5IHRoZSBzdGFnZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8VGFyZ2V0Q2hlY2tPdXRwdXRPd25lcnNoaXA+IHwgbnVsbH0gb3V0cHV0IC0gQnVpbGQgb3V0cHV0IG93bmVyc2hpcCwgb3IgbnVsbCBmb3Igbm9uLXByb2R1Y2luZyBjaGVja3MuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB0cmFuc2llbnRQYXRocyAtIENhbmRpZGF0ZSBzb3VyY2UvYnVpbGQgY2FjaGUgb3IgaW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzIHJlbW92ZWQgYWZ0ZXIgY2hlY2tpbmcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1BsYW5cbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFRhcmdldENoZWNrUGxhblwifSBzY2hlbWEgLSBQbGFuIHNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gUGxhbiBzY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJkZXZlbG9wZXItY2hlY2tcIn0gbW9kZSAtIE5vbi1leGVjdXRpbmcgZGV2ZWxvcGVyLWNoZWNrIG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvamVjdElkIC0gRXhhY3QgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRJZCAtIEV4YWN0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFJlZ2lzdGVyZWQgYmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUGF0aCAtIEV4YWN0IHN0YWdlZCBnZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3Qgc3RhZ2VkIGNvbXBpbGVyLW91dHB1dCByb290LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gYXJ0aWZhY3RQYXRocyAtIEV4YWN0IHN0YWdlZCBhcnRpZmFjdCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tTdGFnZVJlcXVlc3RbXX0gc3RhZ2VzIC0gT3JkZXJlZCB0YXJnZXQtb3duZWQgcmVxdWVzdHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1N0YWdlUmVzdWx0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBDb21wbGV0ZWQgc3RhZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PHtjb21tYW5kOiBzdHJpbmcsIGV4ZWN1dGFibGU6IHN0cmluZywgaWQ6IHN0cmluZywgc291cmNlOiBcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwiLCB2ZXJzaW9uOiBzdHJpbmd9Pn0gdG9vbCAtIEV4YWN0IHRvb2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd2IC0gRXhhY3QgZXhlY3V0ZWQgYXJndW1lbnQgdmVjdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGV4aXRDb2RlIC0gU3VjY2Vzc2Z1bCBwcm9jZXNzIGV4aXQgY29kZS5cbiAqIEBwcm9wZXJ0eSB7bnVsbH0gc2lnbmFsIC0gU3VjY2Vzc2Z1bCBwcm9jZXNzIHNpZ25hbCBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBCb3VuZGVkIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgLSBCb3VuZGVkIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uTXMgLSBOb24tbmVnYXRpdmUgc3RhZ2UgZHVyYXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4YWN0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0SWQgLSBFeGFjdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBSZWdpc3RlcmVkIGJhY2tlbmQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBUYXJnZXRDaGVja1N0YWdlUmVzdWx0W119IHN0YWdlcyAtIE9yZGVyZWQgc3VjY2Vzc2Z1bCBzdGFnZSBldmlkZW5jZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRbXX0gb3V0cHV0cyAtIENvbXBsZXRlIGNvbXBpbGVyLW93bmVkIGJ1aWxkIGZpbGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQWNjZXB0YW5jZVN0YWdlUmVzdWx0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBDb21wbGV0ZWQgc3RhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5IHVzZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIERpc2NvdmVyZWQgdG9vbCB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIENhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgLSBDYXB0dXJlZCBzdGFuZGFyZCBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBUYXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlyZWN0b3J5IC0gUmVtb3ZlZCBpc29sYXRlZCBwcm9qZWN0IGRpcmVjdG9yeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlUmVzdWx0W119IHN0YWdlcyAtIE9yZGVyZWQgY29tcGxldGVkIHN0YWdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IG5hbWUgLSBOb3JtYWxpemVkIHNjYWxhciB2YWx1ZSB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUGFyYW1ldGVyXCJ9IGtpbmQgLSBEZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGRlY2xhcmF0aW9uLXNjb3BlZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgdHlwZSBwYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVWYXJpYWJsZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwifSBraW5kIC0gUmVmZXJlbmNlIHRvIG9uZSBkZWNsYXJhdGlvbi1zY29wZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgcmVmZXJlbmNlZCB0eXBlLXBhcmFtZXRlciBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIHJlZmVyZW5jZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RUeXBlXG4gKiBAcHJvcGVydHkge1wiTGlzdFR5cGVcIn0ga2luZCAtIFJlY3Vyc2l2ZSBsaXN0LXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IGVsZW1lbnRUeXBlIC0gSG9tb2dlbmVvdXMgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJNYXBUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbWFwLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0ga2V5VHlwZSAtIEV4YWN0IHN0cmluZyBrZXkgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHZhbHVlVHlwZSAtIEhvbW9nZW5lb3VzIHZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgYXJndW1lbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3JkZXJlZE1hcFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcmRlcmVkTWFwVHlwZVwifSBraW5kIC0gRGlzdGluY3QgaW5zZXJ0aW9uLW9yZGVyZWQgbWFwLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0ga2V5VHlwZSAtIEV4YWN0IHN1cHBvcnRlZCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtcImluc2VydGlvblwifSBvcmRlciAtIENhbm9uaWNhbCBmaXJzdC1pbnNlcnRpb24gZW5jb3VudGVyIG9yZGVyLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsVHlwZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsVHlwZVwifSBraW5kIC0gRXhwbGljaXQgcHJlc2VuY2UvYWJzZW5jZSB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBFeGFjdCBwcmVzZW50LXZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgY29uc3RpdHVlbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkVHlwZVxuICogQHByb3BlcnR5IHtcIlJlY29yZFR5cGVcIn0ga2luZCAtIE5vbWluYWwgcmVjb3JkLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlW119IFthcmd1bWVudHNdIC0gRXhhY3QgaW52YXJpYW50IHR5cGUgYXJndW1lbnRzOyByZXF1aXJlZCBmb3IgZ2VuZXJpYyBkZWNsYXJhdGlvbnMgYW5kIGFic2VudCBmb3Igbm9uLWdlbmVyaWMgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JUeXBlXG4gKiBAcHJvcGVydHkge1wiRXJyb3JUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZC1lcnJvciB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZmVyZW5jZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWZlcmVuY2VUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlZmVyZW5jZS1jbGFzcyB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZFJlc291cmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVzb3VyY2VUeXBlXCJ9IGtpbmQgLSBDb21waWxlci1vd25lZCBsaW5lYXIgcmVzb3VyY2UgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZUlkIC0gRXhhY3QgYXV0aG9yaXR5IHJlc291cmNlIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiT3duZWRSZWZlcmVuY2VUeXBlXCJ9IGtpbmQgLSBMaW5lYXIgcmVmZXJlbmNlIHRoYXQgb3ducyBvbmUgcHJvdGVjdGVkIHJlc291cmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCBvd25lZCBjbGFzcyBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVyZmFjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJJbnRlcmZhY2VUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIGJvdW5kZWQtc3VidHlwaW5nIGludGVyZmFjZSB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7VHlwZVJlZmVyZW5jZSB8IFR5cGVWYXJpYWJsZVJlZmVyZW5jZSB8IExpc3RUeXBlIHwgTWFwVHlwZSB8IE9yZGVyZWRNYXBUeXBlIHwgT3B0aW9uYWxUeXBlIHwgUmVjb3JkVHlwZSB8IFJlZmVyZW5jZVR5cGUgfCBPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZSB8IEludGVyZmFjZVR5cGV9IFNlbWFudGljVmFsdWVUeXBlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVmFsdWVUeXBlIHwgRXJyb3JUeXBlfSBTZW1hbnRpY0JpbmRpbmdUeXBlICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gVm9pZCByZXR1cm4gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7XCJ2b2lkXCJ9IG5hbWUgLSBOb3JtYWxpemVkIG5vbi12YWx1ZSBmdW5jdGlvbiByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljVmFsdWVUeXBlIHwgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZU5hbWUgfCB7a2luZDogXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiwgcGFyYW1ldGVySWQ6IHN0cmluZ30gfCB7a2luZDogXCJMaXN0VHlwZVwiLCBlbGVtZW50VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiTWFwVHlwZVwiLCBrZXlUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eX0gfCB7a2luZDogXCJPcmRlcmVkTWFwVHlwZVwiLCBrZXlUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgb3JkZXI6IFwiaW5zZXJ0aW9uXCJ9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiUmVjb3JkVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmcsIGFyZ3VtZW50cz86IFNlbWFudGljVHlwZUlkZW50aXR5W119IHwge2tpbmQ6IFwiUmVmZXJlbmNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2VJZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVmZXJlbmNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiSW50ZXJmYWNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9fSBTZW1hbnRpY1R5cGVJZGVudGl0eSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVJZGVudGl0eSB8IFwidm9pZFwifSBGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IHJlcXVpcmVkIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHR5cGVzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJlc29sdmVkIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBbdHlwZUFyZ3VtZW50c10gLSBJbmZlcnJlZCBkZWNsYXJhdGlvbi1vcmRlciB0eXBlIGFyZ3VtZW50cyBmb3IgYSBnZW5lcmljIGNhbGwuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJQYXJhbWV0ZXJcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gUGFyYW1ldGVyIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FwYWJpbGl0eUlkIC0gRXhhY3QgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb25JZCAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBvcmRlcmVkIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBvcGVyYXRpb24gcmVzdWx0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBlZmZlY3RzIC0gQ2xvc2VkIGluaXRpYWwgZWZmZWN0IHNldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZhaWx1cmVJZHMgLSBFeGFjdCBvcmRlcmVkIGRlY2xhcmVkIGZhaWx1cmVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZUZsb3d9IHJlc291cmNlRmxvdyAtIEV4YWN0IG93bmVyc2hpcCB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRNb3ZlRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk93bmVkTW92ZUV4cHJlc3Npb25cIn0ga2luZCAtIEV4cGxpY2l0IGxpbmVhciBvd25lcnNoaXAgdHJhbnNmZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTW92ZWQgb3duZXIuXG4gKiBAcHJvcGVydHkge093bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSB0eXBlIC0gRXhhY3Qgb3duZWQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgdHJhbnNmZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZEJvcnJvd0V4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIn0ga2luZCAtIEltbWVkaWF0ZSBub25lc2NhcGluZyByZXNvdXJjZSBib3Jyb3cuXG4gKiBAcHJvcGVydHkge1wic2hhcmVkXCIgfCBcImV4Y2x1c2l2ZVwifSBtb2RlIC0gQm9ycm93IG1vZGUuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9uIHwgUmVjZWl2ZXJFeHByZXNzaW9uIHwgUHJpdmF0ZUZpZWxkUmVhZH0gZXhwcmVzc2lvbiAtIEJvcnJvd2VkIHBsYWNlLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGJvcnJvdyBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gRGVyaXZlZCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZWZmZWN0IGludm9jYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gRXhhY3Qgb3BlcmF0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlZmZlY3RTaXRlSWQgLSBEZXRlcm1pbmlzdGljIHNlbWFudGljIGV2YWx1YXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlfSByZXNvbHV0aW9uIC0gQ29tcGxldGUgYXV0aG9yaXR5IHJlc29sdXRpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNhbGwgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvcGVyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTdGFibGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3traW5kOiBcIm5vbmVcIn0gfCB7a2luZDogXCJhY3F1aXJlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJib3Jyb3dcIiB8IFwiY2xvc2VcIiwgcGFyYW1ldGVySW5kZXg6IG51bWJlciwgdGVybWluYWxGYWlsdXJlSWQ6IHN0cmluZ319IEVmZmVjdFJlc291cmNlRmxvdyAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBDYXBhYmlsaXR5IHJlc291cmNlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG5vbWluYWwgcmVzb3VyY2UgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSBmYWlsdXJlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG5vbWluYWwgZmFpbHVyZSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvblwifSBraW5kIC0gQ29tcGlsZXItYXV0aG9yaXplZCBvcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIGF1dGhvcml0eS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgb3BlcmF0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBlZmZlY3RzIC0gQ2xvc2VkIGluaXRpYWwgZWZmZWN0IHNldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZhaWx1cmVJZHMgLSBPcmRlcmVkIG5vbWluYWwgZmFpbHVyZSBpZGVudGl0aWVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZUZsb3d9IHJlc291cmNlRmxvdyAtIEV4YWN0IG93bmVyc2hpcCB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBBdXRob3JpemVkIGNhcGFiaWxpdHkgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3JpdHlJZCAtIE9wYXF1ZSBhdXRob3JpdHkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIENhcGFiaWxpdHkgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbltdfSByZXNvdXJjZXMgLSBPcmRlcmVkIHJlc291cmNlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uW119IGZhaWx1cmVzIC0gT3JkZXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25bXX0gb3BlcmF0aW9ucyAtIE9yZGVyZWQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhcGFiaWxpdHlBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIn0gc2NoZW1hIC0gQXV0aG9yaXR5IHNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxIHwgMn0gc2NoZW1hVmVyc2lvbiAtIEF1dGhvcml0eSBwYXlsb2FkIHZlcnNpb24sIG5vdCBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIE9wYXF1ZSBjYWxsZXItc3VwcGxpZWQgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gY2FwYWJpbGl0aWVzIC0gTm9ybWFsaXplZCBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyYWN0VmVyc2lvbl0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24sIHByZXNlbnQgb25seSB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZWQgb25lLlxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgY29udHJhY3RWZXJzaW9uOiBzdHJpbmcsIGNhcGFiaWxpdGllczogRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119W119IFttb2R1bGVzXSAtIFNjaGVtYS12MiBjYW5vbmljYWwgbW9kdWxlIGF1dGhvcml0aWVzLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e21vZHVsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCB0eXBlOiBTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9fX0gQ2FwYWJpbGl0eVBhcmFtZXRlcklucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmd9fSBDYXBhYmlsaXR5TmFtZWRJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9fSBDYXBhYmlsaXR5UmVzb3VyY2VGbG93SW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgcGFyYW1ldGVyczogQ2FwYWJpbGl0eVBhcmFtZXRlcklucHV0W10sIHJldHVyblR5cGU6IEZ1bmN0aW9uUmV0dXJuVHlwZU5hbWUgfCB7a2luZDogXCJPd25lZFJlc291cmNlVHlwZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlTmFtZX0sIGVmZmVjdHM6IFtcImhvc3RcIl0sIGZhaWx1cmVzOiAoc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQpW10sIHJlc291cmNlRmxvdzogQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0fX0gQ2FwYWJpbGl0eU9wZXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHJlc291cmNlczogQ2FwYWJpbGl0eU5hbWVkSW5wdXRbXSwgZmFpbHVyZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIG9wZXJhdGlvbnM6IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0W119fSBDYXBhYmlsaXR5QXV0aG9yaXR5TW9kdWxlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e3NjaGVtYTogXCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIiwgc2NoZW1hVmVyc2lvbjogMSwgaWQ6IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdLCBjb250cmFjdFZlcnNpb24/OiBzdHJpbmd9IHwge3NjaGVtYTogXCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIiwgc2NoZW1hVmVyc2lvbjogMiwgaWQ6IHN0cmluZywgbW9kdWxlczogQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0W119fSBDYXBhYmlsaXR5QXV0aG9yaXR5SW5wdXQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0TGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkxpc3RMaXRlcmFsXCJ9IGtpbmQgLSBPcmRlcmVkIGltbXV0YWJsZSBsaXN0IGxpdGVyYWwuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gZWxlbWVudHMgLSBTb3VyY2Utb3JkZXJlZCwgZHVwbGljYXRlLXByZXNlcnZpbmcgZWxlbWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBFbnRyeVxuICogQHByb3BlcnR5IHtcIk1hcEVudHJ5XCJ9IGtpbmQgLSBTb3VyY2Utb3JkZXJlZCBtYXAgaW5pdGlhbGl6ZXIgZW50cnkuXG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IGtleSAtIExpdGVyYWwgbm9ubnVtZXJpYyBzdHJpbmcga2V5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEVudHJ5IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIk1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbDsgZW50cnkgb3JkZXIgaXMgZGlhZ25vc3RpYy1vbmx5LlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlIGluaXRpYWxpemVyIG9yZGVyLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3JkZXJlZE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJPcmRlcmVkTWFwTGl0ZXJhbFwifSBraW5kIC0gSW1tdXRhYmxlIG1hcCBsaXRlcmFsIHdpdGggb2JzZXJ2YWJsZSBmaXJzdC1pbnNlcnRpb24gb3JkZXIuXG4gKiBAcHJvcGVydHkge01hcEVudHJ5W119IGVudHJpZXMgLSBTb3VyY2Utb3JkZXJlZCB1bmlxdWUgZW50cmllcy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgb3JkZXJlZCBjb25zdHJ1Y3Rpb24gYm91bmRhcnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdEluZGV4RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkxpc3RJbmRleEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHplcm8tYmFzZWQgbGlzdCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbmRleCAtIEludGVnZXIgaW5kZXguXG4gKiBAcHJvcGVydHkge1wicHJvdmVuXCIgfCBcImZhaWwtb24tYWJzZW5jZVwifSB0b3RhbGl0eSAtIEFkbWlzc2lvbiBiYXNpczsgbmV2ZXIgb3B0aW9uYWwuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBMb29rdXBFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWFwTG9va3VwRXhwcmVzc2lvblwifSBraW5kIC0gVG90YWwgc3RyaW5nLWtleSBtYXAgbG9va3VwLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTWFwLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0ga2V5IC0gU3RyaW5nIGtleSBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCJ9IGtpbmQgLSBGaW5pdGUgY29sbGVjdGlvbiBzaXplLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdC0gb3IgbWFwLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7XCJsaXN0XCIgfCBcIm1hcFwifSBbY29sbGVjdGlvbktpbmRdIC0gVmFsaWRhdGVkIHJlY2VpdmVyIGtpbmQgZm9yIHRhcmdldCBzcGVsbGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElkZW50aWZpZXJFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiSWRlbnRpZmllckV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUmVmZXJlbmNlZCBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW50ZWdlckxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJJbnRlZ2VyTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZhbHVlIC0gSmF2YVNjcmlwdC1zYWZlIGludGVnZXIgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb29sZWFuTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkJvb2xlYW5MaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZhbHVlIC0gQm9vbGVhbiB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0cmluZ0xpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJTdHJpbmdMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBVbmljb2RlIHN0cmluZyB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsTm9uZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsTm9uZVwifSBraW5kIC0gQ29udGV4dHVhbGx5IHR5cGVkIGFic2VuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFNvbWVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFNvbWVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbnQgb3B0aW9uYWwgdmFsdWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHZhbHVlIC0gRXhhY3Qgbm9uLW9wdGlvbmFsIHByZXNlbnQgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbElzUHJlc2VudFxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsSXNQcmVzZW50XCJ9IGtpbmQgLSBQcmVzZW5jZSB0ZXN0IGZvciBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBvcGVyYW5kIC0gVGVzdGVkIG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFVud3JhcFxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsVW53cmFwXCJ9IGtpbmQgLSBHdWFyZGVkIHVud3JhcCBvZiBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBvcGVyYW5kIC0gUHJvdmVuLXByZXNlbnQgb3B0aW9uYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFVuYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIlVuYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBvcGVyYW5kIC0gT3BlcmFuZCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQmluYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkJpbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNCaW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGxlZnQgLSBMZWZ0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJpZ2h0IC0gUmlnaHQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbmRpdGlvbmFsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25kaXRpb24gLSBTdHJpY3QgYm9vbGVhbiB0ZXN0IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbnNlcXVlbnQgLSBBcm0gZXZhbHVhdGVkIHdoZW4gdGhlIHRlc3QgaXMgdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gYWx0ZXJuYXRlIC0gQXJtIGV2YWx1YXRlZCB3aGVuIHRoZSB0ZXN0IGlzIGZhbHNlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gSm9pbmVkIGFybSByZXN1bHQgdHlwZSBhc3NpZ25lZCBieSB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhbGxlZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gUG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkRnVuY3Rpb25TaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIERldGVybWluaXN0aWMgZGVjbGFyYXRpb24gYW5kIHNpZ25hdHVyZSBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIHJlc29sdmVkIGZ1bmN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoaXMgY2FsbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIEV4YWN0IGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkTWV0aG9kU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgcmVzb2x2ZWQgbWV0aG9kIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3QgbWV0aG9kIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHt7a2luZDogXCJwcmVzZXJ2ZVwiIHwgXCJ0ZXJtaW5hbFwiLCB0ZXJtaW5hbEZhaWx1cmVJZD86IHN0cmluZ319IFtyZXNvdXJjZUZsb3ddIC0gT3duZWQgcmVjZWl2ZXIgdHJhbnNpdGlvbiBhbmQgZGVjbGFyZWQgdGVybWluYWwtdXNlIGZhaWx1cmUgd2hlbiBhcHBsaWNhYmxlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjZWl2ZXJFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiUmVjZWl2ZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBUaGUgZGVjbGFyaW5nIGNsYXNzIGluc3RhbmNlIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzSWQgLSBTdGFibGUgZGVjbGFyaW5nIGNsYXNzIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgcmVjZWl2ZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByZWNlaXZlciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZmVyZW5jZUNvbnN0cnVjdGlvblxuICogQHByb3BlcnR5IHtcIlJlZmVyZW5jZUNvbnN0cnVjdGlvblwifSBraW5kIC0gRnJlc2ggbm9taW5hbCByZWZlcmVuY2UgY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtSZWZlcmVuY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSByZWZlcmVuY2UgLSBFeGFjdCBjbGFzcyB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRXhhY3QgY29uc3RydWN0b3IgYmluZGluZywgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZWZmZWN0U2l0ZUlkXSAtIERldGVybWluaXN0aWMgc2l0ZSBpZGVudGl0eSB3aGVuIGNvbnN0cnVjdGlvbiByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGNsYXNzLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNZXRob2RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1ldGhvZENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBSZXNvbHZlZCByZWNlaXZlci1tZXRob2QgaW52b2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBSZWNlaXZlciBldmFsdWF0ZWQgb25jZSBiZWZvcmUgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZCAtIFN0YWJsZSBtZXRob2QgaWRlbnRpdHkgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkTWV0aG9kU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBtZXRob2QgYmluZGluZywgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZWZmZWN0U2l0ZUlkXSAtIERldGVybWluaXN0aWMgc2l0ZSBpZGVudGl0eSB3aGVuIHRoZSBtZXRob2QgcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY2FsbCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkUmVhZFxuICogQHByb3BlcnR5IHtcIlByaXZhdGVGaWVsZFJlYWRcIn0ga2luZCAtIERlY2xhcmluZy1yZWNlaXZlci1vbmx5IHByaXZhdGUgZmllbGQgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByZWFkIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZmllbGQtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZENvbnN0cnVjdGlvblxuICogQHByb3BlcnR5IHtcIlJlY29yZENvbnN0cnVjdGlvblwifSBraW5kIC0gTm9taW5hbCByZWNvcmQgY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtSZWNvcmRUeXBlfSByZWNvcmQgLSBSZXNvbHZlZCByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gQ29tcGxldGUgZmllbGQtb3JkZXJlZCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByZWNvcmQtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1lbWJlclJlYWRcbiAqIEBwcm9wZXJ0eSB7XCJNZW1iZXJSZWFkXCJ9IGtpbmQgLSBOb21pbmFsIGltbXV0YWJsZSByZWNvcmQtZmllbGQgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBSZWNvcmQtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHJlc29sdmVkIGZpZWxkIGlkZW50aXR5IGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1lbWJlci1yZWFkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1lbWJlci1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JNZXNzYWdlUmVhZFxuICogQHByb3BlcnR5IHtcIkVycm9yTWVzc2FnZVJlYWRcIn0ga2luZCAtIFRoZSBzb2xlIHBvcnRhYmxlIGVycm9yIG1lbWJlciBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIENhdGNoIGJpbmRpbmcgd2hvc2UgaW1tdXRhYmxlIG1lc3NhZ2UgaXMgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVzc2FnZS1yZWFkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1lc3NhZ2UtbWVtYmVyIHJhbmdlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7SWRlbnRpZmllckV4cHJlc3Npb24gfCBSZWNlaXZlckV4cHJlc3Npb24gfCBJbnRlZ2VyTGl0ZXJhbCB8IEJvb2xlYW5MaXRlcmFsIHwgU3RyaW5nTGl0ZXJhbCB8IE9wdGlvbmFsTm9uZSB8IE9wdGlvbmFsU29tZSB8IE9wdGlvbmFsSXNQcmVzZW50IHwgT3B0aW9uYWxVbndyYXAgfCBMaXN0TGl0ZXJhbCB8IE1hcExpdGVyYWwgfCBPcmRlcmVkTWFwTGl0ZXJhbCB8IExpc3RJbmRleEV4cHJlc3Npb24gfCBNYXBMb29rdXBFeHByZXNzaW9uIHwgQ29sbGVjdGlvblNpemVFeHByZXNzaW9uIHwgVW5hcnlFeHByZXNzaW9uIHwgQmluYXJ5RXhwcmVzc2lvbiB8IENvbmRpdGlvbmFsRXhwcmVzc2lvbiB8IENhbGxFeHByZXNzaW9uIHwgRWZmZWN0Q2FsbEV4cHJlc3Npb24gfCBPd25lZE1vdmVFeHByZXNzaW9uIHwgT3duZWRCb3Jyb3dFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBSZWZlcmVuY2VDb25zdHJ1Y3Rpb24gfCBSZWNvcmRDb25zdHJ1Y3Rpb24gfCBNZW1iZXJSZWFkIHwgUHJpdmF0ZUZpZWxkUmVhZCB8IEVycm9yTWVzc2FnZVJlYWR9IEV4cHJlc3Npb24gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMb2NhbERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTG9jYWxEZWNsYXJhdGlvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBEZWNsYXJlZCBsb2NhbCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4cGxpY2l0IGxvY2FsIHR5cGUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG11dGFibGUgLSBXaGV0aGVyIGxhdGVyIGFzc2lnbm1lbnQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5pdGlhbGl6ZXIgLSBSZXF1aXJlZCBpbml0aWFsaXplciBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBEZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQXNzaWdubWVudFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHRhcmdldCAtIFNpbXBsZSBsb2NhbCBhc3NpZ25tZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEFzc2lnbmVkIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFzc2lnbm1lbnQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIn0ga2luZCAtIERlY2xhcmluZy1yZWNlaXZlci1vbmx5IHByaXZhdGUgZmllbGQgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge1JlY2VpdmVyRXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBFeGFjdCBkZWNsYXJpbmcgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcHJpdmF0ZSBmaWVsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE5ldyBmaWVsZCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmV0dXJuU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmV0dXJuU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IFtleHByZXNzaW9uXSAtIFJldHVybmVkIGV4cHJlc3Npb247IGFic2VudCBleGFjdGx5IGZvciBhIGJhcmUgdm9pZCByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFeHByZXNzaW9uU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiRXhwcmVzc2lvblN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtDYWxsRXhwcmVzc2lvbiB8IE1ldGhvZENhbGxFeHByZXNzaW9uIHwgRWZmZWN0Q2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBBIGRpcmVjdCwgcmVjZWl2ZXIsIG9yIGF1dGhvcml6ZWQgY2FsbCB3aG9zZSByZXNvbHZlZCByZXR1cm4gdHlwZSBpcyB2b2lkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSWZTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJJZlN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25kaXRpb24gLSBCcmFuY2ggY29uZGl0aW9uLlxuICogQHByb3BlcnR5IHtCbG9ja30gY29uc2VxdWVudCAtIFRydWUgYnJhbmNoLlxuICogQHByb3BlcnR5IHtCbG9ja30gW2FsdGVybmF0ZV0gLSBGYWxzZSBicmFuY2gsIGFic2VudCB3aGVuIGV4ZWN1dGlvbiBmYWxscyB0aHJvdWdoLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVmFsdWVCaW5kaW5nXG4gKiBAcHJvcGVydHkge1wiVmFsdWVCaW5kaW5nXCJ9IGtpbmQgLSBJdGVyYXRpb24tYmluZGluZyBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBCb2R5LWxvY2FsIGJpbmRpbmcgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBsaXN0IGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IG11dGFibGUgLSBJdGVyYXRpb24gYmluZGluZ3MgYXJlIGFsd2F5cyBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZvckVhY2hTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJGb3JFYWNoU3RhdGVtZW50XCJ9IGtpbmQgLSBPcmRlcmVkIGxpc3QtaXRlcmF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGxpc3QgLSBMaXN0IGV4cHJlc3Npb24gZXZhbHVhdGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdHJhdmVyc2FsLlxuICogQHByb3BlcnR5IHtWYWx1ZUJpbmRpbmd9IHZhbHVlQmluZGluZyAtIEltbXV0YWJsZSBiaW5kaW5nIHNjb3BlZCB0byB0aGUgYm9keS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBMb29wIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGxvb3Agc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZvckVhY2hNYXBTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJGb3JFYWNoTWFwU3RhdGVtZW50XCJ9IGtpbmQgLSBJbnNlcnRpb24tb3JkZXJlZCBtYXAgcGFpci1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbWFwIC0gT3JkZXJlZC1tYXAgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30ga2V5QmluZGluZyAtIEltbXV0YWJsZSBzdHJpbmcta2V5IGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtWYWx1ZUJpbmRpbmd9IHZhbHVlQmluZGluZyAtIEltbXV0YWJsZSBob21vZ2VuZW91cyB2YWx1ZSBiaW5kaW5nIHNjb3BlZCB0byB0aGUgYm9keS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBMb29wIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGxvb3Agc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFdoaWxlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiV2hpbGVTdGF0ZW1lbnRcIn0ga2luZCAtIFN0cmljdC1Cb29sZWFuIHByZS1jb25kaXRpb24gbG9vcCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25kaXRpb24gLSBCb29sZWFuIGV4cHJlc3Npb24gZXZhbHVhdGVkIGJlZm9yZSBldmVyeSBpdGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gT3JkZXJlZCBsb29wIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGxvb3Agc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJyZWFrU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQnJlYWtTdGF0ZW1lbnRcIn0ga2luZCAtIE5lYXJlc3QtbG9vcCBicmVhayBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRMb29wSWRdIC0gUmVzb2x2ZWQgbmVhcmVzdC1sb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uIGluIGxvb3AgY29udGV4dC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gS2V5d29yZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29udGludWVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJDb250aW51ZVN0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGNvbnRpbnVlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvckNvbnN0cnVjdGlvblxuICogQHByb3BlcnR5IHtcIkVycm9yQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBDb25zdHJ1Y3Rpb24gb2Ygb25lIGRlY2xhcmVkIHVuY2hlY2tlZCBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JUeXBlfSBlcnJvciAtIEV4YWN0IG5vbWluYWwgZXJyb3IgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbWVzc2FnZSAtIFNvbGUgaW1tdXRhYmxlIHN0cmluZyBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3Rpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZSBhbmQgbWVzc2FnZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSYWlzZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJhaXNlU3RhdGVtZW50XCJ9IGtpbmQgLSBBYnJ1cHQgdW5jaGVja2VkLWVycm9yIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtFcnJvckNvbnN0cnVjdGlvbn0gZXJyb3IgLSBFeGFjdCBjb25zdHJ1Y3RlZCBzZW1hbnRpYyBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgcmFpc2Ugc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgcmFpc2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXRocm93U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmV0aHJvd1N0YXRlbWVudFwifSBraW5kIC0gUmUtcHJvcGFnYXRpb24gb2YgdGhlIGV4YWN0IGNhdWdodCBiaW5kaW5nIGluIHNjb3BlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJpbmRpbmcgLSBOYW1lIG9mIHRoZSBsZXhpY2FsbHkgdmlzaWJsZSBpbW11dGFibGUgY2F0Y2ggYmluZGluZyBiZWluZyByZS1yYWlzZWQuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gYmluZGluZ05vZGUgLSBFeGFjdCBjYXRjaCBiaW5kaW5nIG5vZGUgYmVpbmcgcmUtcmFpc2VkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByZXRocm93IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJldGhyb3cgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXRjaEJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJDYXRjaEJpbmRpbmdcIn0ga2luZCAtIEV4YWN0LWhhbmRsZXIgYmluZGluZyBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBIYW5kbGVyLWxvY2FsIGJpbmRpbmcgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JUeXBlfSB0eXBlIC0gRXhhY3QgY2F1Z2h0IG5vbWluYWwgZXJyb3IgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IG11dGFibGUgLSBDYXRjaCBiaW5kaW5ncyBhcmUgaW1tdXRhYmxlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBCaW5kaW5nIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGJpbmRpbmcgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXRjaEhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7XCJDYXRjaEhhbmRsZXJcIn0ga2luZCAtIE9uZSBleGFjdCBub21pbmFsIGhhbmRsZXIgd2l0aGluIGFuIG9yZGVyZWQgaGFuZGxlciBsaXN0LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgaGFuZGxlciBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjYXRjaCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUcnlTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJUcnlTdGF0ZW1lbnRcIn0ga2luZCAtIE9uZSBib2R5LCBhbiBvcmRlcmVkIGxpc3Qgb2YgZXhhY3QgdHlwZWQgaGFuZGxlcnMsIGFuZCBhbiBvcHRpb25hbCBjb21wbGV0aW9uIGJsb2NrLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtDYXRjaEhhbmRsZXJbXX0gaGFuZGxlcnMgLSBPcmRlcmVkIGV4YWN0IGhhbmRsZXJzLCBldmFsdWF0ZWQgdG9wIHRvIGJvdHRvbSB3aXRoIGV4YWN0IG5vbWluYWwgbWF0Y2hpbmcuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbZmluYWxseUJvZHldIC0gQ29tcGxldGlvbiBibG9jayBleGVjdXRlZCBvbiBldmVyeSBub3JtYWwgYW5kIGFicnVwdCBjb21wbGV0aW9uIG9mIHRoZSB0cnkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHRyeS9oYW5kbGVyIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHRyeS9jYXRjaC9maW5hbGx5IHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgUmV0aHJvd1N0YXRlbWVudCB8IFRyeVN0YXRlbWVudH0gU3RhdGVtZW50ICovXG5cbi8qKlxuICogQHR5cGVkZWYgQmxvY2tcbiAqIEBwcm9wZXJ0eSB7XCJCbG9ja1wifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTdGF0ZW1lbnRbXX0gc3RhdGVtZW50cyAtIE9yZGVyZWQgc3RhdGVtZW50cyBpbiBvbmUgbGV4aWNhbCBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJGdW5jdGlvbkRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRnVuY3Rpb24gcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBSZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBGdW5jdGlvbiBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkRmllbGRcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRGaWVsZFwifSBraW5kIC0gQ2xvc2VkIHJlY29yZC1maWVsZCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBGaWVsZCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGZpZWxkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEZpZWxkIGRlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG5hbWUvdHlwZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmREZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIlJlY29yZERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIGNsb3NlZCBpbW11dGFibGUgcmVjb3JkIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBSZWNvcmQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gT3JkZXJlZCBkZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtSZWNvcmRGaWVsZFtdfSBmaWVsZHMgLSBPcmRlcmVkIHVuaXF1ZSB2aXNpYmxlIGZpZWxkcy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaXZhdGVGaWVsZFxuICogQHByb3BlcnR5IHtcIlByaXZhdGVGaWVsZFwifSBraW5kIC0gRGVjbGFyaW5nLWNsYXNzLXByaXZhdGUgbXV0YWJsZSBpbnN0YW5jZSBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBmaWVsZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgZmllbGQgbmFtZSBpbnNpZGUgdGhlIGRlY2xhcmluZyBjbGFzcyBvbmx5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGZpZWxkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEZpZWxkIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbnN0cnVjdG9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBFeGFjdCBjb21wbGV0ZSBwcml2YXRlLXN0YXRlIGluaXRpYWxpemVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGNvbnN0cnVjdG9yIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgY29uc3RydWN0b3Igc2lnbmF0dXJlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZpZWxkLW9yZGVyIGluaXRpYWxpemF0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdG9yIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY29uc3RydWN0b3IgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNZXRob2REZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIk1ldGhvZERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBSZWNlaXZlci1ib3VuZCBjbGFzcyBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgbWV0aG9kIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBtZXRob2QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBFeGFjdCBwb3NpdGlvbmFsIG1ldGhvZCBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gRXhhY3QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gTWV0aG9kIGJvZHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHt7aW50ZXJmYWNlSWQ6IHN0cmluZywgbWV0aG9kSWQ6IHN0cmluZ319IFtpbXBsZW1lbnRzXSAtIEV4YWN0IHNhdGlzZmllZCBpbnRlcmZhY2UgbWVtYmVyLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uIHdoZW4gdGhlIG1ldGhvZCBzYXRpc2ZpZXMgYW4gaW50ZXJmYWNlIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXRob2QgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXRob2QtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVyZmFjZU1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFNpZ25hdHVyZS1vbmx5IGludGVyZmFjZSBjb250cmFjdCBtZW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBpbnRlcmZhY2Utc2NvcGVkIG1ldGhvZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgbWV0aG9kIG5hbWUuXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCByZXF1aXJlZCBwYXJhbWV0ZXJzIHdpdGggZXhwbGljaXQgdHlwZXMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gRXhhY3QgdmFsdWUgb3Igdm9pZCByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGludGVyZmFjZSBtZXRob2QgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXRob2QtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVyZmFjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiSW50ZXJmYWNlRGVjbGFyYXRpb25cIn0ga2luZCAtIENsb3NlZCBzaWduYXR1cmUtb25seSBub21pbmFsIGludGVyZmFjZSB3aXRoIGV4YWN0IGltcGxlbWVudGF0aW9uIGNvbnRyYWN0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBpbnRlcmZhY2UgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIGludGVyZmFjZSBuYW1lLlxuICogQHByb3BlcnR5IHtJbnRlcmZhY2VUeXBlW119IFtleHRlbmRzXSAtIERpcmVjdCBpbnRlcmZhY2UgcGFyZW50cyBpbiBzb3VyY2Ugb3JkZXI7IG9taXR0ZWQgd2hlbiBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7SW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb25bXX0gbWV0aG9kcyAtIE9yZGVyZWQgY2xvc2VkIHNpZ25hdHVyZSBzZXQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGludGVyZmFjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGludGVyZmFjZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge0ludGVyZmFjZVR5cGVbXX0gW2ltcGxlbWVudHNdIC0gRGlyZWN0IGludGVyZmFjZSBjb250cmFjdHMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0ludGVyZmFjZURlY2xhcmF0aW9uW119IFtpbnRlcmZhY2VzXSAtIFRvcC1sZXZlbCBub21pbmFsIGludGVyZmFjZSBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7SW50ZXJmYWNlRGVjbGFyYXRpb25bXX0gW2ludGVyZmFjZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgRXJyb3JEZWNsYXJhdGlvbiB8IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbiB8IEVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb24gfCBFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvbiB8IFJlY29yZEZpZWxkIHwgUHJpdmF0ZUZpZWxkIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IFR5cGVQYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgfCBWYWx1ZUJpbmRpbmcgfCBDYXRjaEJpbmRpbmcgfCBDYXRjaEhhbmRsZXIgfCBCbG9jayB8IFN0YXRlbWVudCB8IEVudHJ5UG9pbnQgfCBFeHByZXNzaW9uIHwgRXJyb3JDb25zdHJ1Y3Rpb24gfCBFcnJvclR5cGUgfCBNYXBFbnRyeSB8IFNlbWFudGljVmFsdWVUeXBlIHwgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpY05vZGUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNOb2RlfSBTZW1hbnRpY05vZGVXaXRob3V0TG9jYXRpb25zICovXG5cbmV4cG9ydCB7fVxuIl19