@aws-cdk/aws-glue-alpha 2.268.0-alpha.0 → 2.270.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.jsii +1820 -1612
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +1649 -10
  4. package/README.md +105 -35
  5. package/adr/job-arguments.md +212 -0
  6. package/lib/catalog.js +88 -4
  7. package/lib/code.js +59 -4
  8. package/lib/connection.d.ts +44 -29
  9. package/lib/connection.js +147 -31
  10. package/lib/constants.d.ts +17 -0
  11. package/lib/constants.js +20 -2
  12. package/lib/data-format.js +43 -6
  13. package/lib/data-quality-ruleset.js +60 -4
  14. package/lib/database.js +48 -2
  15. package/lib/external-table.js +48 -2
  16. package/lib/jobs/job.d.ts +90 -9
  17. package/lib/jobs/job.js +219 -38
  18. package/lib/jobs/pyspark-etl-job.d.ts +1 -3
  19. package/lib/jobs/pyspark-etl-job.js +28 -14
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +1 -3
  21. package/lib/jobs/pyspark-flex-etl-job.js +28 -14
  22. package/lib/jobs/pyspark-streaming-job.d.ts +1 -3
  23. package/lib/jobs/pyspark-streaming-job.js +28 -14
  24. package/lib/jobs/python-shell-job.d.ts +20 -7
  25. package/lib/jobs/python-shell-job.js +49 -33
  26. package/lib/jobs/ray-job.js +8 -13
  27. package/lib/jobs/scala-spark-etl-job.d.ts +1 -3
  28. package/lib/jobs/scala-spark-etl-job.js +29 -14
  29. package/lib/jobs/scala-spark-flex-etl-job.d.ts +1 -3
  30. package/lib/jobs/scala-spark-flex-etl-job.js +29 -14
  31. package/lib/jobs/scala-spark-streaming-job.d.ts +1 -3
  32. package/lib/jobs/scala-spark-streaming-job.js +29 -14
  33. package/lib/jobs/spark-job.d.ts +9 -7
  34. package/lib/jobs/spark-job.js +26 -32
  35. package/lib/partition-projection.d.ts +36 -47
  36. package/lib/partition-projection.js +34 -40
  37. package/lib/s3-table.js +106 -5
  38. package/lib/schema.js +50 -3
  39. package/lib/security-configuration.js +60 -5
  40. package/lib/storage-parameter.js +91 -2
  41. package/lib/table-base.js +32 -2
  42. package/lib/triggers/trigger-options.d.ts +102 -42
  43. package/lib/triggers/trigger-options.js +242 -3
  44. package/lib/triggers/workflow.d.ts +31 -47
  45. package/lib/triggers/workflow.js +87 -142
  46. package/package.json +10 -10
package/lib/jobs/job.js CHANGED
@@ -51,7 +51,22 @@ const secret_detection_1 = require("../private/secret-detection");
51
51
  * event-driven flow using the job.
52
52
  */
53
53
  class JobBase extends cdk.Resource {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.JobBase", version: "2.268.0-alpha.0" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.JobBase", version: "2.270.0-alpha.0" };
55
+ /**
56
+ * A reference to this Job resource, for use with the generated L1 ref interface.
57
+ */
58
+ get jobRef() {
59
+ try {
60
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#jobRef", "");
61
+ }
62
+ catch (error) {
63
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
64
+ Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "jobRef").get);
65
+ }
66
+ throw error;
67
+ }
68
+ return { jobName: this.jobName };
69
+ }
55
70
  /**
56
71
  * Create a CloudWatch Event Rule for this Glue Job when it's in a given state
57
72
  *
@@ -64,6 +79,15 @@ class JobBase extends cdk.Resource {
64
79
  * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types
65
80
  */
66
81
  onEvent(id, options = {}) {
82
+ try {
83
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#onEvent", "");
84
+ }
85
+ catch (error) {
86
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
87
+ Error.captureStackTrace(error, this.onEvent);
88
+ }
89
+ throw error;
90
+ }
67
91
  const rule = new events.Rule(this, id, options);
68
92
  rule.addTarget(options.target);
