appium 2.0.0-beta.2 → 2.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +9 -9
  2. package/build/check-npm-pack-files.js +23 -0
  3. package/build/commands-yml/parse.js +319 -0
  4. package/build/commands-yml/validator.js +130 -0
  5. package/build/index.js +19 -0
  6. package/build/lib/appium-config.schema.json +0 -0
  7. package/build/lib/appium.js +160 -53
  8. package/build/lib/cli/args.js +115 -279
  9. package/build/lib/cli/driver-command.js +11 -1
  10. package/build/lib/cli/extension-command.js +60 -8
  11. package/build/lib/cli/extension.js +30 -7
  12. package/build/lib/cli/npm.js +43 -29
  13. package/build/lib/cli/parser.js +156 -89
  14. package/build/lib/cli/plugin-command.js +11 -1
  15. package/build/lib/cli/utils.js +29 -3
  16. package/build/lib/config-file.js +141 -0
  17. package/build/lib/config.js +53 -65
  18. package/build/lib/driver-config.js +42 -19
  19. package/build/lib/drivers.js +8 -4
  20. package/build/lib/ext-config-io.js +165 -0
  21. package/build/lib/extension-config.js +130 -61
  22. package/build/lib/grid-register.js +22 -24
  23. package/build/lib/logger.js +3 -3
  24. package/build/lib/logsink.js +11 -13
  25. package/build/lib/main.js +197 -77
  26. package/build/lib/plugin-config.js +21 -11
  27. package/build/lib/plugins.js +4 -2
  28. package/build/lib/schema/appium-config-schema.js +253 -0
  29. package/build/lib/schema/arg-spec.js +120 -0
  30. package/build/lib/schema/cli-args.js +188 -0
  31. package/build/lib/schema/cli-transformers.js +76 -0
  32. package/build/lib/schema/index.js +36 -0
  33. package/build/lib/schema/keywords.js +72 -0
  34. package/build/lib/schema/schema.js +357 -0
  35. package/build/lib/utils.js +44 -99
  36. package/build/postinstall.js +90 -0
  37. package/build/test/cli/cli-e2e-specs.js +221 -0
  38. package/build/test/cli/cli-helpers.js +86 -0
  39. package/build/test/cli/cli-specs.js +71 -0
  40. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  41. package/build/test/cli/schema-args-specs.js +48 -0
  42. package/build/test/cli/schema-e2e-specs.js +47 -0
  43. package/build/test/config-e2e-specs.js +112 -0
  44. package/build/test/config-file-e2e-specs.js +209 -0
  45. package/build/test/config-file-specs.js +281 -0
  46. package/build/test/config-specs.js +159 -0
  47. package/build/test/driver-e2e-specs.js +435 -0
  48. package/build/test/driver-specs.js +321 -0
  49. package/build/test/ext-config-io-specs.js +181 -0
  50. package/build/test/extension-config-specs.js +365 -0
  51. package/build/test/fixtures/allow-feat.txt +5 -0
  52. package/build/test/fixtures/caps.json +3 -0
  53. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  54. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  55. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  56. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  57. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  58. package/build/test/fixtures/config/appium.config.good.js +40 -0
  59. package/build/test/fixtures/config/appium.config.good.json +33 -0
  60. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  61. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  62. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  63. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  64. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  65. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  66. package/build/test/fixtures/config/nodeconfig.json +3 -0
  67. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  68. package/build/test/fixtures/default-args.js +35 -0
  69. package/build/test/fixtures/deny-feat.txt +5 -0
  70. package/build/test/fixtures/driver.schema.js +20 -0
  71. package/build/test/fixtures/extensions.yaml +27 -0
  72. package/build/test/fixtures/flattened-schema.js +504 -0
  73. package/build/test/fixtures/plugin.schema.js +20 -0
  74. package/build/test/fixtures/schema-with-extensions.js +28 -0
  75. package/build/test/grid-register-specs.js +74 -0
  76. package/build/test/helpers.js +75 -0
  77. package/build/test/logger-specs.js +76 -0
  78. package/build/test/npm-specs.js +20 -0
  79. package/build/test/parser-specs.js +314 -0
  80. package/build/test/plugin-e2e-specs.js +316 -0
  81. package/build/test/schema/arg-spec-specs.js +70 -0
  82. package/build/test/schema/cli-args-specs.js +431 -0
  83. package/build/test/schema/schema-specs.js +389 -0
  84. package/build/test/utils-specs.js +266 -0
  85. package/index.js +11 -0
  86. package/lib/appium-config.schema.json +278 -0
  87. package/lib/appium.js +207 -65
  88. package/lib/cli/args.js +174 -375
  89. package/lib/cli/driver-command.js +4 -0
  90. package/lib/cli/extension-command.js +70 -5
  91. package/lib/cli/extension.js +25 -5
  92. package/lib/cli/npm.js +86 -18
  93. package/lib/cli/parser.js +257 -79
  94. package/lib/cli/plugin-command.js +4 -0
  95. package/lib/cli/utils.js +21 -1
  96. package/lib/config-file.js +227 -0
  97. package/lib/config.js +84 -63
  98. package/lib/driver-config.js +66 -11
  99. package/lib/drivers.js +4 -1
  100. package/lib/ext-config-io.js +287 -0
  101. package/lib/extension-config.js +225 -67
  102. package/lib/grid-register.js +27 -24
  103. package/lib/logger.js +1 -1
  104. package/lib/logsink.js +10 -7
  105. package/lib/main.js +214 -77
  106. package/lib/plugin-config.js +35 -6
  107. package/lib/plugins.js +1 -0
  108. package/lib/schema/appium-config-schema.js +287 -0
  109. package/lib/schema/arg-spec.js +222 -0
  110. package/lib/schema/cli-args.js +285 -0
  111. package/lib/schema/cli-transformers.js +123 -0
  112. package/lib/schema/index.js +2 -0
  113. package/lib/schema/keywords.js +135 -0
  114. package/lib/schema/schema.js +577 -0
  115. package/lib/utils.js +42 -88
  116. package/package.json +55 -84
  117. package/postinstall.js +71 -0
  118. package/types/appium-config.d.ts +197 -0
  119. package/types/types.d.ts +201 -0
  120. package/CHANGELOG.md +0 -3515
  121. package/build/lib/cli/parser-helpers.js +0 -82
  122. package/lib/cli/parser-helpers.js +0 -79
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("source-map-support/register");
9
+
10
+ const schema = {
11
+ $schema: 'http://json-schema.org/draft-07/schema',
12
+ additionalProperties: false,
13
+ description: 'A schema for Appium configuration files',
14
+ properties: {
15
+ server: {
16
+ additionalProperties: false,
17
+ description: 'Configuration when running Appium as a server',
18
+ properties: {
19
+ address: {
20
+ $comment: 'I think hostname covers both DNS and IPv4...could be wrong',
21
+ appiumCliAliases: ['a'],
22
+ default: '0.0.0.0',
23
+ description: 'IP address to listen on',
24
+ format: 'hostname',
25
+ title: 'address config',
26
+ type: 'string'
27
+ },
28
+ 'allow-cors': {
29
+ description: 'Whether the Appium server should allow web browser connections from any host',
30
+ title: 'allow-cors config',
31
+ type: 'boolean',
32
+ default: false
33
+ },
34
+ 'allow-insecure': {
35
+ appiumCliTransformer: 'csv',
36
+ default: [],
37
+ description: 'Set which insecure features are allowed to run in this server\'s sessions. Features are defined on a driver level; see documentation for more details. Note that features defined via "deny-insecure" will be disabled, even if also listed here. If string, a path to a text file containing policy or a comma-delimited list.',
38
+ items: {
39
+ type: 'string'
40
+ },
41
+ title: 'allow-insecure config',
42
+ type: 'array',
43
+ uniqueItems: true
44
+ },
45
+ 'base-path': {
46
+ appiumCliAliases: ['pa'],
47
+ default: '',
48
+ description: 'Base path to use as the prefix for all webdriver routes running on the server',
49
+ title: 'base-path config',
50
+ type: 'string'
51
+ },
52
+ 'callback-address': {
53
+ appiumCliAliases: ['ca'],
54
+ description: 'Callback IP address (default: same as "address")',
55
+ title: 'callback-address config',
56
+ type: 'string'
57
+ },
58
+ 'callback-port': {
59
+ appiumCliAliases: ['cp'],
60
+ default: 4723,
61
+ description: 'Callback port (default: same as "port")',
62
+ maximum: 65535,
63
+ minimum: 1,
64
+ title: 'callback-port config',
65
+ type: 'integer'
66
+ },
67
+ 'debug-log-spacing': {
68
+ default: false,
69
+ description: 'Add exaggerated spacing in logs to help with visual inspection',
70
+ title: 'debug-log-spacing config',
71
+ type: 'boolean'
72
+ },
73
+ 'default-capabilities': {
74
+ $comment: 'TODO',
75
+ appiumCliAliases: ['dc'],
76
+ description: 'Set the default desired capabilities, which will be set on each session unless overridden by received capabilities. If a string, a path to a JSON file containing the capabilities, or raw JSON.',
77
+ title: 'default-capabilities config',
78
+ type: 'object'
79
+ },
80
+ 'deny-insecure': {
81
+ $comment: 'Allowed values are defined by drivers',
82
+ appiumCliTransformer: 'csv',
83
+ default: [],
84
+ description: 'Set which insecure features are not allowed to run in this server\'s sessions. Features are defined on a driver level; see documentation for more details. Features listed here will not be enabled even if also listed in "allow-insecure", and even if "relaxed-security" is enabled. If string, a path to a text file containing policy or a comma-delimited list.',
85
+ items: {
86
+ type: 'string'
87
+ },
88
+ title: 'deny-insecure config',
89
+ type: 'array',
90
+ uniqueItems: true
91
+ },
92
+ driver: {
93
+ description: 'Driver-specific configuration. Keys should correspond to driver package names',
94
+ properties: {},
95
+ title: 'driver config',
96
+ type: 'object'
97
+ },
98
+ 'keep-alive-timeout': {
99
+ appiumCliAliases: ['ka'],
100
+ default: 600,
101
+ description: 'Number of seconds the Appium server should apply as both the keep-alive timeout and the connection timeout for all requests. A value of 0 disables the timeout.',
102
+ minimum: 0,
103
+ title: 'keep-alive-timeout config',
104
+ type: 'integer'
105
+ },
106
+ 'local-timezone': {
107
+ default: false,
108
+ description: 'Use local timezone for timestamps',
109
+ title: 'local-timezone config',
110
+ type: 'boolean'
111
+ },
112
+ log: {
113
+ appiumCliAliases: ['g'],
114
+ appiumCliDest: 'logFile',
115
+ description: 'Also send log output to this file',
116
+ title: 'log config',
117
+ type: 'string'
118
+ },
119
+ 'log-filters': {
120
+ $comment: 'TODO',
121
+ description: 'One or more log filtering rules',
122
+ items: {
123
+ type: 'string'
124
+ },
125
+ title: 'log-filters config',
126
+ type: 'array'
127
+ },
128
+ 'log-level': {
129
+ appiumCliDest: 'loglevel',
130
+ default: 'debug',
131
+ description: 'Log level (console[:file])',
132
+ enum: ['info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error'],
133
+ title: 'log-level config',
134
+ type: 'string'
135
+ },
136
+ 'log-no-colors': {
137
+ default: false,
138
+ description: 'Do not use color in console output',
139
+ title: 'log-no-colors config',
140
+ type: 'boolean'
141
+ },
142
+ 'log-timestamp': {
143
+ default: false,
144
+ description: 'Show timestamps in console output',
145
+ title: 'log-timestamp config',
146
+ type: 'boolean'
147
+ },
148
+ 'long-stacktrace': {
149
+ default: false,
150
+ description: 'Add long stack traces to log entries. Recommended for debugging only.',
151
+ title: 'long-stacktrace config',
152
+ type: 'boolean'
153
+ },
154
+ 'no-perms-check': {
155
+ default: false,
156
+ description: 'Do not check that needed files are readable and/or writable',
157
+ title: 'no-perms-check config',
158
+ type: 'boolean'
159
+ },
160
+ nodeconfig: {
161
+ $comment: 'Selenium Grid 3 is unmaintained and Selenium Grid 4 no longer supports this file.',
162
+ description: 'Path to configuration JSON file to register Appium as a node with Selenium Grid 3; otherwise the configuration itself',
163
+ title: 'nodeconfig config',
164
+ type: 'object'
165
+ },
166
+ plugin: {
167
+ description: 'Plugin-specific configuration. Keys should correspond to plugin package names',
168
+ properties: {},
169
+ title: 'plugin config',
170
+ type: 'object'
171
+ },
172
+ port: {
173
+ appiumCliAliases: ['p'],
174
+ default: 4723,
175
+ description: 'Port to listen on',
176
+ maximum: 65535,
177
+ minimum: 1,
178
+ title: 'port config',
179
+ type: 'integer'
180
+ },
181
+ 'relaxed-security': {
182
+ default: false,
183
+ description: 'Disable additional security checks, so it is possible to use some advanced features, provided by drivers supporting this option. Only enable it if all the clients are in the trusted network and it\'s not the case if a client could potentially break out of the session sandbox. Specific features can be overridden by using "deny-insecure"',
184
+ title: 'relaxed-security config',
185
+ type: 'boolean',
186
+ appiumCliDest: 'relaxedSecurityEnabled'
187
+ },
188
+ 'session-override': {
189
+ default: false,
190
+ description: 'Enables session override (clobbering)',
191
+ title: 'session-override config',
192
+ type: 'boolean'
193
+ },
194
+ 'strict-caps': {
195
+ default: false,
196
+ description: 'Cause sessions to fail if desired caps are sent in that Appium does not recognize as valid for the selected device',
197
+ title: 'strict-caps config',
198
+ type: 'boolean'
199
+ },
200
+ tmp: {
201
+ appiumCliDest: 'tmpDir',
202
+ description: 'Absolute path to directory Appium can use to manage temp files. Defaults to C:\\Windows\\Temp on Windows and /tmp otherwise.',
203
+ title: 'tmp config',
204
+ type: 'string'
205
+ },
206
+ 'trace-dir': {
207
+ description: 'Absolute path to directory Appium can use to save iOS instrument traces; defaults to <tmp>/appium-instruments',
208
+ title: 'trace-dir config',
209
+ type: 'string'
210
+ },
211
+ 'use-drivers': {
212
+ appiumCliDescription: 'A list of drivers to activate. Can be a comma-delimited string or path to CSV file. By default, all installed drivers will be activated.',
213
+ default: [],
214
+ description: 'A list of drivers to activate. By default, all installed drivers will be activated.',
215
+ items: {
216
+ type: 'string'
217
+ },
218
+ title: 'use-drivers config',
219
+ type: 'array',
220
+ uniqueItems: true
221
+ },
222
+ 'use-plugins': {
223
+ appiumCliDescription: 'A list of plugins to activate. Can be a comma-delimited string, path to CSV file, or the string "all" to use all installed plugins.',
224
+ default: [],
225
+ description: 'A list of plugins to activate. To activate all plugins, the value should be an array with a single item "all".',
226
+ items: {
227
+ type: 'string'
228
+ },
229
+ title: 'use-plugins config',
230
+ type: 'array',
231
+ uniqueItems: true
232
+ },
233
+ webhook: {
234
+ $comment: 'This should probably use a uri-template format to restrict the protocol to http/https',
235
+ appiumCliAliases: ['G'],
236
+ description: 'Also send log output to this http listener',
237
+ format: 'uri',
238
+ title: 'webhook config',
239
+ type: 'string'
240
+ }
241
+ },
242
+ title: 'server config',
243
+ type: 'object'
244
+ }
245
+ },
246
+ title: 'Appium Configuration',
247
+ type: 'object'
248
+ };
249
+ var _default = schema;
250
+ exports.default = _default;require('source-map-support').install();
251
+
252
+
253
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvYXBwaXVtLWNvbmZpZy1zY2hlbWEuanMiXSwibmFtZXMiOlsic2NoZW1hIiwiJHNjaGVtYSIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiZGVzY3JpcHRpb24iLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiYWRkcmVzcyIsIiRjb21tZW50IiwiYXBwaXVtQ2xpQWxpYXNlcyIsImRlZmF1bHQiLCJmb3JtYXQiLCJ0aXRsZSIsInR5cGUiLCJhcHBpdW1DbGlUcmFuc2Zvcm1lciIsIml0ZW1zIiwidW5pcXVlSXRlbXMiLCJtYXhpbXVtIiwibWluaW11bSIsImRyaXZlciIsImxvZyIsImFwcGl1bUNsaURlc3QiLCJlbnVtIiwibm9kZWNvbmZpZyIsInBsdWdpbiIsInBvcnQiLCJ0bXAiLCJhcHBpdW1DbGlEZXNjcmlwdGlvbiIsIndlYmhvb2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBLE1BQU1BLE1BQU0sR0FBeUI7QUFDbkNDLEVBQUFBLE9BQU8sRUFBRSx3Q0FEMEI7QUFFbkNDLEVBQUFBLG9CQUFvQixFQUFFLEtBRmE7QUFHbkNDLEVBQUFBLFdBQVcsRUFBRSx5Q0FIc0I7QUFJbkNDLEVBQUFBLFVBQVUsRUFBRTtBQUNWQyxJQUFBQSxNQUFNLEVBQUU7QUFDTkgsTUFBQUEsb0JBQW9CLEVBQUUsS0FEaEI7QUFFTkMsTUFBQUEsV0FBVyxFQUFFLCtDQUZQO0FBR05DLE1BQUFBLFVBQVUsRUFBRTtBQUNWRSxRQUFBQSxPQUFPLEVBQUU7QUFDUEMsVUFBQUEsUUFBUSxFQUNOLDREQUZLO0FBR1BDLFVBQUFBLGdCQUFnQixFQUFFLENBQUMsR0FBRCxDQUhYO0FBSVBDLFVBQUFBLE9BQU8sRUFBRSxTQUpGO0FBS1BOLFVBQUFBLFdBQVcsRUFBRSx5QkFMTjtBQU1QTyxVQUFBQSxNQUFNLEVBQUUsVUFORDtBQU9QQyxVQUFBQSxLQUFLLEVBQUUsZ0JBUEE7QUFRUEMsVUFBQUEsSUFBSSxFQUFFO0FBUkMsU0FEQztBQVdWLHNCQUFjO0FBQ1pULFVBQUFBLFdBQVcsRUFDVCw4RUFGVTtBQUdaUSxVQUFBQSxLQUFLLEVBQUUsbUJBSEs7QUFJWkMsVUFBQUEsSUFBSSxFQUFFLFNBSk07QUFLWkgsVUFBQUEsT0FBTyxFQUFFO0FBTEcsU0FYSjtBQWtCViwwQkFBa0I7QUFDaEJJLFVBQUFBLG9CQUFvQixFQUFFLEtBRE47QUFFaEJKLFVBQUFBLE9BQU8sRUFBRSxFQUZPO0FBR2hCTixVQUFBQSxXQUFXLEVBQ1QsaVVBSmM7QUFLaEJXLFVBQUFBLEtBQUssRUFBRTtBQUNMRixZQUFBQSxJQUFJLEVBQUU7QUFERCxXQUxTO0FBUWhCRCxVQUFBQSxLQUFLLEVBQUUsdUJBUlM7QUFTaEJDLFVBQUFBLElBQUksRUFBRSxPQVRVO0FBVWhCRyxVQUFBQSxXQUFXLEVBQUU7QUFWRyxTQWxCUjtBQThCVixxQkFBYTtBQUNYUCxVQUFBQSxnQkFBZ0IsRUFBRSxDQUFDLElBQUQsQ0FEUDtBQUVYQyxVQUFBQSxPQUFPLEVBQUUsRUFGRTtBQUdYTixVQUFBQSxXQUFXLEVBQ1QsK0VBSlM7QUFLWFEsVUFBQUEsS0FBSyxFQUFFLGtCQUxJO0FBTVhDLFVBQUFBLElBQUksRUFBRTtBQU5LLFNBOUJIO0FBc0NWLDRCQUFvQjtBQUNsQkosVUFBQUEsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFELENBREE7QUFFbEJMLFVBQUFBLFdBQVcsRUFBRSxrREFGSztBQUdsQlEsVUFBQUEsS0FBSyxFQUFFLHlCQUhXO0FBSWxCQyxVQUFBQSxJQUFJLEVBQUU7QUFKWSxTQXRDVjtBQTRDVix5QkFBaUI7QUFDZkosVUFBQUEsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFELENBREg7QUFFZkMsVUFBQUEsT0FBTyxFQUFFLElBRk07QUFHZk4sVUFBQUEsV0FBVyxFQUFFLHlDQUhFO0FBSWZhLFVBQUFBLE9BQU8sRUFBRSxLQUpNO0FBS2ZDLFVBQUFBLE9BQU8sRUFBRSxDQUxNO0FBTWZOLFVBQUFBLEtBQUssRUFBRSxzQkFOUTtBQU9mQyxVQUFBQSxJQUFJLEVBQUU7QUFQUyxTQTVDUDtBQXFEViw2QkFBcUI7QUFDbkJILFVBQUFBLE9BQU8sRUFBRSxLQURVO0FBRW5CTixVQUFBQSxXQUFXLEVBQ1QsZ0VBSGlCO0FBSW5CUSxVQUFBQSxLQUFLLEVBQUUsMEJBSlk7QUFLbkJDLFVBQUFBLElBQUksRUFBRTtBQUxhLFNBckRYO0FBNERWLGdDQUF3QjtBQUN0QkwsVUFBQUEsUUFBUSxFQUFFLE1BRFk7QUFFdEJDLFVBQUFBLGdCQUFnQixFQUFFLENBQUMsSUFBRCxDQUZJO0FBR3RCTCxVQUFBQSxXQUFXLEVBQ1Qsa01BSm9CO0FBS3RCUSxVQUFBQSxLQUFLLEVBQUUsNkJBTGU7QUFNdEJDLFVBQUFBLElBQUksRUFBRTtBQU5nQixTQTVEZDtBQW9FVix5QkFBaUI7QUFDZkwsVUFBQUEsUUFBUSxFQUFFLHVDQURLO0FBRWZNLFVBQUFBLG9CQUFvQixFQUFFLEtBRlA7QUFHZkosVUFBQUEsT0FBTyxFQUFFLEVBSE07QUFJZk4sVUFBQUEsV0FBVyxFQUNULHVXQUxhO0FBTWZXLFVBQUFBLEtBQUssRUFBRTtBQUNMRixZQUFBQSxJQUFJLEVBQUU7QUFERCxXQU5RO0FBU2ZELFVBQUFBLEtBQUssRUFBRSxzQkFUUTtBQVVmQyxVQUFBQSxJQUFJLEVBQUUsT0FWUztBQVdmRyxVQUFBQSxXQUFXLEVBQUU7QUFYRSxTQXBFUDtBQWlGVkcsUUFBQUEsTUFBTSxFQUFFO0FBQ05mLFVBQUFBLFdBQVcsRUFDVCwrRUFGSTtBQUdOQyxVQUFBQSxVQUFVLEVBQUUsRUFITjtBQUlOTyxVQUFBQSxLQUFLLEVBQUUsZUFKRDtBQUtOQyxVQUFBQSxJQUFJLEVBQUU7QUFMQSxTQWpGRTtBQXdGViw4QkFBc0I7QUFDcEJKLFVBQUFBLGdCQUFnQixFQUFFLENBQUMsSUFBRCxDQURFO0FBRXBCQyxVQUFBQSxPQUFPLEVBQUUsR0FGVztBQUdwQk4sVUFBQUEsV0FBVyxFQUNULGlLQUprQjtBQUtwQmMsVUFBQUEsT0FBTyxFQUFFLENBTFc7QUFNcEJOLFVBQUFBLEtBQUssRUFBRSwyQkFOYTtBQU9wQkMsVUFBQUEsSUFBSSxFQUFFO0FBUGMsU0F4Rlo7QUFpR1YsMEJBQWtCO0FBQ2hCSCxVQUFBQSxPQUFPLEVBQUUsS0FETztBQUVoQk4sVUFBQUEsV0FBVyxFQUFFLG1DQUZHO0FBR2hCUSxVQUFBQSxLQUFLLEVBQUUsdUJBSFM7QUFJaEJDLFVBQUFBLElBQUksRUFBRTtBQUpVLFNBakdSO0FBdUdWTyxRQUFBQSxHQUFHLEVBQUU7QUFDSFgsVUFBQUEsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFELENBRGY7QUFFSFksVUFBQUEsYUFBYSxFQUFFLFNBRlo7QUFHSGpCLFVBQUFBLFdBQVcsRUFBRSxtQ0FIVjtBQUlIUSxVQUFBQSxLQUFLLEVBQUUsWUFKSjtBQUtIQyxVQUFBQSxJQUFJLEVBQUU7QUFMSCxTQXZHSztBQThHVix1QkFBZTtBQUNiTCxVQUFBQSxRQUFRLEVBQUUsTUFERztBQUViSixVQUFBQSxXQUFXLEVBQUUsaUNBRkE7QUFHYlcsVUFBQUEsS0FBSyxFQUFFO0FBQ0xGLFlBQUFBLElBQUksRUFBRTtBQURELFdBSE07QUFNYkQsVUFBQUEsS0FBSyxFQUFFLG9CQU5NO0FBT2JDLFVBQUFBLElBQUksRUFBRTtBQVBPLFNBOUdMO0FBdUhWLHFCQUFhO0FBQ1hRLFVBQUFBLGFBQWEsRUFBRSxVQURKO0FBRVhYLFVBQUFBLE9BQU8sRUFBRSxPQUZFO0FBR1hOLFVBQUFBLFdBQVcsRUFBRSw0QkFIRjtBQUlYa0IsVUFBQUEsSUFBSSxFQUFFLENBQ0osTUFESSxFQUVKLFlBRkksRUFHSixXQUhJLEVBSUosV0FKSSxFQUtKLFlBTEksRUFNSixNQU5JLEVBT0osWUFQSSxFQVFKLFdBUkksRUFTSixXQVRJLEVBVUosWUFWSSxFQVdKLE9BWEksRUFZSixhQVpJLEVBYUosWUFiSSxFQWNKLFlBZEksRUFlSixhQWZJLEVBZ0JKLE9BaEJJLEVBaUJKLGFBakJJLEVBa0JKLFlBbEJJLEVBbUJKLFlBbkJJLEVBb0JKLGFBcEJJLENBSks7QUEwQlhWLFVBQUFBLEtBQUssRUFBRSxrQkExQkk7QUEyQlhDLFVBQUFBLElBQUksRUFBRTtBQTNCSyxTQXZISDtBQW9KVix5QkFBaUI7QUFDZkgsVUFBQUEsT0FBTyxFQUFFLEtBRE07QUFFZk4sVUFBQUEsV0FBVyxFQUFFLG9DQUZFO0FBR2ZRLFVBQUFBLEtBQUssRUFBRSxzQkFIUTtBQUlmQyxVQUFBQSxJQUFJLEVBQUU7QUFKUyxTQXBKUDtBQTBKVix5QkFBaUI7QUFDZkgsVUFBQUEsT0FBTyxFQUFFLEtBRE07QUFFZk4sVUFBQUEsV0FBVyxFQUFFLG1DQUZFO0FBR2ZRLFVBQUFBLEtBQUssRUFBRSxzQkFIUTtBQUlmQyxVQUFBQSxJQUFJLEVBQUU7QUFKUyxTQTFKUDtBQWdLViwyQkFBbUI7QUFDakJILFVBQUFBLE9BQU8sRUFBRSxLQURRO0FBRWpCTixVQUFBQSxXQUFXLEVBQ1QsdUVBSGU7QUFJakJRLFVBQUFBLEtBQUssRUFBRSx3QkFKVTtBQUtqQkMsVUFBQUEsSUFBSSxFQUFFO0FBTFcsU0FoS1Q7QUF1S1YsMEJBQWtCO0FBQ2hCSCxVQUFBQSxPQUFPLEVBQUUsS0FETztBQUVoQk4sVUFBQUEsV0FBVyxFQUNULDZEQUhjO0FBSWhCUSxVQUFBQSxLQUFLLEVBQUUsdUJBSlM7QUFLaEJDLFVBQUFBLElBQUksRUFBRTtBQUxVLFNBdktSO0FBOEtWVSxRQUFBQSxVQUFVLEVBQUU7QUFDVmYsVUFBQUEsUUFBUSxFQUNOLG1GQUZRO0FBR1ZKLFVBQUFBLFdBQVcsRUFDVCx1SEFKUTtBQUtWUSxVQUFBQSxLQUFLLEVBQUUsbUJBTEc7QUFNVkMsVUFBQUEsSUFBSSxFQUFFO0FBTkksU0E5S0Y7QUFzTFZXLFFBQUFBLE1BQU0sRUFBRTtBQUNOcEIsVUFBQUEsV0FBVyxFQUNULCtFQUZJO0FBR05DLFVBQUFBLFVBQVUsRUFBRSxFQUhOO0FBSU5PLFVBQUFBLEtBQUssRUFBRSxlQUpEO0FBS05DLFVBQUFBLElBQUksRUFBRTtBQUxBLFNBdExFO0FBNkxWWSxRQUFBQSxJQUFJLEVBQUU7QUFDSmhCLFVBQUFBLGdCQUFnQixFQUFFLENBQUMsR0FBRCxDQURkO0FBRUpDLFVBQUFBLE9BQU8sRUFBRSxJQUZMO0FBR0pOLFVBQUFBLFdBQVcsRUFBRSxtQkFIVDtBQUlKYSxVQUFBQSxPQUFPLEVBQUUsS0FKTDtBQUtKQyxVQUFBQSxPQUFPLEVBQUUsQ0FMTDtBQU1KTixVQUFBQSxLQUFLLEVBQUUsYUFOSDtBQU9KQyxVQUFBQSxJQUFJLEVBQUU7QUFQRixTQTdMSTtBQXNNViw0QkFBb0I7QUFDbEJILFVBQUFBLE9BQU8sRUFBRSxLQURTO0FBRWxCTixVQUFBQSxXQUFXLEVBQ1QsbVZBSGdCO0FBSWxCUSxVQUFBQSxLQUFLLEVBQUUseUJBSlc7QUFLbEJDLFVBQUFBLElBQUksRUFBRSxTQUxZO0FBTWxCUSxVQUFBQSxhQUFhLEVBQUU7QUFORyxTQXRNVjtBQThNViw0QkFBb0I7QUFDbEJYLFVBQUFBLE9BQU8sRUFBRSxLQURTO0FBRWxCTixVQUFBQSxXQUFXLEVBQUUsdUNBRks7QUFHbEJRLFVBQUFBLEtBQUssRUFBRSx5QkFIVztBQUlsQkMsVUFBQUEsSUFBSSxFQUFFO0FBSlksU0E5TVY7QUFvTlYsdUJBQWU7QUFDYkgsVUFBQUEsT0FBTyxFQUFFLEtBREk7QUFFYk4sVUFBQUEsV0FBVyxFQUNULG9IQUhXO0FBSWJRLFVBQUFBLEtBQUssRUFBRSxvQkFKTTtBQUtiQyxVQUFBQSxJQUFJLEVBQUU7QUFMTyxTQXBOTDtBQTJOVmEsUUFBQUEsR0FBRyxFQUFFO0FBQ0hMLFVBQUFBLGFBQWEsRUFBRSxRQURaO0FBRUhqQixVQUFBQSxXQUFXLEVBQ1QsOEhBSEM7QUFJSFEsVUFBQUEsS0FBSyxFQUFFLFlBSko7QUFLSEMsVUFBQUEsSUFBSSxFQUFFO0FBTEgsU0EzTks7QUFrT1YscUJBQWE7QUFDWFQsVUFBQUEsV0FBVyxFQUNULCtHQUZTO0FBR1hRLFVBQUFBLEtBQUssRUFBRSxrQkFISTtBQUlYQyxVQUFBQSxJQUFJLEVBQUU7QUFKSyxTQWxPSDtBQXdPVix1QkFBZTtBQUNiYyxVQUFBQSxvQkFBb0IsRUFDbEIsMElBRlc7QUFHYmpCLFVBQUFBLE9BQU8sRUFBRSxFQUhJO0FBSWJOLFVBQUFBLFdBQVcsRUFDVCxxRkFMVztBQU1iVyxVQUFBQSxLQUFLLEVBQUU7QUFDTEYsWUFBQUEsSUFBSSxFQUFFO0FBREQsV0FOTTtBQVNiRCxVQUFBQSxLQUFLLEVBQUUsb0JBVE07QUFVYkMsVUFBQUEsSUFBSSxFQUFFLE9BVk87QUFXYkcsVUFBQUEsV0FBVyxFQUFFO0FBWEEsU0F4T0w7QUFxUFYsdUJBQWU7QUFDYlcsVUFBQUEsb0JBQW9CLEVBQ2xCLHFJQUZXO0FBR2JqQixVQUFBQSxPQUFPLEVBQUUsRUFISTtBQUliTixVQUFBQSxXQUFXLEVBQ1QsZ0hBTFc7QUFNYlcsVUFBQUEsS0FBSyxFQUFFO0FBQ0xGLFlBQUFBLElBQUksRUFBRTtBQURELFdBTk07QUFTYkQsVUFBQUEsS0FBSyxFQUFFLG9CQVRNO0FBVWJDLFVBQUFBLElBQUksRUFBRSxPQVZPO0FBV2JHLFVBQUFBLFdBQVcsRUFBRTtBQVhBLFNBclBMO0FBa1FWWSxRQUFBQSxPQUFPLEVBQUU7QUFDUHBCLFVBQUFBLFFBQVEsRUFDTix1RkFGSztBQUdQQyxVQUFBQSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUQsQ0FIWDtBQUlQTCxVQUFBQSxXQUFXLEVBQUUsNENBSk47QUFLUE8sVUFBQUEsTUFBTSxFQUFFLEtBTEQ7QUFNUEMsVUFBQUEsS0FBSyxFQUFFLGdCQU5BO0FBT1BDLFVBQUFBLElBQUksRUFBRTtBQVBDO0FBbFFDLE9BSE47QUErUU5ELE1BQUFBLEtBQUssRUFBRSxlQS9RRDtBQWdSTkMsTUFBQUEsSUFBSSxFQUFFO0FBaFJBO0FBREUsR0FKdUI7QUF3Um5DRCxFQUFBQSxLQUFLLEVBQUUsc0JBeFI0QjtBQXlSbkNDLEVBQUFBLElBQUksRUFBRTtBQXpSNkIsQ0FBckM7ZUE0UmVaLE0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3Qgc2NoZW1hID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgJHNjaGVtYTogJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hJyxcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICBkZXNjcmlwdGlvbjogJ0Egc2NoZW1hIGZvciBBcHBpdW0gY29uZmlndXJhdGlvbiBmaWxlcycsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgQXBwaXVtIGFzIGEgc2VydmVyJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgYWRkcmVzczoge1xuICAgICAgICAgICRjb21tZW50OlxuICAgICAgICAgICAgJ0kgdGhpbmsgaG9zdG5hbWUgY292ZXJzIGJvdGggRE5TIGFuZCBJUHY0Li4uY291bGQgYmUgd3JvbmcnLFxuICAgICAgICAgIGFwcGl1bUNsaUFsaWFzZXM6IFsnYSddLFxuICAgICAgICAgIGRlZmF1bHQ6ICcwLjAuMC4wJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0lQIGFkZHJlc3MgdG8gbGlzdGVuIG9uJyxcbiAgICAgICAgICBmb3JtYXQ6ICdob3N0bmFtZScsXG4gICAgICAgICAgdGl0bGU6ICdhZGRyZXNzIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIH0sXG4gICAgICAgICdhbGxvdy1jb3JzJzoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1doZXRoZXIgdGhlIEFwcGl1bSBzZXJ2ZXIgc2hvdWxkIGFsbG93IHdlYiBicm93c2VyIGNvbm5lY3Rpb25zIGZyb20gYW55IGhvc3QnLFxuICAgICAgICAgIHRpdGxlOiAnYWxsb3ctY29ycyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgJ2FsbG93LWluc2VjdXJlJzoge1xuICAgICAgICAgIGFwcGl1bUNsaVRyYW5zZm9ybWVyOiAnY3N2JyxcbiAgICAgICAgICBkZWZhdWx0OiBbXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdTZXQgd2hpY2ggaW5zZWN1cmUgZmVhdHVyZXMgYXJlIGFsbG93ZWQgdG8gcnVuIGluIHRoaXMgc2VydmVyXFwncyBzZXNzaW9ucy4gRmVhdHVyZXMgYXJlIGRlZmluZWQgb24gYSBkcml2ZXIgbGV2ZWw7IHNlZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuIE5vdGUgdGhhdCBmZWF0dXJlcyBkZWZpbmVkIHZpYSBcImRlbnktaW5zZWN1cmVcIiB3aWxsIGJlIGRpc2FibGVkLCBldmVuIGlmIGFsc28gbGlzdGVkIGhlcmUuIElmIHN0cmluZywgYSBwYXRoIHRvIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgcG9saWN5IG9yIGEgY29tbWEtZGVsaW1pdGVkIGxpc3QuJyxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZTogJ2FsbG93LWluc2VjdXJlIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgJ2Jhc2UtcGF0aCc6IHtcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ3BhJ10sXG4gICAgICAgICAgZGVmYXVsdDogJycsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQmFzZSBwYXRoIHRvIHVzZSBhcyB0aGUgcHJlZml4IGZvciBhbGwgd2ViZHJpdmVyIHJvdXRlcyBydW5uaW5nIG9uIHRoZSBzZXJ2ZXInLFxuICAgICAgICAgIHRpdGxlOiAnYmFzZS1wYXRoIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIH0sXG4gICAgICAgICdjYWxsYmFjay1hZGRyZXNzJzoge1xuICAgICAgICAgIGFwcGl1bUNsaUFsaWFzZXM6IFsnY2EnXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NhbGxiYWNrIElQIGFkZHJlc3MgKGRlZmF1bHQ6IHNhbWUgYXMgXCJhZGRyZXNzXCIpJyxcbiAgICAgICAgICB0aXRsZTogJ2NhbGxiYWNrLWFkZHJlc3MgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2NhbGxiYWNrLXBvcnQnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpQWxpYXNlczogWydjcCddLFxuICAgICAgICAgIGRlZmF1bHQ6IDQ3MjMsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdDYWxsYmFjayBwb3J0IChkZWZhdWx0OiBzYW1lIGFzIFwicG9ydFwiKScsXG4gICAgICAgICAgbWF4aW11bTogNjU1MzUsXG4gICAgICAgICAgbWluaW11bTogMSxcbiAgICAgICAgICB0aXRsZTogJ2NhbGxiYWNrLXBvcnQgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIH0sXG4gICAgICAgICdkZWJ1Zy1sb2ctc3BhY2luZyc6IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBZGQgZXhhZ2dlcmF0ZWQgc3BhY2luZyBpbiBsb2dzIHRvIGhlbHAgd2l0aCB2aXN1YWwgaW5zcGVjdGlvbicsXG4gICAgICAgICAgdGl0bGU6ICdkZWJ1Zy1sb2ctc3BhY2luZyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ2RlZmF1bHQtY2FwYWJpbGl0aWVzJzoge1xuICAgICAgICAgICRjb21tZW50OiAnVE9ETycsXG4gICAgICAgICAgYXBwaXVtQ2xpQWxpYXNlczogWydkYyddLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1NldCB0aGUgZGVmYXVsdCBkZXNpcmVkIGNhcGFiaWxpdGllcywgd2hpY2ggd2lsbCBiZSBzZXQgb24gZWFjaCBzZXNzaW9uIHVubGVzcyBvdmVycmlkZGVuIGJ5IHJlY2VpdmVkIGNhcGFiaWxpdGllcy4gSWYgYSBzdHJpbmcsIGEgcGF0aCB0byBhIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBjYXBhYmlsaXRpZXMsIG9yIHJhdyBKU09OLicsXG4gICAgICAgICAgdGl0bGU6ICdkZWZhdWx0LWNhcGFiaWxpdGllcyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICB9LFxuICAgICAgICAnZGVueS1pbnNlY3VyZSc6IHtcbiAgICAgICAgICAkY29tbWVudDogJ0FsbG93ZWQgdmFsdWVzIGFyZSBkZWZpbmVkIGJ5IGRyaXZlcnMnLFxuICAgICAgICAgIGFwcGl1bUNsaVRyYW5zZm9ybWVyOiAnY3N2JyxcbiAgICAgICAgICBkZWZhdWx0OiBbXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdTZXQgd2hpY2ggaW5zZWN1cmUgZmVhdHVyZXMgYXJlIG5vdCBhbGxvd2VkIHRvIHJ1biBpbiB0aGlzIHNlcnZlclxcJ3Mgc2Vzc2lvbnMuIEZlYXR1cmVzIGFyZSBkZWZpbmVkIG9uIGEgZHJpdmVyIGxldmVsOyBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiBGZWF0dXJlcyBsaXN0ZWQgaGVyZSB3aWxsIG5vdCBiZSBlbmFibGVkIGV2ZW4gaWYgYWxzbyBsaXN0ZWQgaW4gXCJhbGxvdy1pbnNlY3VyZVwiLCBhbmQgZXZlbiBpZiBcInJlbGF4ZWQtc2VjdXJpdHlcIiBpcyBlbmFibGVkLiBJZiBzdHJpbmcsIGEgcGF0aCB0byBhIHRleHQgZmlsZSBjb250YWluaW5nIHBvbGljeSBvciBhIGNvbW1hLWRlbGltaXRlZCBsaXN0LicsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGl0bGU6ICdkZW55LWluc2VjdXJlIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZHJpdmVyOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnRHJpdmVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIEtleXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gZHJpdmVyIHBhY2thZ2UgbmFtZXMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgIHRpdGxlOiAnZHJpdmVyIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIH0sXG4gICAgICAgICdrZWVwLWFsaXZlLXRpbWVvdXQnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpQWxpYXNlczogWydrYSddLFxuICAgICAgICAgIGRlZmF1bHQ6IDYwMCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdOdW1iZXIgb2Ygc2Vjb25kcyB0aGUgQXBwaXVtIHNlcnZlciBzaG91bGQgYXBwbHkgYXMgYm90aCB0aGUga2VlcC1hbGl2ZSB0aW1lb3V0IGFuZCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGZvciBhbGwgcmVxdWVzdHMuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyB0aGUgdGltZW91dC4nLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdGl0bGU6ICdrZWVwLWFsaXZlLXRpbWVvdXQgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIH0sXG4gICAgICAgICdsb2NhbC10aW1lem9uZSc6IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSBsb2NhbCB0aW1lem9uZSBmb3IgdGltZXN0YW1wcycsXG4gICAgICAgICAgdGl0bGU6ICdsb2NhbC10aW1lem9uZSBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9nOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpQWxpYXNlczogWydnJ10sXG4gICAgICAgICAgYXBwaXVtQ2xpRGVzdDogJ2xvZ0ZpbGUnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQWxzbyBzZW5kIGxvZyBvdXRwdXQgdG8gdGhpcyBmaWxlJyxcbiAgICAgICAgICB0aXRsZTogJ2xvZyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgICAnbG9nLWZpbHRlcnMnOiB7XG4gICAgICAgICAgJGNvbW1lbnQ6ICdUT0RPJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ09uZSBvciBtb3JlIGxvZyBmaWx0ZXJpbmcgcnVsZXMnLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpdGxlOiAnbG9nLWZpbHRlcnMgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICB9LFxuICAgICAgICAnbG9nLWxldmVsJzoge1xuICAgICAgICAgIGFwcGl1bUNsaURlc3Q6ICdsb2dsZXZlbCcsXG4gICAgICAgICAgZGVmYXVsdDogJ2RlYnVnJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0xvZyBsZXZlbCAoY29uc29sZVs6ZmlsZV0pJyxcbiAgICAgICAgICBlbnVtOiBbXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICAnaW5mbzpkZWJ1ZycsXG4gICAgICAgICAgICAnaW5mbzppbmZvJyxcbiAgICAgICAgICAgICdpbmZvOndhcm4nLFxuICAgICAgICAgICAgJ2luZm86ZXJyb3InLFxuICAgICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICAgJ3dhcm46ZGVidWcnLFxuICAgICAgICAgICAgJ3dhcm46aW5mbycsXG4gICAgICAgICAgICAnd2Fybjp3YXJuJyxcbiAgICAgICAgICAgICd3YXJuOmVycm9yJyxcbiAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAnZXJyb3I6ZGVidWcnLFxuICAgICAgICAgICAgJ2Vycm9yOmluZm8nLFxuICAgICAgICAgICAgJ2Vycm9yOndhcm4nLFxuICAgICAgICAgICAgJ2Vycm9yOmVycm9yJyxcbiAgICAgICAgICAgICdkZWJ1ZycsXG4gICAgICAgICAgICAnZGVidWc6ZGVidWcnLFxuICAgICAgICAgICAgJ2RlYnVnOmluZm8nLFxuICAgICAgICAgICAgJ2RlYnVnOndhcm4nLFxuICAgICAgICAgICAgJ2RlYnVnOmVycm9yJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpdGxlOiAnbG9nLWxldmVsIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIH0sXG4gICAgICAgICdsb2ctbm8tY29sb3JzJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRG8gbm90IHVzZSBjb2xvciBpbiBjb25zb2xlIG91dHB1dCcsXG4gICAgICAgICAgdGl0bGU6ICdsb2ctbm8tY29sb3JzIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICAnbG9nLXRpbWVzdGFtcCc6IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1Nob3cgdGltZXN0YW1wcyBpbiBjb25zb2xlIG91dHB1dCcsXG4gICAgICAgICAgdGl0bGU6ICdsb2ctdGltZXN0YW1wIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICAnbG9uZy1zdGFja3RyYWNlJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0FkZCBsb25nIHN0YWNrIHRyYWNlcyB0byBsb2cgZW50cmllcy4gUmVjb21tZW5kZWQgZm9yIGRlYnVnZ2luZyBvbmx5LicsXG4gICAgICAgICAgdGl0bGU6ICdsb25nLXN0YWNrdHJhY2UgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICAgICduby1wZXJtcy1jaGVjayc6IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdEbyBub3QgY2hlY2sgdGhhdCBuZWVkZWQgZmlsZXMgYXJlIHJlYWRhYmxlIGFuZC9vciB3cml0YWJsZScsXG4gICAgICAgICAgdGl0bGU6ICduby1wZXJtcy1jaGVjayBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgfSxcbiAgICAgICAgbm9kZWNvbmZpZzoge1xuICAgICAgICAgICRjb21tZW50OlxuICAgICAgICAgICAgJ1NlbGVuaXVtIEdyaWQgMyBpcyB1bm1haW50YWluZWQgYW5kIFNlbGVuaXVtIEdyaWQgNCBubyBsb25nZXIgc3VwcG9ydHMgdGhpcyBmaWxlLicsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnUGF0aCB0byBjb25maWd1cmF0aW9uIEpTT04gZmlsZSB0byByZWdpc3RlciBBcHBpdW0gYXMgYSBub2RlIHdpdGggU2VsZW5pdW0gR3JpZCAzOyBvdGhlcndpc2UgdGhlIGNvbmZpZ3VyYXRpb24gaXRzZWxmJyxcbiAgICAgICAgICB0aXRsZTogJ25vZGVjb25maWcgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1Z2luOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnUGx1Z2luLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIEtleXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gcGx1Z2luIHBhY2thZ2UgbmFtZXMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgIHRpdGxlOiAncGx1Z2luIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHBvcnQ6IHtcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ3AnXSxcbiAgICAgICAgICBkZWZhdWx0OiA0NzIzLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUG9ydCB0byBsaXN0ZW4gb24nLFxuICAgICAgICAgIG1heGltdW06IDY1NTM1LFxuICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgdGl0bGU6ICdwb3J0IGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICB9LFxuICAgICAgICAncmVsYXhlZC1zZWN1cml0eSc6IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdEaXNhYmxlIGFkZGl0aW9uYWwgc2VjdXJpdHkgY2hlY2tzLCBzbyBpdCBpcyBwb3NzaWJsZSB0byB1c2Ugc29tZSBhZHZhbmNlZCBmZWF0dXJlcywgcHJvdmlkZWQgYnkgZHJpdmVycyBzdXBwb3J0aW5nIHRoaXMgb3B0aW9uLiBPbmx5IGVuYWJsZSBpdCBpZiBhbGwgdGhlIGNsaWVudHMgYXJlIGluIHRoZSB0cnVzdGVkIG5ldHdvcmsgYW5kIGl0XFwncyBub3QgdGhlIGNhc2UgaWYgYSBjbGllbnQgY291bGQgcG90ZW50aWFsbHkgYnJlYWsgb3V0IG9mIHRoZSBzZXNzaW9uIHNhbmRib3guIFNwZWNpZmljIGZlYXR1cmVzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHVzaW5nIFwiZGVueS1pbnNlY3VyZVwiJyxcbiAgICAgICAgICB0aXRsZTogJ3JlbGF4ZWQtc2VjdXJpdHkgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgYXBwaXVtQ2xpRGVzdDogJ3JlbGF4ZWRTZWN1cml0eUVuYWJsZWQnXG4gICAgICAgIH0sXG4gICAgICAgICdzZXNzaW9uLW92ZXJyaWRlJzoge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRW5hYmxlcyBzZXNzaW9uIG92ZXJyaWRlIChjbG9iYmVyaW5nKScsXG4gICAgICAgICAgdGl0bGU6ICdzZXNzaW9uLW92ZXJyaWRlIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICAnc3RyaWN0LWNhcHMnOiB7XG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQ2F1c2Ugc2Vzc2lvbnMgdG8gZmFpbCBpZiBkZXNpcmVkIGNhcHMgYXJlIHNlbnQgaW4gdGhhdCBBcHBpdW0gZG9lcyBub3QgcmVjb2duaXplIGFzIHZhbGlkIGZvciB0aGUgc2VsZWN0ZWQgZGV2aWNlJyxcbiAgICAgICAgICB0aXRsZTogJ3N0cmljdC1jYXBzIGNvbmZpZycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICB0bXA6IHtcbiAgICAgICAgICBhcHBpdW1DbGlEZXN0OiAndG1wRGlyJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBYnNvbHV0ZSBwYXRoIHRvIGRpcmVjdG9yeSBBcHBpdW0gY2FuIHVzZSB0byBtYW5hZ2UgdGVtcCBmaWxlcy4gRGVmYXVsdHMgdG8gQzpcXFxcV2luZG93c1xcXFxUZW1wIG9uIFdpbmRvd3MgYW5kIC90bXAgb3RoZXJ3aXNlLicsXG4gICAgICAgICAgdGl0bGU6ICd0bXAgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgJ3RyYWNlLWRpcic6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdBYnNvbHV0ZSBwYXRoIHRvIGRpcmVjdG9yeSBBcHBpdW0gY2FuIHVzZSB0byBzYXZlIGlPUyBpbnN0cnVtZW50IHRyYWNlczsgZGVmYXVsdHMgdG8gPHRtcD4vYXBwaXVtLWluc3RydW1lbnRzJyxcbiAgICAgICAgICB0aXRsZTogJ3RyYWNlLWRpciBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgICAndXNlLWRyaXZlcnMnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpRGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQSBsaXN0IG9mIGRyaXZlcnMgdG8gYWN0aXZhdGUuIENhbiBiZSBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgb3IgcGF0aCB0byBDU1YgZmlsZS4gQnkgZGVmYXVsdCwgYWxsIGluc3RhbGxlZCBkcml2ZXJzIHdpbGwgYmUgYWN0aXZhdGVkLicsXG4gICAgICAgICAgZGVmYXVsdDogW10sXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQSBsaXN0IG9mIGRyaXZlcnMgdG8gYWN0aXZhdGUuIEJ5IGRlZmF1bHQsIGFsbCBpbnN0YWxsZWQgZHJpdmVycyB3aWxsIGJlIGFjdGl2YXRlZC4nLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpdGxlOiAndXNlLWRyaXZlcnMgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAndXNlLXBsdWdpbnMnOiB7XG4gICAgICAgICAgYXBwaXVtQ2xpRGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQSBsaXN0IG9mIHBsdWdpbnMgdG8gYWN0aXZhdGUuIENhbiBiZSBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcsIHBhdGggdG8gQ1NWIGZpbGUsIG9yIHRoZSBzdHJpbmcgXCJhbGxcIiB0byB1c2UgYWxsIGluc3RhbGxlZCBwbHVnaW5zLicsXG4gICAgICAgICAgZGVmYXVsdDogW10sXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnQSBsaXN0IG9mIHBsdWdpbnMgdG8gYWN0aXZhdGUuIFRvIGFjdGl2YXRlIGFsbCBwbHVnaW5zLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGFuIGFycmF5IHdpdGggYSBzaW5nbGUgaXRlbSBcImFsbFwiLicsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGl0bGU6ICd1c2UtcGx1Z2lucyBjb25maWcnLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2s6IHtcbiAgICAgICAgICAkY29tbWVudDpcbiAgICAgICAgICAgICdUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYSB1cmktdGVtcGxhdGUgZm9ybWF0IHRvIHJlc3RyaWN0IHRoZSBwcm90b2NvbCB0byBodHRwL2h0dHBzJyxcbiAgICAgICAgICBhcHBpdW1DbGlBbGlhc2VzOiBbJ0cnXSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Fsc28gc2VuZCBsb2cgb3V0cHV0IHRvIHRoaXMgaHR0cCBsaXN0ZW5lcicsXG4gICAgICAgICAgZm9ybWF0OiAndXJpJyxcbiAgICAgICAgICB0aXRsZTogJ3dlYmhvb2sgY29uZmlnJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0aXRsZTogJ3NlcnZlciBjb25maWcnLFxuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgfSxcbiAgfSxcbiAgdGl0bGU6ICdBcHBpdW0gQ29uZmlndXJhdGlvbicsXG4gIHR5cGU6ICdvYmplY3QnLFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNjaGVtYTtcbiJdLCJmaWxlIjoibGliL3NjaGVtYS9hcHBpdW0tY29uZmlnLXNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.SERVER_PROP_NAME = exports.ArgSpec = exports.APPIUM_CONFIG_SCHEMA_ID = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ require("source-map-support/register");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash"));
15
+
16
+ const APPIUM_CONFIG_SCHEMA_ID = 'appium.json';
17
+ exports.APPIUM_CONFIG_SCHEMA_ID = APPIUM_CONFIG_SCHEMA_ID;
18
+ const SERVER_PROP_NAME = 'server';
19
+ exports.SERVER_PROP_NAME = SERVER_PROP_NAME;
20
+ const SCHEMA_ID_REGEXP = /^(?<extType>.+?)-(?<normalizedExtName>.+)\.json$/;
21
+ const PROPERTIES = 'properties';
22
+
23
+ class ArgSpec {
24
+ constructor(name, {
25
+ extType,
26
+ extName,
27
+ dest,
28
+ defaultValue
29
+ } = {}) {
30
+ (0, _defineProperty2.default)(this, "name", void 0);
31
+ (0, _defineProperty2.default)(this, "extType", void 0);
32
+ (0, _defineProperty2.default)(this, "extName", void 0);
33
+ (0, _defineProperty2.default)(this, "ref", void 0);
34
+ (0, _defineProperty2.default)(this, "arg", void 0);
35
+ (0, _defineProperty2.default)(this, "dest", void 0);
36
+ (0, _defineProperty2.default)(this, "defaultValue", void 0);
37
+ const arg = ArgSpec.toArg(name, extType, extName);
38
+ const ref = ArgSpec.toSchemaRef(name, extType, extName);
39
+
40
+ const baseDest = _lodash.default.camelCase(dest !== null && dest !== void 0 ? dest : name);
41
+
42
+ const destKeypath = extType && extName ? [extType, extName, baseDest].join('.') : baseDest;
43
+ this.defaultValue = defaultValue;
44
+ this.name = name;
45
+ this.extType = extType;
46
+ this.extName = extName;
47
+ this.arg = arg;
48
+ this.dest = destKeypath;
49
+ this.ref = ref;
50
+ }
51
+
52
+ static toSchemaRef(name, extType, extName) {
53
+ const baseRef = ArgSpec.toSchemaBaseRef(extType, extName);
54
+
55
+ if (extType && extName) {
56
+ return [`${baseRef}#`, PROPERTIES, name].join('/');
57
+ }
58
+
59
+ return [`${baseRef}#`, PROPERTIES, SERVER_PROP_NAME, PROPERTIES, name].join('/');
60
+ }
61
+
62
+ static toSchemaBaseRef(extType, extName) {
63
+ if (extType && extName) {
64
+ return `${extType}-${ArgSpec.toNormalizedExtName(extName)}.json`;
65
+ }
66
+
67
+ return APPIUM_CONFIG_SCHEMA_ID;
68
+ }
69
+
70
+ static toArg(name, extType, extName) {
71
+ const properName = _lodash.default.kebabCase(name.replace(/^--?/, ''));
72
+
73
+ if (extType && extName) {
74
+ return [extType, _lodash.default.kebabCase(extName), properName].join('-');
75
+ }
76
+
77
+ return properName;
78
+ }
79
+
80
+ static toNormalizedExtName(extName) {
81
+ return _lodash.default.kebabCase(extName);
82
+ }
83
+
84
+ static extensionInfoFromRootSchemaId(schemaId) {
85
+ const matches = schemaId.match(SCHEMA_ID_REGEXP);
86
+
87
+ if (matches !== null && matches !== void 0 && matches.groups) {
88
+ const {
89
+ extType,
90
+ normalizedExtName
91
+ } = matches.groups;
92
+ return {
93
+ extType,
94
+ normalizedExtName
95
+ };
96
+ }
97
+
98
+ return {};
99
+ }
100
+
101
+ static create(name, opts) {
102
+ return Object.freeze(new ArgSpec(name, opts));
103
+ }
104
+
105
+ toString() {
106
+ let str = `[ArgSpec] ${this.name} (${this.ref})`;
107
+
108
+ if (this.extType && this.extName) {
109
+ str += ` (ext: ${this.extType}/${this.extName})`;
110
+ }
111
+
112
+ return str;
113
+ }
114
+
115
+ }
116
+
117
+ exports.ArgSpec = ArgSpec;require('source-map-support').install();
118
+
119
+
120
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvYXJnLXNwZWMuanMiXSwibmFtZXMiOlsiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJTRVJWRVJfUFJPUF9OQU1FIiwiU0NIRU1BX0lEX1JFR0VYUCIsIlBST1BFUlRJRVMiLCJBcmdTcGVjIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJkZXN0IiwiZGVmYXVsdFZhbHVlIiwiYXJnIiwidG9BcmciLCJyZWYiLCJ0b1NjaGVtYVJlZiIsImJhc2VEZXN0IiwiXyIsImNhbWVsQ2FzZSIsImRlc3RLZXlwYXRoIiwiam9pbiIsImJhc2VSZWYiLCJ0b1NjaGVtYUJhc2VSZWYiLCJ0b05vcm1hbGl6ZWRFeHROYW1lIiwicHJvcGVyTmFtZSIsImtlYmFiQ2FzZSIsInJlcGxhY2UiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsInNjaGVtYUlkIiwibWF0Y2hlcyIsIm1hdGNoIiwiZ3JvdXBzIiwibm9ybWFsaXplZEV4dE5hbWUiLCJjcmVhdGUiLCJvcHRzIiwiT2JqZWN0IiwiZnJlZXplIiwidG9TdHJpbmciLCJzdHIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFNTyxNQUFNQSx1QkFBdUIsR0FBRyxhQUFoQzs7QUFPQSxNQUFNQyxnQkFBZ0IsR0FBRyxRQUF6Qjs7QUFLUCxNQUFNQyxnQkFBZ0IsR0FBRyxrREFBekI7QUFLQSxNQUFNQyxVQUFVLEdBQUcsWUFBbkI7O0FBUU8sTUFBTUMsT0FBTixDQUFjO0FBOERuQkMsRUFBQUEsV0FBVyxDQUFFQyxJQUFGLEVBQVE7QUFBQ0MsSUFBQUEsT0FBRDtBQUFVQyxJQUFBQSxPQUFWO0FBQW1CQyxJQUFBQSxJQUFuQjtBQUF5QkMsSUFBQUE7QUFBekIsTUFBeUMsRUFBakQsRUFBcUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUc5RCxVQUFNQyxHQUFHLEdBQUdQLE9BQU8sQ0FBQ1EsS0FBUixDQUFjTixJQUFkLEVB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QUYsRUFBUTJCLElBQVIsRUFBYztBQUN6QixXQUFPQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFJL0IsT0FBSixDQUFZRSxJQUFaLEVBQWtCMkIsSUFBbEIsQ0FBZCxDQUFQO0FBQ0Q7O0FBT0RHLEVBQUFBLFFBQVEsR0FBSTtBQUNWLFFBQUlDLEdBQUcsR0FBSSxhQUFZLEtBQUsvQixJQUFLLEtBQUksS0FBS08sR0FBSSxHQUE5Qzs7QUFDQSxRQUFJLEtBQUtOLE9BQUwsSUFBZ0IsS0FBS0MsT0FBekIsRUFBa0M7QUFDaEM2QixNQUFBQSxHQUFHLElBQUssVUFBUyxLQUFLOUIsT0FBUSxJQUFHLEtBQUtDLE9BQVEsR0FBOUM7QUFDRDs7QUFDRCxXQUFPNkIsR0FBUDtBQUNEOztBQS9La0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIFRoZSBvcmlnaW5hbCBJRCBvZiB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gKiBXZSB1c2UgdGhpcyBpbiB0aGUgQ0xJIHRvIGNvbnZlcnQgaXQgdG8gYGFyZ3BhcnNlYCBvcHRpb25zLlxuICovXG5leHBvcnQgY29uc3QgQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQgPSAnYXBwaXVtLmpzb24nO1xuXG4vKipcbiAqIFRoZSBzY2hlbWEgcHJvcCBjb250YWluaW5nIHNlcnZlci1yZWxhdGVkIG9wdGlvbnMuIEV2ZXJ5dGhpbmcgaW4gaGVyZVxuICogaXMgXCJuYXRpdmVcIiB0byBBcHBpdW0uXG4gKiBVc2VkIGJ5IHtAbGluayBmbGF0dGVuU2NoZW1hfSBmb3IgdHJhbnNmb3JtaW5nIHRoZSBzY2hlbWEgaW50byBDTEkgYXJncy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9QUk9QX05BTUUgPSAnc2VydmVyJztcblxuLyoqXG4gKiBVc2VkIHRvIHBhcnNlIGV4dGVuc2lvbiBpbmZvIGZyb20gYSBzY2hlbWEgSUQuXG4gKi9cbmNvbnN0IFNDSEVNQV9JRF9SRUdFWFAgPSAvXig/PGV4dFR5cGU+Lis/KS0oPzxub3JtYWxpemVkRXh0TmFtZT4uKylcXC5qc29uJC87XG5cbi8qKlxuICogQXZvaWQgdHlwb3MgYnkgdXNpbmcgY29uc3RhbnRzIVxuICovXG5jb25zdCBQUk9QRVJUSUVTID0gJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIEFuIGBBcmdTcGVjYCBpcyBhIGNsYXNzIHJlcHJlc2VudGluZyBtZXRhZGF0YSBhYm91dCBhbiBhcmd1bWVudCAob3IgY29uZmlnXG4gKiBvcHRpb24pIHVzZWQgZm9yIGNyb3NzLXJlZmVyZW5jaW5nLlxuICpcbiAqIFRoaXMgY2xhc3MgaGFzIG5vIGluc3RhbmNlIG1ldGhvZHMsIGFuZCBpcyBiYXNpY2FsbHkganVzdCBhIHJlYWQtb25seSBcInN0cnVjdFwiLlxuICovXG5leHBvcnQgY2xhc3MgQXJnU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBDb3JyZXNwb25kcyB0byBrZXkgaW4gc2NoZW1hJ3MgYHByb3BlcnRpZXNgIHByb3AuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgYEV4dGVuc2lvblR5cGVgIG9mIHRoZSBhcmd1bWVudC4gVGhpcyB3aWxsIGJlIHNldCBpZiB0aGUgYXJnIGNhbWUgZnJvbSBhbiBleHRlbnNpb247XG4gICAqIG90aGVyd2lzZSBpdCB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICAgKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZXx1bmRlZmluZWR9XG4gICAqL1xuICBleHRUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCBpZiB0aGlzIGFyZ3VtZW50IGNhbWUgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIE90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9XG4gICAqL1xuICBleHROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NoZW1hIElEIChgJGlkYCkgZm9yIHRoZSBhcmd1bWVudC4gIFRoaXMgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLCBhbmQgYW55IHVzZXItcHJvdmlkZWQgYCRpZGBzIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICByZWY7XG5cbiAgLyoqXG4gICAqIFRoZSBDTEkgYXJndW1lbnQsIHNhbnMgbGVhZGluZyBkYXNoZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBhcmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpcmVkIGtleXBhdGggZm9yIHRoZSBhcmd1bWVudCBhZnRlciBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZC5cbiAgICpcbiAgICogVHlwaWNhbGx5IHRoaXMgaXMgY2FtZWxDYXNlZC4gIElmIHRoZSBhcmcgY2FtZSBmcm9tIGFuIGV4dGVuc2lvbiwgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoXG4gICAqIGA8ZXh0VHlwZT4uPGV4dE5hbWU+LmBcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGRlc3Q7XG5cbiAgLyoqXG4gICAqIFdoYXRldmVyIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYXJndW1lbnQgaXMsIGFzIHNwZWNpZmllZCBieSB0aGVcbiAgICogYGRlZmF1bHRgIHByb3BlcnR5IG9mIHRoZSBzY2hlbWEuXG4gICAqIEB0eXBlIHtEfVxuICAgKi9cbiAgZGVmYXVsdFZhbHVlO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgc29tZSBjb21wdXRlZCBmaWVsZHMgYW5kIGFzc2lnbnMgdGhlbSB0byB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBub3QgYXNzaWduZWQuXG4gICAqXG4gICAqIFRoZSBfY29uc3RydWN0b3JfIGlzIHByaXZhdGUuIFVzZSB7QGxpbmsgQXJnU3BlYy5jcmVhdGV9IGluc3RlYWQuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSBEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJnU3BlY09wdGlvbnM8RD59IFtvcHRzXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5hbWUsIHtleHRUeXBlLCBleHROYW1lLCBkZXN0LCBkZWZhdWx0VmFsdWV9ID0ge30pIHtcbiAgICAvLyB3ZSBtdXN0IG5vcm1hbGl6ZSB0aGUgZXh0ZW5zaW9uIG5hbWUgdG8gZml0IGludG8gb3VyIGNvbnZlbnRpb24gZm9yIENMSVxuICAgIC8vIGFyZ3MuXG4gICAgY29uc3QgYXJnID0gQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKTtcblxuICAgIGNvbnN0IHJlZiA9IEFyZ1NwZWMudG9TY2hlbWFSZWYobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSk7XG5cbiAgICAvLyBpZiBubyBleHBsaWNpdCBgZGVzdGAgcHJvdmlkZWQsIGp1c3QgY2FtZWxDYXNlIHRoZSBuYW1lIHRvIGF2b2lkIG5lZWRpbmdcbiAgICAvLyB0byB1c2UgYnJhY2tldCBzeW50YXggd2hlbiBhY2Nlc3NpbmcgcHJvcHMgb24gdGhlIHBhcnNlZCBhcmdzIG9iamVjdC5cbiAgICBjb25zdCBiYXNlRGVzdCA9IF8uY2FtZWxDYXNlKGRlc3QgPz8gbmFtZSk7XG5cbiAgICBjb25zdCBkZXN0S2V5cGF0aCA9XG4gICAgICBleHRUeXBlICYmIGV4dE5hbWUgPyBbZXh0VHlwZSwgZXh0TmFtZSwgYmFzZURlc3RdLmpvaW4oJy4nKSA6IGJhc2VEZXN0O1xuXG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmV4dFR5cGUgPSBleHRUeXBlO1xuICAgIHRoaXMuZXh0TmFtZSA9IGV4dE5hbWU7XG4gICAgdGhpcy5hcmcgPSBhcmc7XG4gICAgdGhpcy5kZXN0ID0gZGVzdEtleXBhdGg7XG4gICAgdGhpcy5yZWYgPSByZWY7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzY2hlbWEgSUQgKGAkaWRgKSBmb3IgdGhlICoqYXJndW1lbnQqKiBnaXZlbiB0aGUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIFwicm9vdFwiIG9yIFwiYmFzZVwiIHNjaGVtYSBJRCwgdXNlIHtAbGluayBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZn0gaW5zdGVhZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFNjaGVtYSBJRFxuICAgKi9cbiAgc3RhdGljIHRvU2NoZW1hUmVmIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgY29uc3QgYmFzZVJlZiA9IEFyZ1NwZWMudG9TY2hlbWFCYXNlUmVmKGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIGlmIChleHRUeXBlICYmIGV4dE5hbWUpIHtcbiAgICAgIHJldHVybiBbYCR7YmFzZVJlZn0jYCwgUFJPUEVSVElFUywgbmFtZV0uam9pbignLycpO1xuICAgIH1cbiAgICByZXR1cm4gW2Ake2Jhc2VSZWZ9I2AsIFBST1BFUlRJRVMsIFNFUlZFUl9QUk9QX05BTUUsIFBST1BFUlRJRVMsIG5hbWVdLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNjaGVtYSBJRCBmb3IgYW4gZXh0ZW5zaW9uIG9yIHRoZSBiYXNlIHNjaGVtYSBJRC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICovXG4gIHN0YXRpYyB0b1NjaGVtYUJhc2VSZWYgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBpZiAoZXh0VHlwZSAmJiBleHROYW1lKSB7XG4gICAgICByZXR1cm4gYCR7ZXh0VHlwZX0tJHtBcmdTcGVjLnRvTm9ybWFsaXplZEV4dE5hbWUoZXh0TmFtZSl9Lmpzb25gO1xuICAgIH1cbiAgICByZXR1cm4gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB1bmlxdWUgSUQgZm9yIHRoZSBhcmd1bWVudCBnaXZlbiB0aGUgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFVuaXF1ZSBJRFxuICAgKi9cbiAgc3RhdGljIHRvQXJnIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgY29uc3QgcHJvcGVyTmFtZSA9IF8ua2ViYWJDYXNlKG5hbWUucmVwbGFjZSgvXi0tPy8sICcnKSk7XG4gICAgaWYgKGV4dFR5cGUgJiYgZXh0TmFtZSkge1xuICAgICAgcmV0dXJuIFtleHRUeXBlLCBfLmtlYmFiQ2FzZShleHROYW1lKSwgcHJvcGVyTmFtZV0uam9pbignLScpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVyTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgcmF3IGV4dGVuc2lvbiBuYW1lIChub3QgaW5jbHVkaW5nIHRoZSB0eXBlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBOb3JtYWxpemVkIGV4dGVuc2lvbiBuYW1lXG4gICAqL1xuICBzdGF0aWMgdG9Ob3JtYWxpemVkRXh0TmFtZSAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmtlYmFiQ2FzZShleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGdpdmVuIHRoZSByb290IElEIG9mIGEgc2NoZW1hIGZvciBhbiBleHRlbnNpb24gKGA8ZXh0VHlwZT4tPG5vcm1hbGl6ZWRFeHROYW1lPi5qc29uYCkgUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kIHRoZSBfbm9ybWFsaXplZF8gZXh0ZW5zaW9uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFJZCAtIFJvb3Qgc2NoZW1hIElEXG4gICAqIEByZXR1cm5zIHt7ZXh0VHlwZTogRXh0ZW5zaW9uVHlwZXx1bmRlZmluZWQsIG5vcm1hbGl6ZWRFeHROYW1lOiBzdHJpbmd8dW5kZWZpbmVkfX1cbiAgICovXG4gIHN0YXRpYyBleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCAoc2NoZW1hSWQpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gc2NoZW1hSWQubWF0Y2goU0NIRU1BX0lEX1JFR0VYUCk7XG4gICAgaWYgKG1hdGNoZXM/Lmdyb3Vwcykge1xuICAgICAgY29uc3Qge2V4dFR5cGUsIG5vcm1hbGl6ZWRFeHROYW1lfSA9IG1hdGNoZXMuZ3JvdXBzO1xuICAgICAgcmV0dXJuIHtleHRUeXBlLCBub3JtYWxpemVkRXh0TmFtZX07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGBBcmdTcGVjYFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgYXJndW1lbnQuIENvcnJlc3BvbmRzIHRvIGEga2V5IGluIGEgc2NoZW1hJ3NcbiAgICogYHByb3BlcnRpZXNgIHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge0FyZ1NwZWNPcHRpb25zfSBbb3B0c10gLSBPcHRpb25zXG4gICAqIEByZXR1cm5zIHtSZWFkb25seTxBcmdTcGVjPn1cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUgKG5hbWUsIG9wdHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuZXcgQXJnU3BlYyhuYW1lLCBvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uLCB1c2VmdWwgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdG9TdHJpbmcgKCkge1xuICAgIGxldCBzdHIgPSBgW0FyZ1NwZWNdICR7dGhpcy5uYW1lfSAoJHt0aGlzLnJlZn0pYDtcbiAgICBpZiAodGhpcy5leHRUeXBlICYmIHRoaXMuZXh0TmFtZSkge1xuICAgICAgc3RyICs9IGAgKGV4dDogJHt0aGlzLmV4dFR5cGV9LyR7dGhpcy5leHROYW1lfSlgO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIEFyZ1NwZWMuY3JlYXRlfVxuICogQHRlbXBsYXRlIERcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFyZ1NwZWNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V4dE5hbWVdXG4gKiBAcHJvcGVydHkge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZXN0XVxuICogQHByb3BlcnR5IHtEfSBbZGVmYXVsdFZhbHVlXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuIl0sImZpbGUiOiJsaWIvc2NoZW1hL2FyZy1zcGVjLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=