semantifold 0.4.0 → 0.5.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.
- package/README.md +5 -2
- package/build/index.d.ts +12 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -7
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1274 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +7 -1
- package/build/src/backends/kotlin.d.ts +10 -0
- package/build/src/backends/kotlin.d.ts.map +1 -1
- package/build/src/backends/kotlin.js +11 -9
- package/build/src/backends/program.d.ts +6 -4
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +5 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +17 -1
- package/build/src/backends/writer.d.ts +21 -1
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +25 -2
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +11 -1
- package/build/src/semantic/types.d.ts +182 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +44 -2
- package/docs/android.md +79 -0
- package/docs/architecture.md +2 -0
- package/docs/ios.md +1 -1
- package/docs/language-support.md +8 -1
- package/docs/source-maps.md +2 -0
- package/docs/specification.md +5 -0
- package/docs/testing.md +15 -0
- package/index.js +9 -6
- package/package.json +1 -1
- package/src/backends/android.js +1370 -0
- package/src/backends/identifiers.js +6 -0
- package/src/backends/kotlin.js +11 -8
- package/src/backends/program.js +4 -3
- package/src/backends/shared.js +19 -0
- package/src/backends/writer.js +27 -2
- package/src/language-registry.js +10 -0
- package/src/semantic/types.js +46 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
/** @typedef {"php" | "ruby" | "javascript" | "typescript" | "java" | "kotlin" | "python" | "csharp" | "go" | "c" | "cpp" | "rust" | "swift" | "dart"} SemanticLanguage */
|
|
3
3
|
/** @typedef {SemanticLanguage} TextBackendLanguage */
|
|
4
|
-
/** @typedef {TextBackendLanguage | "wasm" | "ios"} BackendLanguage */
|
|
4
|
+
/** @typedef {TextBackendLanguage | "wasm" | "ios" | "android"} BackendLanguage */
|
|
5
5
|
/** @typedef {SemanticLanguage | "html"} GeneratedTextLanguage */
|
|
6
6
|
/** @typedef {"integer" | "boolean" | "string"} SemanticTypeName */
|
|
7
7
|
/** @typedef {SemanticTypeName | "void"} FunctionReturnTypeName */
|
|
@@ -53,6 +53,48 @@
|
|
|
53
53
|
* @property {string} mediaType - Explicit artifact media type.
|
|
54
54
|
* @property {string} sha256 - Lowercase SHA-256 of exact UTF-8 text or bytes.
|
|
55
55
|
*/
|
|
56
|
+
/**
|
|
57
|
+
* @typedef AndroidApplicationConfigurationInput
|
|
58
|
+
* @property {string} [applicationId] - Lowercase reverse-DNS Android application identity.
|
|
59
|
+
* @property {string} [namespace] - Kotlin/Android namespace; defaults to applicationId.
|
|
60
|
+
* @property {string} [packageName] - Generated Kotlin package; defaults to namespace.
|
|
61
|
+
* @property {string} [activityClassName] - Launcher Activity class name.
|
|
62
|
+
* @property {string} [productName] - Deterministic project product name.
|
|
63
|
+
* @property {string} [displayName] - User-visible application label.
|
|
64
|
+
* @property {23} [minimumSdk] - Qualified minimum Android API.
|
|
65
|
+
* @property {35} [targetSdk] - Qualified target Android API.
|
|
66
|
+
* @property {35} [compileSdk] - Qualified compile Android API.
|
|
67
|
+
* @property {"35.0.0"} [buildToolsVersion] - Qualified Android Build Tools version.
|
|
68
|
+
* @property {number} [versionCode] - Positive Android version code.
|
|
69
|
+
* @property {string} [versionName] - Canonical application version name.
|
|
70
|
+
* @property {"unspecified"} [orientation] - Baseline orientation behavior.
|
|
71
|
+
* @property {"system"} [theme] - Baseline platform-native theme.
|
|
72
|
+
* @property {unknown[]} [permissions] - Validated as the closed empty permission set.
|
|
73
|
+
*/
|
|
74
|
+
/**
|
|
75
|
+
* @typedef AndroidApplicationConfiguration
|
|
76
|
+
* @property {string} applicationId - Validated Android application identity.
|
|
77
|
+
* @property {string} namespace - Validated Android namespace.
|
|
78
|
+
* @property {string} packageName - Generated Kotlin package.
|
|
79
|
+
* @property {string} activityClassName - Launcher Activity class name.
|
|
80
|
+
* @property {string} productName - Project product name.
|
|
81
|
+
* @property {string} displayName - User-visible application label.
|
|
82
|
+
* @property {23} minimumSdk - Qualified minimum Android API.
|
|
83
|
+
* @property {35} targetSdk - Qualified target Android API.
|
|
84
|
+
* @property {35} compileSdk - Qualified compile Android API.
|
|
85
|
+
* @property {"35.0.0"} buildToolsVersion - Qualified Android Build Tools version.
|
|
86
|
+
* @property {number} versionCode - Positive Android version code.
|
|
87
|
+
* @property {string} versionName - Canonical application version name.
|
|
88
|
+
* @property {"unspecified"} orientation - Baseline orientation behavior.
|
|
89
|
+
* @property {"system"} theme - Platform-native theme.
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* @typedef AndroidApplicationInputFile
|
|
93
|
+
* @property {string} path - Safe path relative to the selected fixed Android resource or asset root.
|
|
94
|
+
* @property {string | Uint8Array} content - Exact caller-provided text or bytes.
|
|
95
|
+
* @property {string} mediaType - Explicit artifact media type.
|
|
96
|
+
* @property {string} sha256 - Lowercase SHA-256 of exact UTF-8 text or bytes.
|
|
97
|
+
*/
|
|
56
98
|
/**
|
|
57
99
|
* @typedef LanguageRoleCapabilities
|
|
58
100
|
* @property {boolean} frontend - Parser adapter availability.
|
|
@@ -1057,4 +1099,4 @@
|
|
|
1057
1099
|
/** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
|
|
1058
1100
|
/** @typedef {SemanticNode} SemanticNodeWithoutLocations */
|
|
1059
1101
|
export {};
|
|
1060
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLDBLQUEwSztBQUMxSyxzREFBc0Q7QUFDdEQsc0VBQXNFO0FBQ3RFLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCwrRUFBK0U7QUFFL0U7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCw4REFBOEQ7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCxrSEFBa0g7QUFFbEg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVILG9NQUFvTTtBQUNwTSxtRUFBbUU7QUFFbkU7Ozs7O0dBS0c7QUFFSCw0RkFBNEY7QUFFNUYsOG9CQUE4b0I7QUFDOW9CLDBFQUEwRTtBQUUxRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7OztHQUlHO0FBRUgsMktBQTJLO0FBRTNLOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCxvRkFBb0Y7QUFDcEYsNk5BQTZOO0FBQzdOLHFEQUFxRDtBQUNyRCw0UEFBNFA7QUFDNVAsMllBQTJZO0FBQzNZLHdLQUF3SztBQUN4Syx3SUFBd0k7QUFDeEksK1NBQStTO0FBRS9TOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUgsbWlCQUFtaUI7QUFFbmlCOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCx1RUFBdUU7QUFDdkUsNlFBQTZRO0FBRTdROzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCx3akJBQXdqQjtBQUN4akIsMkRBQTJEO0FBRTNELE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwiamF2YVwiIHwgXCJrb3RsaW5cIiB8IFwicHl0aG9uXCIgfCBcImNzaGFycFwiIHwgXCJnb1wiIHwgXCJjXCIgfCBcImNwcFwiIHwgXCJydXN0XCIgfCBcInN3aWZ0XCIgfCBcImRhcnRcIn0gU2VtYW50aWNMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY0xhbmd1YWdlfSBUZXh0QmFja2VuZExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1RleHRCYWNrZW5kTGFuZ3VhZ2UgfCBcIndhc21cIiB8IFwiaW9zXCJ9IEJhY2tlbmRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY0xhbmd1YWdlIHwgXCJodG1sXCJ9IEdlbmVyYXRlZFRleHRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImludGVnZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJzdHJpbmdcIn0gU2VtYW50aWNUeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwgXCJ2b2lkXCJ9IEZ1bmN0aW9uUmV0dXJuVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyTmVnYXRlXCIgfCBcIkJvb2xlYW5Ob3RcIn0gU2VtYW50aWNVbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJBZGRcIiB8IFwiSW50ZWdlclN1YnRyYWN0XCIgfCBcIkludGVnZXJNdWx0aXBseVwiIHwgXCJCb29sZWFuQW5kXCIgfCBcIkJvb2xlYW5PclwiIHwgXCJJbnRlZ2VyRXF1YWxcIiB8IFwiSW50ZWdlck5vdEVxdWFsXCIgfCBcIkJvb2xlYW5FcXVhbFwiIHwgXCJCb29sZWFuTm90RXF1YWxcIiB8IFwiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIiB8IFwiSW50ZWdlckxlc3NUaGFuXCIgfCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIiB8IFwiU3RyaW5nQ29uY2F0XCJ9IFNlbWFudGljQmluYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiY2FwYWJpbGl0eVwiIHwgXCJyZXNvdXJjZVwiIHwgXCJmYWlsdXJlXCIgfCBcIm9wZXJhdGlvblwiIHwgXCJyZWNvcmRcIiB8IFwiY2xhc3NcIiB8IFwiZXJyb3JcIiB8IFwiZmllbGRcIiB8IFwiY29uc3RydWN0b3JcIiB8IFwibWV0aG9kXCIgfCBcImZ1bmN0aW9uXCIgfCBcInR5cGVQYXJhbWV0ZXJcIiB8IFwicGFyYW1ldGVyXCIgfCBcImxvY2FsXCIgfCBcIml0ZXJhdGlvblwiIHwgXCJjYXRjaFwifSBTZW1hbnRpY1N5bWJvbEtpbmQgKi9cbi8qKiBAdHlwZWRlZiB7XCJyZWNvcmRcIiB8IFwiY2xhc3NcIiB8IFwiZXJyb3JcIiB8IFwiZnVuY3Rpb25cIn0gU2VtYW50aWNEZWNsYXJhdGlvbktpbmQgKi9cbi8qKiBAdHlwZWRlZiB7XCJkZWNsYXJhdGlvblwiIHwgXCJ0eXBlXCIgfCBcImNvbnN0cnVjdFwiIHwgXCJtZW1iZXJcIiB8IFwicmVhZFwiIHwgXCJ3cml0ZVwiIHwgXCJjYWxsXCJ9IFNlbWFudGljU3ltYm9sUm9sZSAqL1xuLyoqIEB0eXBlZGVmIHtcInBhcnNlXCIgfCBcImdlbmVyYXRlXCIgfCBcInJlc3RvcmVcIiB8IFwiY29tcGlsZVwiIHwgXCJsaW5rXCIgfCBcInZhbGlkYXRlXCIgfCBcImluc3RhbnRpYXRlXCIgfCBcImV4ZWN1dGVcIn0gQWNjZXB0YW5jZVN0YWdlICovXG4vKiogQHR5cGVkZWYge1wiZW50cnlcIiB8IFwic291cmNlXCIgfCBcIm1hbmlmZXN0XCIgfCBcInN1cHBvcnRcIiB8IFwibWFwcGluZ1wiIHwgXCJyZXNvdXJjZVwiIHwgXCJsb2FkZXJcIn0gR2VuZXJhdGVkQXJ0aWZhY3RSb2xlICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFNhZmUgWGNvZGUgcHJvZHVjdC9wYXRoIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBTYWZlIFN3aWZ0IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb25QcmVmaXggLSBDYWxsZXItc3VwcGxpZWQgcmV2ZXJzZS1ETlMgb3JnYW5pemF0aW9uIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZGVudGlmaWVyIC0gQ2FsbGVyLXN1cHBsaWVkIHJldmVyc2UtRE5TIGFwcGxpY2F0aW9uIGJ1bmRsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXBsb3ltZW50VGFyZ2V0IC0gQ2FsbGVyLXN1cHBsaWVkIG1ham9yLm1pbm9yIGlPUyBkZXBsb3ltZW50IHRhcmdldDsgbmV2ZXIgaW5mZXJyZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJTb3VyY2VzXCJ9IFtzb3VyY2VSb290XSAtIEZpeGVkIGdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJBc3NldHMueGNhc3NldHNcIn0gW3Jlc291cmNlUm9vdF0gLSBGaXhlZCBjYWxsZXItcmVzb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJzd2lmdHVpXCJ9IFtsaWZlY3ljbGVdIC0gU29sZSBzdXBwb3J0ZWQgbGlmZWN5Y2xlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBuZXZlcj59IFtpbmZvUGxpc3RdIC0gQ2xvc2VkIGJhc2VsaW5lIGNhbGxlciBwbGlzdCBleHRlbnNpb247IGN1cnJlbnRseSBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcGVybWlzc2lvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW2VudGl0bGVtZW50c10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBlbnRpdGxlbWVudHMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3ByaXZhY3lEZWNsYXJhdGlvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgcHJpdmFjeSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW2NhcGFiaWxpdGllc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBBcHBsZSBjYXBhYmlsaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFZhbGlkYXRlZCBYY29kZSBwcm9kdWN0L3BhdGggaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlTmFtZSAtIFZhbGlkYXRlZCBTd2lmdCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uUHJlZml4IC0gVmFsaWRhdGVkIHJldmVyc2UtRE5TIG9yZ2FuaXphdGlvbiBwcmVmaXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWRlbnRpZmllciAtIFZhbGlkYXRlZCByZXZlcnNlLUROUyBhcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVwbG95bWVudFRhcmdldCAtIFZhbGlkYXRlZCBjYWxsZXItc3VwcGxpZWQgZGVwbG95bWVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBWYWxpZGF0ZWQgZGlzcGxheSBuYW1lLlxuICogQHByb3BlcnR5IHtcIlNvdXJjZXNcIn0gc291cmNlUm9vdCAtIEdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJBc3NldHMueGNhc3NldHNcIn0gcmVzb3VyY2VSb290IC0gQ2FsbGVyLXJlc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wic3dpZnR1aVwifSBsaWZlY3ljbGUgLSBTb2xlIHN1cHBvcnRlZCBsaWZlY3ljbGUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG5ldmVyPj59IGluZm9QbGlzdCAtIEVtcHR5IGNhbGxlciBwbGlzdCBleHRlbnNpb24uXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IHBlcm1pc3Npb25zIC0gRW1wdHkgYmFzZWxpbmUgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IGVudGl0bGVtZW50cyAtIEVtcHR5IGJhc2VsaW5lIGVudGl0bGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gcHJpdmFjeURlY2xhcmF0aW9ucyAtIEVtcHR5IGJhc2VsaW5lIHByaXZhY3kgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBjYXBhYmlsaXRpZXMgLSBFbXB0eSBiYXNlbGluZSBBcHBsZSBjYXBhYmlsaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkFzc2V0SW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gRnVsbCBzYWZlIGRlc3RpbmF0aW9uIGJlbG93IEFzc2V0cy54Y2Fzc2V0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIEV4YWN0IGNhbGxlci1wcm92aWRlZCB0ZXh0IG9yIGJ5dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEV4cGxpY2l0IGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2hhMjU2IC0gTG93ZXJjYXNlIFNIQS0yNTYgb2YgZXhhY3QgVVRGLTggdGV4dCBvciBieXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUm9sZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBmcm9udGVuZCAtIFBhcnNlciBhZGFwdGVyIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGV4dEJhY2tlbmQgLSBTaW5nbGUtIG9yIG11bHRpLWZpbGUgdGV4dCBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluYXJ5QmFja2VuZCAtIEJpbmFyeSBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXBwbGljYXRpb25CYWNrZW5kIC0gQXBwbGljYXRpb24tYXJ0aWZhY3QgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGludGVyb3BlcmFiaWxpdHkgLSBJbnRlcm9wZXJhYmlsaXR5IGJyaWRnZSBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByb3ZpZGVyIC0gVGFyZ2V0IGhvc3Qgc3RkbGliIHByb3ZpZGVyL25hdGl2ZS1iaW5kaW5nIGF2YWlsYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSByaWNoVGV4dCAtIEF1dGhvcml0YXRpdmUgcmljaCB0ZXh0IG1hcHBpbmdzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzb3VyY2VNYXBWMyAtIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluYXJ5UmFuZ2VzIC0gQnl0ZS1jb29yZGluYXRlIGJpbmFyeS9yZXNvdXJjZSBtYXBwaW5ncy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtyZWFkb25seSBBY2NlcHRhbmNlU3RhZ2VbXX0gc3RhZ2VzIC0gQXBwbGljYWJsZSBvcmRlcmVkIGFjY2VwdGFuY2Ugc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdG9vbGNoYWlucyAtIFJlcXVpcmVkIGNhbm9uaWNhbCB0b29sY2hhaW4gSURzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxscyAtIFRhc2sgMDA1IGFyYml0cmFyeSByZXF1aXJlZCBzaWduYXR1cmVzLCByZXNvbHZlZCBkaXJlY3QgY2FsbHMsIGFuZCB2b2lkIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW1tdXRhYmxlQ29sbGVjdGlvbnMgLSBUYXNrIDAwNiByZWN1cnNpdmUgaW1tdXRhYmxlIGxpc3RzL21hcHMsIHRvdGFsIGFjY2VzcywgYW5kIHNpemUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wdGlvbmFsVmFsdWVzIC0gVGFzayAwMDcgZXhwbGljaXQgb3B0aW9uYWwgdmFsdWVzLCBwcmVzZW5jZSB0ZXN0cywgYW5kIGd1YXJkZWQgdW53cmFwLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcmRlcmVkTGlzdEl0ZXJhdGlvbiAtIFRhc2sgMDA4IG9yZGVyZWQgaW1tdXRhYmxlLWxpc3QgaXRlcmF0aW9uIGFuZCBuZWFyZXN0LWxvb3AgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3JkZXJlZE1hcEl0ZXJhdGlvbiAtIFRhc2sgMDE0IGluc2VydGlvbi1vcmRlcmVkIGltbXV0YWJsZS1tYXAgcGFpciBpdGVyYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wcyAtIFRhc2sgMDMyIHN0cmljdC1Cb29sZWFuIHByZS1jb25kaXRpb24gbG9vcHMgYW5kIHJlc29sdmVkIGNvbnRyb2wuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNsb3NlZFJlY29yZHMgLSBUYXNrIDAwOSBub21pbmFsIGNsb3NlZCBpbW11dGFibGUgcmVjb3JkcywgY29uc3RydWN0aW9uLCBhbmQgbWVtYmVyIHJlYWRzLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlZEVycm9ycyAtIFRhc2sgMDExIG5vbWluYWwgdW5jaGVja2VkIGVycm9ycywgcmFpc2VzLCBhbmQgZXhhY3QgdHlwZWQgY2F0Y2hlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljcyAtIFRhc2sgMDEyIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXJzIGFuZCBjbG9zZWQgZ2VuZXJpYyBhcHBsaWNhdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlZmVyZW5jZUNsYXNzZXMgLSBUYXNrIDAzMyBub21pbmFsIHJlZmVyZW5jZSBjbGFzc2VzLCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLCBleGFjdCBjb25zdHJ1Y3RvcnMsIGFuZCByZWNlaXZlciBtZXRob2RzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXMgLSBUYXNrIDAzNCBhdXRob3JpemVkIGhvc3QgZWZmZWN0cywgdHlwZWQgZmFpbHVyZXMsIGFuZCBvd25lZCByZXNvdXJjZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU3RhYmxlIHJlZ2lzdHJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXM+fSByb2xlcyAtIEluZGVwZW5kZW50bHkgcmVnaXN0ZXJlZCByb2xlcy5cbiAqIEBwcm9wZXJ0eSB7XCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIn0gYXJ0aWZhY3RNdWx0aXBsaWNpdHkgLSBUYXJnZXQgYXJ0aWZhY3QgbXVsdGlwbGljaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSByb3VuZFRyaXAgLSBXaGV0aGVyIGZyb250ZW5kL2JhY2tlbmQgcm91bmQtdHJpcCBhY2NlcHRhbmNlIGlzIGRlY2xhcmVkLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXM+fSBmZWF0dXJlcyAtIFNlbWFudGljIGZlYXR1cmUgY2FwYWJpbGl0aWVzLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXM+fSBtYXBwaW5nIC0gTWFwcGluZyBmb3Jtcy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzPn0gYWNjZXB0YW5jZSAtIFN0YWdlcyBhbmQgdG9vbGNoYWlucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZVBvaW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gbGluZSAtIE9uZS1iYXNlZCBsaW5lLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbHVtbiAtIE9uZS1iYXNlZCBVVEYtMTYgY29kZS11bml0IGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXQgLSBaZXJvLWJhc2VkIFVURi0xNiBzb3VyY2Ugb2Zmc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlTG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmF0aW5nIGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gc3RhcnQgLSBJbmNsdXNpdmUgc3RhcnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBlbmQgLSBFeGNsdXNpdmUgZW5kLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVnaXN0ZXJlZFNvdXJjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gUmVnaXN0cnktbG9jYWwgZGV0ZXJtaW5pc3RpYyBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hbCBmaWxlbmFtZSwgcHJlc2VydmVkIHZlcmJhdGltLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBjb250ZW50IC0gT3JpZ2luYWwgc291cmNlIGNvbnRlbnQsIHByZXNlcnZlZCB2ZXJiYXRpbSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZSB8IG51bGx9IGxhbmd1YWdlIC0gUGFyc2VyIGxhbmd1YWdlIHdoZW4ga25vd24uXG4gKiBAcHJvcGVydHkge1wiYXBwbGljYXRpb25cIiB8IFwiZmFjYWRlXCJ9IFtvd25lcnNoaXBdIC0gQ2FsbGVyIG9yIGNvbXBpbGVyLW93bmVkIHNvdXJjZSByb2xlIGZvciBzZW1hbnRpYyBwcm9ncmFtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZU9yaWdpblxuICogQHByb3BlcnR5IHtcInNvdXJjZVwifSBraW5kIC0gRGlyZWN0IHNvdXJjZSBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IG9yaWdpbmFsIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVsYXRlZE9yaWdpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJlbGF0ZWQgb3JpZ2luYWwgcmFuZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFJlbGF0aW9uc2hpcCByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGVyaXZlZE9yaWdpblxuICogQHByb3BlcnR5IHtcImRlcml2ZWRcIn0ga2luZCAtIFByb3ZlbmFuY2UgZGVyaXZlZCBmcm9tIG9uZSBvciBtb3JlIG9yaWdpbnMuXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gb3JpZ2lucyAtIE9yZGVyZWQsIG5vbi1lbXB0eSBvcmlnaW5hbCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTeW50aGV0aWNPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFNvdXJjZS1mcmVlIGdlbmVyYXRlZCBvciBzZW1hbnRpYyBzY2FmZm9sZGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWFzb24gLSBTdGFibGUgaHVtYW4tcmVhZGFibGUgcmVhc29uLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gT3JkZXJlZCByZWxhdGVkIHJhbmdlcywgcG9zc2libHkgZW1wdHkuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTb3VyY2VPcmlnaW4gfCBEZXJpdmVkT3JpZ2luIHwgU3ludGhldGljT3JpZ2lufSBTZW1hbnRpY09yaWdpbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEJ5dGVSYW5nZVxuICogQHByb3BlcnR5IHt7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBIYWxmLW9wZW4gZ2VuZXJhdGVkIGJ5dGUgb2Zmc2V0cy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNlbWFudGljIG9yIGV4cGxpY2l0IHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIG9yIGJpbmFyeS1yZWdpb24gcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIEdlbmVyYXRlZCBvZmZzZXRzIGFyZSBieXRlcywgbmV2ZXIgdGV4dCBjb2x1bW5zLlxuICogQHByb3BlcnR5IHt7cGF0aDogc3RyaW5nLCBieXRlTGVuZ3RoOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgYXJ0aWZhY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRlZEJ5dGVSYW5nZVtdfSByYW5nZXMgLSBPcmRlcmVkIG5vbi1vdmVybGFwcGluZyByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBBc3NvY2lhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gQXNzb2NpYXRpb24gdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNvdXJjZSBhc3NvY2lhdGlvbiBpbmRlcGVuZGVudCBvZiB0cmF2ZXJzYWwgcG9zaXRpb24uXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gSlNPTiBQb2ludGVyIGZyb20gdGhlIHNlbWFudGljIG1vZHVsZSByb290LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVbXCJraW5kXCJdIHwgXCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBTZW1hbnRpYyBub2RlIGtpbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlc29sdmVkIGRlY2xhcmVkL3JlZmVyZW5jZWQgc3ltYm9sIGlkZW50aXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub2RlSWQgLSBSZWZlcnJpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSb2xlfSByb2xlIC0gUmVmZXJlbmNlIHJvbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHJlZmVyZW5jZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTZW1hbnRpYyBzeW1ib2wgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xLaW5kfSBraW5kIC0gU3ltYm9sIGNhdGVnb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uTm9kZUlkIC0gRGVjbGFyaW5nIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbWFudGljRGVjbGFyYXRpb25JZF0gLSBTdGFibGUgc2VtYW50aWMgZGVjbGFyYXRpb24gaWRlbnRpdHkgZm9yIHJlY29yZCwgZmllbGQsIGFuZCBmdW5jdGlvbiBzeW1ib2xzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFJlZmVyZW5jZVtdfSByZWZlcmVuY2VzIC0gT3JkZXJlZCByZXNvbHZlZCByZWZlcmVuY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIFZlcnNpb25lZCBzb3VyY2UgcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gbm9kZXMgLSBEZXRlcm1pbmlzdGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gRGV0ZXJtaW5pc3RpYyBzeW1ib2wgaW5kZXguXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtcImV4YWN0XCIgfCBcImFuY2hvclwiIHwgXCJzeW50aGV0aWNcIn0gTWFwcGluZ0tpbmQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdTcGFuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgaGFsZi1vcGVuIHJhbmdlLlxuICogQHByb3BlcnR5IHtNYXBwaW5nS2luZH0gbWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBvcmlnaW5hbCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBjYW5vbmljYWwgc2VtYW50aWMgbm9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBjYW5vbmljYWwgc2VtYW50aWMgc3ltYm9sLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gVXNlZnVsIHN5bWJvbCBuYW1lIGZvciBTb3VyY2UgTWFwIHYzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZFRleHRMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgdGV4dCBsYW5ndWFnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50IC0gRXhhY3QgZ2VuZXJhdGVkIExGIHNvdXJjZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1xuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTWFwcGluZ1wifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcInV0ZjE2XCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBPZmZzZXQgYW5kIGNvbHVtbiB1bml0LlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRTb3VyY2V9IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBwcm9ncmFtIGlkZW50aXR5IGFuZCBjb250ZW50LlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBPcmlnaW5hbCBzb3VyY2UgcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gbm9kZXMgLSBDYW5vbmljYWwgc2VtYW50aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBDYW5vbmljYWwgc2VtYW50aWMgc3ltYm9sIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IHNwYW5zIC0gT3JkZXJlZCBnZW5lcmF0ZWQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2RlIC0gR2VuZXJhdGVkIG91dHB1dCBwcm9ncmFtLCBpbmNsdWRpbmcgYW55IHJlcXVlc3RlZCBkaXJlY3RpdmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBHZW5lcmF0ZWQgb3V0cHV0IGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByaWNoIG1hcHBpbmcuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IHNvdXJjZU1hcCAtIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VNYXBGaWxlbmFtZSAtIERlZmF1bHQgZXh0ZXJuYWwgU291cmNlIE1hcCBmaWxlbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRleHRBcnRpZmFjdFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJ0ZXh0XCJ9IGtpbmQgLSBSaWNoIHRleHQgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIHJhbmdlIG1hcHBpbmcuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IHNvdXJjZU1hcCAtIEludGVyb3BlcmFibGUgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc291cmNlTWFwRmlsZW5hbWVdIC0gTG9naWNhbCBTb3VyY2UgTWFwIHNpZGVjYXIgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJ5dGVBcnRpZmFjdFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJieXRlc1wifSBraW5kIC0gQnl0ZSBwcm92ZW5hbmNlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkQnl0ZU1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIGJ5dGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wic3ludGhldGljXCJ9IGtpbmQgLSBTeW50aGV0aWMgYXJ0aWZhY3QgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWFzb24gLSBFeHBsaWNpdCB0YXJnZXQtc2NhZmZvbGRpbmcgcmVhc29uLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBSZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gUmVsYXRlZCBzZW1hbnRpYyBzb3VyY2UgcmFuZ2VzLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7VGV4dEFydGlmYWN0UHJvdmVuYW5jZSB8IEJ5dGVBcnRpZmFjdFByb3ZlbmFuY2UgfCBBcnRpZmFjdFN5bnRoZXRpY1Byb3ZlbmFuY2V9IEFydGlmYWN0UHJvdmVuYW5jZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZFNldEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFVuaXF1ZSBzYWZlIHJlbGF0aXZlIFBPU0lYIHBhdGguXG4gKiBAcHJvcGVydHkge1widGV4dFwiIHwgXCJiaW5hcnlcIn0gY29udGVudEtpbmQgLSBDb250ZW50IHJlcHJlc2VudGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gVGV4dCBvciBhIGRldGFjaGVkIGNvcHkgb2YgdGhlIGV4YWN0IGdlbmVyYXRlZCBieXRlcyBvbiBldmVyeSBiaW5hcnkgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBBcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRBcnRpZmFjdFJvbGV9IHJvbGUgLSBBcnRpZmFjdCByb2xlOyBleGFjdGx5IG9uZSBzZXQgYXJ0aWZhY3QgaXMgZW50cnkuXG4gKiBAcHJvcGVydHkge1wiZ2VuZXJhdGVkXCJ9IG93bmVyc2hpcCAtIFRhc2stMDE1IG93bmVyc2hpcCBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7QXJ0aWZhY3RQcm92ZW5hbmNlfSBwcm92ZW5hbmNlIC0gVGV4dCwgYnl0ZS1yYW5nZSwgb3Igc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRBcnRpZmFjdFNldFxuICogQHByb3BlcnR5IHtcIkdlbmVyYXRlZEFydGlmYWN0U2V0XCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gU3RhYmxlIGxhbmd1YWdlIG9yIHRhcmdldCBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbnRyeSAtIFBhdGggb2YgdGhlIHNvbGUgZGVjbGFyZWQgZW50cnkgYXJ0aWZhY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRlZFNldEFydGlmYWN0W119IGFydGlmYWN0cyAtIERldGVybWluaXN0aWMgYXJ0aWZhY3Qgb3JkZXIuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pn0gW21ldGFkYXRhXSAtIERldGFjaGVkIHRhcmdldC1zcGVjaWZpYyBKU09OIG1ldGFkYXRhLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGlzY292ZXJlZFRvb2xjaGFpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbW1hbmQgLSBEb2N1bWVudGVkIGNhbm9uaWNhbCBjb21tYW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBhYnNvbHV0ZSBleGVjdXRhYmxlIHBhdGguXG4gKiBAcHJvcGVydHkge1wib3ZlcnJpZGVcIiB8IFwiY2Fub25pY2FsXCJ9IHNvdXJjZSAtIFJlc29sdXRpb24gcm91dGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIEZpcnN0IHNlbGVjdGVkLXN0cmVhbSB2ZXJzaW9uIGxpbmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk91dHB1dCAtIENvbXBsZXRlIG5vcm1hbGl6ZWQgc3Rkb3V0LCBvciBub3JtYWxpemVkIHN0ZGVyciB3aGVuIHN0ZG91dCBpcyBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHZlcnNpb25Bcmd1bWVudHMgLSBFeGFjdCB2ZXJzaW9uIGFyZ3VtZW50IGFycmF5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQWNjZXB0YW5jZVN0YWdlUmVzdWx0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBDb21wbGV0ZWQgc3RhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5IHVzZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIERpc2NvdmVyZWQgdG9vbCB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIENhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgLSBDYXB0dXJlZCBzdGFuZGFyZCBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBUYXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlyZWN0b3J5IC0gUmVtb3ZlZCBpc29sYXRlZCBwcm9qZWN0IGRpcmVjdG9yeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlUmVzdWx0W119IHN0YWdlcyAtIE9yZGVyZWQgY29tcGxldGVkIHN0YWdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IG5hbWUgLSBOb3JtYWxpemVkIHNjYWxhciB2YWx1ZSB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUGFyYW1ldGVyXCJ9IGtpbmQgLSBEZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGRlY2xhcmF0aW9uLXNjb3BlZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgdHlwZSBwYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVWYXJpYWJsZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwifSBraW5kIC0gUmVmZXJlbmNlIHRvIG9uZSBkZWNsYXJhdGlvbi1zY29wZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgcmVmZXJlbmNlZCB0eXBlLXBhcmFtZXRlciBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIHJlZmVyZW5jZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RUeXBlXG4gKiBAcHJvcGVydHkge1wiTGlzdFR5cGVcIn0ga2luZCAtIFJlY3Vyc2l2ZSBsaXN0LXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IGVsZW1lbnRUeXBlIC0gSG9tb2dlbmVvdXMgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJNYXBUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbWFwLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0ga2V5VHlwZSAtIEV4YWN0IHN0cmluZyBrZXkgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHZhbHVlVHlwZSAtIEhvbW9nZW5lb3VzIHZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgYXJndW1lbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3JkZXJlZE1hcFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcmRlcmVkTWFwVHlwZVwifSBraW5kIC0gRGlzdGluY3QgaW5zZXJ0aW9uLW9yZGVyZWQgbWFwLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0ga2V5VHlwZSAtIEV4YWN0IHN1cHBvcnRlZCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtcImluc2VydGlvblwifSBvcmRlciAtIENhbm9uaWNhbCBmaXJzdC1pbnNlcnRpb24gZW5jb3VudGVyIG9yZGVyLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsVHlwZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsVHlwZVwifSBraW5kIC0gRXhwbGljaXQgcHJlc2VuY2UvYWJzZW5jZSB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBFeGFjdCBwcmVzZW50LXZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgY29uc3RpdHVlbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkVHlwZVxuICogQHByb3BlcnR5IHtcIlJlY29yZFR5cGVcIn0ga2luZCAtIE5vbWluYWwgcmVjb3JkLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlW119IFthcmd1bWVudHNdIC0gRXhhY3QgaW52YXJpYW50IHR5cGUgYXJndW1lbnRzOyByZXF1aXJlZCBmb3IgZ2VuZXJpYyBkZWNsYXJhdGlvbnMgYW5kIGFic2VudCBmb3Igbm9uLWdlbmVyaWMgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JUeXBlXG4gKiBAcHJvcGVydHkge1wiRXJyb3JUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZC1lcnJvciB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZmVyZW5jZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWZlcmVuY2VUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlZmVyZW5jZS1jbGFzcyB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZFJlc291cmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVzb3VyY2VUeXBlXCJ9IGtpbmQgLSBDb21waWxlci1vd25lZCBsaW5lYXIgcmVzb3VyY2UgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZUlkIC0gRXhhY3QgYXV0aG9yaXR5IHJlc291cmNlIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiT3duZWRSZWZlcmVuY2VUeXBlXCJ9IGtpbmQgLSBMaW5lYXIgcmVmZXJlbmNlIHRoYXQgb3ducyBvbmUgcHJvdGVjdGVkIHJlc291cmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCBvd25lZCBjbGFzcyBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1R5cGVSZWZlcmVuY2UgfCBUeXBlVmFyaWFibGVSZWZlcmVuY2UgfCBMaXN0VHlwZSB8IE1hcFR5cGUgfCBPcmRlcmVkTWFwVHlwZSB8IE9wdGlvbmFsVHlwZSB8IFJlY29yZFR5cGUgfCBSZWZlcmVuY2VUeXBlIHwgT3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IFNlbWFudGljVmFsdWVUeXBlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVmFsdWVUeXBlIHwgRXJyb3JUeXBlfSBTZW1hbnRpY0JpbmRpbmdUeXBlICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gVm9pZCByZXR1cm4gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7XCJ2b2lkXCJ9IG5hbWUgLSBOb3JtYWxpemVkIG5vbi12YWx1ZSBmdW5jdGlvbiByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljVmFsdWVUeXBlIHwgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZU5hbWUgfCB7a2luZDogXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiwgcGFyYW1ldGVySWQ6IHN0cmluZ30gfCB7a2luZDogXCJMaXN0VHlwZVwiLCBlbGVtZW50VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiTWFwVHlwZVwiLCBrZXlUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eX0gfCB7a2luZDogXCJPcmRlcmVkTWFwVHlwZVwiLCBrZXlUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgb3JkZXI6IFwiaW5zZXJ0aW9uXCJ9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiUmVjb3JkVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmcsIGFyZ3VtZW50cz86IFNlbWFudGljVHlwZUlkZW50aXR5W119IHwge2tpbmQ6IFwiUmVmZXJlbmNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2VJZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVmZXJlbmNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9fSBTZW1hbnRpY1R5cGVJZGVudGl0eSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVJZGVudGl0eSB8IFwidm9pZFwifSBGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IHJlcXVpcmVkIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHR5cGVzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJlc29sdmVkIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBbdHlwZUFyZ3VtZW50c10gLSBJbmZlcnJlZCBkZWNsYXJhdGlvbi1vcmRlciB0eXBlIGFyZ3VtZW50cyBmb3IgYSBnZW5lcmljIGNhbGwuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJQYXJhbWV0ZXJcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gUGFyYW1ldGVyIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FwYWJpbGl0eUlkIC0gRXhhY3QgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb25JZCAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBvcmRlcmVkIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBvcGVyYXRpb24gcmVzdWx0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBlZmZlY3RzIC0gQ2xvc2VkIGluaXRpYWwgZWZmZWN0IHNldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZhaWx1cmVJZHMgLSBFeGFjdCBvcmRlcmVkIGRlY2xhcmVkIGZhaWx1cmVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZUZsb3d9IHJlc291cmNlRmxvdyAtIEV4YWN0IG93bmVyc2hpcCB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRNb3ZlRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk93bmVkTW92ZUV4cHJlc3Npb25cIn0ga2luZCAtIEV4cGxpY2l0IGxpbmVhciBvd25lcnNoaXAgdHJhbnNmZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTW92ZWQgb3duZXIuXG4gKiBAcHJvcGVydHkge093bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSB0eXBlIC0gRXhhY3Qgb3duZWQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgdHJhbnNmZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZEJvcnJvd0V4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIn0ga2luZCAtIEltbWVkaWF0ZSBub25lc2NhcGluZyByZXNvdXJjZSBib3Jyb3cuXG4gKiBAcHJvcGVydHkge1wic2hhcmVkXCIgfCBcImV4Y2x1c2l2ZVwifSBtb2RlIC0gQm9ycm93IG1vZGUuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9uIHwgUmVjZWl2ZXJFeHByZXNzaW9uIHwgUHJpdmF0ZUZpZWxkUmVhZH0gZXhwcmVzc2lvbiAtIEJvcnJvd2VkIHBsYWNlLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGJvcnJvdyBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gRGVyaXZlZCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZWZmZWN0IGludm9jYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gRXhhY3Qgb3BlcmF0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlZmZlY3RTaXRlSWQgLSBEZXRlcm1pbmlzdGljIHNlbWFudGljIGV2YWx1YXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlfSByZXNvbHV0aW9uIC0gQ29tcGxldGUgYXV0aG9yaXR5IHJlc29sdXRpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNhbGwgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvcGVyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTdGFibGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3traW5kOiBcIm5vbmVcIn0gfCB7a2luZDogXCJhY3F1aXJlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJib3Jyb3dcIiB8IFwiY2xvc2VcIiwgcGFyYW1ldGVySW5kZXg6IG51bWJlciwgdGVybWluYWxGYWlsdXJlSWQ6IHN0cmluZ319IEVmZmVjdFJlc291cmNlRmxvdyAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBDYXBhYmlsaXR5IHJlc291cmNlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG5vbWluYWwgcmVzb3VyY2UgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSBmYWlsdXJlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG5vbWluYWwgZmFpbHVyZSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvblwifSBraW5kIC0gQ29tcGlsZXItYXV0aG9yaXplZCBvcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIGF1dGhvcml0eS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgb3BlcmF0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBlZmZlY3RzIC0gQ2xvc2VkIGluaXRpYWwgZWZmZWN0IHNldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZhaWx1cmVJZHMgLSBPcmRlcmVkIG5vbWluYWwgZmFpbHVyZSBpZGVudGl0aWVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZUZsb3d9IHJlc291cmNlRmxvdyAtIEV4YWN0IG93bmVyc2hpcCB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBBdXRob3JpemVkIGNhcGFiaWxpdHkgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3JpdHlJZCAtIE9wYXF1ZSBhdXRob3JpdHkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIENhcGFiaWxpdHkgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbltdfSByZXNvdXJjZXMgLSBPcmRlcmVkIHJlc291cmNlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uW119IGZhaWx1cmVzIC0gT3JkZXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25bXX0gb3BlcmF0aW9ucyAtIE9yZGVyZWQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhcGFiaWxpdHlBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIn0gc2NoZW1hIC0gQXV0aG9yaXR5IHNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxIHwgMn0gc2NoZW1hVmVyc2lvbiAtIEF1dGhvcml0eSBwYXlsb2FkIHZlcnNpb24sIG5vdCBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIE9wYXF1ZSBjYWxsZXItc3VwcGxpZWQgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gY2FwYWJpbGl0aWVzIC0gTm9ybWFsaXplZCBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyYWN0VmVyc2lvbl0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24sIHByZXNlbnQgb25seSB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZWQgb25lLlxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgY29udHJhY3RWZXJzaW9uOiBzdHJpbmcsIGNhcGFiaWxpdGllczogRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119W119IFttb2R1bGVzXSAtIFNjaGVtYS12MiBjYW5vbmljYWwgbW9kdWxlIGF1dGhvcml0aWVzLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e21vZHVsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCB0eXBlOiBTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9fX0gQ2FwYWJpbGl0eVBhcmFtZXRlcklucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmd9fSBDYXBhYmlsaXR5TmFtZWRJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9fSBDYXBhYmlsaXR5UmVzb3VyY2VGbG93SW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgcGFyYW1ldGVyczogQ2FwYWJpbGl0eVBhcmFtZXRlcklucHV0W10sIHJldHVyblR5cGU6IEZ1bmN0aW9uUmV0dXJuVHlwZU5hbWUgfCB7a2luZDogXCJPd25lZFJlc291cmNlVHlwZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlTmFtZX0sIGVmZmVjdHM6IFtcImhvc3RcIl0sIGZhaWx1cmVzOiAoc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQpW10sIHJlc291cmNlRmxvdzogQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0fX0gQ2FwYWJpbGl0eU9wZXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHJlc291cmNlczogQ2FwYWJpbGl0eU5hbWVkSW5wdXRbXSwgZmFpbHVyZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIG9wZXJhdGlvbnM6IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0W119fSBDYXBhYmlsaXR5QXV0aG9yaXR5TW9kdWxlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e3NjaGVtYTogXCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIiwgc2NoZW1hVmVyc2lvbjogMSwgaWQ6IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdLCBjb250cmFjdFZlcnNpb24/OiBzdHJpbmd9IHwge3NjaGVtYTogXCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIiwgc2NoZW1hVmVyc2lvbjogMiwgaWQ6IHN0cmluZywgbW9kdWxlczogQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0W119fSBDYXBhYmlsaXR5QXV0aG9yaXR5SW5wdXQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0TGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkxpc3RMaXRlcmFsXCJ9IGtpbmQgLSBPcmRlcmVkIGltbXV0YWJsZSBsaXN0IGxpdGVyYWwuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gZWxlbWVudHMgLSBTb3VyY2Utb3JkZXJlZCwgZHVwbGljYXRlLXByZXNlcnZpbmcgZWxlbWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBFbnRyeVxuICogQHByb3BlcnR5IHtcIk1hcEVudHJ5XCJ9IGtpbmQgLSBTb3VyY2Utb3JkZXJlZCBtYXAgaW5pdGlhbGl6ZXIgZW50cnkuXG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IGtleSAtIExpdGVyYWwgbm9ubnVtZXJpYyBzdHJpbmcga2V5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEVudHJ5IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIk1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbDsgZW50cnkgb3JkZXIgaXMgZGlhZ25vc3RpYy1vbmx5LlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlIGluaXRpYWxpemVyIG9yZGVyLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3JkZXJlZE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJPcmRlcmVkTWFwTGl0ZXJhbFwifSBraW5kIC0gSW1tdXRhYmxlIG1hcCBsaXRlcmFsIHdpdGggb2JzZXJ2YWJsZSBmaXJzdC1pbnNlcnRpb24gb3JkZXIuXG4gKiBAcHJvcGVydHkge01hcEVudHJ5W119IGVudHJpZXMgLSBTb3VyY2Utb3JkZXJlZCB1bmlxdWUgZW50cmllcy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgb3JkZXJlZCBjb25zdHJ1Y3Rpb24gYm91bmRhcnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdEluZGV4RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkxpc3RJbmRleEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHplcm8tYmFzZWQgbGlzdCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbmRleCAtIEludGVnZXIgaW5kZXguXG4gKiBAcHJvcGVydHkge1wicHJvdmVuXCIgfCBcImZhaWwtb24tYWJzZW5jZVwifSB0b3RhbGl0eSAtIEFkbWlzc2lvbiBiYXNpczsgbmV2ZXIgb3B0aW9uYWwuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBMb29rdXBFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWFwTG9va3VwRXhwcmVzc2lvblwifSBraW5kIC0gVG90YWwgc3RyaW5nLWtleSBtYXAgbG9va3VwLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTWFwLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0ga2V5IC0gU3RyaW5nIGtleSBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCJ9IGtpbmQgLSBGaW5pdGUgY29sbGVjdGlvbiBzaXplLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdC0gb3IgbWFwLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7XCJsaXN0XCIgfCBcIm1hcFwifSBbY29sbGVjdGlvbktpbmRdIC0gVmFsaWRhdGVkIHJlY2VpdmVyIGtpbmQgZm9yIHRhcmdldCBzcGVsbGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElkZW50aWZpZXJFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiSWRlbnRpZmllckV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUmVmZXJlbmNlZCBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW50ZWdlckxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJJbnRlZ2VyTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZhbHVlIC0gSmF2YVNjcmlwdC1zYWZlIGludGVnZXIgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb29sZWFuTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkJvb2xlYW5MaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZhbHVlIC0gQm9vbGVhbiB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0cmluZ0xpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJTdHJpbmdMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBVbmljb2RlIHN0cmluZyB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsTm9uZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsTm9uZVwifSBraW5kIC0gQ29udGV4dHVhbGx5IHR5cGVkIGFic2VuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFNvbWVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFNvbWVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbnQgb3B0aW9uYWwgdmFsdWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHZhbHVlIC0gRXhhY3Qgbm9uLW9wdGlvbmFsIHByZXNlbnQgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbElzUHJlc2VudFxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsSXNQcmVzZW50XCJ9IGtpbmQgLSBQcmVzZW5jZSB0ZXN0IGZvciBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBvcGVyYW5kIC0gVGVzdGVkIG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFVud3JhcFxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsVW53cmFwXCJ9IGtpbmQgLSBHdWFyZGVkIHVud3JhcCBvZiBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBvcGVyYW5kIC0gUHJvdmVuLXByZXNlbnQgb3B0aW9uYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFVuYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIlVuYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBvcGVyYW5kIC0gT3BlcmFuZCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQmluYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkJpbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNCaW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGxlZnQgLSBMZWZ0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJpZ2h0IC0gUmlnaHQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjYWxsZWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBEZXRlcm1pbmlzdGljIGRlY2xhcmF0aW9uIGFuZCBzaWduYXR1cmUgYmluZGluZywgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZWZmZWN0U2l0ZUlkXSAtIERldGVybWluaXN0aWMgc2l0ZSBpZGVudGl0eSB3aGVuIHRoZSByZXNvbHZlZCBmdW5jdGlvbiByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGlzIGNhbGwuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIEV4YWN0IHJlc29sdmVkIG1ldGhvZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBtZXRob2QgcGFyYW1ldGVyIHR5cGVzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gcmV0dXJuVHlwZSAtIEV4YWN0IG1ldGhvZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7e2tpbmQ6IFwicHJlc2VydmVcIiB8IFwidGVybWluYWxcIiwgdGVybWluYWxGYWlsdXJlSWQ/OiBzdHJpbmd9fSBbcmVzb3VyY2VGbG93XSAtIE93bmVkIHJlY2VpdmVyIHRyYW5zaXRpb24gYW5kIGRlY2xhcmVkIHRlcm1pbmFsLXVzZSBmYWlsdXJlIHdoZW4gYXBwbGljYWJsZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY2VpdmVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIlJlY2VpdmVyRXhwcmVzc2lvblwifSBraW5kIC0gVGhlIGRlY2xhcmluZyBjbGFzcyBpbnN0YW5jZSByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc0lkIC0gU3RhYmxlIGRlY2xhcmluZyBjbGFzcyBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIHJlY2VpdmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgcmVjZWl2ZXIgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIEZyZXNoIG5vbWluYWwgcmVmZXJlbmNlIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVmZXJlbmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gcmVmZXJlbmNlIC0gRXhhY3QgY2xhc3MgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IGNvbnN0cnVjdG9yIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiBjb25zdHJ1Y3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3Rpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjbGFzcy1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWV0aG9kQ2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJNZXRob2RDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gUmVzb2x2ZWQgcmVjZWl2ZXItbWV0aG9kIGludm9jYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJlY2VpdmVyIC0gUmVjZWl2ZXIgZXZhbHVhdGVkIG9uY2UgYmVmb3JlIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRob2QgLSBTdGFibGUgbWV0aG9kIGlkZW50aXR5IGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRXhhY3QgbWV0aG9kIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgbWV0aG9kIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNhbGwgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXRob2QtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaXZhdGVGaWVsZFJlYWRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRSZWFkXCJ9IGtpbmQgLSBEZWNsYXJpbmctcmVjZWl2ZXItb25seSBwcml2YXRlIGZpZWxkIHJlYWQuXG4gKiBAcHJvcGVydHkge1JlY2VpdmVyRXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBFeGFjdCBkZWNsYXJpbmcgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcHJpdmF0ZSBmaWVsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgcmVhZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRDb25zdHJ1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIE5vbWluYWwgcmVjb3JkIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkVHlwZX0gcmVjb3JkIC0gUmVzb2x2ZWQgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIENvbXBsZXRlIGZpZWxkLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3Rpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgcmVjb3JkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNZW1iZXJSZWFkXG4gKiBAcHJvcGVydHkge1wiTWVtYmVyUmVhZFwifSBraW5kIC0gTm9taW5hbCBpbW11dGFibGUgcmVjb3JkLWZpZWxkIHJlYWQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJlY2VpdmVyIC0gUmVjb3JkLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSByZXNvbHZlZCBmaWVsZCBpZGVudGl0eSBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZW1iZXItcmVhZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZW1iZXItbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yTWVzc2FnZVJlYWRcbiAqIEBwcm9wZXJ0eSB7XCJFcnJvck1lc3NhZ2VSZWFkXCJ9IGtpbmQgLSBUaGUgc29sZSBwb3J0YWJsZSBlcnJvciBtZW1iZXIgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBDYXRjaCBiaW5kaW5nIHdob3NlIGltbXV0YWJsZSBtZXNzYWdlIGlzIHJlYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1lc3NhZ2UtcmVhZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXNzYWdlLW1lbWJlciByYW5nZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0lkZW50aWZpZXJFeHByZXNzaW9uIHwgUmVjZWl2ZXJFeHByZXNzaW9uIHwgSW50ZWdlckxpdGVyYWwgfCBCb29sZWFuTGl0ZXJhbCB8IFN0cmluZ0xpdGVyYWwgfCBPcHRpb25hbE5vbmUgfCBPcHRpb25hbFNvbWUgfCBPcHRpb25hbElzUHJlc2VudCB8IE9wdGlvbmFsVW53cmFwIHwgTGlzdExpdGVyYWwgfCBNYXBMaXRlcmFsIHwgT3JkZXJlZE1hcExpdGVyYWwgfCBMaXN0SW5kZXhFeHByZXNzaW9uIHwgTWFwTG9va3VwRXhwcmVzc2lvbiB8IENvbGxlY3Rpb25TaXplRXhwcmVzc2lvbiB8IFVuYXJ5RXhwcmVzc2lvbiB8IEJpbmFyeUV4cHJlc3Npb24gfCBDYWxsRXhwcmVzc2lvbiB8IEVmZmVjdENhbGxFeHByZXNzaW9uIHwgT3duZWRNb3ZlRXhwcmVzc2lvbiB8IE93bmVkQm9ycm93RXhwcmVzc2lvbiB8IE1ldGhvZENhbGxFeHByZXNzaW9uIHwgUmVmZXJlbmNlQ29uc3RydWN0aW9uIHwgUmVjb3JkQ29uc3RydWN0aW9uIHwgTWVtYmVyUmVhZCB8IFByaXZhdGVGaWVsZFJlYWQgfCBFcnJvck1lc3NhZ2VSZWFkfSBFeHByZXNzaW9uICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9jYWxEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkxvY2FsRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRGVjbGFyZWQgbG9jYWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeHBsaWNpdCBsb2NhbCB0eXBlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBtdXRhYmxlIC0gV2hldGhlciBsYXRlciBhc3NpZ25tZW50IGlzIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGluaXRpYWxpemVyIC0gUmVxdWlyZWQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFzc2lnbm1lbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJBc3NpZ25tZW50U3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSB0YXJnZXQgLSBTaW1wbGUgbG9jYWwgYXNzaWdubWVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBBc3NpZ25lZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCJ9IGtpbmQgLSBEZWNsYXJpbmctcmVjZWl2ZXItb25seSBwcml2YXRlIGZpZWxkIG11dGF0aW9uLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBOZXcgZmllbGQgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFzc2lnbm1lbnQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZmllbGQtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJldHVyblN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJldHVyblN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBbZXhwcmVzc2lvbl0gLSBSZXR1cm5lZCBleHByZXNzaW9uOyBhYnNlbnQgZXhhY3RseSBmb3IgYSBiYXJlIHZvaWQgcmV0dXJuLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXhwcmVzc2lvblN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7Q2FsbEV4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IEVmZmVjdENhbGxFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQSBkaXJlY3QsIHJlY2VpdmVyLCBvciBhdXRob3JpemVkIGNhbGwgd2hvc2UgcmVzb2x2ZWQgcmV0dXJuIHR5cGUgaXMgdm9pZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElmU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiSWZTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gQnJhbmNoIGNvbmRpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNvbnNlcXVlbnQgLSBUcnVlIGJyYW5jaC5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IFthbHRlcm5hdGVdIC0gRmFsc2UgYnJhbmNoLCBhYnNlbnQgd2hlbiBleGVjdXRpb24gZmFsbHMgdGhyb3VnaC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFZhbHVlQmluZGluZ1xuICogQHByb3BlcnR5IHtcIlZhbHVlQmluZGluZ1wifSBraW5kIC0gSXRlcmF0aW9uLWJpbmRpbmcgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gQm9keS1sb2NhbCBiaW5kaW5nIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgbGlzdCBlbGVtZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBtdXRhYmxlIC0gSXRlcmF0aW9uIGJpbmRpbmdzIGFyZSBhbHdheXMgaW1tdXRhYmxlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBCaW5kaW5nIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGb3JFYWNoU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiRm9yRWFjaFN0YXRlbWVudFwifSBraW5kIC0gT3JkZXJlZCBsaXN0LWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsaXN0IC0gTGlzdCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSB2YWx1ZUJpbmRpbmcgLSBJbW11dGFibGUgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gTG9vcCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBsb29wIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGb3JFYWNoTWFwU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiRm9yRWFjaE1hcFN0YXRlbWVudFwifSBraW5kIC0gSW5zZXJ0aW9uLW9yZGVyZWQgbWFwIHBhaXItaXRlcmF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG1hcCAtIE9yZGVyZWQtbWFwIGV4cHJlc3Npb24gZXZhbHVhdGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdHJhdmVyc2FsLlxuICogQHByb3BlcnR5IHtWYWx1ZUJpbmRpbmd9IGtleUJpbmRpbmcgLSBJbW11dGFibGUgc3RyaW5nLWtleSBiaW5kaW5nIHNjb3BlZCB0byB0aGUgYm9keS5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSB2YWx1ZUJpbmRpbmcgLSBJbW11dGFibGUgaG9tb2dlbmVvdXMgdmFsdWUgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gTG9vcCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBsb29wIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBXaGlsZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIldoaWxlU3RhdGVtZW50XCJ9IGtpbmQgLSBTdHJpY3QtQm9vbGVhbiBwcmUtY29uZGl0aW9uIGxvb3AgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gQm9vbGVhbiBleHByZXNzaW9uIGV2YWx1YXRlZCBiZWZvcmUgZXZlcnkgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIE9yZGVyZWQgbG9vcCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBsb29wIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCcmVha1N0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkJyZWFrU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgYnJlYWsgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbnRpbnVlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQ29udGludWVTdGF0ZW1lbnRcIn0ga2luZCAtIE5lYXJlc3QtbG9vcCBjb250aW51ZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRMb29wSWRdIC0gUmVzb2x2ZWQgbmVhcmVzdC1sb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uIGluIGxvb3AgY29udGV4dC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gS2V5d29yZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JDb25zdHJ1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckNvbnN0cnVjdGlvblwifSBraW5kIC0gQ29uc3RydWN0aW9uIG9mIG9uZSBkZWNsYXJlZCB1bmNoZWNrZWQgZXJyb3IuXG4gKiBAcHJvcGVydHkge0Vycm9yVHlwZX0gZXJyb3IgLSBFeGFjdCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG1lc3NhZ2UgLSBTb2xlIGltbXV0YWJsZSBzdHJpbmcgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUgYW5kIG1lc3NhZ2UgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmFpc2VTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSYWlzZVN0YXRlbWVudFwifSBraW5kIC0gQWJydXB0IHVuY2hlY2tlZC1lcnJvciBwcm9wYWdhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JDb25zdHJ1Y3Rpb259IGVycm9yIC0gRXhhY3QgY29uc3RydWN0ZWQgc2VtYW50aWMgZXJyb3IuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJhaXNlIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJhaXNlIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2F0Y2hCaW5kaW5nXG4gKiBAcHJvcGVydHkge1wiQ2F0Y2hCaW5kaW5nXCJ9IGtpbmQgLSBFeGFjdC1oYW5kbGVyIGJpbmRpbmcgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gSGFuZGxlci1sb2NhbCBiaW5kaW5nIG5hbWUuXG4gKiBAcHJvcGVydHkge0Vycm9yVHlwZX0gdHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBtdXRhYmxlIC0gQ2F0Y2ggYmluZGluZ3MgYXJlIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBiaW5kaW5nIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVHJ5U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiVHJ5U3RhdGVtZW50XCJ9IGtpbmQgLSBPbmUgYm9keSBhbmQgb25lIGV4YWN0IHR5cGVkIGhhbmRsZXIuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gUHJvdGVjdGVkIGJvZHkuXG4gKiBAcHJvcGVydHkge0Vycm9yVHlwZX0gY2F0Y2hUeXBlIC0gRXhhY3QgY2F1Z2h0IG5vbWluYWwgZXJyb3IgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Q2F0Y2hCaW5kaW5nfSBjYXRjaEJpbmRpbmcgLSBJbW11dGFibGUgaGFuZGxlci1sb2NhbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtCbG9ja30gY2F0Y2hCb2R5IC0gSGFuZGxlciBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSB0cnkvaGFuZGxlciBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0cnkvY2F0Y2ggcmFuZ2VzLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7TG9jYWxEZWNsYXJhdGlvbiB8IEFzc2lnbm1lbnRTdGF0ZW1lbnR9IExvY2FsU3RhdGVtZW50ICovXG4vKiogQHR5cGVkZWYge0xvY2FsU3RhdGVtZW50IHwgUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnQgfCBFeHByZXNzaW9uU3RhdGVtZW50IHwgSWZTdGF0ZW1lbnQgfCBGb3JFYWNoU3RhdGVtZW50IHwgRm9yRWFjaE1hcFN0YXRlbWVudCB8IFdoaWxlU3RhdGVtZW50IHwgQnJlYWtTdGF0ZW1lbnQgfCBDb250aW51ZVN0YXRlbWVudCB8IFJldHVyblN0YXRlbWVudCB8IFByaW50U3RhdGVtZW50IHwgUmFpc2VTdGF0ZW1lbnQgfCBUcnlTdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJsb2NrXG4gKiBAcHJvcGVydHkge1wiQmxvY2tcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U3RhdGVtZW50W119IHN0YXRlbWVudHMgLSBPcmRlcmVkIHN0YXRlbWVudHMgaW4gb25lIGxleGljYWwgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGdW5jdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRnVuY3Rpb25EZWNsYXJhdGlvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gT3JkZXJlZCBkZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gUmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRnVuY3Rpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZEZpZWxkXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRmllbGRcIn0ga2luZCAtIENsb3NlZCByZWNvcmQtZmllbGQgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBmaWVsZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBmaWVsZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGaWVsZCBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmREZWNsYXJhdGlvblwifSBraW5kIC0gTm9taW5hbCBjbG9zZWQgaW1tdXRhYmxlIHJlY29yZCBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUmVjb3JkIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCB1bmlxdWUgdmlzaWJsZSBmaWVsZHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGRlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRcIn0ga2luZCAtIERlY2xhcmluZy1jbGFzcy1wcml2YXRlIG11dGFibGUgaW5zdGFuY2UgZmllbGQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIGZpZWxkIG5hbWUgaW5zaWRlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb25seS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBmaWVsZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGaWVsZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG5hbWUvdHlwZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiQ29uc3RydWN0b3JEZWNsYXJhdGlvblwifSBraW5kIC0gRXhhY3QgY29tcGxldGUgcHJpdmF0ZS1zdGF0ZSBpbml0aWFsaXplci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBjb25zdHJ1Y3RvciBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBFeGFjdCBwb3NpdGlvbmFsIGNvbnN0cnVjdG9yIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBGaWVsZC1vcmRlciBpbml0aWFsaXphdGlvbiBib2R5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3RvciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGNvbnN0cnVjdG9yIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWV0aG9kRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJNZXRob2REZWNsYXJhdGlvblwifSBraW5kIC0gUmVjZWl2ZXItYm91bmQgY2xhc3MgbWV0aG9kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIG1ldGhvZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgbWV0aG9kIG5hbWUuXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBtZXRob2Qgc2lnbmF0dXJlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIE1ldGhvZCBib2R5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWV0aG9kIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDbGFzc0RlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiQ2xhc3NEZWNsYXJhdGlvblwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UgY2xhc3Mgd2l0aCBwcml2YXRlIG11dGFibGUgc3RhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgY2xhc3MgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge1ByaXZhdGVGaWVsZFtdfSBmaWVsZHMgLSBPcmRlcmVkIHByaXZhdGUgaW5zdGFuY2Ugc3RhdGUuXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yRGVjbGFyYXRpb259IGNvbnN0cnVjdG9yIC0gU29sZSBleGFjdCBjb25zdHJ1Y3Rvci5cbiAqIEBwcm9wZXJ0eSB7TWV0aG9kRGVjbGFyYXRpb25bXX0gbWV0aG9kcyAtIE9yZGVyZWQgcmVjZWl2ZXIgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7e2tpbmQ6IFwib3JkaW5hcnlcIn0gfCB7a2luZDogXCJvd25lZFJlc291cmNlXCIsIGZpZWxkSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nfX0gW293bmVyc2hpcF0gLSBFeHBsaWNpdCBjbGFzcyBvd25lcnNoaXAgcHJvZmlsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY2xhc3MgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjbGFzcy1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVycm9yRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgdW5jaGVja2VkIGVycm9yIHdpdGggb25lIGltbXV0YWJsZSBzdHJpbmcgbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRXJyb3IgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcmludFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUHJpbnRlZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRW50cnlQb2ludFxuICogQHByb3BlcnR5IHtcIkVudHJ5UG9pbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBFbnRyeS1wb2ludCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNNb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucyBpbiBzb3VyY2Ugb3JkZXI7IG9taXR0ZWQgd2hlbiBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBUb3AtbGV2ZWwgbm9taW5hbCByZWZlcmVuY2UgY2xhc3NlcyBpbiBzb3VyY2Ugb3JkZXI7IG9taXR0ZWQgd2hlbiBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JEZWNsYXJhdGlvbltdfSBbZXJyb3JzXSAtIFRvcC1sZXZlbCBub21pbmFsIHVuY2hlY2tlZCBlcnJvciBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0VmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbY2FwYWJpbGl0aWVzXSAtIENvbXBpbGVyLWF1dGhvcml6ZWQgVGFzayAwMzQgZGVjbGFyYXRpb25zOyBvbWlzc2lvbiBpcyB0aGUgbGVnYWN5IGVtcHR5IHNldC5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25EZWNsYXJhdGlvbltdfSBmdW5jdGlvbnMgLSBUb3AtbGV2ZWwgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtFbnRyeVBvaW50fSBlbnRyeVBvaW50IC0gRXhlY3V0YWJsZSBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm92ZW5hbmNlfSBbcHJvdmVuYW5jZV0gLSBQYXJzZXItYXV0aG9yZWQgc291cmNlIGFuZCBpZGVudGl0eSBpbmRleDsgb3B0aW9uYWwgZm9yIGxlZ2FjeSBjYWxsZXItYXV0aG9yZWQgbW9kdWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljSW1wb3J0XG4gKiBAcHJvcGVydHkge1wiSW1wb3J0XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlSWQgLSBTdGFibGUgaW1wb3J0ZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGltcG9ydGVkTmFtZSAtIEV4cG9ydGVkIGRlY2xhcmF0aW9uIG5hbWUgaW4gdGhlIHNvdXJjZSBtb2R1bGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9jYWxOYW1lIC0gQmluZGluZyBuYW1lIHZpc2libGUgaW4gdGhlIGltcG9ydGluZyBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRGVjbGFyYXRpb25LaW5kfSBzeW1ib2xLaW5kIC0gSW1wb3J0ZWQgZGVjbGFyYXRpb24gbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgcmVzb2x2ZWQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVPbmx5IC0gV2hldGhlciBzb3VyY2Ugc3ludGF4IGFkbWl0dGVkIG9ubHkgdHlwZS1wb3NpdGlvbiB1c2UuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGltcG9ydCBkZWNsYXJhdGlvbi9zcGVjaWZpZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBpbXBvcnQgcmFuZ2VzLlxuICogQHByb3BlcnR5IHtTdGRsaWJGYWNhZGVSZXNvbHV0aW9uRXZpZGVuY2V9IFtzdGRsaWJGYWNhZGVdIC0gRXhhY3QgcGFyc2VyLXByb3ZlZCBuYXRpdmUgZmFjYWRlIGlkZW50aXR5IGV2aWRlbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVSZXNvbHV0aW9uXCJ9IHNjaGVtYSAtIEV2aWRlbmNlIHNjaGVtYS5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEV2aWRlbmNlIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmFjYWRlSWRlbnRpdHkgLSBTZWxlY3RlZCBmYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmFjYWRlVmVyc2lvbiAtIFNlbGVjdGVkIGV4YWN0IGZhY2FkZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZU1vZHVsZSAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmF0aXZlU3ltYm9sIC0gUGFyc2VyLXByb3ZlZCBzb3VyY2Ugc3RkbGliIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljRXhwb3J0XG4gKiBAcHJvcGVydHkge1wiRXhwb3J0XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwb3J0ZWROYW1lIC0gTmFtZSB2aXNpYmxlIHRvIGltcG9ydGluZyBtb2R1bGVzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEV4cG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGV4cG9ydGVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBleHBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZXhwb3J0IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbU1vZHVsZVxuICogQHByb3BlcnR5IHtcIk1vZHVsZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU3RhYmxlIGNhbGxlci1zdXBwbGllZCBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VGaWxlbmFtZSAtIEV4cGxpY2l0IHNvdXJjZSBmaWxlbmFtZTsgbmV2ZXIgYW4gaW1wbGljaXQgcmVhZCByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtSZWNvcmREZWNsYXJhdGlvbltdfSBbcmVjb3Jkc10gLSBUb3AtbGV2ZWwgbm9taW5hbCByZWNvcmQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtDbGFzc0RlY2xhcmF0aW9uW119IFtjbGFzc2VzXSAtIENvbXBpbGVyLW93bmVkIGZhY2FkZSByZWZlcmVuY2UgY2xhc3Nlcy5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JEZWNsYXJhdGlvbltdfSBbZXJyb3JzXSAtIFRvcC1sZXZlbCBub21pbmFsIHVuY2hlY2tlZCBlcnJvciBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNJbXBvcnRbXX0gaW1wb3J0cyAtIFJlc29sdmVkIGltcG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0V4cG9ydFtdfSBleHBvcnRzIC0gUmVzb2x2ZWQgZXhwb3J0cyBpbiBzb3VyY2Ugb3JkZXIuXG4gKiBAcHJvcGVydHkge0VmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbY2FwYWJpbGl0aWVzXSAtIEF1dGhvcml0eSBkZWNsYXJhdGlvbnMgc2hhcmVkIGJ5IHJlZmVyZW5jZSB3aGVuIHRoZSBwcm9ncmFtIGRlY2xhcmVzIGEgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gW2VudHJ5UG9pbnRdIC0gU29sZSBleGVjdXRhYmxlIGVudHJ5IHBvaW50LCBwcmVzZW50IG9ubHkgb24gdGhlIHNlbGVjdGVkIG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm92ZW5hbmNlfSBbcHJvdmVuYW5jZV0gLSBQYXJzZXItYXV0aG9yZWQgc291cmNlIGFuZCBpZGVudGl0eSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ319IFtzdGRsaWJGYWNhZGVdIC0gU2VsZWN0ZWQgY29tcGlsZXItb3duZWQgZmFjYWRlIG1vZHVsZSBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCByYW5nZTogc3RyaW5nfVtdfSBkZXBlbmRlbmNpZXMgLSBWZXJzaW9uZWQgZmFjYWRlIGRlcGVuZGVuY2llcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGl0eSAtIEZhY2FkZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7KHtpZGVudGl0eTogc3RyaW5nLCBraW5kOiBcIm1vZHVsZVwiLCBzeW1ib2xzOiBzdHJpbmdbXX0gfCB7Zm9ybXM6IChcInVucXVhbGlmaWVkLWNhbGxcIiB8IFwicmVjZWl2ZXItY2FsbFwiKVtdLCBpZGVudGl0eTogc3RyaW5nLCBraW5kOiBcImJ1aWx0aW5cIiwgc3ltYm9sczogc3RyaW5nW119KVtdfSBuYXRpdmVNb2R1bGVzIC0gRXhhY3QgbmF0aXZlIHNvdXJjZSBpZGVudGl0aWVzLlxuICogQHByb3BlcnR5IHsoe2VmZmVjdHM6IHN0cmluZ1tdLCBmYWlsdXJlczogc3RyaW5nW10sIGZvcm1zOiAoXCJkaXJlY3QtY2FsbFwiIHwgXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwga2luZDogXCJmdW5jdGlvblwiLCBuYW1lOiBzdHJpbmcsIG93bmVyc2hpcDogXCJub3QtYXBwbGljYWJsZVwiLCBwYXJhbWV0ZXJzOiB7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9W10sIHJldHVyblR5cGU6IHN0cmluZ30gfCB7Y29uc3RydWN0b3I6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBvd25lcnNoaXA6IFwiYWNxdWlyZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdfSwgZm9ybXM6IFtcImNvbnN0cnVjdG9yLWNhbGxcIl0sIGtpbmQ6IFwiY2xhc3NcIiwgbWV0aG9kczoge2VmZmVjdHM6IHN0cmluZ1tdLCBmYWlsdXJlczogc3RyaW5nW10sIGZvcm1zOiBbXCJyZWNlaXZlci1jYWxsXCJdLCBuYW1lOiBzdHJpbmcsIG93bmVyc2hpcDogXCJib3Jyb3dlZFwiIHwgXCJjb25zdW1lZFwiLCBwYXJhbWV0ZXJzOiB7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9W10sIHJldHVyblR5cGU6IHN0cmluZ31bXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwib3duZWQtcmVmZXJlbmNlXCJ9KVtdfSBwdWJsaWNEZWNsYXJhdGlvbnMgLSBQdWJsaWMgc291cmNlIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7e21vZHVsZTogc3RyaW5nLCBvcGVyYXRpb25zOiBzdHJpbmdbXSwgcmFuZ2U6IHN0cmluZ31bXX0gcmVxdWlyZW1lbnRzIC0gQ2Fub25pY2FsIGNhcGFiaWxpdHkgcmVxdWlyZW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJ1bnRpbWVQcm9maWxlIC0gRXhhY3Qgc291cmNlIHJ1bnRpbWUgcHJvZmlsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VNb2R1bGUgLSBDb21waWxlci1vd25lZCBzZW1hbnRpYyBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIEV4YWN0IGZhY2FkZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImludGVybmFsXCIgfCBcInB1YmxpY1wifSB2aXNpYmlsaXR5IC0gTmF0aXZlLXNlbGVjdGFibGUgdmlzaWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVzXCJ9IHNjaGVtYSAtIEZhY2FkZSBkZXNjcmlwdG9yIHNjaGVtYS5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEZhY2FkZSBkZXNjcmlwdG9yIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gU291cmNlLWxhbmd1YWdlIGNvbXBhdGliaWxpdHkgcHJvZmlsZS5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUHJvZ3JhbU1vZHVsZURlc2NyaXB0b3JbXX0gbW9kdWxlcyAtIERlcGVuZGVuY3ktZmlyc3Qgc2VsZWN0ZWQgZXhlY3V0YWJsZSBjbG9zdXJlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNQcm9ncmFtXG4gKiBAcHJvcGVydHkge1wiUHJvZ3JhbVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1Byb2dyYW1Nb2R1bGVbXX0gbW9kdWxlcyAtIERlcGVuZGVuY3ktZmlyc3QgZGV0ZXJtaW5pc3RpYyBtb2R1bGUgb3JkZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnlNb2R1bGUgLSBTdGFibGUgaWRlbnRpdHkgb2YgdGhlIHNvbGUgZW50cnkgbW9kdWxlLlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYWxsZXItb3JkZXIgY29tcGxldGUgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfX0gW3N0ZGxpYkNvbnRyYWN0XSAtIERlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3Q7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge3tjb250cmFjdFZlcnNpb24/OiBzdHJpbmcsIGlkZW50aXR5OiBzdHJpbmd9W119IFtzdGRsaWJDb250cmFjdHNdIC0gT3JkZXJlZCBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0czsgcGxhaW4sIG5ldmVyIGZyb3plbi5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3J9IFtzdGRsaWJGYWNhZGVzXSAtIENvbXBsZXRlIHNlbGVjdGVkIHNvdXJjZS1sYW5ndWFnZSBmYWNhZGUgY2xvc3VyZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljTW9kdWxlIHwgU2VtYW50aWNQcm9ncmFtTW9kdWxlIHwgU2VtYW50aWNJbXBvcnQgfCBTZW1hbnRpY0V4cG9ydCB8IFJlY29yZERlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEVycm9yRGVjbGFyYXRpb24gfCBFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb24gfCBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uIHwgRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb24gfCBSZWNvcmRGaWVsZCB8IFByaXZhdGVGaWVsZCB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyIHwgUGFyYW1ldGVyIHwgVmFsdWVCaW5kaW5nIHwgQ2F0Y2hCaW5kaW5nIHwgQmxvY2sgfCBTdGF0ZW1lbnQgfCBFbnRyeVBvaW50IHwgRXhwcmVzc2lvbiB8IEVycm9yQ29uc3RydWN0aW9uIHwgRXJyb3JUeXBlIHwgTWFwRW50cnkgfCBTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNOb2RlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTm9kZX0gU2VtYW50aWNOb2RlV2l0aG91dExvY2F0aW9ucyAqL1xuXG5leHBvcnQge31cbiJdfQ==
|
|
1102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLDBLQUEwSztBQUMxSyxzREFBc0Q7QUFDdEQsa0ZBQWtGO0FBQ2xGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILDhEQUE4RDtBQUU5RDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILGtIQUFrSDtBQUVsSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUgsb01BQW9NO0FBQ3BNLG1FQUFtRTtBQUVuRTs7Ozs7R0FLRztBQUVILDRGQUE0RjtBQUU1Riw4b0JBQThvQjtBQUM5b0IsMEVBQTBFO0FBRTFFOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7O0dBSUc7QUFFSCwyS0FBMks7QUFFM0s7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILG9GQUFvRjtBQUNwRiw2TkFBNk47QUFDN04scURBQXFEO0FBQ3JELDRQQUE0UDtBQUM1UCwyWUFBMlk7QUFDM1ksd0tBQXdLO0FBQ3hLLHdJQUF3STtBQUN4SSwrU0FBK1M7QUFFL1M7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSCxtaUJBQW1pQjtBQUVuaUI7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVILHVFQUF1RTtBQUN2RSw2UUFBNlE7QUFFN1E7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVILHdqQkFBd2pCO0FBQ3hqQiwyREFBMkQ7QUFFM0QsT0FBTyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtcInBocFwiIHwgXCJydWJ5XCIgfCBcImphdmFzY3JpcHRcIiB8IFwidHlwZXNjcmlwdFwiIHwgXCJqYXZhXCIgfCBcImtvdGxpblwiIHwgXCJweXRob25cIiB8IFwiY3NoYXJwXCIgfCBcImdvXCIgfCBcImNcIiB8IFwiY3BwXCIgfCBcInJ1c3RcIiB8IFwic3dpZnRcIiB8IFwiZGFydFwifSBTZW1hbnRpY0xhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2V9IFRleHRCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7VGV4dEJhY2tlbmRMYW5ndWFnZSB8IFwid2FzbVwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwifSBCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNMYW5ndWFnZSB8IFwiaHRtbFwifSBHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJpbnRlZ2VyXCIgfCBcImJvb2xlYW5cIiB8IFwic3RyaW5nXCJ9IFNlbWFudGljVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlTmFtZSB8IFwidm9pZFwifSBGdW5jdGlvblJldHVyblR5cGVOYW1lICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlck5lZ2F0ZVwiIHwgXCJCb29sZWFuTm90XCJ9IFNlbWFudGljVW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyQWRkXCIgfCBcIkludGVnZXJTdWJ0cmFjdFwiIHwgXCJJbnRlZ2VyTXVsdGlwbHlcIiB8IFwiQm9vbGVhbkFuZFwiIHwgXCJCb29sZWFuT3JcIiB8IFwiSW50ZWdlckVxdWFsXCIgfCBcIkludGVnZXJOb3RFcXVhbFwiIHwgXCJCb29sZWFuRXF1YWxcIiB8IFwiQm9vbGVhbk5vdEVxdWFsXCIgfCBcIlN0cmluZ0VxdWFsXCIgfCBcIlN0cmluZ05vdEVxdWFsXCIgfCBcIkludGVnZXJMZXNzVGhhblwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5PckVxdWFsXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhblwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIgfCBcIlN0cmluZ0NvbmNhdFwifSBTZW1hbnRpY0JpbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcImNhcGFiaWxpdHlcIiB8IFwicmVzb3VyY2VcIiB8IFwiZmFpbHVyZVwiIHwgXCJvcGVyYXRpb25cIiB8IFwicmVjb3JkXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZpZWxkXCIgfCBcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwiIHwgXCJmdW5jdGlvblwiIHwgXCJ0eXBlUGFyYW1ldGVyXCIgfCBcInBhcmFtZXRlclwiIHwgXCJsb2NhbFwiIHwgXCJpdGVyYXRpb25cIiB8IFwiY2F0Y2hcIn0gU2VtYW50aWNTeW1ib2xLaW5kICovXG4vKiogQHR5cGVkZWYge1wicmVjb3JkXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZ1bmN0aW9uXCJ9IFNlbWFudGljRGVjbGFyYXRpb25LaW5kICovXG4vKiogQHR5cGVkZWYge1wiZGVjbGFyYXRpb25cIiB8IFwidHlwZVwiIHwgXCJjb25zdHJ1Y3RcIiB8IFwibWVtYmVyXCIgfCBcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSBTZW1hbnRpY1N5bWJvbFJvbGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJzZVwiIHwgXCJnZW5lcmF0ZVwiIHwgXCJyZXN0b3JlXCIgfCBcImNvbXBpbGVcIiB8IFwibGlua1wiIHwgXCJ2YWxpZGF0ZVwiIHwgXCJpbnN0YW50aWF0ZVwiIHwgXCJleGVjdXRlXCJ9IEFjY2VwdGFuY2VTdGFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImVudHJ5XCIgfCBcInNvdXJjZVwiIHwgXCJtYW5pZmVzdFwiIHwgXCJzdXBwb3J0XCIgfCBcIm1hcHBpbmdcIiB8IFwicmVzb3VyY2VcIiB8IFwibG9hZGVyXCJ9IEdlbmVyYXRlZEFydGlmYWN0Um9sZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBTYWZlIFhjb2RlIHByb2R1Y3QvcGF0aCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVOYW1lIC0gU2FmZSBTd2lmdCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uUHJlZml4IC0gQ2FsbGVyLXN1cHBsaWVkIHJldmVyc2UtRE5TIG9yZ2FuaXphdGlvbiBwcmVmaXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWRlbnRpZmllciAtIENhbGxlci1zdXBwbGllZCByZXZlcnNlLUROUyBhcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVwbG95bWVudFRhcmdldCAtIENhbGxlci1zdXBwbGllZCBtYWpvci5taW5vciBpT1MgZGVwbG95bWVudCB0YXJnZXQ7IG5ldmVyIGluZmVycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiU291cmNlc1wifSBbc291cmNlUm9vdF0gLSBGaXhlZCBnZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wiQXNzZXRzLnhjYXNzZXRzXCJ9IFtyZXNvdXJjZVJvb3RdIC0gRml4ZWQgY2FsbGVyLXJlc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wic3dpZnR1aVwifSBbbGlmZWN5Y2xlXSAtIFNvbGUgc3VwcG9ydGVkIGxpZmVjeWNsZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgbmV2ZXI+fSBbaW5mb1BsaXN0XSAtIENsb3NlZCBiYXNlbGluZSBjYWxsZXIgcGxpc3QgZXh0ZW5zaW9uOyBjdXJyZW50bHkgZW1wdHkuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtlbnRpdGxlbWVudHNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgZW50aXRsZW1lbnRzLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwcml2YWN5RGVjbGFyYXRpb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIHByaXZhY3kgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtjYXBhYmlsaXRpZXNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgQXBwbGUgY2FwYWJpbGl0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBWYWxpZGF0ZWQgWGNvZGUgcHJvZHVjdC9wYXRoIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBWYWxpZGF0ZWQgU3dpZnQgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvblByZWZpeCAtIFZhbGlkYXRlZCByZXZlcnNlLUROUyBvcmdhbml6YXRpb24gcHJlZml4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZUlkZW50aWZpZXIgLSBWYWxpZGF0ZWQgcmV2ZXJzZS1ETlMgYXBwbGljYXRpb24gYnVuZGxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlcGxveW1lbnRUYXJnZXQgLSBWYWxpZGF0ZWQgY2FsbGVyLXN1cHBsaWVkIGRlcGxveW1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVmFsaWRhdGVkIGRpc3BsYXkgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJTb3VyY2VzXCJ9IHNvdXJjZVJvb3QgLSBHZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wiQXNzZXRzLnhjYXNzZXRzXCJ9IHJlc291cmNlUm9vdCAtIENhbGxlci1yZXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcInN3aWZ0dWlcIn0gbGlmZWN5Y2xlIC0gU29sZSBzdXBwb3J0ZWQgbGlmZWN5Y2xlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBuZXZlcj4+fSBpbmZvUGxpc3QgLSBFbXB0eSBjYWxsZXIgcGxpc3QgZXh0ZW5zaW9uLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBwZXJtaXNzaW9ucyAtIEVtcHR5IGJhc2VsaW5lIHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBlbnRpdGxlbWVudHMgLSBFbXB0eSBiYXNlbGluZSBlbnRpdGxlbWVudHMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IHByaXZhY3lEZWNsYXJhdGlvbnMgLSBFbXB0eSBiYXNlbGluZSBwcml2YWN5IGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gY2FwYWJpbGl0aWVzIC0gRW1wdHkgYmFzZWxpbmUgQXBwbGUgY2FwYWJpbGl0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Bc3NldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEZ1bGwgc2FmZSBkZXN0aW5hdGlvbiBiZWxvdyBBc3NldHMueGNhc3NldHMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXBwbGljYXRpb25JZF0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZXNwYWNlXSAtIEtvdGxpbi9BbmRyb2lkIG5hbWVzcGFjZTsgZGVmYXVsdHMgdG8gYXBwbGljYXRpb25JZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gR2VuZXJhdGVkIEtvdGxpbiBwYWNrYWdlOyBkZWZhdWx0cyB0byBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FjdGl2aXR5Q2xhc3NOYW1lXSAtIExhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb2R1Y3ROYW1lXSAtIERldGVybWluaXN0aWMgcHJvamVjdCBwcm9kdWN0IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpc3BsYXlOYW1lXSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IFttaW5pbXVtU2RrXSAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW3RhcmdldFNka10gLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW2NvbXBpbGVTZGtdIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IFtidWlsZFRvb2xzVmVyc2lvbl0gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJzaW9uQ29kZV0gLSBQb3NpdGl2ZSBBbmRyb2lkIHZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyc2lvbk5hbWVdIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJ1bnNwZWNpZmllZFwifSBbb3JpZW50YXRpb25dIC0gQmFzZWxpbmUgb3JpZW50YXRpb24gYmVoYXZpb3IuXG4gKiBAcHJvcGVydHkge1wic3lzdGVtXCJ9IFt0aGVtZV0gLSBCYXNlbGluZSBwbGF0Zm9ybS1uYXRpdmUgdGhlbWUuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IHBlcm1pc3Npb24gc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcGxpY2F0aW9uSWQgLSBWYWxpZGF0ZWQgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBWYWxpZGF0ZWQgQW5kcm9pZCBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZU5hbWUgLSBHZW5lcmF0ZWQgS290bGluIHBhY2thZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHlDbGFzc05hbWUgLSBMYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gUHJvamVjdCBwcm9kdWN0IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBtaW5pbXVtU2RrIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSB0YXJnZXRTZGsgLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gY29tcGlsZVNkayAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBidWlsZFRvb2xzVmVyc2lvbiAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkNvZGUgLSBQb3NpdGl2ZSBBbmRyb2lkIHZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1widW5zcGVjaWZpZWRcIn0gb3JpZW50YXRpb24gLSBCYXNlbGluZSBvcmllbnRhdGlvbiBiZWhhdmlvci5cbiAqIEBwcm9wZXJ0eSB7XCJzeXN0ZW1cIn0gdGhlbWUgLSBQbGF0Zm9ybS1uYXRpdmUgdGhlbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25JbnB1dEZpbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gU2FmZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzZWxlY3RlZCBmaXhlZCBBbmRyb2lkIHJlc291cmNlIG9yIGFzc2V0IHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZnJvbnRlbmQgLSBQYXJzZXIgYWRhcHRlciBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRleHRCYWNrZW5kIC0gU2luZ2xlLSBvciBtdWx0aS1maWxlIHRleHQgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeUJhY2tlbmQgLSBCaW5hcnkgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFwcGxpY2F0aW9uQmFja2VuZCAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnRlcm9wZXJhYmlsaXR5IC0gSW50ZXJvcGVyYWJpbGl0eSBicmlkZ2UgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBwcm92aWRlciAtIFRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlci9uYXRpdmUtYmluZGluZyBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMgLSBUYXNrIDAwNSBhcmJpdHJhcnkgcmVxdWlyZWQgc2lnbmF0dXJlcywgcmVzb2x2ZWQgZGlyZWN0IGNhbGxzLCBhbmQgdm9pZCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGltbXV0YWJsZUNvbGxlY3Rpb25zIC0gVGFzayAwMDYgcmVjdXJzaXZlIGltbXV0YWJsZSBsaXN0cy9tYXBzLCB0b3RhbCBhY2Nlc3MsIGFuZCBzaXplLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcHRpb25hbFZhbHVlcyAtIFRhc2sgMDA3IGV4cGxpY2l0IG9wdGlvbmFsIHZhbHVlcywgcHJlc2VuY2UgdGVzdHMsIGFuZCBndWFyZGVkIHVud3JhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3JkZXJlZExpc3RJdGVyYXRpb24gLSBUYXNrIDAwOCBvcmRlcmVkIGltbXV0YWJsZS1saXN0IGl0ZXJhdGlvbiBhbmQgbmVhcmVzdC1sb29wIGNvbnRyb2wuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRNYXBJdGVyYXRpb24gLSBUYXNrIDAxNCBpbnNlcnRpb24tb3JkZXJlZCBpbW11dGFibGUtbWFwIHBhaXIgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb25kaXRpb25Db250cm9sbGVkTG9vcHMgLSBUYXNrIDAzMiBzdHJpY3QtQm9vbGVhbiBwcmUtY29uZGl0aW9uIGxvb3BzIGFuZCByZXNvbHZlZCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjbG9zZWRSZWNvcmRzIC0gVGFzayAwMDkgbm9taW5hbCBjbG9zZWQgaW1tdXRhYmxlIHJlY29yZHMsIGNvbnN0cnVjdGlvbiwgYW5kIG1lbWJlciByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHlwZWRFcnJvcnMgLSBUYXNrIDAxMSBub21pbmFsIHVuY2hlY2tlZCBlcnJvcnMsIHJhaXNlcywgYW5kIGV4YWN0IHR5cGVkIGNhdGNoZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MgLSBUYXNrIDAxMiBpbnZhcmlhbnQgdW5ib3VuZGVkIHR5cGUgcGFyYW1ldGVycyBhbmQgY2xvc2VkIGdlbmVyaWMgYXBwbGljYXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZWZlcmVuY2VDbGFzc2VzIC0gVGFzayAwMzMgbm9taW5hbCByZWZlcmVuY2UgY2xhc3NlcywgcHJpdmF0ZSBpbnN0YW5jZSBzdGF0ZSwgZXhhY3QgY29uc3RydWN0b3JzLCBhbmQgcmVjZWl2ZXIgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzIC0gVGFzayAwMzQgYXV0aG9yaXplZCBob3N0IGVmZmVjdHMsIHR5cGVkIGZhaWx1cmVzLCBhbmQgb3duZWQgcmVzb3VyY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSByZWdpc3RyeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VSb2xlQ2FwYWJpbGl0aWVzPn0gcm9sZXMgLSBJbmRlcGVuZGVudGx5IHJlZ2lzdGVyZWQgcm9sZXMuXG4gKiBAcHJvcGVydHkge1wic2luZ2xlXCIgfCBcIm11bHRpcGxlXCJ9IGFydGlmYWN0TXVsdGlwbGljaXR5IC0gVGFyZ2V0IGFydGlmYWN0IG11bHRpcGxpY2l0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRUcmlwIC0gV2hldGhlciBmcm9udGVuZC9iYWNrZW5kIHJvdW5kLXRyaXAgYWNjZXB0YW5jZSBpcyBkZWNsYXJlZC5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzPn0gZmVhdHVyZXMgLSBTZW1hbnRpYyBmZWF0dXJlIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzPn0gbWFwcGluZyAtIE1hcHBpbmcgZm9ybXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllcz59IGFjY2VwdGFuY2UgLSBTdGFnZXMgYW5kIHRvb2xjaGFpbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VQb2ludFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmUgLSBPbmUtYmFzZWQgbGluZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb2x1bW4gLSBPbmUtYmFzZWQgVVRGLTE2IGNvZGUtdW5pdCBjb2x1bW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgc291cmNlIG9mZnNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZUxvY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hdGluZyBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IHN0YXJ0IC0gSW5jbHVzaXZlIHN0YXJ0LlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gZW5kIC0gRXhjbHVzaXZlIGVuZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZ2lzdGVyZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFJlZ2lzdHJ5LWxvY2FsIGRldGVybWluaXN0aWMgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUsIHByZXNlcnZlZCB2ZXJiYXRpbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCAtIE9yaWdpbmFsIHNvdXJjZSBjb250ZW50LCBwcmVzZXJ2ZWQgdmVyYmF0aW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFBhcnNlciBsYW5ndWFnZSB3aGVuIGtub3duLlxuICogQHByb3BlcnR5IHtcImFwcGxpY2F0aW9uXCIgfCBcImZhY2FkZVwifSBbb3duZXJzaGlwXSAtIENhbGxlciBvciBjb21waWxlci1vd25lZCBzb3VyY2Ugcm9sZSBmb3Igc2VtYW50aWMgcHJvZ3JhbXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIn0ga2luZCAtIERpcmVjdCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBvcmlnaW5hbCByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlbGF0ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSZWxhdGVkIG9yaWdpbmFsIHJhbmdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBSZWxhdGlvbnNoaXAgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERlcml2ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJkZXJpdmVkXCJ9IGtpbmQgLSBQcm92ZW5hbmNlIGRlcml2ZWQgZnJvbSBvbmUgb3IgbW9yZSBvcmlnaW5zLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IG9yaWdpbnMgLSBPcmRlcmVkLCBub24tZW1wdHkgb3JpZ2luYWwgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3ludGhldGljT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic3ludGhldGljXCJ9IGtpbmQgLSBTb3VyY2UtZnJlZSBnZW5lcmF0ZWQgb3Igc2VtYW50aWMgc2NhZmZvbGRpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gU3RhYmxlIGh1bWFuLXJlYWRhYmxlIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIE9yZGVyZWQgcmVsYXRlZCByYW5nZXMsIHBvc3NpYmx5IGVtcHR5LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7U291cmNlT3JpZ2luIHwgRGVyaXZlZE9yaWdpbiB8IFN5bnRoZXRpY09yaWdpbn0gU2VtYW50aWNPcmlnaW4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRCeXRlUmFuZ2VcbiAqIEBwcm9wZXJ0eSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gSGFsZi1vcGVuIGdlbmVyYXRlZCBieXRlIG9mZnNldHMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTZW1hbnRpYyBvciBleHBsaWNpdCBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyBvciBiaW5hcnktcmVnaW9uIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRCeXRlTWFwcGluZ1wifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBHZW5lcmF0ZWQgb2Zmc2V0cyBhcmUgYnl0ZXMsIG5ldmVyIHRleHQgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7e3BhdGg6IHN0cmluZywgYnl0ZUxlbmd0aDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGFydGlmYWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRCeXRlUmFuZ2VbXX0gcmFuZ2VzIC0gT3JkZXJlZCBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gQXNzb2NpYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEFzc29jaWF0aW9uIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTb3VyY2UgYXNzb2NpYXRpb24gaW5kZXBlbmRlbnQgb2YgdHJhdmVyc2FsIHBvc2l0aW9uLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmcm9tIHRoZSBzZW1hbnRpYyBtb2R1bGUgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlW1wia2luZFwiXSB8IFwiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gU2VtYW50aWMgbm9kZSBraW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZXNvbHZlZCBkZWNsYXJlZC9yZWZlcmVuY2VkIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm9kZUlkIC0gUmVmZXJyaW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUm9sZX0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByZWZlcmVuY2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgc3ltYm9sIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBjYXRlZ29yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbk5vZGVJZCAtIERlY2xhcmluZyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZW1hbnRpY0RlY2xhcmF0aW9uSWRdIC0gU3RhYmxlIHNlbWFudGljIGRlY2xhcmF0aW9uIGlkZW50aXR5IGZvciByZWNvcmQsIGZpZWxkLCBhbmQgZnVuY3Rpb24gc3ltYm9scy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSZWZlcmVuY2VbXX0gcmVmZXJlbmNlcyAtIE9yZGVyZWQgcmVzb2x2ZWQgcmVmZXJlbmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcInV0ZjE2XCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBPZmZzZXQgYW5kIGNvbHVtbiB1bml0LlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBWZXJzaW9uZWQgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gRGV0ZXJtaW5pc3RpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIERldGVybWluaXN0aWMgc3ltYm9sIGluZGV4LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7XCJleGFjdFwiIHwgXCJhbmNob3JcIiB8IFwic3ludGhldGljXCJ9IE1hcHBpbmdLaW5kICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nU3BhblxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGhhbGYtb3BlbiByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7TWFwcGluZ0tpbmR9IG1hcHBpbmdLaW5kIC0gTWFwcGluZyBwcmVjaXNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgb3JpZ2luYWwgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIG5vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIHN5bWJvbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyB0b2tlbiByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIFVzZWZ1bCBzeW1ib2wgbmFtZSBmb3IgU291cmNlIE1hcCB2My5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZFNvdXJjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3V0cHV0IGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IHRleHQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBMRiBzb3VyY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbSBpZGVudGl0eSBhbmQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gT3JpZ2luYWwgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gQ2Fub25pY2FsIHNlbWFudGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gQ2Fub25pY2FsIHNlbWFudGljIHN5bWJvbCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgZ2VuZXJhdGVkIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIEdlbmVyYXRlZCBvdXRwdXQgcHJvZ3JhbSwgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQgZGlyZWN0aXZlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gR2VuZXJhdGVkIG91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmljaCBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTWFwRmlsZW5hbWUgLSBEZWZhdWx0IGV4dGVybmFsIFNvdXJjZSBNYXAgZmlsZW5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1widGV4dFwifSBraW5kIC0gUmljaCB0ZXh0IHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByYW5nZSBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBJbnRlcm9wZXJhYmxlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZU1hcEZpbGVuYW1lXSAtIExvZ2ljYWwgU291cmNlIE1hcCBzaWRlY2FyIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0ga2luZCAtIEJ5dGUgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSBieXRlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU3ludGhldGljIGFydGlmYWN0IGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gRXhwbGljaXQgdGFyZ2V0LXNjYWZmb2xkaW5nIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIFJlbGF0ZWQgc2VtYW50aWMgc291cmNlIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1RleHRBcnRpZmFjdFByb3ZlbmFuY2UgfCBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlIHwgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlfSBBcnRpZmFjdFByb3ZlbmFuY2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTZXRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBVbmlxdWUgc2FmZSByZWxhdGl2ZSBQT1NJWCBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gQ29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIFRleHQgb3IgYSBkZXRhY2hlZCBjb3B5IG9mIHRoZSBleGFjdCBnZW5lcmF0ZWQgYnl0ZXMgb24gZXZlcnkgYmluYXJ5IHJlYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gQXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gQXJ0aWZhY3Qgcm9sZTsgZXhhY3RseSBvbmUgc2V0IGFydGlmYWN0IGlzIGVudHJ5LlxuICogQHByb3BlcnR5IHtcImdlbmVyYXRlZFwifSBvd25lcnNoaXAgLSBUYXNrLTAxNSBvd25lcnNoaXAgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIFRleHQsIGJ5dGUtcmFuZ2UsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RTZXRcbiAqIEBwcm9wZXJ0eSB7XCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFN0YWJsZSBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnkgLSBQYXRoIG9mIHRoZSBzb2xlIGRlY2xhcmVkIGVudHJ5IGFydGlmYWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSBhcnRpZmFjdHMgLSBEZXRlcm1pbmlzdGljIGFydGlmYWN0IG9yZGVyLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IFttZXRhZGF0YV0gLSBEZXRhY2hlZCB0YXJnZXQtc3BlY2lmaWMgSlNPTiBtZXRhZGF0YS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERpc2NvdmVyZWRUb29sY2hhaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kIC0gRG9jdW1lbnRlZCBjYW5vbmljYWwgY29tbWFuZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHByb3BlcnR5IHtcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwifSBzb3VyY2UgLSBSZXNvbHV0aW9uIHJvdXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBGaXJzdCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBsaW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25PdXRwdXQgLSBDb21wbGV0ZSBub3JtYWxpemVkIHN0ZG91dCwgb3Igbm9ybWFsaXplZCBzdGRlcnIgd2hlbiBzdGRvdXQgaXMgZW1wdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCBzY2FsYXIgdmFsdWUgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiVHlwZVBhcmFtZXRlclwifSBraW5kIC0gRGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbi1zY29wZWQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIHR5cGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlVmFyaWFibGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIn0ga2luZCAtIFJlZmVyZW5jZSB0byBvbmUgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gU3RhYmxlIHJlZmVyZW5jZWQgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCByZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0VHlwZVxuICogQHByb3BlcnR5IHtcIkxpc3RUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbGlzdC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSBlbGVtZW50VHlwZSAtIEhvbW9nZW5lb3VzIGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiTWFwVHlwZVwifSBraW5kIC0gUmVjdXJzaXZlIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcFR5cGVcIn0ga2luZCAtIERpc3RpbmN0IGluc2VydGlvbi1vcmRlcmVkIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdXBwb3J0ZWQgc3RyaW5nIGtleSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gSG9tb2dlbmVvdXMgdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7XCJpbnNlcnRpb25cIn0gb3JkZXIgLSBDYW5vbmljYWwgZmlyc3QtaW5zZXJ0aW9uIGVuY291bnRlciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFR5cGVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbmNlL2Fic2VuY2UgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gRXhhY3QgcHJlc2VudC12YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGNvbnN0aXR1ZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZVtdfSBbYXJndW1lbnRzXSAtIEV4YWN0IGludmFyaWFudCB0eXBlIGFyZ3VtZW50czsgcmVxdWlyZWQgZm9yIGdlbmVyaWMgZGVjbGFyYXRpb25zIGFuZCBhYnNlbnQgZm9yIG5vbi1nZW5lcmljIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yVHlwZVxuICogQHByb3BlcnR5IHtcIkVycm9yVHlwZVwifSBraW5kIC0gTm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UtY2xhc3MgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZXNvdXJjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPd25lZFJlc291cmNlVHlwZVwifSBraW5kIC0gQ29tcGlsZXItb3duZWQgbGluZWFyIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIEV4YWN0IGF1dGhvcml0eSByZXNvdXJjZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkUmVmZXJlbmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTGluZWFyIHJlZmVyZW5jZSB0aGF0IG93bnMgb25lIHByb3RlY3RlZCByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3Qgb3duZWQgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUeXBlUmVmZXJlbmNlIHwgVHlwZVZhcmlhYmxlUmVmZXJlbmNlIHwgTGlzdFR5cGUgfCBNYXBUeXBlIHwgT3JkZXJlZE1hcFR5cGUgfCBPcHRpb25hbFR5cGUgfCBSZWNvcmRUeXBlIHwgUmVmZXJlbmNlVHlwZSB8IE93bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSBTZW1hbnRpY1ZhbHVlVHlwZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEVycm9yVHlwZX0gU2VtYW50aWNCaW5kaW5nVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFZvaWQgcmV0dXJuIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1widm9pZFwifSBuYW1lIC0gTm9ybWFsaXplZCBub24tdmFsdWUgZnVuY3Rpb24gcmV0dXJuLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIsIHBhcmFtZXRlcklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiTGlzdFR5cGVcIiwgZWxlbWVudFR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIk1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIG9yZGVyOiBcImluc2VydGlvblwifSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIlJlY29yZFR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nLCBhcmd1bWVudHM/OiBTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSB8IHtraW5kOiBcIlJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfX0gU2VtYW50aWNUeXBlSWRlbnRpdHkgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlSWRlbnRpdHkgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCByZXNvbHZlZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gW3R5cGVBcmd1bWVudHNdIC0gSW5mZXJyZWQgZGVjbGFyYXRpb24tb3JkZXIgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyBjYWxsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiUGFyYW1ldGVyXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhcGFiaWxpdHlJZCAtIEV4YWN0IGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uSWQgLSBFeGFjdCBvcGVyYXRpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3Qgb3BlcmF0aW9uIHJlc3VsdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gRXhhY3Qgb3JkZXJlZCBkZWNsYXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkTW92ZUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZE1vdmVFeHByZXNzaW9uXCJ9IGtpbmQgLSBFeHBsaWNpdCBsaW5lYXIgb3duZXJzaGlwIHRyYW5zZmVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE1vdmVkIG93bmVyLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHRyYW5zZmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBEZXJpdmVkIHNvdXJjZSBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRCb3Jyb3dFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCJ9IGtpbmQgLSBJbW1lZGlhdGUgbm9uZXNjYXBpbmcgcmVzb3VyY2UgYm9ycm93LlxuICogQHByb3BlcnR5IHtcInNoYXJlZFwiIHwgXCJleGNsdXNpdmVcIn0gbW9kZSAtIEJvcnJvdyBtb2RlLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IFByaXZhdGVGaWVsZFJlYWR9IGV4cHJlc3Npb24gLSBCb3Jyb3dlZCBwbGFjZS5cbiAqIEBwcm9wZXJ0eSB7T3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHR5cGUgLSBFeGFjdCBvd25lZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBib3Jyb3cgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBDb21waWxlci1hdXRob3JpemVkIGVmZmVjdCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWZmZWN0U2l0ZUlkIC0gRGV0ZXJtaW5pc3RpYyBzZW1hbnRpYyBldmFsdWF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZX0gcmVzb2x1dGlvbiAtIENvbXBsZXRlIGF1dGhvcml0eSByZXNvbHV0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3BlcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU3RhYmxlIHBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IG9yZGVyZWQgcGFyYW1ldGVyIHR5cGUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZUlkOiBzdHJpbmd9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZUlkOiBzdHJpbmd9fSBFZmZlY3RSZXNvdXJjZUZsb3cgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSByZXNvdXJjZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIHJlc291cmNlIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cIn0ga2luZCAtIENhcGFiaWxpdHkgZmFpbHVyZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIGZhaWx1cmUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgb3BlcmF0aW9uIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG9wZXJhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFZmZlY3RQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gT3JkZXJlZCBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblwifSBraW5kIC0gQXV0aG9yaXplZCBjYXBhYmlsaXR5IGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yaXR5SWQgLSBPcGFxdWUgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBDYXBhYmlsaXR5IG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRGVjbGFyYXRpb25bXX0gcmVzb3VyY2VzIC0gT3JkZXJlZCByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbltdfSBmYWlsdXJlcyAtIE9yZGVyZWQgZmFpbHVyZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uW119IG9wZXJhdGlvbnMgLSBPcmRlcmVkIG9wZXJhdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXBhYmlsaXR5QXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCJ9IHNjaGVtYSAtIEF1dGhvcml0eSBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MSB8IDJ9IHNjaGVtYVZlcnNpb24gLSBBdXRob3JpdHkgcGF5bG9hZCB2ZXJzaW9uLCBub3QgYSBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBPcGFxdWUgY2FsbGVyLXN1cHBsaWVkIGF1dGhvcml0eSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IGNhcGFiaWxpdGllcyAtIE5vcm1hbGl6ZWQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cmFjdFZlcnNpb25dIC0gRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uLCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfVtdfSBbbW9kdWxlc10gLSBTY2hlbWEtdjIgY2Fub25pY2FsIG1vZHVsZSBhdXRob3JpdGllcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3ttb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgdHlwZTogU2VtYW50aWNUeXBlTmFtZSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVOYW1lfX19IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eU5hbWVkSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9uZVwifSB8IHtraW5kOiBcImFjcXVpcmVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcImJvcnJvd1wiIHwgXCJjbG9zZVwiLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB0ZXJtaW5hbEZhaWx1cmU6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fX0gQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dFtdLCByZXR1cm5UeXBlOiBGdW5jdGlvblJldHVyblR5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9LCBlZmZlY3RzOiBbXCJob3N0XCJdLCBmYWlsdXJlczogKHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0KVtdLCByZXNvdXJjZUZsb3c6IENhcGFiaWxpdHlSZXNvdXJjZUZsb3dJbnB1dH19IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCByZXNvdXJjZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIGZhaWx1cmVzOiBDYXBhYmlsaXR5TmFtZWRJbnB1dFtdLCBvcGVyYXRpb25zOiBDYXBhYmlsaXR5T3BlcmF0aW9uSW5wdXRbXX19IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb246IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0ICovXG4vKiogQHR5cGVkZWYge3tzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDEsIGlkOiBzdHJpbmcsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXRbXSwgY29udHJhY3RWZXJzaW9uPzogc3RyaW5nfSB8IHtzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDIsIGlkOiBzdHJpbmcsIG1vZHVsZXM6IENhcGFiaWxpdHlBdXRob3JpdHlNb2R1bGVJbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eUlucHV0ICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJMaXN0TGl0ZXJhbFwifSBraW5kIC0gT3JkZXJlZCBpbW11dGFibGUgbGlzdCBsaXRlcmFsLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGVsZW1lbnRzIC0gU291cmNlLW9yZGVyZWQsIGR1cGxpY2F0ZS1wcmVzZXJ2aW5nIGVsZW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwRW50cnlcbiAqIEBwcm9wZXJ0eSB7XCJNYXBFbnRyeVwifSBraW5kIC0gU291cmNlLW9yZGVyZWQgbWFwIGluaXRpYWxpemVyIGVudHJ5LlxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBrZXkgLSBMaXRlcmFsIG5vbm51bWVyaWMgc3RyaW5nIGtleS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gdmFsdWUgLSBFbnRyeSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJNYXBMaXRlcmFsXCJ9IGtpbmQgLSBJbW11dGFibGUgbWFwIGxpdGVyYWw7IGVudHJ5IG9yZGVyIGlzIGRpYWdub3N0aWMtb25seS5cbiAqIEBwcm9wZXJ0eSB7TWFwRW50cnlbXX0gZW50cmllcyAtIFNvdXJjZSBpbml0aWFsaXplciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbCB3aXRoIG9ic2VydmFibGUgZmlyc3QtaW5zZXJ0aW9uIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlLW9yZGVyZWQgdW5pcXVlIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG9yZGVyZWQgY29uc3RydWN0aW9uIGJvdW5kYXJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RJbmRleEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJMaXN0SW5kZXhFeHByZXNzaW9uXCJ9IGtpbmQgLSBUb3RhbCB6ZXJvLWJhc2VkIGxpc3QgaW5kZXguXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0LXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5kZXggLSBJbnRlZ2VyIGluZGV4LlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTG9va3VwRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1hcExvb2t1cEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHN0cmluZy1rZXkgbWFwIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIE1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGtleSAtIFN0cmluZyBrZXkgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJwcm92ZW5cIiB8IFwiZmFpbC1vbi1hYnNlbmNlXCJ9IHRvdGFsaXR5IC0gQWRtaXNzaW9uIGJhc2lzOyBuZXZlciBvcHRpb25hbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbGxlY3Rpb25TaXplRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwifSBraW5kIC0gRmluaXRlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtIG9yIG1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge1wibGlzdFwiIHwgXCJtYXBcIn0gW2NvbGxlY3Rpb25LaW5kXSAtIFZhbGlkYXRlZCByZWNlaXZlciBraW5kIGZvciB0YXJnZXQgc3BlbGxpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZGVudGlmaWVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIklkZW50aWZpZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlZmVyZW5jZWQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVnZXJMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiSW50ZWdlckxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2YWx1ZSAtIEphdmFTY3JpcHQtc2FmZSBpbnRlZ2VyIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9vbGVhbkxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJCb29sZWFuTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtib29sZWFufSB2YWx1ZSAtIEJvb2xlYW4gdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdHJpbmdMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiU3RyaW5nTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gVW5pY29kZSBzdHJpbmcgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbE5vbmVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbE5vbmVcIn0ga2luZCAtIENvbnRleHR1YWxseSB0eXBlZCBhYnNlbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxTb21lXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxTb21lXCJ9IGtpbmQgLSBFeHBsaWNpdCBwcmVzZW50IG9wdGlvbmFsIHZhbHVlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEV4YWN0IG5vbi1vcHRpb25hbCBwcmVzZW50IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxJc1ByZXNlbnRcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbElzUHJlc2VudFwifSBraW5kIC0gUHJlc2VuY2UgdGVzdCBmb3Igb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFRlc3RlZCBvcHRpb25hbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxVbndyYXBcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFVud3JhcFwifSBraW5kIC0gR3VhcmRlZCB1bndyYXAgb2Ygb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFByb3Zlbi1wcmVzZW50IG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBVbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJVbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNVbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gb3BlcmFuZCAtIE9wZXJhbmQgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJCaW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByaWdodCAtIFJpZ2h0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FsbGVlIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBQb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgc2lnbmF0dXJlIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgcmVzb2x2ZWQgZnVuY3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhpcyBjYWxsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCByZXNvbHZlZCBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBtZXRob2QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gW3Jlc291cmNlRmxvd10gLSBPd25lZCByZWNlaXZlciB0cmFuc2l0aW9uIGFuZCBkZWNsYXJlZCB0ZXJtaW5hbC11c2UgZmFpbHVyZSB3aGVuIGFwcGxpY2FibGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNlaXZlckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNlaXZlckV4cHJlc3Npb25cIn0ga2luZCAtIFRoZSBkZWNsYXJpbmcgY2xhc3MgaW5zdGFuY2UgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NJZCAtIFN0YWJsZSBkZWNsYXJpbmcgY2xhc3MgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSByZWNlaXZlciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY2VpdmVyIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVmZXJlbmNlQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBGcmVzaCBub21pbmFsIHJlZmVyZW5jZSBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlZmVyZW5jZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHJlZmVyZW5jZSAtIEV4YWN0IGNsYXNzIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBjb25zdHJ1Y3RvciBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gY29uc3RydWN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIFJlc29sdmVkIHJlY2VpdmVyLW1ldGhvZCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY2VpdmVyIGV2YWx1YXRlZCBvbmNlIGJlZm9yZSBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIC0gU3RhYmxlIG1ldGhvZCBpZGVudGl0eSBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IG1ldGhvZCBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIG1ldGhvZCByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRSZWFkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkUmVhZFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJlYWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZFR5cGV9IHJlY29yZCAtIFJlc29sdmVkIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBDb21wbGV0ZSBmaWVsZC1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY29yZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWVtYmVyUmVhZFxuICogQHByb3BlcnR5IHtcIk1lbWJlclJlYWRcIn0ga2luZCAtIE5vbWluYWwgaW1tdXRhYmxlIHJlY29yZC1maWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY29yZC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcmVzb2x2ZWQgZmllbGQgaWRlbnRpdHkgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVtYmVyLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVtYmVyLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvck1lc3NhZ2VSZWFkXG4gKiBAcHJvcGVydHkge1wiRXJyb3JNZXNzYWdlUmVhZFwifSBraW5kIC0gVGhlIHNvbGUgcG9ydGFibGUgZXJyb3IgbWVtYmVyIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHJlY2VpdmVyIC0gQ2F0Y2ggYmluZGluZyB3aG9zZSBpbW11dGFibGUgbWVzc2FnZSBpcyByZWFkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXNzYWdlLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVzc2FnZS1tZW1iZXIgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgT3B0aW9uYWxOb25lIHwgT3B0aW9uYWxTb21lIHwgT3B0aW9uYWxJc1ByZXNlbnQgfCBPcHRpb25hbFVud3JhcCB8IExpc3RMaXRlcmFsIHwgTWFwTGl0ZXJhbCB8IE9yZGVyZWRNYXBMaXRlcmFsIHwgTGlzdEluZGV4RXhwcmVzc2lvbiB8IE1hcExvb2t1cEV4cHJlc3Npb24gfCBDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb24gfCBVbmFyeUV4cHJlc3Npb24gfCBCaW5hcnlFeHByZXNzaW9uIHwgQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbiB8IE93bmVkTW92ZUV4cHJlc3Npb24gfCBPd25lZEJvcnJvd0V4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IFJlZmVyZW5jZUNvbnN0cnVjdGlvbiB8IFJlY29yZENvbnN0cnVjdGlvbiB8IE1lbWJlclJlYWQgfCBQcml2YXRlRmllbGRSZWFkIHwgRXJyb3JNZXNzYWdlUmVhZH0gRXhwcmVzc2lvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvY2FsRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJMb2NhbERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIGxvY2FsIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhwbGljaXQgbG9jYWwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgbGF0ZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbml0aWFsaXplciAtIFJlcXVpcmVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBc3NpZ25tZW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQXNzaWdubWVudFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gdGFyZ2V0IC0gU2ltcGxlIGxvY2FsIGFzc2lnbm1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQXNzaWduZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTmV3IGZpZWxkIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXR1cm5TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSZXR1cm5TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gW2V4cHJlc3Npb25dIC0gUmV0dXJuZWQgZXhwcmVzc2lvbjsgYWJzZW50IGV4YWN0bHkgZm9yIGEgYmFyZSB2b2lkIHJldHVybi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJFeHByZXNzaW9uU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0NhbGxFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEEgZGlyZWN0LCByZWNlaXZlciwgb3IgYXV0aG9yaXplZCBjYWxsIHdob3NlIHJlc29sdmVkIHJldHVybiB0eXBlIGlzIHZvaWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZlN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIklmU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJyYW5jaCBjb25kaXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjb25zZXF1ZW50IC0gVHJ1ZSBicmFuY2guXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbYWx0ZXJuYXRlXSAtIEZhbHNlIGJyYW5jaCwgYWJzZW50IHdoZW4gZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWx1ZUJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJWYWx1ZUJpbmRpbmdcIn0ga2luZCAtIEl0ZXJhdGlvbi1iaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEJvZHktbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGxpc3QgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIEl0ZXJhdGlvbiBiaW5kaW5ncyBhcmUgYWx3YXlzIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hTdGF0ZW1lbnRcIn0ga2luZCAtIE9yZGVyZWQgbGlzdC1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGlzdCAtIExpc3QgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaE1hcFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIn0ga2luZCAtIEluc2VydGlvbi1vcmRlcmVkIG1hcCBwYWlyLWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtYXAgLSBPcmRlcmVkLW1hcCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSBrZXlCaW5kaW5nIC0gSW1tdXRhYmxlIHN0cmluZy1rZXkgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGhvbW9nZW5lb3VzIHZhbHVlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2hpbGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJXaGlsZVN0YXRlbWVudFwifSBraW5kIC0gU3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0ZWQgYmVmb3JlIGV2ZXJ5IGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBPcmRlcmVkIGxvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnJlYWtTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJCcmVha1N0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGJyZWFrIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb250aW51ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkNvbnRpbnVlU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgY29udGludWUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiRXJyb3JDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIENvbnN0cnVjdGlvbiBvZiBvbmUgZGVjbGFyZWQgdW5jaGVja2VkIGVycm9yLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGVycm9yIC0gRXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtZXNzYWdlIC0gU29sZSBpbW11dGFibGUgc3RyaW5nIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlIGFuZCBtZXNzYWdlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJhaXNlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmFpc2VTdGF0ZW1lbnRcIn0ga2luZCAtIEFicnVwdCB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge0Vycm9yQ29uc3RydWN0aW9ufSBlcnJvciAtIEV4YWN0IGNvbnN0cnVjdGVkIHNlbWFudGljIGVycm9yLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByYWlzZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByYWlzZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhdGNoQmluZGluZ1xuICogQHByb3BlcnR5IHtcIkNhdGNoQmluZGluZ1wifSBraW5kIC0gRXhhY3QtaGFuZGxlciBiaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEhhbmRsZXItbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IHR5cGUgLSBFeGFjdCBjYXVnaHQgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIENhdGNoIGJpbmRpbmdzIGFyZSBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgYmluZGluZyByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRyeVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlRyeVN0YXRlbWVudFwifSBraW5kIC0gT25lIGJvZHkgYW5kIG9uZSBleGFjdCB0eXBlZCBoYW5kbGVyLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgdHJ5L2hhbmRsZXIgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHJ5L2NhdGNoIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgVHJ5U3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCbG9ja1xuICogQHByb3BlcnR5IHtcIkJsb2NrXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1N0YXRlbWVudFtdfSBzdGF0ZW1lbnRzIC0gT3JkZXJlZCBzdGF0ZW1lbnRzIGluIG9uZSBsZXhpY2FsIHNjb3BlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIFJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZ1bmN0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRGaWVsZFxuICogQHByb3BlcnR5IHtcIlJlY29yZEZpZWxkXCJ9IGtpbmQgLSBDbG9zZWQgcmVjb3JkLWZpZWxkIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlY29yZCBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1JlY29yZEZpZWxkW119IGZpZWxkcyAtIE9yZGVyZWQgdW5pcXVlIHZpc2libGUgZmllbGRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkXCJ9IGtpbmQgLSBEZWNsYXJpbmctY2xhc3MtcHJpdmF0ZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBmaWVsZCBuYW1lIGluc2lkZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9ubHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uc3RydWN0b3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIn0ga2luZCAtIEV4YWN0IGNvbXBsZXRlIHByaXZhdGUtc3RhdGUgaW5pdGlhbGl6ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgY29uc3RydWN0b3IgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRmllbGQtb3JkZXIgaW5pdGlhbGl6YXRpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0b3IgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjb25zdHJ1Y3RvciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFJlY2VpdmVyLWJvdW5kIGNsYXNzIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBtZXRob2QgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgbWV0aG9kIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBNZXRob2QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1ldGhvZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCBFcnJvckRlY2xhcmF0aW9uIHwgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uIHwgRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbiB8IEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uIHwgUmVjb3JkRmllbGQgfCBQcml2YXRlRmllbGQgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlciB8IFBhcmFtZXRlciB8IFZhbHVlQmluZGluZyB8IENhdGNoQmluZGluZyB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBFcnJvckNvbnN0cnVjdGlvbiB8IEVycm9yVHlwZSB8IE1hcEVudHJ5IHwgU2VtYW50aWNWYWx1ZVR5cGUgfCBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZVdpdGhvdXRMb2NhdGlvbnMgKi9cblxuZXhwb3J0IHt9XG4iXX0=
|
package/docs/android.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Android application target
|
|
2
|
+
|
|
3
|
+
Task 028 adds the target-only `android` application backend. It consumes a parsed semantic module or complete Task 010 program and returns an immutable `GeneratedArtifactSet`; it does not parse Android or Kotlin source, add Android nodes to semantic IR, discover source files, or expose a filesystem writer.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
const program = parseProgram({entryModule: "main", sources})
|
|
7
|
+
const project = generateProgramArtifactSet({
|
|
8
|
+
language: "android",
|
|
9
|
+
program,
|
|
10
|
+
role: "application"
|
|
11
|
+
})
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Every path is below fixed root `generated/android-app`. The set contains pinned settings/root/app Gradle Kotlin scripts, `gradle.properties`, one allowlisted manifest, mapped per-module semantic Kotlin, a checked scalar/output runtime, one `Activity`, one native XML `TextView`, label/theme resources, paired legacy full-backup and Android 12+ data-extraction exclusion resources, one JUnit unit test, a platform-only instrumentation test, and `semantifold-project.json`. There is no Gradle wrapper JAR or distribution, SDK, Maven archive, APK, key, cache, or binary tool in the returned project.
|
|
15
|
+
|
|
16
|
+
## Application contract
|
|
17
|
+
|
|
18
|
+
Configuration is a closed plain record. Unknown keys and public filesystem controls such as `outputDirectory`, `overwrite`, `sourcePath`, `sdkPath`, or `keystore` fail with `INVALID_APPLICATION_INPUT` or `INVALID_APPLICATION_CONFIGURATION` before source rendering.
|
|
19
|
+
|
|
20
|
+
Defaults are:
|
|
21
|
+
|
|
22
|
+
| Field | Default / accepted baseline |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `applicationId` | `dev.semantifold.generated` |
|
|
25
|
+
| `namespace` | application ID |
|
|
26
|
+
| `packageName` | namespace |
|
|
27
|
+
| `activityClassName` | `MainActivity` |
|
|
28
|
+
| `productName`, `displayName` | `Semantifold` |
|
|
29
|
+
| `minimumSdk`, `targetSdk`, `compileSdk` | `23`, `35`, `35` |
|
|
30
|
+
| `buildToolsVersion` | `35.0.0` |
|
|
31
|
+
| `versionCode`, `versionName` | `1`, `1.0.0` |
|
|
32
|
+
| `orientation`, `theme` | `unspecified`, `system` |
|
|
33
|
+
|
|
34
|
+
Application/package segments are lowercase Java/Kotlin identifiers and cannot be keywords. The activity is an ASCII upper-camel identifier and cannot shadow an unqualified symbol used by the generated Activity, unit test, or instrumentation scaffold. Labels are trimmed Unicode-scalar strings of at most 64 characters. SDK values are the qualified fixed matrix, version code is positive and Android-bounded, and version name is canonical. The permission allowlist is empty.
|
|
35
|
+
|
|
36
|
+
The manifest contains exactly one exported launcher activity and no permissions, services, receivers, providers, deep links, network/storage access, or background work. It keeps `android:allowBackup="false"`, points `android:fullBackupContent` to the owned `@xml/backup_rules` exclusions for API 23–30, and points `android:dataExtractionRules` to the owned `@xml/data_extraction_rules` cloud-backup/device-transfer exclusions for Android 12+. Both resources exclude every supported storage domain. The activity runs the semantic entry afresh and joins captured output with one LF between printed values. The sole native `TextView` has ID `semantifold_output` and is accessibility-important; its visible text is the accessibility-node text, so no redundant `contentDescription` is generated.
|
|
37
|
+
|
|
38
|
+
## Semantic and provenance boundary
|
|
39
|
+
|
|
40
|
+
The Android backend preflights the complete program using the independent Kotlin backend capability profile. It then emits application-owned namespaced Kotlin modules and threads one output sink through resolved calls. The sink is reset for every entry invocation. Kotlin identifiers, literals, operators, calls, functions, parameters, locals, and statements retain rich Task 015 mappings and Source Map v3 projections to all original source identities and filenames. Gradle, Android manifest, resource, activity, lifecycle, and test syntax remains synthetic or configuration-derived.
|
|
41
|
+
|
|
42
|
+
`SemantifoldAndroidProject` version 1 records exact normalized configuration, the ordered owned path set and hashes, excluded build/cache paths, input hashes, field-to-output ranges, semantic source/module/import/entry identities, synthetic scaffolding, and exact toolchain requirements. Caller resources and assets are detached before return. Binary inputs use full-content byte provenance.
|
|
43
|
+
|
|
44
|
+
Resources are opt-in closed records `{path, content, mediaType, sha256}`. Supported resource paths are `raw/<safe-name>` and PNG/WebP density drawables under `drawable-mdpi`, `drawable-hdpi`, `drawable-xhdpi`, `drawable-xxhdpi`, or `drawable-xxxhdpi`. Assets use safe portable relative paths below `app/src/main/assets`. Traversal, absolute/NUL/Unicode-ambiguous paths, unsupported qualifiers/types, checksum mismatches, generated-file conflicts, duplicate Android identifiers in one resource configuration, case-fold collisions, and file/directory-prefix collisions fail before any artifact set is returned.
|
|
45
|
+
|
|
46
|
+
Generation itself is byte-identical and has no filesystem state, so stale files cannot survive inside its returned ownership list. The repository-private acceptance helper writes only to a caller-created empty mode-0700 temporary directory, uses exclusive file creation, verifies every checksum, refuses symlink/non-empty roots, and is not exported or packed. It is not a durable materializer.
|
|
47
|
+
|
|
48
|
+
## Toolchain and offline acceptance
|
|
49
|
+
|
|
50
|
+
The qualified application lane is independent of the generic Kotlin/JVM compiler lane:
|
|
51
|
+
|
|
52
|
+
- Gradle `8.13`, distribution SHA-256 `20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78`
|
|
53
|
+
- Android Gradle Plugin `8.11.1`
|
|
54
|
+
- Kotlin Gradle plugin and command-line compiler `2.2.10`, compiler ZIP SHA-256 `302d1d8e671e5c3207e6ed62ff11fb555462a628e22a1158254dcaaf7e7394bc`
|
|
55
|
+
- Eclipse Temurin JDK `21.0.8+9`, archive SHA-256 `f2dc5418092c43003db8f9005c4a286e1c0104fea96ccdd49e8ebd037cac9219`
|
|
56
|
+
- command-line tools build `11076708`, archive SHA-256 `2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258`
|
|
57
|
+
- platform/target API `35`, Build Tools `35.0.0`
|
|
58
|
+
- emulator `35.6.11` build `13610412` and `system-images;android-35;google_apis;x86_64` revision `9`
|
|
59
|
+
|
|
60
|
+
API 35 and Build Tools 35.0.0 are owner-pinned acceptance boundaries rather than ambient latest-version choices. Generated lint keeps warnings as errors and aborts on findings, while disabling only `MissingApplicationIcon` for the deliberately icon-free baseline, `OldTargetApi` for the conflicting moving-latest-target recommendation, and `GradleDependency` for moving compile-SDK and Build-Tools version advice that conflicts with that pinned matrix.
|
|
61
|
+
|
|
62
|
+
Every Android SDK payload is a direct immutable official archive verified before extraction; no mutable package channel participates:
|
|
63
|
+
|
|
64
|
+
| SDK input | Exact archive | SHA-256 |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| command-line tools | `commandlinetools-linux-11076708_latest.zip` | `2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258` |
|
|
67
|
+
| platform-tools 37.0.1 | `platform-tools_r37.0.1-linux.zip` | `d230f13842f60f782a8645f9c813f8f845bf36089ea7289f28c48f17979313f1` |
|
|
68
|
+
| Android Platform 35 revision 2 | `platform-35_r02.zip` | `0988cacad01b38a18a47bac14a0695f246bc76c1b06c0eeb8eb0dc825ab0c8e0` |
|
|
69
|
+
| Build Tools 35.0.0 | `build-tools_r35_linux.zip` | `bd3a4966912eb8b30ed0d00b0cda6b6543b949d5ffe00bea54c04c81e1561d88` |
|
|
70
|
+
| Emulator 35.6.11 build 13610412 | `emulator-linux_x64-13610412.zip` | `2fe2b56fe93ce75e1d478a40162131381d911c355efeaedb54dd1e0d0897a5cf` |
|
|
71
|
+
| Google APIs x86_64 API-35 revision 9 | `x86_64-35_r09.zip` | `c67b9ba0ff5bc0eb6d046871bfa228af14d4d47b02f0cdae94f048e511b7566e` |
|
|
72
|
+
|
|
73
|
+
The Android repository archives above come from Google's official [`repository2-3.xml`](https://dl.google.com/android/repository/repository2-3.xml) and [`sys-img2-3.xml`](https://dl.google.com/android/repository/sys-img/google_apis/sys-img2-3.xml) package metadata; the emulator build and published SHA-256 come from the official [Android Emulator download archive](https://developer.android.com/studio/emulator_archive). `scripts/bootstrap-android.sh` is the only online preparation stage. It verifies immutable archives, installs them directly, registers the archived emulator through a checked-in exact local-package descriptor, verifies their embedded exact revision metadata, creates the named API-35 AVD, and warms the fixed Gradle cache with a disposable project. `scripts/accept-android.sh` generates a fresh project, creates its ephemeral debug key only inside the private acceptance root, and runs lint, JUnit, debug application assembly, and instrumentation assembly with Gradle `--offline` plus pinned UTF-8, English, UTC, heap, no-daemon, no-parallel, no-build-cache settings. Missing tools, package revisions, or cache content fail with `SEMANTIFOLD_ANDROID_INFRASTRUCTURE` rather than skipping.
|
|
74
|
+
|
|
75
|
+
The only declared Gradle library dependencies are exact non-transitive `testImplementation("junit:junit:4.13.2")` and `testRuntimeOnly("org.hamcrest:hamcrest-core:1.3")`. Hamcrest Core supplies the `org.hamcrest.SelfDescribing` linkage that JUnit's Gradle runner loads before generated test code; it does not enter application compilation or runtime. The generated unit test uses only JUnit's `@Test` annotation, compares the platform list directly, and raises a platform `AssertionError`. Kotlin's implicit stdlib dependency is disabled. Compilation reads the checksum-pinned compiler distribution's `kotlin-stdlib.jar` directly as a compiler task input, not as a Gradle dependency; generated bytecode uses JVM/Android platform facilities and the file is never placed on a runtime configuration or packaging input. Acceptance requires an empty debug runtime dependency graph, exactly JUnit and Hamcrest Core in the unit-test runtime graph, and no JUnit, Hamcrest, `kotlin/jvm/internal`, or `kotlin/collections` payload in the application APK.
|
|
76
|
+
|
|
77
|
+
Real emulator acceptance runs only in TensorBuzz with `/dev/kvm:/dev/kvm`. It fails before startup unless `/dev/kvm` is usable and `emulator -accel-check` affirms acceleration, exclusively locks fixed `emulator-5580` plus its private adb server on port `5581`, never invokes `adb root` or changes KVM permissions, boots with `-accel on -wipe-data -no-snapshot`, installs both APKs, launches the app, and invokes the runner through the explicit `<applicationId>.test` test application ID. Exact UTF-8 output is passed as base64 to platform instrumentation. The test checks the native labelled view, exact text, visibility, class, accessibility importance, absent content description, and activity recreation. CI then stops that emulator, boots a second fresh emulator, reinstalls/relaunches, and repeats. Screenshots/UI XML are always produced; failure also records logcat, adb state, emulator command line, and an exact reason.
|
|
78
|
+
|
|
79
|
+
Local environments without KVM do not attempt software emulation. Release signing, physical devices, accounts, Play Console, publication, Compose, fragments/navigation, WebView, platform channels, NDK/JNI, reflection, permissions, services, storage/networking, and background behavior are outside Task 028.
|
package/docs/architecture.md
CHANGED
|
@@ -14,6 +14,8 @@ Task 018's C path follows these layers through the unchanged root-bundled privat
|
|
|
14
14
|
|
|
15
15
|
The [iOS application target](ios.md) is a target-only spoke on that artifact boundary. `src/backends/ios.js` reuses Task 010 project/source ownership and the Task 022 Tasks 001–004 Swift capability profile, validates the complete graph/configuration/asset layout, then emits captured namespaced Swift plus synthetic SwiftUI, unsigned project, test, asset-catalog, and versioned manifest artifacts. Apple lifecycle/configuration/resources do not enter semantic IR, and generation performs no filesystem access. There is no public project materializer: transactional create-only directory publication is deferred because Node's public filesystem API cannot combine atomic no-replace publication with descriptor-relative no-follow staging and cleanup without a separately authorized native boundary. No best-effort writer replaces that guarantee. Linux semantic/tool/packed-generator proofs are implemented; Apple/Xcode/Simulator proof remains explicitly deferred.
|
|
16
16
|
|
|
17
|
+
The [Android application target](android.md) is a Kotlin/Android spoke on the same boundary. `src/backends/android.js` validates a complete Kotlin-supported semantic module or Task 010 program plus closed Android configuration/resource inputs before writer allocation, then emits mapped namespaced semantic Kotlin and synthetic Gradle/manifest/Activity/native-view/test artifacts under one fixed ownership root. Android lifecycle/UI/build syntax stays outside semantic IR, and generic Kotlin/JVM output is unchanged. Public generation remains in-memory; a repository-private create-only helper materializes only fresh mode-0700 acceptance directories. The actual build is offline, while TensorBuzz alone prepares official caches and runs two clean KVM-accelerated API-35 emulator boots.
|
|
18
|
+
|
|
17
19
|
`src/toolchains.js` resolves configured absolute overrides or one unambiguous canonical PATH executable, runs a bounded version command, and returns its exact real path and captured version. Alongside language compilers/runtimes, browser Wasm defines exact WABT 1.0.36 and Chrome/Chromium 152.0.7977.82 contracts through `SEMANTIFOLD_WASM_VALIDATE` and `SEMANTIFOLD_CHROMIUM`. `src/acceptance.js` validates all artifacts and ordered stages before filesystem mutation, materializes only safe generated paths in a unique temporary directory, invokes exact executable/argument arrays without a shell, fixes `LANG`, `LC_ALL`, and `TZ`, captures output, distinguishes discovery/version/launch/timeout/nonzero failures, records the precise failed stage, and removes the directory. The browser-specific acceptance owner additionally serves a materialized artifact directory on loopback under strict CSP and owns the headless browser process group. No runner performs tool installation or runtime download.
|
|
18
20
|
|
|
19
21
|
## Browser WebAssembly target
|