69
93
  rule.addEventPattern({
@@ -84,6 +108,7 @@ class JobBase extends cdk.Resource {
84
108
  */
85
109
  onStateChange(id, jobState, options = {}) {
86
110
  try {
111
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#onStateChange", "");
87
112
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_JobState(jobState);
88
113
  }
89
114
  catch (error) {
@@ -110,6 +135,15 @@ class JobBase extends cdk.Resource {
110
135
  * @param options optional event options. default is {}.
111
136
  */
112
137
  onSuccess(id, options = {}) {
138
+ try {
139
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#onSuccess", "");
140
+ }
141
+ catch (error) {
142
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
143
+ Error.captureStackTrace(error, this.onSuccess);
144
+ }
145
+ throw error;
146
+ }
113
147
  return this.onStateChange(id, constants_1.JobState.SUCCEEDED, options);
114
148
  }
115
149
  /**
@@ -119,6 +153,15 @@ class JobBase extends cdk.Resource {
119
153
  * @param options optional event options. default is {}.
120
154
  */
121
155
  onFailure(id, options = {}) {
156
+ try {
157
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#onFailure", "");
158
+ }
159
+ catch (error) {
160
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
161
+ Error.captureStackTrace(error, this.onFailure);
162
+ }
163
+ throw error;
164
+ }
122
165
  return this.onStateChange(id, constants_1.JobState.FAILED, options);
123
166
  }
124
167
  /**
@@ -128,6 +171,15 @@ class JobBase extends cdk.Resource {
128
171
  * @param options optional event options. default is {}.
129
172
  */
130
173
  onTimeout(id, options = {}) {
174
+ try {
175
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#onTimeout", "");
176
+ }
177
+ catch (error) {
178
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
179
+ Error.captureStackTrace(error, this.onTimeout);
180
+ }
181
+ throw error;
182
+ }
131
183
  return this.onStateChange(id, constants_1.JobState.TIMEOUT, options);
132
184
  }
133
185
  /**
@@ -141,6 +193,7 @@ class JobBase extends cdk.Resource {
141
193
  */
142
194
  metric(metricName, type, props) {
143
195
  try {
196
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#metric", "");
144
197
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_MetricType(type);
145
198
  }
146
199
  catch (error) {
@@ -166,6 +219,15 @@ class JobBase extends cdk.Resource {
166
219
  * This metric is based on the Rule returned by no-args onSuccess() call.
167
220
  */
168
221
  metricSuccess(props) {
222
+ try {
223
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#metricSuccess", "");
224
+ }
225
+ catch (error) {
226
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
227
+ Error.captureStackTrace(error, this.metricSuccess);
228
+ }
229
+ throw error;
230
+ }
169
231
  return metricRule(this.metricJobStateRule('SuccessMetricRule', constants_1.JobState.SUCCEEDED), props);
170
232
  }
171
233
  /**
@@ -174,6 +236,15 @@ class JobBase extends cdk.Resource {
174
236
  * This metric is based on the Rule returned by no-args onFailure() call.
175
237
  */
176
238
  metricFailure(props) {
239
+ try {
240
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#metricFailure", "");
241
+ }
242
+ catch (error) {
243
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
244
+ Error.captureStackTrace(error, this.metricFailure);
245
+ }
246
+ throw error;
247
+ }
177
248
  return metricRule(this.metricJobStateRule('FailureMetricRule', constants_1.JobState.FAILED), props);
178
249
  }
179
250
  /**
@@ -182,6 +253,15 @@ class JobBase extends cdk.Resource {
182
253
  * This metric is based on the Rule returned by no-args onTimeout() call.
183
254
  */
184
255
  metricTimeout(props) {
256
+ try {
257
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#metricTimeout", "");
258
+ }
259
+ catch (error) {
260
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
261
+ Error.captureStackTrace(error, this.metricTimeout);
262
+ }
263
+ throw error;
264
+ }
185
265
  return metricRule(this.metricJobStateRule('TimeoutMetricRule', constants_1.JobState.TIMEOUT), props);
186
266
  }
187
267
  /**
@@ -197,6 +277,15 @@ class JobBase extends cdk.Resource {
197
277
  * Returns the job arn
198
278
  */
199
279
  buildJobArn(scope, jobName) {
280
+ try {
281
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.JobBase#buildJobArn", "");
282
+ }
283
+ catch (error) {
284
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
285
+ Error.captureStackTrace(error, this.buildJobArn);
286
+ }
287
+ throw error;
288
+ }
200
289
  return cdk.Stack.of(scope).formatArn({
201
290
  service: 'glue',
202
291
  resource: 'job',
@@ -210,7 +299,7 @@ exports.JobBase = JobBase;
210
299
  * @resource AWS::Glue::Job
211
300
  */
212
301
  class Job extends JobBase {
213
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.268.0-alpha.0" };
302
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.270.0-alpha.0" };
214
303
  /**
215
304
  * Identifies an existing Glue Job from a subset of attributes that can
216
305
  * be referenced from within another Stack or Construct.
@@ -221,6 +310,7 @@ class Job extends JobBase {
221
310
  */
222
311
  static fromJobAttributes(scope, id, attrs) {
223
312
  try {
313
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.Job#fromJobAttributes", "");
224
314
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_JobAttributes(attrs);
225
315
  }
226
316
  catch (error) {
@@ -237,31 +327,126 @@ class Job extends JobBase {
237
327
  return new Import(scope, id);
238
328
  }
239
329
  /**
240
- * Check no usage of reserved arguments.
330
+ * Argument keys that Glue reserves for its own use and that a caller must never set through
331
+ * `defaultArguments`. Unlike construct-managed arguments (which are derived from what each job
332
+ * class emits), these are owned by the Glue service itself and are reserved for every job type.
241
333
  *
242
334
  * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
243
335
  */
244
- checkNoReservedArgs(defaultArguments) {
336
+ static GLUE_RESERVED_ARGUMENTS = new Set(['--debug', '--mode', '--JOB_NAME', '--endpoint']);
337
+ /**
338
+ * The construct-managed job arguments that are actually emitted for the current configuration,
339
+ * accumulated via {@link setManagedArgument}. Passed through to `CfnJob.defaultArguments` after
340
+ * being merged with the user-supplied `defaultArguments` by {@link mergeDefaultArguments}.
341
+ */
342
+ _managedArguments = {};
343
+ /**
344
+ * Every argument key this construct manages, accumulated via {@link setManagedArgument} — whether
345
+ * or not the current configuration emits a value for it. This is the reserved set that a
346
+ * user-supplied `defaultArguments` must not collide with. Registering a key even when its value
347
+ * is `undefined` (feature disabled or unset) is what keeps `defaultArguments` from silently
348
+ * re-enabling it.
349
+ */
350
+ _managedArgumentKeys = new Set();
351
+ /**
352
+ * Declare `key` as construct-managed and, when `value` is defined, emit it into the job's
353
+ * arguments.
354
+ *
355
+ * This is the single sink for every argument a job construct derives from its typed props (or
356
+ * from the job class itself). Call it once per managed key, passing `undefined` as the value when
357
+ * the corresponding feature is turned off or unset — the key is still reserved from
358
+ * `defaultArguments` either way, so a disabled feature cannot be re-enabled through the escape
359
+ * hatch. There is deliberately no other way for a subclass to emit a managed argument, so the
360
+ * reserved set can never drift from what is emitted.
361
+ *
362
+ * @param key the Glue argument key, e.g. `--enable-metrics`
363
+ * @param value the value to emit, or `undefined` to reserve the key without emitting it
364
+ */
365
+ setManagedArgument(key, value) {
366
+ try {
367
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.Job#setManagedArgument", "");
368
+ }
369
+ catch (error) {
370
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
371
+ Error.captureStackTrace(error, this.setManagedArgument);
372
+ }
373
+ throw error;
374
+ }
375
+ this._managedArgumentKeys.add(key);
376
+ if (value !== undefined) {
377
+ this._managedArguments[key] = value;
378
+ }
379
+ }
380
+ /**
381
+ * Merge the customer-supplied `defaultArguments` with the arguments this construct manages.
382
+ *
383
+ * The construct owns every argument it emits — whether the value comes from a dedicated typed
384
+ * prop (e.g. `continuousLogging`, `enableMetrics`, `sparkUI`) or from the job class itself
385
+ * (e.g. `--job-language`). Those arguments, plus the arguments Glue reserves for its own use,
386
+ * MUST be configured through their dedicated props rather than the untyped `defaultArguments`
387
+ * map, so there is exactly one way to express each intent. Passing such a key through
388
+ * `defaultArguments` therefore throws instead of silently winning or being silently dropped.
389
+ *
390
+ * A managed key whose supplied value is identical to the construct's value is not contradictory,
391
+ * so it is allowed rather than rejected (auto-correcting config is preferred over errors).
392
+ * Glue-reserved keys are never emitted by the construct, so there is no value to reconcile and
393
+ * they always throw.
394
+ *
395
+ * The reserved set is `_managedArgumentKeys` — every key the construct declared through
396
+ * {@link setManagedArgument}, whether or not a value was emitted for it. It is deliberately NOT
397
+ * derived from the keys that carry a value: a typed prop that turns a feature *off* (e.g.
398
+ * `enableMetrics: false`) emits no value but still reserves its key, so `defaultArguments` cannot
399
+ * silently re-enable it.
400
+ *
401
+ * Conflict detection relies on string equality of the argument keys, which cannot see through
402
+ * unresolved tokens (e.g. a key produced by `CfnJson` that only resolves at deploy time). If a
403
+ * key is a token, the check is skipped for that key and a synthesis-time warning is emitted, so
404
+ * the (rare) case where a token key resolves to a managed argument at deploy time — in which the
405
+ * construct-managed value would silently take precedence — is surfaced rather than hidden.
406
+ *
407
+ * @param defaultArguments the caller-supplied escape-hatch arguments, if any
408
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
409
+ */
410
+ mergeDefaultArguments(defaultArguments) {
411
+ try {
412
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.Job#mergeDefaultArguments", "");
413
+ }
414
+ catch (error) {
415
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
416
+ Error.captureStackTrace(error, this.mergeDefaultArguments);
417
+ }
418
+ throw error;
419
+ }
245
420
  if (defaultArguments) {
246
- const reservedArgs = new Set(['--debug', '--mode', '--JOB_NAME']);
247
- Object.keys(defaultArguments).forEach((arg) => {
248
- if (reservedArgs.has(arg)) {
249
- throw new cdk.ValidationError((0, helpers_internal_1.lit) `ReservedArgumentUsed`, `The ${arg} argument is reserved by Glue. Don't set it`, this);
250
- }
251
- });
421
+ if (Object.keys(defaultArguments).some((arg) => cdk.Token.isUnresolved(arg))) {
422
+ cdk.Annotations.of(this).addWarningV2('@aws-cdk/aws-glue-alpha:tokenJobArgumentKey', 'defaultArguments contains an unresolved token as an argument key, so it cannot be checked for conflicts with construct-managed arguments. If it resolves to a managed argument at deploy time, the construct-managed value will take precedence. Configure managed arguments through their dedicated props (e.g. continuousLogging, enableMetrics, enableObservabilityMetrics, sparkUI).');
423
+ }
424
+ const conflicts = Object.keys(defaultArguments).filter((arg) => Job.GLUE_RESERVED_ARGUMENTS.has(arg)
425
+ || (this._managedArgumentKeys.has(arg)
426
+ && !(Object.hasOwn(this._managedArguments, arg) && defaultArguments[arg] === this._managedArguments[arg])));
427
+ if (conflicts.length > 0) {
428
+ throw new cdk.ValidationError((0, helpers_internal_1.lit) `ManagedJobArgument`, `the job argument(s) ${JSON.stringify(conflicts)} are managed by the construct or reserved by Glue; configure them through the corresponding props (e.g. continuousLogging, enableMetrics, enableObservabilityMetrics, sparkUI) instead of defaultArguments`, this);
429
+ }
252
430
  }
253
431
  (0, secret_detection_1.warnOnPlaintextSecrets)(this, defaultArguments, '@aws-cdk/aws-glue-alpha:plaintextJobArgumentSecret', 'Pass secrets to the job at runtime through AWS Secrets Manager instead of embedding them in `defaultArguments`.');
254
- return defaultArguments;
432
+ return { ...defaultArguments, ...this._managedArguments };
255
433
  }
256
434
  /**
257
- * Setup Continuous Logging Properties
258
- * @param role The IAM role to use for continuous logging
435
+ * Register (and, when enabled, emit) the continuous-logging arguments this job manages.
436
+ *
437
+ * All five continuous-logging keys are reserved on every job type regardless of configuration:
438
+ * they are always registered through {@link setManagedArgument}, and carry a value only when
439
+ * logging is enabled. This keeps `defaultArguments` from re-enabling logging a user turned off.
440
+ *
441
+ * @param role The IAM role to grant write access to a custom log group, if one is provided
259
442
  * @param props The properties for continuous logging configuration
260
- * @returns String containing the args for the continuous logging command
443
+ * @param securityConfiguration The security configuration attached to the job, if any
261
444
  */
262
- setupContinuousLogging(role, props) {
445
+ setupContinuousLogging(role, props, securityConfiguration) {
263
446
  try {
447
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.Job#setupContinuousLogging", "");
264
448
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ContinuousLoggingProps(props);
449
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ISecurityConfiguration(securityConfiguration);
265
450
  }
266
451
  catch (error) {
267
452
  if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
@@ -269,32 +454,28 @@ class Job extends JobBase {
269
454
  }
270
455
  throw error;
271
456
  }
272
- // If the developer has explicitly disabled continuous logging return no args
273
- if (props && !props.enabled) {
274
- return {};
275
- }
276
- // Else we turn on continuous logging by default. Determine what log group to use.
277
- const args = {
278
- '--enable-continuous-cloudwatch-log': 'true',
279
- };
280
- if (props?.quiet) {
281
- args['--enable-continuous-log-filter'] = 'true';
282
- }
283
- // If the developer provided a log group, add its name to the args and update the role.
284
- if (props?.logGroup) {
285
- args['--continuous-log-logGroup'] = props.logGroup.logGroupName;
286
- props.logGroup.grantWrite(role);
287
- }
288
- if (props?.logStreamPrefix) {
289
- args['--continuous-log-logStreamPrefix'] = props.logStreamPrefix;
290
- }
291
- if (props?.conversionPattern) {
292
- args['--continuous-log-conversionPattern'] = props.conversionPattern;
457
+ // Continuous logging is on unless the developer has explicitly disabled it.
458
+ const enabled = !(props && !props.enabled);
459
+ // When logging is on, the logs are written to an unencrypted CloudWatch log group unless a
460
+ // SecurityConfiguration is attached. We cannot introspect whether the attached
461
+ // SecurityConfiguration actually configures cloudWatchEncryption (the ISecurityConfiguration
462
+ // interface only exposes the name), so we only warn when none is attached at all to avoid
463
+ // false positives.
464
+ if (enabled && !securityConfiguration) {
465
+ cdk.Annotations.of(this).addWarningV2('@aws-cdk/aws-glue-alpha:unencryptedContinuousLogging', 'Continuous CloudWatch logging is enabled but no SecurityConfiguration with cloudWatchEncryption is attached. Job stdout and stderr will be written to an unencrypted CloudWatch log group. See https://docs.aws.amazon.com/glue/latest/dg/encryption-security-configuration.html');
293
466
  }
294
- return args;
467
+ // A custom log group is only wired up (and only granted write) when logging is enabled.
468
+ const logGroup = enabled ? props?.logGroup : undefined;
469
+ logGroup?.grantWrite(role);
470
+ this.setManagedArgument('--enable-continuous-cloudwatch-log', enabled ? 'true' : undefined);
471
+ this.setManagedArgument('--enable-continuous-log-filter', enabled && props?.quiet ? 'true' : undefined);
472
+ this.setManagedArgument('--continuous-log-logGroup', logGroup?.logGroupName);
473
+ this.setManagedArgument('--continuous-log-logStreamPrefix', enabled ? props?.logStreamPrefix : undefined);
474
+ this.setManagedArgument('--continuous-log-conversionPattern', enabled ? props?.conversionPattern : undefined);
295
475
  }
296
476
  codeS3ObjectUrl(code) {
297
477
  try {
478
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.Job#codeS3ObjectUrl", "");
298
479
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_Code(code);
299
480
  }
300
481
  catch (error) {
@@ -325,4 +506,4 @@ function metricRule(rule, props) {
325
506
  ...props,
326
507
  }).attachTo(rule);
327
508
  }
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQXlEO0FBQ3pELCtEQUFpRDtBQUNqRCx5REFBMkM7QUFFM0Msc0RBQXdDO0FBQ3hDLDRFQUE0RDtBQUs1RCw0Q0FBd0M7QUFDeEMsa0VBQXFFO0FBcUhyRTs7Ozs7O0dBTUc7QUFDSCxNQUFzQixPQUFRLFNBQVEsR0FBRyxDQUFDLFFBQVE7O0lBS2hEOzs7Ozs7Ozs7O09BVUc7SUFDSSxPQUFPLENBQUMsRUFBVSxFQUFFLFVBQWlDLEVBQUU7UUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUNuQixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDcEIsVUFBVSxFQUFFLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLENBQUM7WUFDNUQsTUFBTSxFQUFFO2dCQUNOLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDeEI7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQ7Ozs7OztPQU1HO0lBQ08sYUFBYSxDQUFDLEVBQVUsRUFBRSxRQUFrQixFQUFFLFVBQWlDLEVBQUU7Ozs7Ozs7Ozs7UUFDekYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDNUIsV0FBVyxFQUFFLGdDQUFnQyxJQUFJLENBQUMsT0FBTyxVQUFVLFFBQVEsUUFBUTtZQUNuRixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ25C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QyxHQUFHO1FBQy9CLEdBQUcsS0FBSztLQUNULENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjb25zdHJ1Y3RzIGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlIH0gZnJvbSAnLi4vY29kZSc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1R5cGUsIEdsdWVWZXJzaW9uIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEpvYlN0YXRlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHdhcm5PblBsYWludGV4dFNlY3JldHMgfSBmcm9tICcuLi9wcml2YXRlL3NlY3JldC1kZXRlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBJU2VjdXJpdHlDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vc2VjdXJpdHktY29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIG5ldyBvciBhbiBpbXBvcnRlZCBHbHVlIEpvYlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElKb2IgZXh0ZW5kcyBjZGsuSVJlc291cmNlLCBpYW0uSUdyYW50YWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgam9iLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBqb2JOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGpvYi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgam9iQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBDbG91ZFdhdGNoIGV2ZW50IHJ1bGUgdHJpZ2dlcmVkIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgd2l0aCB0aGlzIGpvYi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL0V2ZW50VHlwZXMuaHRtbCNnbHVlLWV2ZW50LXR5cGVzXG4gICAqL1xuICBvbkV2ZW50KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBldmVudHMuT25FdmVudE9wdGlvbnMpOiBldmVudHMuUnVsZTtcblxuICAvKipcbiAgICogRGVmaW5lcyBhIENsb3VkV2F0Y2ggZXZlbnQgcnVsZSB0cmlnZ2VyZWQgd2hlbiB0aGlzIGpvYiBtb3ZlcyB0byB0aGUgU1VDQ0VFREVEIHN0YXRlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uU3VjY2VzcyhpZDogc3RyaW5nLCBvcHRpb25zPzogZXZlbnRzLk9uRXZlbnRPcHRpb25zKTogZXZlbnRzLlJ1bGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBDbG91ZFdhdGNoIGV2ZW50IHJ1bGUgdHJpZ2dlcmVkIHdoZW4gdGhpcyBqb2IgbW92ZXMgdG8gdGhlIEZBSUxFRCBzdGF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL0V2ZW50VHlwZXMuaHRtbCNnbHVlLWV2ZW50LXR5cGVzXG4gICAqL1xuICBvbkZhaWx1cmUoaWQ6IHN0cmluZywgb3B0aW9ucz86IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyk6IGV2ZW50cy5SdWxlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgQ2xvdWRXYXRjaCBldmVudCBydWxlIHRyaWdnZXJlZCB3aGVuIHRoaXMgam9iIG1vdmVzIHRvIHRoZSBUSU1FT1VUIHN0YXRlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uVGltZW91dChpZDogc3RyaW5nLCBvcHRpb25zPzogZXZlbnRzLk9uRXZlbnRPcHRpb25zKTogZXZlbnRzLlJ1bGU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBuYW1lIG9mIHRoZSBtZXRyaWMgdHlwaWNhbGx5IHByZWZpeGVkIHdpdGggYGdsdWUuZHJpdmVyLmAsIGBnbHVlLjxleGVjdXRvcklkPi5gIG9yIGBnbHVlLkFMTC5gLlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgbWV0cmljIHR5cGUuXG4gICAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgb3B0aW9ucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvcmluZy1hd3NnbHVlLXdpdGgtY2xvdWR3YXRjaC1tZXRyaWNzLmh0bWxcbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHR5cGU6IE1ldHJpY1R5cGUsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHN1Y2Nlc3MuXG4gICAqL1xuICBtZXRyaWNTdWNjZXNzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIGZhaWx1cmUuXG4gICAqL1xuICBtZXRyaWNGYWlsdXJlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHRpbWVvdXQuXG4gICAqL1xuICBtZXRyaWNUaW1lb3V0KHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZW5hYmxpbmcgQ29udGludW91cyBMb2dnaW5nIGZvciBHbHVlIEpvYnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1jb250aW51b3VzLWxvZ2dpbmctZW5hYmxlLmh0bWxcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludW91c0xvZ2dpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBFbmFibGUgY29udGludW91cyBsb2dnaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBDbG91ZFdhdGNoIGxvZyBncm91cCBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbG9nIGdyb3VwIGlzIGNyZWF0ZWQgd2l0aCBuYW1lIGAvYXdzLWdsdWUvam9icy9sb2dzLXYyL2AuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIENsb3VkV2F0Y2ggbG9nIHN0cmVhbSBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGpvYiBydW4gSUQuXG4gICAqL1xuICByZWFkb25seSBsb2dTdHJlYW1QcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBvdXQgbm9uLXVzZWZ1bCBBcGFjaGUgU3BhcmsgZHJpdmVyL2V4ZWN1dG9yIGFuZCBBcGFjaGUgSGFkb29wIFlBUk4gaGVhcnRiZWF0IGxvZyBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgcHJvdmlkZWQgY29udmVyc2lvbiBwYXR0ZXJuLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgTG9nNGogQ29udmVyc2lvbiBQYXR0ZXJuIHRvIGN1c3RvbWl6ZSBkcml2ZXIgYW5kIGV4ZWN1dG9yIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAlZHt5eS9NTS9kZCBISDptbTpzc30gJXAgJWN7MX06ICVtJW5gXG4gICAqL1xuICByZWFkb25seSBjb252ZXJzaW9uUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgaXMgbmVlZGVkIHRvIGJlIGFibGUgdG8gaW1wb3J0IGV4aXN0aW5nIEpvYnMgaW50byBhIENESyBhcHAgdG9cbiAqIHJlZmVyZW5jZSBhcyBwYXJ0IG9mIGEgbGFyZ2VyIHN0YWNrIG9yIGNvbnN0cnVjdC4gSm9iQmFzZSBoYXMgdGhlIHN1YnNldFxuICogb2YgYXR0cmlidXRlcyByZXF1aXJlZCB0byBpZGVudGlmeSBhbmQgcmVmZXJlbmNlIGFuIGV4aXN0aW5nIEdsdWUgSm9iLFxuICogYXMgd2VsbCBhcyBzb21lIENsb3VkV2F0Y2ggbWV0cmljIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5cbiAqIGV2ZW50LWRyaXZlbiBmbG93IHVzaW5nIHRoZSBqb2IuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2JCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUpvYiB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBqb2JBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIGZvciB0aGlzIEdsdWUgSm9iIHdoZW4gaXQncyBpbiBhIGdpdmVuIHN0YXRlXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIG9wdGlvbnMgZXZlbnQgb3B0aW9ucy4gTm90ZSB0aGF0IHNvbWUgdmFsdWVzIGFyZSBvdmVycmlkZGVuIGlmIHByb3ZpZGVkLCB0aGVzZSBhcmVcbiAgICogIC0gZXZlbnRQYXR0ZXJuLnNvdXJjZSA9IFsnYXdzLmdsdWUnXVxuICAgKiAgLSBldmVudFBhdHRlcm4uZGV0YWlsVHlwZSA9IFsnR2x1ZSBKb2IgU3RhdGUgQ2hhbmdlJywgJ0dsdWUgSm9iIFJ1biBTdGF0dXMnXVxuICAgKiAgLSBldmVudFBhdHRlcm4uZGV0YWlsLmpvYk5hbWUgPSBbdGhpcy5qb2JOYW1lXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIHB1YmxpYyBvbkV2ZW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIGNvbnN0IHJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgaWQsIG9wdGlvbnMpO1xuICAgIHJ1bGUuYWRkVGFyZ2V0KG9wdGlvbnMudGFyZ2V0KTtcbiAgICBydWxlLmFkZEV2ZW50UGF0dGVybih7XG4gICAgICBzb3VyY2U6IFsnYXdzLmdsdWUnXSxcbiAgICAgIGRldGFpbFR5cGU6IFsnR2x1ZSBKb2IgU3RhdGUgQ2hhbmdlJywgJ0dsdWUgSm9iIFJ1biBTdGF0dXMnXSxcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBqb2JOYW1lOiBbdGhpcy5qb2JOYW1lXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIGZvciB0aGUgdHJhbnNpdGlvbiBpbnRvIHRoZSBpbnB1dCBqb2JTdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIGpvYlN0YXRlIHRoZSBqb2Igc3RhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25TdGF0ZUNoYW5nZShpZDogc3RyaW5nLCBqb2JTdGF0ZTogSm9iU3RhdGUsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLm9uRXZlbnQoaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgUnVsZSB0cmlnZ2VyZWQgd2hlbiBHbHVlIGpvYiAke3RoaXMuam9iTmFtZX0gaXMgaW4gJHtqb2JTdGF0ZX0gc3RhdGVgLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBydWxlLmFkZEV2ZW50UGF0dGVybih7XG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgc3RhdGU6IFtqb2JTdGF0ZV0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggRXZlbnQgUnVsZSBtYXRjaGluZyBKb2JTdGF0ZS5TVUNDRUVERUQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuIGRlZmF1bHQgaXMge30uXG4gICAqL1xuICBwdWJsaWMgb25TdWNjZXNzKGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIHJldHVybiB0aGlzLm9uU3RhdGVDaGFuZ2UoaWQsIEpvYlN0YXRlLlNVQ0NFRURFRCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIG1hdGNoaW5nIEZBSUxFRCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXZlbnQgb3B0aW9ucy4gZGVmYXVsdCBpcyB7fS5cbiAgICovXG4gIHB1YmxpYyBvbkZhaWx1cmUoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZUNoYW5nZShpZCwgSm9iU3RhdGUuRkFJTEVELCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIEV2ZW50IFJ1bGUgbWF0Y2hpbmcgVElNRU9VVCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXZlbnQgb3B0aW9ucy4gZGVmYXVsdCBpcyB7fS5cbiAgICovXG4gIHB1YmxpYyBvblRpbWVvdXQoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZUNoYW5nZShpZCwgSm9iU3RhdGUuVElNRU9VVCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYyB0eXBpY2FsbHkgcHJlZml4ZWQgd2l0aCBgZ2x1ZS5kcml2ZXIuYCwgYGdsdWUuPGV4ZWN1dG9ySWQ+LmAgb3IgYGdsdWUuQUxMLmAuXG4gICAqIEBwYXJhbSB0eXBlIHRoZSBtZXRyaWMgdHlwZS5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yaW5nLWF3c2dsdWUtd2l0aC1jbG91ZHdhdGNoLW1ldHJpY3MuaHRtbFxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHR5cGU6IE1ldHJpY1R5cGUsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0dsdWUnLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBKb2JOYW1lOiB0aGlzLmpvYk5hbWUsXG4gICAgICAgIEpvYlJ1bklkOiAnQUxMJyxcbiAgICAgICAgVHlwZTogdHlwZSxcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIE1ldHJpYyBpbmRpY2F0aW5nIGpvYiBzdWNjZXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyBpcyBiYXNlZCBvbiB0aGUgUnVsZSByZXR1cm5lZCBieSBuby1hcmdzIG9uU3VjY2VzcygpIGNhbGwuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU3VjY2Vzcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbWV0cmljUnVsZSh0aGlzLm1ldHJpY0pvYlN0YXRlUnVsZSgnU3VjY2Vzc01ldHJpY1J1bGUnLCBKb2JTdGF0ZS5TVUNDRUVERUQpLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgZmFpbHVyZS5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgaXMgYmFzZWQgb24gdGhlIFJ1bGUgcmV0dXJuZWQgYnkgbm8tYXJncyBvbkZhaWx1cmUoKSBjYWxsLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZhaWx1cmUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG1ldHJpY1J1bGUodGhpcy5tZXRyaWNKb2JTdGF0ZVJ1bGUoJ0ZhaWx1cmVNZXRyaWNSdWxlJywgSm9iU3RhdGUuRkFJTEVEKSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHRpbWVvdXQuXG4gICAqXG4gICAqIFRoaXMgbWV0cmljIGlzIGJhc2VkIG9uIHRoZSBSdWxlIHJldHVybmVkIGJ5IG5vLWFyZ3Mgb25UaW1lb3V0KCkgY2FsbC5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUaW1lb3V0KHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBtZXRyaWNSdWxlKHRoaXMubWV0cmljSm9iU3RhdGVSdWxlKCdUaW1lb3V0TWV0cmljUnVsZScsIEpvYlN0YXRlLlRJTUVPVVQpLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciByZXRyaWV2ZXMgYSBzaW5nbGV0b24gZXZlbnQgcnVsZSBmb3IgdGhlIGlucHV0IGpvYiBzdGF0ZSBmb3IgdXNlIHdpdGggdGhlIG1ldHJpYyBKb2JTdGF0ZSBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IGlkLlxuICAgKiBAcGFyYW0gam9iU3RhdGUgdGhlIGpvYiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgbWV0cmljSm9iU3RhdGVSdWxlKGlkOiBzdHJpbmcsIGpvYlN0YXRlOiBKb2JTdGF0ZSk6IGV2ZW50cy5SdWxlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgZXZlbnRzLlJ1bGUgPz8gdGhpcy5vblN0YXRlQ2hhbmdlKGlkLCBqb2JTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgam9iIGFyblxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkSm9iQXJuKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgam9iTmFtZTogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAnam9iJyxcbiAgICAgIHJlc291cmNlTmFtZTogam9iTmFtZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3Vic2V0IG9mIEpvYiBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZCBmb3IgaW1wb3J0aW5nIGFuIGV4aXN0aW5nIGpvYlxuICogaW50byBhIENESyBwcm9qZWN0LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHVzaW5nIGZyb21Kb2JBdHRyaWJ1dGVzXG4gKiB0byBpZGVudGlmeSBhbmQgcmVmZXJlbmNlIHRoZSBleGlzdGluZyBqb2IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgam9iTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgYXNzdW1lZCBieSBHbHVlIHRvIHJ1biB0aGlzIGpvYi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbn1cblxuLyoqXG4gKiBKb2JQcm9wcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBHbHVlIEpvYnMgdXNpbmcgdGhpcyBMMiBDb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iUHJvcHMge1xuICAvKipcbiAgICogU2NyaXB0IENvZGUgTG9jYXRpb24gKHJlcXVpcmVkKVxuICAgKiBTY3JpcHQgdG8gcnVuIHdoZW4gdGhlIEdsdWUgam9iIGV4ZWN1dGVzLiBDYW4gYmUgdXBsb2FkZWRcbiAgICogZnJvbSB0aGUgbG9jYWwgZGlyZWN0b3J5IHN0cnVjdHVyZSB1c2luZyBmcm9tQXNzZXRcbiAgICogb3IgcmVmZXJlbmNlZCB2aWEgUzMgbG9jYXRpb24gdXNpbmcgZnJvbUJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyaXB0OiBDb2RlO1xuXG4gIC8qKlxuICAgKiBJQU0gUm9sZSAocmVxdWlyZWQpXG4gICAqIElBTSBSb2xlIHRvIHVzZSBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uXG4gICAqIE11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBkZXZlbG9wZXIgYmVjYXVzZSB0aGUgTDIgZG9lc24ndCBoYXZlIHZpc2liaWxpdHlcbiAgICogaW50byB0aGUgYWN0aW9ucyB0aGUgc2NyaXB0KHMpIHRha2VzIGR1cmluZyB0aGUgam9iIGV4ZWN1dGlvblxuICAgKiBUaGUgcm9sZSBtdXN0IHRydXN0IHRoZSBHbHVlIHNlcnZpY2UgcHJpbmNpcGFsIChnbHVlLmFtYXpvbmF3cy5jb20pXG4gICAqIGFuZCBiZSBncmFudGVkIHN1ZmZpY2llbnQgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2dldHRpbmctc3RhcnRlZC1hY2Nlc3MuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHbHVlIGpvYiAob3B0aW9uYWwpXG4gICAqIERldmVsb3Blci1zcGVjaWZpZWQgbmFtZSBvZiB0aGUgR2x1ZSBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGpvYk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIChvcHRpb25hbClcbiAgICogRGV2ZWxvcGVyLXNwZWNpZmllZCBkZXNjcmlwdGlvbiBvZiB0aGUgR2x1ZSBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1heCBDb25jdXJyZW50IFJ1bnMgKG9wdGlvbmFsKVxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcnVucyB0aGlzIEdsdWUgam9iIGNhbiBjb25jdXJyZW50bHkgcnVuXG4gICAqXG4gICAqIEFuIGVycm9yIGlzIHJldHVybmVkIHdoZW4gdGhpcyB0aHJlc2hvbGQgaXMgcmVhY2hlZC4gVGhlIG1heGltdW0gdmFsdWVcbiAgICogeW91IGNhbiBzcGVjaWZ5IGlzIGNvbnRyb2xsZWQgYnkgYSBzZXJ2aWNlIGxpbWl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW50UnVucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBBcmd1bWVudHMgKG9wdGlvbmFsKVxuICAgKiBUaGUgZGVmYXVsdCBhcmd1bWVudHMgZm9yIGV2ZXJ5IHJ1biBvZiB0aGlzIEdsdWUgam9iLFxuICAgKiBzcGVjaWZpZWQgYXMgbmFtZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogVGhlc2UgYXJlIGVtaXR0ZWQgdmVyYmF0aW0gaW50byB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUsIHNvIGF2b2lkXG4gICAqIHBsYWNpbmcgc2VjcmV0cyBoZXJlIGluIHBsYWludGV4dC4gUGFzcyBzZWNyZXRzIHRvIHRoZSBqb2IgYXQgcnVudGltZVxuICAgKiB0aHJvdWdoIEFXUyBTZWNyZXRzIE1hbmFnZXIgaW5zdGVhZC4gQSBzeW50aGVzaXMtdGltZSB3YXJuaW5nIGlzIGVtaXR0ZWRcbiAgICogd2hlbiBhbiBhcmd1bWVudCBrZXkgbG9va3MgbGlrZSBhIGNyZWRlbnRpYWwgYW5kIGhvbGRzIGEgcGxhaW50ZXh0IGxpdGVyYWwuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqIGZvciBhIGxpc3Qgb2YgcmVzZXJ2ZWQgcGFyYW1ldGVyc1xuICAgKiBAZGVmYXVsdCAtIG5vIGFyZ3VtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEFyZ3VtZW50cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIENvbm5lY3Rpb25zIChvcHRpb25hbClcbiAgICogTGlzdCBvZiBjb25uZWN0aW9ucyB0byB1c2UgZm9yIHRoaXMgR2x1ZSBqb2JcbiAgICogQ29ubmVjdGlvbnMgYXJlIHVzZWQgdG8gY29ubmVjdCB0byBvdGhlciBBV1MgU2VydmljZSBvciByZXNvdXJjZXMgd2l0aGluIGEgVlBDLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXSAtIG5vIGNvbm5lY3Rpb25zIGFyZSBhZGRlZCB0byB0aGUgam9iXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9ucz86IElDb25uZWN0aW9uW107XG5cbiAgLyoqXG4gICAqIE1heCBSZXRyaWVzIChvcHRpb25hbClcbiAgICogTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgR2x1ZSBwZXJmb3JtcyBpZiB0aGUgam9iIGZhaWxzXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IG1heFJldHJpZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgKG9wdGlvbmFsKVxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRoYXQgYSBqb2IgcnVuIGNhbiBjb25zdW1lIHJlc291cmNlcyBiZWZvcmUgaXQgaXNcbiAgICogdGVybWluYXRlZCBhbmQgZW50ZXJzIFRJTUVPVVQgc3RhdHVzLiBTcGVjaWZpZWQgaW4gbWludXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgMjg4MCAoMiBkYXlzIGZvciBub24tc3RyZWFtaW5nKVxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogU2VjdXJpdHkgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpXG4gICAqIERlZmluZXMgdGhlIGVuY3J5cHRpb24gb3B0aW9ucyBmb3IgdGhlIEdsdWUgam9iXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2VjdXJpdHkgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbj86IElTZWN1cml0eUNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRhZ3MgKG9wdGlvbmFsKVxuICAgKiBBIGxpc3Qgb2Yga2V5OnZhbHVlIHBhaXJzIG9mIHRhZ3MgdG8gYXBwbHkgdG8gdGhpcyBHbHVlIGpvYiByZXNvdXJjZXNcbiAgICpcbiAgICogQGRlZmF1bHQge30gLSBubyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogR2x1ZSBWZXJzaW9uXG4gICAqIFRoZSB2ZXJzaW9uIG9mIEdsdWUgdG8gdXNlIHRvIGV4ZWN1dGUgdGhpcyBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlcm1pbmVkIGJ5IHRoZSBqb2IgdHlwZTogNC4wIGZvciBFVEwgYW5kIFN0cmVhbWluZywgNS4wIGZvciBGbGV4LCAzLjAgZm9yIFB5dGhvbiBTaGVsbFxuICAgKi9cbiAgcmVhZG9ubHkgZ2x1ZVZlcnNpb24/OiBHbHVlVmVyc2lvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBjb250aW51b3VzIGxvZ2dpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNvbnRpbnVvdXMgbG9nZ2luZyBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLWNvbnRpbnVvdXMtbG9nZ2luZy1lbmFibGUuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKiovXG4gIHJlYWRvbmx5IGNvbnRpbnVvdXNMb2dnaW5nPzogQ29udGludW91c0xvZ2dpbmdQcm9wcztcbn1cblxuLyoqXG4gKiBBIEdsdWUgSm9iLlxuICogQHJlc291cmNlIEFXUzo6R2x1ZTo6Sm9iXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2IgZXh0ZW5kcyBKb2JCYXNlIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXMgYW4gZXhpc3RpbmcgR2x1ZSBKb2IgZnJvbSBhIHN1YnNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgY2FuXG4gICAqIGJlIHJlZmVyZW5jZWQgZnJvbSB3aXRoaW4gYW5vdGhlciBTdGFjayBvciBDb25zdHJ1Y3QuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYClcbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZm9yIHRoZSBHbHVlIEpvYiB3ZSB3YW50IHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSm9iQXR0cmlidXRlcyhzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBKb2JBdHRyaWJ1dGVzKTogSUpvYiB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgSm9iQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgam9iTmFtZSA9IGF0dHJzLmpvYk5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgam9iQXJuID0gdGhpcy5idWlsZEpvYkFybihzY29wZSwgYXR0cnMuam9iTmFtZSk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWwgPSBhdHRycy5yb2xlID8/IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIEdsdWUgYXNzdW1lcyB0byBydW4gdGhpcyBqb2IuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWJzdHJhY3Qgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBDaGVjayBubyB1c2FnZSBvZiByZXNlcnZlZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICBwcm90ZWN0ZWQgY2hlY2tOb1Jlc2VydmVkQXJncyhkZWZhdWx0QXJndW1lbnRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmIChkZWZhdWx0QXJndW1lbnRzKSB7XG4gICAgICBjb25zdCByZXNlcnZlZEFyZ3MgPSBuZXcgU2V0KFsnLS1kZWJ1ZycsICctLW1vZGUnLCAnLS1KT0JfTkFNRSddKTtcbiAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRBcmd1bWVudHMpLmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzZXJ2ZWRBcmdzLmhhcyhhcmcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IobGl0YFJlc2VydmVkQXJndW1lbnRVc2VkYCwgYFRoZSAke2FyZ30gYXJndW1lbnQgaXMgcmVzZXJ2ZWQgYnkgR2x1ZS4gRG9uJ3Qgc2V0IGl0YCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB3YXJuT25QbGFpbnRleHRTZWNyZXRzKFxuICAgICAgdGhpcyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgICAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGE6cGxhaW50ZXh0Sm9iQXJndW1lbnRTZWNyZXQnLFxuICAgICAgJ1Bhc3Mgc2VjcmV0cyB0byB0aGUgam9iIGF0IHJ1bnRpbWUgdGhyb3VnaCBBV1MgU2VjcmV0cyBNYW5hZ2VyIGluc3RlYWQgb2YgZW1iZWRkaW5nIHRoZW0gaW4gYGRlZmF1bHRBcmd1bWVudHNgLicsXG4gICAgKTtcbiAgICByZXR1cm4gZGVmYXVsdEFyZ3VtZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBDb250aW51b3VzIExvZ2dpbmcgUHJvcGVydGllc1xuICAgKiBAcGFyYW0gcm9sZSBUaGUgSUFNIHJvbGUgdG8gdXNlIGZvciBjb250aW51b3VzIGxvZ2dpbmdcbiAgICogQHBhcmFtIHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciBjb250aW51b3VzIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBTdHJpbmcgY29udGFpbmluZyB0aGUgYXJncyBmb3IgdGhlIGNvbnRpbnVvdXMgbG9nZ2luZyBjb21tYW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0dXBDb250aW51b3VzTG9nZ2luZyhyb2xlOiBpYW0uSVJvbGUsIHByb3BzOiBDb250aW51b3VzTG9nZ2luZ1Byb3BzIHwgdW5kZWZpbmVkKSA6IGFueSB7XG4gICAgLy8gSWYgdGhlIGRldmVsb3BlciBoYXMgZXhwbGljaXRseSBkaXNhYmxlZCBjb250aW51b3VzIGxvZ2dpbmcgcmV0dXJuIG5vIGFyZ3NcbiAgICBpZiAocHJvcHMgJiYgIXByb3BzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyBFbHNlIHdlIHR1cm4gb24gY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQuIERldGVybWluZSB3aGF0IGxvZyBncm91cCB0byB1c2UuXG4gICAgY29uc3QgYXJnczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7XG4gICAgICAnLS1lbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZyc6ICd0cnVlJyxcbiAgICB9O1xuXG4gICAgaWYgKHByb3BzPy5xdWlldCkge1xuICAgICAgYXJnc1snLS1lbmFibGUtY29udGludW91cy1sb2ctZmlsdGVyJ10gPSAndHJ1ZSc7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGRldmVsb3BlciBwcm92aWRlZCBhIGxvZyBncm91cCwgYWRkIGl0cyBuYW1lIHRvIHRoZSBhcmdzIGFuZCB1cGRhdGUgdGhlIHJvbGUuXG4gICAgaWYgKHByb3BzPy5sb2dHcm91cCkge1xuICAgICAgYXJnc1snLS1jb250aW51b3VzLWxvZy1sb2dHcm91cCddID0gcHJvcHMubG9nR3JvdXAubG9nR3JvdXBOYW1lO1xuICAgICAgcHJvcHMubG9nR3JvdXAuZ3JhbnRXcml0ZShyb2xlKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmxvZ1N0cmVhbVByZWZpeCkge1xuICAgICAgYXJnc1snLS1jb250aW51b3VzLWxvZy1sb2dTdHJlYW1QcmVmaXgnXSA9IHByb3BzLmxvZ1N0cmVhbVByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmNvbnZlcnNpb25QYXR0ZXJuKSB7XG4gICAgICBhcmdzWyctLWNvbnRpbnVvdXMtbG9nLWNvbnZlcnNpb25QYXR0ZXJuJ10gPSBwcm9wcy5jb252ZXJzaW9uUGF0dGVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2RlUzNPYmplY3RVcmwoY29kZTogQ29kZSkge1xuICAgIGNvbnN0IHMzTG9jYXRpb24gPSBjb2RlLmJpbmQodGhpcywgdGhpcy5yb2xlKS5zM0xvY2F0aW9uO1xuICAgIHJldHVybiBgczM6Ly8ke3MzTG9jYXRpb24uYnVja2V0TmFtZX0vJHtzM0xvY2F0aW9uLm9iamVjdEtleX1gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgdGhhdCdzIGJhc2VkIG9uIEdsdWUgSm9iIGV2ZW50c1xuICoge0BzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc31cbiAqIFRoZSBtZXRyaWMgaGFzIG5hbWVzcGFjZSA9ICdBV1MvRXZlbnRzJywgbWV0cmljTmFtZSA9ICdUcmlnZ2VyZWRSdWxlcycgYW5kIFJ1bGVOYW1lID0gcnVsZS5ydWxlTmFtZSBkaW1lbnNpb24uXG4gKlxuICogQHBhcmFtIHJ1bGUgZm9yIHVzZSBpbiBzZXR0aW5nIFJ1bGVOYW1lIGRpbWVuc2lvbiB2YWx1ZVxuICogQHBhcmFtIHByb3BzIG1ldHJpYyBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1ldHJpY1J1bGUocnVsZTogZXZlbnRzLklSdWxlLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgbmFtZXNwYWNlOiAnQVdTL0V2ZW50cycsXG4gICAgbWV0cmljTmFtZTogJ1RyaWdnZXJlZFJ1bGVzJyxcbiAgICBkaW1lbnNpb25zTWFwOiB7IFJ1bGVOYW1lOiBydWxlLnJ1bGVOYW1lIH0sXG4gICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAuLi5wcm9wcyxcbiAgfSkuYXR0YWNoVG8ocnVsZSk7XG59XG5cbiJdfQ==
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQXlEO0FBQ3pELCtEQUFpRDtBQUVqRCx5REFBMkM7QUFFM0Msc0RBQXdDO0FBQ3hDLDRFQUE0RDtBQUs1RCw0Q0FBd0M7QUFDeEMsa0VBQXFFO0FBcUhyRTs7Ozs7O0dBTUc7QUFDSCxNQUFzQixPQUFRLFNBQVEsR0FBRyxDQUFDLFFBQVE7O0lBS2hEOztPQUVHO0lBQ0gsSUFBVyxNQUFNOzs7Ozs7Ozs7O1FBQ2YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksT0FBTyxDQUFDLEVBQVUsRUFBRSxVQUFpQyxFQUFFOzs7Ozs7Ozs7O1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkIsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDO1lBQzVELE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVEOzs7Ozs7T0FNRztJQUNPLGFBQWEsQ0FBQyxFQUFVLEVBQUUsUUFBa0IsRUFBRSxVQUFpQyxFQUFFOzs7Ozs7Ozs7OztRQUN6RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUM1QixXQUFXLEVB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QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUMvRztJQUVTLGVBQWUsQ0FBQyxJQUFVOzs7Ozs7Ozs7OztRQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3pELE9BQU8sUUFBUSxVQUFVLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztLQUNoRTs7QUE3S0gsa0JBOEtDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLElBQWtCLEVBQUUsS0FBZ0M7SUFDdEUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDM0IsU0FBUyxFQUFFLFlBQVk7UUFDdkIsVUFBVSxFQUFFLGdCQUFnQjtRQUM1QixhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUMxQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHO1FBQy9CLEdBQUcsS0FBSztLQUNULENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0IHR5cGUgeyBJSm9iUmVmLCBKb2JSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgdHlwZSAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IENvZGUgfSBmcm9tICcuLi9jb2RlJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCB0eXBlIHsgTWV0cmljVHlwZSwgR2x1ZVZlcnNpb24gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSm9iU3RhdGUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgd2Fybk9uUGxhaW50ZXh0U2VjcmV0cyB9IGZyb20gJy4uL3ByaXZhdGUvc2VjcmV0LWRldGVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IElTZWN1cml0eUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZWN1cml0eS1jb25maWd1cmF0aW9uJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgbmV3IG9yIGFuIGltcG9ydGVkIEdsdWUgSm9iXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUpvYiBleHRlbmRzIGNkay5JUmVzb3VyY2UsIGlhbS5JR3JhbnRhYmxlLCBJSm9iUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBqb2IuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgam9iLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBqb2JBcm46IHN0cmluZztcblxuICAvKipcbiAgICogRGVmaW5lcyBhIENsb3VkV2F0Y2ggZXZlbnQgcnVsZSB0cmlnZ2VyZWQgd2hlbiBzb21ldGhpbmcgaGFwcGVucyB3aXRoIHRoaXMgam9iLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uRXZlbnQoaWQ6IHN0cmluZywgb3B0aW9ucz86IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyk6IGV2ZW50cy5SdWxlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgQ2xvdWRXYXRjaCBldmVudCBydWxlIHRyaWdnZXJlZCB3aGVuIHRoaXMgam9iIG1vdmVzIHRvIHRoZSBTVUNDRUVERUQgc3RhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc1xuICAgKi9cbiAgb25TdWNjZXNzKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBldmVudHMuT25FdmVudE9wdGlvbnMpOiBldmVudHMuUnVsZTtcblxuICAvKipcbiAgICogRGVmaW5lcyBhIENsb3VkV2F0Y2ggZXZlbnQgcnVsZSB0cmlnZ2VyZWQgd2hlbiB0aGlzIGpvYiBtb3ZlcyB0byB0aGUgRkFJTEVEIHN0YXRlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uRmFpbHVyZShpZDogc3RyaW5nLCBvcHRpb25zPzogZXZlbnRzLk9uRXZlbnRPcHRpb25zKTogZXZlbnRzLlJ1bGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBDbG91ZFdhdGNoIGV2ZW50IHJ1bGUgdHJpZ2dlcmVkIHdoZW4gdGhpcyBqb2IgbW92ZXMgdG8gdGhlIFRJTUVPVVQgc3RhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc1xuICAgKi9cbiAgb25UaW1lb3V0KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBldmVudHMuT25FdmVudE9wdGlvbnMpOiBldmVudHMuUnVsZTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYyB0eXBpY2FsbHkgcHJlZml4ZWQgd2l0aCBgZ2x1ZS5kcml2ZXIuYCwgYGdsdWUuPGV4ZWN1dG9ySWQ+LmAgb3IgYGdsdWUuQUxMLmAuXG4gICAqIEBwYXJhbSB0eXBlIHRoZSBtZXRyaWMgdHlwZS5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yaW5nLWF3c2dsdWUtd2l0aC1jbG91ZHdhdGNoLW1ldHJpY3MuaHRtbFxuICAgKi9cbiAgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgdHlwZTogTWV0cmljVHlwZSwgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2Igc3VjY2Vzcy5cbiAgICovXG4gIG1ldHJpY1N1Y2Nlc3MocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgZmFpbHVyZS5cbiAgICovXG4gIG1ldHJpY0ZhaWx1cmUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgdGltZW91dC5cbiAgICovXG4gIG1ldHJpY1RpbWVvdXQocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBlbmFibGluZyBDb250aW51b3VzIExvZ2dpbmcgZm9yIEdsdWUgSm9icy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLWNvbnRpbnVvdXMtbG9nZ2luZy1lbmFibGUuaHRtbFxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51b3VzTG9nZ2luZ1Byb3BzIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBjb250aW51b3VzIGxvZ2dpbmcuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIENsb3VkV2F0Y2ggbG9nIGdyb3VwIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBsb2cgZ3JvdXAgaXMgY3JlYXRlZCB3aXRoIG5hbWUgYC9hd3MtZ2x1ZS9qb2JzL2xvZ3MtdjIvYC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwPzogbG9ncy5JTG9nR3JvdXA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gQ2xvdWRXYXRjaCBsb2cgc3RyZWFtIHByZWZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgam9iIHJ1biBJRC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ1N0cmVhbVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIG91dCBub24tdXNlZnVsIEFwYWNoZSBTcGFyayBkcml2ZXIvZXhlY3V0b3IgYW5kIEFwYWNoZSBIYWRvb3AgWUFSTiBoZWFydGJlYXQgbG9nIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBwcm92aWRlZCBjb252ZXJzaW9uIHBhdHRlcm4uXG4gICAqXG4gICAqIFRoaXMgaXMgYSBMb2c0aiBDb252ZXJzaW9uIFBhdHRlcm4gdG8gY3VzdG9taXplIGRyaXZlciBhbmQgZXhlY3V0b3IgbG9ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgYCVke3l5L01NL2RkIEhIOm1tOnNzfSAlcCAlY3sxfTogJW0lbmBcbiAgICovXG4gIHJlYWRvbmx5IGNvbnZlcnNpb25QYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBpcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBpbXBvcnQgZXhpc3RpbmcgSm9icyBpbnRvIGEgQ0RLIGFwcCB0b1xuICogcmVmZXJlbmNlIGFzIHBhcnQgb2YgYSBsYXJnZXIgc3RhY2sgb3IgY29uc3RydWN0LiBKb2JCYXNlIGhhcyB0aGUgc3Vic2V0XG4gKiBvZiBhdHRyaWJ1dGVzIHJlcXVpcmVkIHRvIGlkZW50aWZ5IGFuZCByZWZlcmVuY2UgYW4gZXhpc3RpbmcgR2x1ZSBKb2IsXG4gKiBhcyB3ZWxsIGFzIHNvbWUgQ2xvdWRXYXRjaCBtZXRyaWMgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBhblxuICogZXZlbnQtZHJpdmVuIGZsb3cgdXNpbmcgdGhlIGpvYi5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpvYkJhc2UgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJSm9iIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGpvYkFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgam9iTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGlzIEpvYiByZXNvdXJjZSwgZm9yIHVzZSB3aXRoIHRoZSBnZW5lcmF0ZWQgTDEgcmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgam9iUmVmKCk6IEpvYlJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHsgam9iTmFtZTogdGhpcy5qb2JOYW1lIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIGZvciB0aGlzIEdsdWUgSm9iIHdoZW4gaXQncyBpbiBhIGdpdmVuIHN0YXRlXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIG9wdGlvbnMgZXZlbnQgb3B0aW9ucy4gTm90ZSB0aGF0IHNvbWUgdmFsdWVzIGFyZSBvdmVycmlkZGVuIGlmIHByb3ZpZGVkLCB0aGVzZSBhcmVcbiAgICogIC0gZXZlbnRQYXR0ZXJuLnNvdXJjZSA9IFsnYXdzLmdsdWUnXVxuICAgKiAgLSBldmVudFBhdHRlcm4uZGV0YWlsVHlwZSA9IFsnR2x1ZSBKb2IgU3RhdGUgQ2hhbmdlJywgJ0dsdWUgSm9iIFJ1biBTdGF0dXMnXVxuICAgKiAgLSBldmVudFBhdHRlcm4uZGV0YWlsLmpvYk5hbWUgPSBbdGhpcy5qb2JOYW1lXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIHB1YmxpYyBvbkV2ZW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIGNvbnN0IHJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgaWQsIG9wdGlvbnMpO1xuICAgIHJ1bGUuYWRkVGFyZ2V0KG9wdGlvbnMudGFyZ2V0KTtcbiAgICBydWxlLmFkZEV2ZW50UGF0dGVybih7XG4gICAgICBzb3VyY2U6IFsnYXdzLmdsdWUnXSxcbiAgICAgIGRldGFpbFR5cGU6IFsnR2x1ZSBKb2IgU3RhdGUgQ2hhbmdlJywgJ0dsdWUgSm9iIFJ1biBTdGF0dXMnXSxcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBqb2JOYW1lOiBbdGhpcy5qb2JOYW1lXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIGZvciB0aGUgdHJhbnNpdGlvbiBpbnRvIHRoZSBpbnB1dCBqb2JTdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIGpvYlN0YXRlIHRoZSBqb2Igc3RhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25TdGF0ZUNoYW5nZShpZDogc3RyaW5nLCBqb2JTdGF0ZTogSm9iU3RhdGUsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLm9uRXZlbnQoaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgUnVsZSB0cmlnZ2VyZWQgd2hlbiBHbHVlIGpvYiAke3RoaXMuam9iTmFtZX0gaXMgaW4gJHtqb2JTdGF0ZX0gc3RhdGVgLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBydWxlLmFkZEV2ZW50UGF0dGVybih7XG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgc3RhdGU6IFtqb2JTdGF0ZV0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggRXZlbnQgUnVsZSBtYXRjaGluZyBKb2JTdGF0ZS5TVUNDRUVERUQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuIGRlZmF1bHQgaXMge30uXG4gICAqL1xuICBwdWJsaWMgb25TdWNjZXNzKGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIHJldHVybiB0aGlzLm9uU3RhdGVDaGFuZ2UoaWQsIEpvYlN0YXRlLlNVQ0NFRURFRCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIG1hdGNoaW5nIEZBSUxFRCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXZlbnQgb3B0aW9ucy4gZGVmYXVsdCBpcyB7fS5cbiAgICovXG4gIHB1YmxpYyBvbkZhaWx1cmUoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZUNoYW5nZShpZCwgSm9iU3RhdGUuRkFJTEVELCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIEV2ZW50IFJ1bGUgbWF0Y2hpbmcgVElNRU9VVCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXZlbnQgb3B0aW9ucy4gZGVmYXVsdCBpcyB7fS5cbiAgICovXG4gIHB1YmxpYyBvblRpbWVvdXQoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZUNoYW5nZShpZCwgSm9iU3RhdGUuVElNRU9VVCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYyB0eXBpY2FsbHkgcHJlZml4ZWQgd2l0aCBgZ2x1ZS5kcml2ZXIuYCwgYGdsdWUuPGV4ZWN1dG9ySWQ+LmAgb3IgYGdsdWUuQUxMLmAuXG4gICAqIEBwYXJhbSB0eXBlIHRoZSBtZXRyaWMgdHlwZS5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yaW5nLWF3c2dsdWUtd2l0aC1jbG91ZHdhdGNoLW1ldHJpY3MuaHRtbFxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHR5cGU6IE1ldHJpY1R5cGUsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0dsdWUnLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBKb2JOYW1lOiB0aGlzLmpvYk5hbWUsXG4gICAgICAgIEpvYlJ1bklkOiAnQUxMJyxcbiAgICAgICAgVHlwZTogdHlwZSxcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIE1ldHJpYyBpbmRpY2F0aW5nIGpvYiBzdWNjZXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyBpcyBiYXNlZCBvbiB0aGUgUnVsZSByZXR1cm5lZCBieSBuby1hcmdzIG9uU3VjY2VzcygpIGNhbGwuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU3VjY2Vzcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbWV0cmljUnVsZSh0aGlzLm1ldHJpY0pvYlN0YXRlUnVsZSgnU3VjY2Vzc01ldHJpY1J1bGUnLCBKb2JTdGF0ZS5TVUNDRUVERUQpLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgZmFpbHVyZS5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgaXMgYmFzZWQgb24gdGhlIFJ1bGUgcmV0dXJuZWQgYnkgbm8tYXJncyBvbkZhaWx1cmUoKSBjYWxsLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZhaWx1cmUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG1ldHJpY1J1bGUodGhpcy5tZXRyaWNKb2JTdGF0ZVJ1bGUoJ0ZhaWx1cmVNZXRyaWNSdWxlJywgSm9iU3RhdGUuRkFJTEVEKSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHRpbWVvdXQuXG4gICAqXG4gICAqIFRoaXMgbWV0cmljIGlzIGJhc2VkIG9uIHRoZSBSdWxlIHJldHVybmVkIGJ5IG5vLWFyZ3Mgb25UaW1lb3V0KCkgY2FsbC5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUaW1lb3V0KHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBtZXRyaWNSdWxlKHRoaXMubWV0cmljSm9iU3RhdGVSdWxlKCdUaW1lb3V0TWV0cmljUnVsZScsIEpvYlN0YXRlLlRJTUVPVVQpLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciByZXRyaWV2ZXMgYSBzaW5nbGV0b24gZXZlbnQgcnVsZSBmb3IgdGhlIGlucHV0IGpvYiBzdGF0ZSBmb3IgdXNlIHdpdGggdGhlIG1ldHJpYyBKb2JTdGF0ZSBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IGlkLlxuICAgKiBAcGFyYW0gam9iU3RhdGUgdGhlIGpvYiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgbWV0cmljSm9iU3RhdGVSdWxlKGlkOiBzdHJpbmcsIGpvYlN0YXRlOiBKb2JTdGF0ZSk6IGV2ZW50cy5SdWxlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgZXZlbnRzLlJ1bGUgPz8gdGhpcy5vblN0YXRlQ2hhbmdlKGlkLCBqb2JTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgam9iIGFyblxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkSm9iQXJuKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgam9iTmFtZTogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAnam9iJyxcbiAgICAgIHJlc291cmNlTmFtZTogam9iTmFtZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3Vic2V0IG9mIEpvYiBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZCBmb3IgaW1wb3J0aW5nIGFuIGV4aXN0aW5nIGpvYlxuICogaW50byBhIENESyBwcm9qZWN0LiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHVzaW5nIGZyb21Kb2JBdHRyaWJ1dGVzXG4gKiB0byBpZGVudGlmeSBhbmQgcmVmZXJlbmNlIHRoZSBleGlzdGluZyBqb2IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgam9iTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgYXNzdW1lZCBieSBHbHVlIHRvIHJ1biB0aGlzIGpvYi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbn1cblxuLyoqXG4gKiBKb2JQcm9wcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBHbHVlIEpvYnMgdXNpbmcgdGhpcyBMMiBDb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iUHJvcHMge1xuICAvKipcbiAgICogU2NyaXB0IENvZGUgTG9jYXRpb24gKHJlcXVpcmVkKVxuICAgKiBTY3JpcHQgdG8gcnVuIHdoZW4gdGhlIEdsdWUgam9iIGV4ZWN1dGVzLiBDYW4gYmUgdXBsb2FkZWRcbiAgICogZnJvbSB0aGUgbG9jYWwgZGlyZWN0b3J5IHN0cnVjdHVyZSB1c2luZyBmcm9tQXNzZXRcbiAgICogb3IgcmVmZXJlbmNlZCB2aWEgUzMgbG9jYXRpb24gdXNpbmcgZnJvbUJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyaXB0OiBDb2RlO1xuXG4gIC8qKlxuICAgKiBJQU0gUm9sZSAocmVxdWlyZWQpXG4gICAqIElBTSBSb2xlIHRvIHVzZSBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uXG4gICAqIE11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBkZXZlbG9wZXIgYmVjYXVzZSB0aGUgTDIgZG9lc24ndCBoYXZlIHZpc2liaWxpdHlcbiAgICogaW50byB0aGUgYWN0aW9ucyB0aGUgc2NyaXB0KHMpIHRha2VzIGR1cmluZyB0aGUgam9iIGV4ZWN1dGlvblxuICAgKiBUaGUgcm9sZSBtdXN0IHRydXN0IHRoZSBHbHVlIHNlcnZpY2UgcHJpbmNpcGFsIChnbHVlLmFtYXpvbmF3cy5jb20pXG4gICAqIGFuZCBiZSBncmFudGVkIHN1ZmZpY2llbnQgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2dldHRpbmctc3RhcnRlZC1hY2Nlc3MuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHbHVlIGpvYiAob3B0aW9uYWwpXG4gICAqIERldmVsb3Blci1zcGVjaWZpZWQgbmFtZSBvZiB0aGUgR2x1ZSBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGpvYk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIChvcHRpb25hbClcbiAgICogRGV2ZWxvcGVyLXNwZWNpZmllZCBkZXNjcmlwdGlvbiBvZiB0aGUgR2x1ZSBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1heCBDb25jdXJyZW50IFJ1bnMgKG9wdGlvbmFsKVxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcnVucyB0aGlzIEdsdWUgam9iIGNhbiBjb25jdXJyZW50bHkgcnVuXG4gICAqXG4gICAqIEFuIGVycm9yIGlzIHJldHVybmVkIHdoZW4gdGhpcyB0aHJlc2hvbGQgaXMgcmVhY2hlZC4gVGhlIG1heGltdW0gdmFsdWVcbiAgICogeW91IGNhbiBzcGVjaWZ5IGlzIGNvbnRyb2xsZWQgYnkgYSBzZXJ2aWNlIGxpbWl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW50UnVucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBBcmd1bWVudHMgKG9wdGlvbmFsKVxuICAgKiBUaGUgZGVmYXVsdCBhcmd1bWVudHMgZm9yIGV2ZXJ5IHJ1biBvZiB0aGlzIEdsdWUgam9iLFxuICAgKiBzcGVjaWZpZWQgYXMgbmFtZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogVGhpcyBtYXAgaXMgdGhlIGVzY2FwZSBoYXRjaCBmb3IgR2x1ZSBqb2IgYXJndW1lbnRzIHRoYXQgdGhpcyBjb25zdHJ1Y3QgZG9lcyBub3QgbW9kZWwuIEl0XG4gICAqIE1VU1QgTk9UIGJlIHVzZWQgdG8gc2V0IGFyZ3VtZW50cyB0aGF0IGFscmVhZHkgaGF2ZSBhIGRlZGljYXRlZCBwcm9wIOKAlCBjb25maWd1cmUgdGhvc2UgdGhyb3VnaFxuICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wIGluc3RlYWQgKGBjb250aW51b3VzTG9nZ2luZ2AsIGBlbmFibGVNZXRyaWNzYCxcbiAgICogYGVuYWJsZU9ic2VydmFiaWxpdHlNZXRyaWNzYCwgYHNwYXJrVUlgLCBgY2xhc3NOYW1lYCwgYGV4dHJhSmFyc2AsIGBleHRyYUphcnNGaXJzdGAsXG4gICAqIGBleHRyYVB5dGhvbkZpbGVzYCwgYGV4dHJhRmlsZXNgKS4gUGFzc2luZyBhIGNvbnN0cnVjdC1tYW5hZ2VkIGFyZ3VtZW50IChlLmcuXG4gICAqIGAtLWVuYWJsZS1jb250aW51b3VzLWNsb3Vkd2F0Y2gtbG9nYCwgYC0tZW5hYmxlLW1ldHJpY3NgLCBgLS1lbmFibGUtc3BhcmstdWlgLFxuICAgKiBgLS1qb2ItbGFuZ3VhZ2VgKSBvciBhIEdsdWUtcmVzZXJ2ZWQgYXJndW1lbnQgKGAtLWRlYnVnYCwgYC0tbW9kZWAsIGAtLUpPQl9OQU1FYCwgYC0tZW5kcG9pbnRgKVxuICAgKiBoZXJlIHRocm93cyBhdCBzeW50aGVzaXMgdGltZSwgc28gdGhlcmUgaXMgZXhhY3RseSBvbmUgd2F5IHRvIGV4cHJlc3MgZWFjaCBpbnRlbnQuXG4gICAqXG4gICAqIEFsc28gbm90ZSB0aGF0IHRoZXNlIGFyZSBlbWl0dGVkIHZlcmJhdGltIGludG8gdGhlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlLCBzbyBhdm9pZFxuICAgKiBwbGFjaW5nIHNlY3JldHMgaGVyZSBpbiBwbGFpbnRleHQuIFBhc3Mgc2VjcmV0cyB0byB0aGUgam9iIGF0IHJ1bnRpbWVcbiAgICogdGhyb3VnaCBBV1MgU2VjcmV0cyBNYW5hZ2VyIGluc3RlYWQuIEEgc3ludGhlc2lzLXRpbWUgd2FybmluZyBpcyBlbWl0dGVkXG4gICAqIHdoZW4gYW4gYXJndW1lbnQga2V5IGxvb2tzIGxpa2UgYSBjcmVkZW50aWFsIGFuZCBob2xkcyBhIHBsYWludGV4dCBsaXRlcmFsLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKiBmb3IgYSBsaXN0IG9mIHJlc2VydmVkIHBhcmFtZXRlcnNcbiAgICogQGRlZmF1bHQgLSBubyBhcmd1bWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRBcmd1bWVudHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBDb25uZWN0aW9ucyAob3B0aW9uYWwpXG4gICAqIExpc3Qgb2YgY29ubmVjdGlvbnMgdG8gdXNlIGZvciB0aGlzIEdsdWUgam9iXG4gICAqIENvbm5lY3Rpb25zIGFyZSB1c2VkIHRvIGNvbm5lY3QgdG8gb3RoZXIgQVdTIFNlcnZpY2Ugb3IgcmVzb3VyY2VzIHdpdGhpbiBhIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgW10gLSBubyBjb25uZWN0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGpvYlxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM/OiBJQ29ubmVjdGlvbltdO1xuXG4gIC8qKlxuICAgKiBNYXggUmV0cmllcyAob3B0aW9uYWwpXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzIEdsdWUgcGVyZm9ybXMgaWYgdGhlIGpvYiBmYWlsc1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IChvcHRpb25hbClcbiAgICogVGhlIG1heGltdW0gdGltZSB0aGF0IGEgam9iIHJ1biBjYW4gY29uc3VtZSByZXNvdXJjZXMgYmVmb3JlIGl0IGlzXG4gICAqIHRlcm1pbmF0ZWQgYW5kIGVudGVycyBUSU1FT1VUIHN0YXR1cy4gU3BlY2lmaWVkIGluIG1pbnV0ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDI4ODAgKDIgZGF5cyBmb3Igbm9uLXN0cmVhbWluZylcbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IENvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKVxuICAgKiBEZWZpbmVzIHRoZSBlbmNyeXB0aW9uIG9wdGlvbnMgZm9yIHRoZSBHbHVlIGpvYlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNlY3VyaXR5IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUNvbmZpZ3VyYXRpb24/OiBJU2VjdXJpdHlDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUYWdzIChvcHRpb25hbClcbiAgICogQSBsaXN0IG9mIGtleTp2YWx1ZSBwYWlycyBvZiB0YWdzIHRvIGFwcGx5IHRvIHRoaXMgR2x1ZSBqb2IgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IHt9IC0gbm8gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEdsdWUgVmVyc2lvblxuICAgKiBUaGUgdmVyc2lvbiBvZiBHbHVlIHRvIHVzZSB0byBleGVjdXRlIHRoaXMgam9iXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBieSB0aGUgam9iIHR5cGU6IDQuMCBmb3IgRVRMIGFuZCBTdHJlYW1pbmcsIDUuMCBmb3IgRmxleCwgMy4wIGZvciBQeXRob24gU2hlbGxcbiAgICovXG4gIHJlYWRvbmx5IGdsdWVWZXJzaW9uPzogR2x1ZVZlcnNpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgY29udGludW91cyBsb2dnaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjb250aW51b3VzIGxvZ2dpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1jb250aW51b3VzLWxvZ2dpbmctZW5hYmxlLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICoqL1xuICByZWFkb25seSBjb250aW51b3VzTG9nZ2luZz86IENvbnRpbnVvdXNMb2dnaW5nUHJvcHM7XG59XG5cbi8qKlxuICogQSBHbHVlIEpvYi5cbiAqIEByZXNvdXJjZSBBV1M6OkdsdWU6OkpvYlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSm9iIGV4dGVuZHMgSm9iQmFzZSB7XG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIGFuIGV4aXN0aW5nIEdsdWUgSm9iIGZyb20gYSBzdWJzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGNhblxuICAgKiBiZSByZWZlcmVuY2VkIGZyb20gd2l0aGluIGFub3RoZXIgU3RhY2sgb3IgQ29uc3RydWN0LlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgaWQuXG4gICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZvciB0aGUgR2x1ZSBKb2Igd2Ugd2FudCB0byBpbXBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpvYkF0dHJpYnV0ZXMoc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogSm9iQXR0cmlidXRlcyk6IElKb2Ige1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEpvYkJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGpvYk5hbWUgPSBhdHRycy5qb2JOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGpvYkFybiA9IHRoaXMuYnVpbGRKb2JBcm4oc2NvcGUsIGF0dHJzLmpvYk5hbWUpO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsID0gYXR0cnMucm9sZSA/PyBuZXcgaWFtLlVua25vd25QcmluY2lwYWwoeyByZXNvdXJjZTogdGhpcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50IGtleXMgdGhhdCBHbHVlIHJlc2VydmVzIGZvciBpdHMgb3duIHVzZSBhbmQgdGhhdCBhIGNhbGxlciBtdXN0IG5ldmVyIHNldCB0aHJvdWdoXG4gICAqIGBkZWZhdWx0QXJndW1lbnRzYC4gVW5saWtlIGNvbnN0cnVjdC1tYW5hZ2VkIGFyZ3VtZW50cyAod2hpY2ggYXJlIGRlcml2ZWQgZnJvbSB3aGF0IGVhY2ggam9iXG4gICAqIGNsYXNzIGVtaXRzKSwgdGhlc2UgYXJlIG93bmVkIGJ5IHRoZSBHbHVlIHNlcnZpY2UgaXRzZWxmIGFuZCBhcmUgcmVzZXJ2ZWQgZm9yIGV2ZXJ5IGpvYiB0eXBlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0xVRV9SRVNFUlZFRF9BUkdVTUVOVFMgPSBuZXcgU2V0KFsnLS1kZWJ1ZycsICctLW1vZGUnLCAnLS1KT0JfTkFNRScsICctLWVuZHBvaW50J10pO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgR2x1ZSBhc3N1bWVzIHRvIHJ1biB0aGlzIGpvYi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdCByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3QtbWFuYWdlZCBqb2IgYXJndW1lbnRzIHRoYXQgYXJlIGFjdHVhbGx5IGVtaXR0ZWQgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sXG4gICAqIGFjY3VtdWxhdGVkIHZpYSB7QGxpbmsgc2V0TWFuYWdlZEFyZ3VtZW50fS4gUGFzc2VkIHRocm91Z2ggdG8gYENmbkpvYi5kZWZhdWx0QXJndW1lbnRzYCBhZnRlclxuICAgKiBiZWluZyBtZXJnZWQgd2l0aCB0aGUgdXNlci1zdXBwbGllZCBgZGVmYXVsdEFyZ3VtZW50c2AgYnkge0BsaW5rIG1lcmdlRGVmYXVsdEFyZ3VtZW50c30uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYW5hZ2VkQXJndW1lbnRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGFyZ3VtZW50IGtleSB0aGlzIGNvbnN0cnVjdCBtYW5hZ2VzLCBhY2N1bXVsYXRlZCB2aWEge0BsaW5rIHNldE1hbmFnZWRBcmd1bWVudH0g4oCUIHdoZXRoZXJcbiAgICogb3Igbm90IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZW1pdHMgYSB2YWx1ZSBmb3IgaXQuIFRoaXMgaXMgdGhlIHJlc2VydmVkIHNldCB0aGF0IGFcbiAgICogdXNlci1zdXBwbGllZCBgZGVmYXVsdEFyZ3VtZW50c2AgbXVzdCBub3QgY29sbGlkZSB3aXRoLiBSZWdpc3RlcmluZyBhIGtleSBldmVuIHdoZW4gaXRzIHZhbHVlXG4gICAqIGlzIGB1bmRlZmluZWRgIChmZWF0dXJlIGRpc2FibGVkIG9yIHVuc2V0KSBpcyB3aGF0IGtlZXBzIGBkZWZhdWx0QXJndW1lbnRzYCBmcm9tIHNpbGVudGx5XG4gICAqIHJlLWVuYWJsaW5nIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWFuYWdlZEFyZ3VtZW50S2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlIGBrZXlgIGFzIGNvbnN0cnVjdC1tYW5hZ2VkIGFuZCwgd2hlbiBgdmFsdWVgIGlzIGRlZmluZWQsIGVtaXQgaXQgaW50byB0aGUgam9iJ3NcbiAgICogYXJndW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzaW5nbGUgc2luayBmb3IgZXZlcnkgYXJndW1lbnQgYSBqb2IgY29uc3RydWN0IGRlcml2ZXMgZnJvbSBpdHMgdHlwZWQgcHJvcHMgKG9yXG4gICAqIGZyb20gdGhlIGpvYiBjbGFzcyBpdHNlbGYpLiBDYWxsIGl0IG9uY2UgcGVyIG1hbmFnZWQga2V5LCBwYXNzaW5nIGB1bmRlZmluZWRgIGFzIHRoZSB2YWx1ZSB3aGVuXG4gICAqIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgdHVybmVkIG9mZiBvciB1bnNldCDigJQgdGhlIGtleSBpcyBzdGlsbCByZXNlcnZlZCBmcm9tXG4gICAqIGBkZWZhdWx0QXJndW1lbnRzYCBlaXRoZXIgd2F5LCBzbyBhIGRpc2FibGVkIGZlYXR1cmUgY2Fubm90IGJlIHJlLWVuYWJsZWQgdGhyb3VnaCB0aGUgZXNjYXBlXG4gICAqIGhhdGNoLiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gb3RoZXIgd2F5IGZvciBhIHN1YmNsYXNzIHRvIGVtaXQgYSBtYW5hZ2VkIGFyZ3VtZW50LCBzbyB0aGVcbiAgICogcmVzZXJ2ZWQgc2V0IGNhbiBuZXZlciBkcmlmdCBmcm9tIHdoYXQgaXMgZW1pdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSB0aGUgR2x1ZSBhcmd1bWVudCBrZXksIGUuZy4gYC0tZW5hYmxlLW1ldHJpY3NgXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gZW1pdCwgb3IgYHVuZGVmaW5lZGAgdG8gcmVzZXJ2ZSB0aGUga2V5IHdpdGhvdXQgZW1pdHRpbmcgaXRcbiAgICovXG4gIHByb3RlY3RlZCBzZXRNYW5hZ2VkQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWFuYWdlZEFyZ3VtZW50S2V5cy5hZGQoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbWFuYWdlZEFyZ3VtZW50c1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHRoZSBjdXN0b21lci1zdXBwbGllZCBgZGVmYXVsdEFyZ3VtZW50c2Agd2l0aCB0aGUgYXJndW1lbnRzIHRoaXMgY29uc3RydWN0IG1hbmFnZXMuXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3Qgb3ducyBldmVyeSBhcmd1bWVudCBpdCBlbWl0cyDigJQgd2hldGhlciB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGRlZGljYXRlZCB0eXBlZFxuICAgKiBwcm9wIChlLmcuIGBjb250aW51b3VzTG9nZ2luZ2AsIGBlbmFibGVNZXRyaWNzYCwgYHNwYXJrVUlgKSBvciBmcm9tIHRoZSBqb2IgY2xhc3MgaXRzZWxmXG4gICAqIChlLmcuIGAtLWpvYi1sYW5ndWFnZWApLiBUaG9zZSBhcmd1bWVudHMsIHBsdXMgdGhlIGFyZ3VtZW50cyBHbHVlIHJlc2VydmVzIGZvciBpdHMgb3duIHVzZSxcbiAgICogTVVTVCBiZSBjb25maWd1cmVkIHRocm91Z2ggdGhlaXIgZGVkaWNhdGVkIHByb3BzIHJhdGhlciB0aGFuIHRoZSB1bnR5cGVkIGBkZWZhdWx0QXJndW1lbnRzYFxuICAgKiBtYXAsIHNvIHRoZXJlIGlzIGV4YWN0bHkgb25lIHdheSB0byBleHByZXNzIGVhY2ggaW50ZW50LiBQYXNzaW5nIHN1Y2ggYSBrZXkgdGhyb3VnaFxuICAgKiBgZGVmYXVsdEFyZ3VtZW50c2AgdGhlcmVmb3JlIHRocm93cyBpbnN0ZWFkIG9mIHNpbGVudGx5IHdpbm5pbmcgb3IgYmVpbmcgc2lsZW50bHkgZHJvcHBlZC5cbiAgICpcbiAgICogQSBtYW5hZ2VkIGtleSB3aG9zZSBzdXBwbGllZCB2YWx1ZSBpcyBpZGVudGljYWwgdG8gdGhlIGNvbnN0cnVjdCdzIHZhbHVlIGlzIG5vdCBjb250cmFkaWN0b3J5LFxuICAgKiBzbyBpdCBpcyBhbGxvd2VkIHJhdGhlciB0aGFuIHJlamVjdGVkIChhdXRvLWNvcnJlY3RpbmcgY29uZmlnIGlzIHByZWZlcnJlZCBvdmVyIGVycm9ycykuXG4gICAqIEdsdWUtcmVzZXJ2ZWQga2V5cyBhcmUgbmV2ZXIgZW1pdHRlZCBieSB0aGUgY29uc3RydWN0LCBzbyB0aGVyZSBpcyBubyB2YWx1ZSB0byByZWNvbmNpbGUgYW5kXG4gICAqIHRoZXkgYWx3YXlzIHRocm93LlxuICAgKlxuICAgKiBUaGUgcmVzZXJ2ZWQgc2V0IGlzIGBfbWFuYWdlZEFyZ3VtZW50S2V5c2Ag4oCUIGV2ZXJ5IGtleSB0aGUgY29uc3RydWN0IGRlY2xhcmVkIHRocm91Z2hcbiAgICoge0BsaW5rIHNldE1hbmFnZWRBcmd1bWVudH0sIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgd2FzIGVtaXR0ZWQgZm9yIGl0LiBJdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIGRlcml2ZWQgZnJvbSB0aGUga2V5cyB0aGF0IGNhcnJ5IGEgdmFsdWU6IGEgdHlwZWQgcHJvcCB0aGF0IHR1cm5zIGEgZmVhdHVyZSAqb2ZmKiAoZS5nLlxuICAgKiBgZW5hYmxlTWV0cmljczogZmFsc2VgKSBlbWl0cyBubyB2YWx1ZSBidXQgc3RpbGwgcmVzZXJ2ZXMgaXRzIGtleSwgc28gYGRlZmF1bHRBcmd1bWVudHNgIGNhbm5vdFxuICAgKiBzaWxlbnRseSByZS1lbmFibGUgaXQuXG4gICAqXG4gICAqIENvbmZsaWN0IGRldGVjdGlvbiByZWxpZXMgb24gc3RyaW5nIGVxdWFsaXR5IG9mIHRoZSBhcmd1bWVudCBrZXlzLCB3aGljaCBjYW5ub3Qgc2VlIHRocm91Z2hcbiAgICogdW5yZXNvbHZlZCB0b2tlbnMgKGUuZy4gYSBrZXkgcHJvZHVjZWQgYnkgYENmbkpzb25gIHRoYXQgb25seSByZXNvbHZlcyBhdCBkZXBsb3kgdGltZSkuIElmIGFcbiAgICoga2V5IGlzIGEgdG9rZW4sIHRoZSBjaGVjayBpcyBza2lwcGVkIGZvciB0aGF0IGtleSBhbmQgYSBzeW50aGVzaXMtdGltZSB3YXJuaW5nIGlzIGVtaXR0ZWQsIHNvXG4gICAqIHRoZSAocmFyZSkgY2FzZSB3aGVyZSBhIHRva2VuIGtleSByZXNvbHZlcyB0byBhIG1hbmFnZWQgYXJndW1lbnQgYXQgZGVwbG95IHRpbWUg4oCUIGluIHdoaWNoIHRoZVxuICAgKiBjb25zdHJ1Y3QtbWFuYWdlZCB2YWx1ZSB3b3VsZCBzaWxlbnRseSB0YWtlIHByZWNlZGVuY2Ug4oCUIGlzIHN1cmZhY2VkIHJhdGhlciB0aGFuIGhpZGRlbi5cbiAgICpcbiAgICogQHBhcmFtIGRlZmF1bHRBcmd1bWVudHMgdGhlIGNhbGxlci1zdXBwbGllZCBlc2NhcGUtaGF0Y2ggYXJndW1lbnRzLCBpZiBhbnlcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZURlZmF1bHRBcmd1bWVudHMoXG4gICAgZGVmYXVsdEFyZ3VtZW50cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmIChkZWZhdWx0QXJndW1lbnRzKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoZGVmYXVsdEFyZ3VtZW50cykuc29tZSgoYXJnKSA9PiBjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGFyZykpKSB7XG4gICAgICAgIGNkay5Bbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOnRva2VuSm9iQXJndW1lbnRLZXknLFxuICAgICAgICAgICdkZWZhdWx0QXJndW1lbnRzIGNvbnRhaW5zIGFuIHVucmVzb2x2ZWQgdG9rZW4gYXMgYW4gYXJndW1lbnQga2V5LCBzbyBpdCBjYW5ub3QgYmUgY2hlY2tlZCBmb3IgY29uZmxpY3RzIHdpdGggY29uc3RydWN0LW1hbmFnZWQgYXJndW1lbnRzLiBJZiBpdCByZXNvbHZlcyB0byBhIG1hbmFnZWQgYXJndW1lbnQgYXQgZGVwbG95IHRpbWUsIHRoZSBjb25zdHJ1Y3QtbWFuYWdlZCB2YWx1ZSB3aWxsIHRha2UgcHJlY2VkZW5jZS4gQ29uZmlndXJlIG1hbmFnZWQgYXJndW1lbnRzIHRocm91Z2ggdGhlaXIgZGVkaWNhdGVkIHByb3BzIChlLmcuIGNvbnRpbnVvdXNMb2dnaW5nLCBlbmFibGVNZXRyaWNzLCBlbmFibGVPYnNlcnZhYmlsaXR5TWV0cmljcywgc3BhcmtVSSkuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZsaWN0cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRBcmd1bWVudHMpLmZpbHRlcihcbiAgICAgICAgKGFyZykgPT4gSm9iLkdMVUVfUkVTRVJWRURfQVJHVU1FTlRTLmhhcyhhcmcpXG4gICAgICAgICAgfHwgKHRoaXMuX21hbmFnZWRBcmd1bWVudEtleXMuaGFzKGFyZylcbiAgICAgICAgICAgICYmICEoT2JqZWN0Lmhhc093bih0aGlzLl9tYW5hZ2VkQXJndW1lbnRzLCBhcmcpICYmIGRlZmF1bHRBcmd1bWVudHNbYXJnXSA9PT0gdGhpcy5fbWFuYWdlZEFyZ3VtZW50c1thcmddKSksXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBNYW5hZ2VkSm9iQXJndW1lbnRgLFxuICAgICAgICAgIGB0aGUgam9iIGFyZ3VtZW50KHMpICR7SlNPTi5zdHJpbmdpZnkoY29uZmxpY3RzKX0gYXJlIG1hbmFnZWQgYnkgdGhlIGNvbnN0cnVjdCBvciByZXNlcnZlZCBieSBHbHVlOyBjb25maWd1cmUgdGhlbSB0aHJvdWdoIHRoZSBjb3JyZXNwb25kaW5nIHByb3BzIChlLmcuIGNvbnRpbnVvdXNMb2dnaW5nLCBlbmFibGVNZXRyaWNzLCBlbmFibGVPYnNlcnZhYmlsaXR5TWV0cmljcywgc3BhcmtVSSkgaW5zdGVhZCBvZiBkZWZhdWx0QXJndW1lbnRzYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB3YXJuT25QbGFpbnRleHRTZWNyZXRzKFxuICAgICAgdGhpcyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgICAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGE6cGxhaW50ZXh0Sm9iQXJndW1lbnRTZWNyZXQnLFxuICAgICAgJ1Bhc3Mgc2VjcmV0cyB0byB0aGUgam9iIGF0IHJ1bnRpbWUgdGhyb3VnaCBBV1MgU2VjcmV0cyBNYW5hZ2VyIGluc3RlYWQgb2YgZW1iZWRkaW5nIHRoZW0gaW4gYGRlZmF1bHRBcmd1bWVudHNgLicsXG4gICAgKTtcbiAgICByZXR1cm4geyAuLi5kZWZhdWx0QXJndW1lbnRzLCAuLi50aGlzLl9tYW5hZ2VkQXJndW1lbnRzIH07XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgKGFuZCwgd2hlbiBlbmFibGVkLCBlbWl0KSB0aGUgY29udGludW91cy1sb2dnaW5nIGFyZ3VtZW50cyB0aGlzIGpvYiBtYW5hZ2VzLlxuICAgKlxuICAgKiBBbGwgZml2ZSBjb250aW51b3VzLWxvZ2dpbmcga2V5cyBhcmUgcmVzZXJ2ZWQgb24gZXZlcnkgam9iIHR5cGUgcmVnYXJkbGVzcyBvZiBjb25maWd1cmF0aW9uOlxuICAgKiB0aGV5IGFyZSBhbHdheXMgcmVnaXN0ZXJlZCB0aHJvdWdoIHtAbGluayBzZXRNYW5hZ2VkQXJndW1lbnR9LCBhbmQgY2FycnkgYSB2YWx1ZSBvbmx5IHdoZW5cbiAgICogbG9nZ2luZyBpcyBlbmFibGVkLiBUaGlzIGtlZXBzIGBkZWZhdWx0QXJndW1lbnRzYCBmcm9tIHJlLWVuYWJsaW5nIGxvZ2dpbmcgYSB1c2VyIHR1cm5lZCBvZmYuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBJQU0gcm9sZSB0byBncmFudCB3cml0ZSBhY2Nlc3MgdG8gYSBjdXN0b20gbG9nIGdyb3VwLCBpZiBvbmUgaXMgcHJvdmlkZWRcbiAgICogQHBhcmFtIHByb3BzIFRoZSBwcm9wZXJ0aWVzIGZvciBjb250aW51b3VzIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gc2VjdXJpdHlDb25maWd1cmF0aW9uIFRoZSBzZWN1cml0eSBjb25maWd1cmF0aW9uIGF0dGFjaGVkIHRvIHRoZSBqb2IsIGlmIGFueVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldHVwQ29udGludW91c0xvZ2dpbmcocm9sZTogaWFtLklSb2xlLCBwcm9wczogQ29udGludW91c0xvZ2dpbmdQcm9wcyB8IHVuZGVmaW5lZCwgc2VjdXJpdHlDb25maWd1cmF0aW9uPzogSVNlY3VyaXR5Q29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIC8vIENvbnRpbnVvdXMgbG9nZ2luZyBpcyBvbiB1bmxlc3MgdGhlIGRldmVsb3BlciBoYXMgZXhwbGljaXRseSBkaXNhYmxlZCBpdC5cbiAgICBjb25zdCBlbmFibGVkID0gIShwcm9wcyAmJiAhcHJvcHMuZW5hYmxlZCk7XG5cbiAgICAvLyBXaGVuIGxvZ2dpbmcgaXMgb24sIHRoZSBsb2dzIGFyZSB3cml0dGVuIHRvIGFuIHVuZW5jcnlwdGVkIENsb3VkV2F0Y2ggbG9nIGdyb3VwIHVubGVzcyBhXG4gICAgLy8gU2VjdXJpdHlDb25maWd1cmF0aW9uIGlzIGF0dGFjaGVkLiBXZSBjYW5ub3QgaW50cm9zcGVjdCB3aGV0aGVyIHRoZSBhdHRhY2hlZFxuICAgIC8vIFNlY3VyaXR5Q29uZmlndXJhdGlvbiBhY3R1YWxseSBjb25maWd1cmVzIGNsb3VkV2F0Y2hFbmNyeXB0aW9uICh0aGUgSVNlY3VyaXR5Q29uZmlndXJhdGlvblxuICAgIC8vIGludGVyZmFjZSBvbmx5IGV4cG9zZXMgdGhlIG5hbWUpLCBzbyB3ZSBvbmx5IHdhcm4gd2hlbiBub25lIGlzIGF0dGFjaGVkIGF0IGFsbCB0byBhdm9pZFxuICAgIC8vIGZhbHNlIHBvc2l0aXZlcy5cbiAgICBpZiAoZW5hYmxlZCAmJiAhc2VjdXJpdHlDb25maWd1cmF0aW9uKSB7XG4gICAgICBjZGsuQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGE6dW5lbmNyeXB0ZWRDb250aW51b3VzTG9nZ2luZycsXG4gICAgICAgICdDb250aW51b3VzIENsb3VkV2F0Y2ggbG9nZ2luZyBpcyBlbmFibGVkIGJ1dCBubyBTZWN1cml0eUNvbmZpZ3VyYXRpb24gd2l0aCBjbG91ZFdhdGNoRW5jcnlwdGlvbiBpcyBhdHRhY2hlZC4gSm9iIHN0ZG91dCBhbmQgc3RkZXJyIHdpbGwgYmUgd3JpdHRlbiB0byBhbiB1bmVuY3J5cHRlZCBDbG91ZFdhdGNoIGxvZyBncm91cC4gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9lbmNyeXB0aW9uLXNlY3VyaXR5LWNvbmZpZ3VyYXRpb24uaHRtbCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEEgY3VzdG9tIGxvZyBncm91cCBpcyBvbmx5IHdpcmVkIHVwIChhbmQgb25seSBncmFudGVkIHdyaXRlKSB3aGVuIGxvZ2dpbmcgaXMgZW5hYmxlZC5cbiAgICBjb25zdCBsb2dHcm91cCA9IGVuYWJsZWQgPyBwcm9wcz8ubG9nR3JvdXAgOiB1bmRlZmluZWQ7XG4gICAgbG9nR3JvdXA/LmdyYW50V3JpdGUocm9sZSk7XG5cbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudCgnLS1lbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZycsIGVuYWJsZWQgPyAndHJ1ZScgOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuc2V0TWFuYWdlZEFyZ3VtZW50KCctLWVuYWJsZS1jb250aW51b3VzLWxvZy1maWx0ZXInLCBlbmFibGVkICYmIHByb3BzPy5xdWlldCA/ICd0cnVlJyA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoJy0tY29udGludW91cy1sb2ctbG9nR3JvdXAnLCBsb2dHcm91cD8ubG9nR3JvdXBOYW1lKTtcbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudCgnLS1jb250aW51b3VzLWxvZy1sb2dTdHJlYW1QcmVmaXgnLCBlbmFibGVkID8gcHJvcHM/LmxvZ1N0cmVhbVByZWZpeCA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoJy0tY29udGludW91cy1sb2ctY29udmVyc2lvblBhdHRlcm4nLCBlbmFibGVkID8gcHJvcHM/LmNvbnZlcnNpb25QYXR0ZXJuIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2RlUzNPYmplY3RVcmwoY29kZTogQ29kZSkge1xuICAgIGNvbnN0IHMzTG9jYXRpb24gPSBjb2RlLmJpbmQodGhpcywgdGhpcy5yb2xlKS5zM0xvY2F0aW9uO1xuICAgIHJldHVybiBgczM6Ly8ke3MzTG9jYXRpb24uYnVja2V0TmFtZX0vJHtzM0xvY2F0aW9uLm9iamVjdEtleX1gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgdGhhdCdzIGJhc2VkIG9uIEdsdWUgSm9iIGV2ZW50c1xuICoge0BzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc31cbiAqIFRoZSBtZXRyaWMgaGFzIG5hbWVzcGFjZSA9ICdBV1MvRXZlbnRzJywgbWV0cmljTmFtZSA9ICdUcmlnZ2VyZWRSdWxlcycgYW5kIFJ1bGVOYW1lID0gcnVsZS5ydWxlTmFtZSBkaW1lbnNpb24uXG4gKlxuICogQHBhcmFtIHJ1bGUgZm9yIHVzZSBpbiBzZXR0aW5nIFJ1bGVOYW1lIGRpbWVuc2lvbiB2YWx1ZVxuICogQHBhcmFtIHByb3BzIG1ldHJpYyBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1ldHJpY1J1bGUocnVsZTogZXZlbnRzLklSdWxlLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgbmFtZXNwYWNlOiAnQVdTL0V2ZW50cycsXG4gICAgbWV0cmljTmFtZTogJ1RyaWdnZXJlZFJ1bGVzJyxcbiAgICBkaW1lbnNpb25zTWFwOiB7IFJ1bGVOYW1lOiBydWxlLnJ1bGVOYW1lIH0sXG4gICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAuLi5wcm9wcyxcbiAgfSkuYXR0YWNoVG8ocnVsZSk7XG59XG5cbiJdfQ==
@@ -78,9 +78,7 @@ export declare class PySparkEtlJob extends SparkJob {
78
78
  get jobArn(): string;
79
79
  get jobName(): string;
80
80
  /**
81
- * Set the executable arguments with best practices enabled by default
82
- *
83
- * @returns An array of arguments for Glue to use on execution
81
+ * Register the executable arguments with best practices enabled by default.
84
82
  */
85
83
  private executableArguments;
86
84
  }