@aws-cdk/aws-glue-alpha 2.268.0-alpha.0 → 2.269.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 +1086 -878
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +1 -79
  4. package/README.md +101 -29
  5. package/adr/job-arguments.md +212 -0
  6. package/lib/catalog.js +3 -3
  7. package/lib/code.js +3 -3
  8. package/lib/connection.d.ts +44 -29
  9. package/lib/connection.js +66 -32
  10. package/lib/constants.d.ts +17 -0
  11. package/lib/constants.js +20 -2
  12. package/lib/data-format.js +5 -5
  13. package/lib/data-quality-ruleset.js +3 -3
  14. package/lib/database.js +1 -1
  15. package/lib/external-table.js +1 -1
  16. package/lib/jobs/job.d.ts +90 -9
  17. package/lib/jobs/job.js +115 -38
  18. package/lib/jobs/pyspark-etl-job.d.ts +1 -3
  19. package/lib/jobs/pyspark-etl-job.js +9 -14
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +1 -3
  21. package/lib/jobs/pyspark-flex-etl-job.js +9 -14
  22. package/lib/jobs/pyspark-streaming-job.d.ts +1 -3
  23. package/lib/jobs/pyspark-streaming-job.js +9 -14
  24. package/lib/jobs/python-shell-job.d.ts +20 -7
  25. package/lib/jobs/python-shell-job.js +30 -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 +10 -14
  29. package/lib/jobs/scala-spark-flex-etl-job.d.ts +1 -3
  30. package/lib/jobs/scala-spark-flex-etl-job.js +10 -14
  31. package/lib/jobs/scala-spark-streaming-job.d.ts +1 -3
  32. package/lib/jobs/scala-spark-streaming-job.js +10 -14
  33. package/lib/jobs/spark-job.d.ts +9 -7
  34. package/lib/jobs/spark-job.js +23 -32
  35. package/lib/partition-projection.d.ts +36 -47
  36. package/lib/partition-projection.js +22 -40
  37. package/lib/s3-table.js +4 -4
  38. package/lib/schema.js +2 -2
  39. package/lib/security-configuration.js +4 -4
  40. package/lib/storage-parameter.js +1 -1
  41. package/lib/table-base.js +1 -1
  42. package/lib/triggers/trigger-options.d.ts +102 -42
  43. package/lib/triggers/trigger-options.js +202 -3
  44. package/lib/triggers/workflow.d.ts +31 -47
  45. package/lib/triggers/workflow.js +27 -142
  46. package/package.json +7 -7
package/lib/jobs/job.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
2
2
  import * as events from 'aws-cdk-lib/aws-events';
3
+ import type { IJobRef, JobReference } from 'aws-cdk-lib/aws-glue';
3
4
  import * as iam from 'aws-cdk-lib/aws-iam';
4
5
  import type * as logs from 'aws-cdk-lib/aws-logs';
5
6
  import * as cdk from 'aws-cdk-lib/core';
@@ -12,7 +13,7 @@ import type { ISecurityConfiguration } from '../security-configuration';
12
13
  /**
13
14
  * Interface representing a new or an imported Glue Job
14
15
  */
15
- export interface IJob extends cdk.IResource, iam.IGrantable {
16
+ export interface IJob extends cdk.IResource, iam.IGrantable, IJobRef {
16
17
  /**
17
18
  * The name of the job.
18
19
  * @attribute
@@ -119,6 +120,10 @@ export declare abstract class JobBase extends cdk.Resource implements IJob {
119
120
  abstract readonly jobArn: string;
120
121
  abstract readonly jobName: string;
121
122
  abstract readonly grantPrincipal: iam.IPrincipal;
123
+ /**
124
+ * A reference to this Job resource, for use with the generated L1 ref interface.
125
+ */
126
+ get jobRef(): JobReference;
122
127
  /**
123
128
  * Create a CloudWatch Event Rule for this Glue Job when it's in a given state
124
129
  *
@@ -268,7 +273,16 @@ export interface JobProps {
268
273
  * The default arguments for every run of this Glue job,
269
274
  * specified as name-value pairs.
270
275
  *
271
- * These are emitted verbatim into the CloudFormation template, so avoid
276
+ * This map is the escape hatch for Glue job arguments that this construct does not model. It
277
+ * MUST NOT be used to set arguments that already have a dedicated prop — configure those through
278
+ * the corresponding prop instead (`continuousLogging`, `enableMetrics`,
279
+ * `enableObservabilityMetrics`, `sparkUI`, `className`, `extraJars`, `extraJarsFirst`,
280
+ * `extraPythonFiles`, `extraFiles`). Passing a construct-managed argument (e.g.
281
+ * `--enable-continuous-cloudwatch-log`, `--enable-metrics`, `--enable-spark-ui`,
282
+ * `--job-language`) or a Glue-reserved argument (`--debug`, `--mode`, `--JOB_NAME`, `--endpoint`)
283
+ * here throws at synthesis time, so there is exactly one way to express each intent.
284
+ *
285
+ * Also note that these are emitted verbatim into the CloudFormation template, so avoid
272
286
  * placing secrets here in plaintext. Pass secrets to the job at runtime
273
287
  * through AWS Secrets Manager instead. A synthesis-time warning is emitted
274
288
  * when an argument key looks like a credential and holds a plaintext literal.
@@ -351,26 +365,93 @@ export declare abstract class Job extends JobBase {
351
365
  * @param attrs Attributes for the Glue Job we want to import
352
366
  */
353
367
  static fromJobAttributes(scope: constructs.Construct, id: string, attrs: JobAttributes): IJob;
368
+ /**
369
+ * Argument keys that Glue reserves for its own use and that a caller must never set through
370
+ * `defaultArguments`. Unlike construct-managed arguments (which are derived from what each job
371
+ * class emits), these are owned by the Glue service itself and are reserved for every job type.
372
+ *
373
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
374
+ */
375
+ private static readonly GLUE_RESERVED_ARGUMENTS;
354
376
  /**
355
377
  * The IAM role Glue assumes to run this job.
356
378
  */
357
379
  abstract readonly role: iam.IRole;
358
380
  /**
359
- * Check no usage of reserved arguments.
381
+ * The construct-managed job arguments that are actually emitted for the current configuration,
382
+ * accumulated via {@link setManagedArgument}. Passed through to `CfnJob.defaultArguments` after
383
+ * being merged with the user-supplied `defaultArguments` by {@link mergeDefaultArguments}.
384
+ */
385
+ private readonly _managedArguments;
386
+ /**
387
+ * Every argument key this construct manages, accumulated via {@link setManagedArgument} — whether
388
+ * or not the current configuration emits a value for it. This is the reserved set that a
389
+ * user-supplied `defaultArguments` must not collide with. Registering a key even when its value
390
+ * is `undefined` (feature disabled or unset) is what keeps `defaultArguments` from silently
391
+ * re-enabling it.
392
+ */
393
+ private readonly _managedArgumentKeys;
394
+ /**
395
+ * Declare `key` as construct-managed and, when `value` is defined, emit it into the job's
396
+ * arguments.
360
397
  *
398
+ * This is the single sink for every argument a job construct derives from its typed props (or
399
+ * from the job class itself). Call it once per managed key, passing `undefined` as the value when
400
+ * the corresponding feature is turned off or unset — the key is still reserved from
401
+ * `defaultArguments` either way, so a disabled feature cannot be re-enabled through the escape
402
+ * hatch. There is deliberately no other way for a subclass to emit a managed argument, so the
403
+ * reserved set can never drift from what is emitted.
404
+ *
405
+ * @param key the Glue argument key, e.g. `--enable-metrics`
406
+ * @param value the value to emit, or `undefined` to reserve the key without emitting it
407
+ */
408
+ protected setManagedArgument(key: string, value?: string): void;
409
+ /**
410
+ * Merge the customer-supplied `defaultArguments` with the arguments this construct manages.
411
+ *
412
+ * The construct owns every argument it emits — whether the value comes from a dedicated typed
413
+ * prop (e.g. `continuousLogging`, `enableMetrics`, `sparkUI`) or from the job class itself
414
+ * (e.g. `--job-language`). Those arguments, plus the arguments Glue reserves for its own use,
415
+ * MUST be configured through their dedicated props rather than the untyped `defaultArguments`
416
+ * map, so there is exactly one way to express each intent. Passing such a key through
417
+ * `defaultArguments` therefore throws instead of silently winning or being silently dropped.
418
+ *
419
+ * A managed key whose supplied value is identical to the construct's value is not contradictory,
420
+ * so it is allowed rather than rejected (auto-correcting config is preferred over errors).
421
+ * Glue-reserved keys are never emitted by the construct, so there is no value to reconcile and
422
+ * they always throw.
423
+ *
424
+ * The reserved set is `_managedArgumentKeys` — every key the construct declared through
425
+ * {@link setManagedArgument}, whether or not a value was emitted for it. It is deliberately NOT
426
+ * derived from the keys that carry a value: a typed prop that turns a feature *off* (e.g.
427
+ * `enableMetrics: false`) emits no value but still reserves its key, so `defaultArguments` cannot
428
+ * silently re-enable it.
429
+ *
430
+ * Conflict detection relies on string equality of the argument keys, which cannot see through
431
+ * unresolved tokens (e.g. a key produced by `CfnJson` that only resolves at deploy time). If a
432
+ * key is a token, the check is skipped for that key and a synthesis-time warning is emitted, so
433
+ * the (rare) case where a token key resolves to a managed argument at deploy time — in which the
434
+ * construct-managed value would silently take precedence — is surfaced rather than hidden.
435
+ *
436
+ * @param defaultArguments the caller-supplied escape-hatch arguments, if any
361
437
  * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
362
438
  */
363
- protected checkNoReservedArgs(defaultArguments?: {
439
+ protected mergeDefaultArguments(defaultArguments?: {
364
440
  [key: string]: string;
365
441
  }): {
366
442
  [key: string]: string;
367
- } | undefined;
443
+ };
368
444
  /**
369
- * Setup Continuous Logging Properties
370
- * @param role The IAM role to use for continuous logging
445
+ * Register (and, when enabled, emit) the continuous-logging arguments this job manages.
446
+ *
447
+ * All five continuous-logging keys are reserved on every job type regardless of configuration:
448
+ * they are always registered through {@link setManagedArgument}, and carry a value only when
449
+ * logging is enabled. This keeps `defaultArguments` from re-enabling logging a user turned off.
450
+ *
451
+ * @param role The IAM role to grant write access to a custom log group, if one is provided
371
452
  * @param props The properties for continuous logging configuration
372
- * @returns String containing the args for the continuous logging command
453
+ * @param securityConfiguration The security configuration attached to the job, if any
373
454
  */
374
- protected setupContinuousLogging(role: iam.IRole, props: ContinuousLoggingProps | undefined): any;
455
+ protected setupContinuousLogging(role: iam.IRole, props: ContinuousLoggingProps | undefined, securityConfiguration?: ISecurityConfiguration): void;
375
456
  protected codeS3ObjectUrl(code: Code): string;
376
457
  }
package/lib/jobs/job.js CHANGED
@@ -51,7 +51,13 @@ 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.269.0-alpha.0" };
55
+ /**
56
+ * A reference to this Job resource, for use with the generated L1 ref interface.
57
+ */
58
+ get jobRef() {
59
+ return { jobName: this.jobName };
60
+ }
55
61
  /**
56
62
  * Create a CloudWatch Event Rule for this Glue Job when it's in a given state
57
63
  *
@@ -210,7 +216,7 @@ exports.JobBase = JobBase;
210
216
  * @resource AWS::Glue::Job
211
217
  */
212
218
  class Job extends JobBase {
213
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.268.0-alpha.0" };
219
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.269.0-alpha.0" };
214
220
  /**
215
221
  * Identifies an existing Glue Job from a subset of attributes that can
216
222
  * be referenced from within another Stack or Construct.
@@ -237,31 +243,107 @@ class Job extends JobBase {
237
243
  return new Import(scope, id);
238
244
  }
239
245
  /**
240
- * Check no usage of reserved arguments.
246
+ * Argument keys that Glue reserves for its own use and that a caller must never set through
247
+ * `defaultArguments`. Unlike construct-managed arguments (which are derived from what each job
248
+ * class emits), these are owned by the Glue service itself and are reserved for every job type.
249
+ *
250
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
251
+ */
252
+ static GLUE_RESERVED_ARGUMENTS = new Set(['--debug', '--mode', '--JOB_NAME', '--endpoint']);
253
+ /**
254
+ * The construct-managed job arguments that are actually emitted for the current configuration,
255
+ * accumulated via {@link setManagedArgument}. Passed through to `CfnJob.defaultArguments` after
256
+ * being merged with the user-supplied `defaultArguments` by {@link mergeDefaultArguments}.
257
+ */
258
+ _managedArguments = {};
259
+ /**
260
+ * Every argument key this construct manages, accumulated via {@link setManagedArgument} — whether
261
+ * or not the current configuration emits a value for it. This is the reserved set that a
262
+ * user-supplied `defaultArguments` must not collide with. Registering a key even when its value
263
+ * is `undefined` (feature disabled or unset) is what keeps `defaultArguments` from silently
264
+ * re-enabling it.
265
+ */
266
+ _managedArgumentKeys = new Set();
267
+ /**
268
+ * Declare `key` as construct-managed and, when `value` is defined, emit it into the job's
269
+ * arguments.
270
+ *
271
+ * This is the single sink for every argument a job construct derives from its typed props (or
272
+ * from the job class itself). Call it once per managed key, passing `undefined` as the value when
273
+ * the corresponding feature is turned off or unset — the key is still reserved from
274
+ * `defaultArguments` either way, so a disabled feature cannot be re-enabled through the escape
275
+ * hatch. There is deliberately no other way for a subclass to emit a managed argument, so the
276
+ * reserved set can never drift from what is emitted.
277
+ *
278
+ * @param key the Glue argument key, e.g. `--enable-metrics`
279
+ * @param value the value to emit, or `undefined` to reserve the key without emitting it
280
+ */
281
+ setManagedArgument(key, value) {
282
+ this._managedArgumentKeys.add(key);
283
+ if (value !== undefined) {
284
+ this._managedArguments[key] = value;
285
+ }
286
+ }
287
+ /**
288
+ * Merge the customer-supplied `defaultArguments` with the arguments this construct manages.
289
+ *
290
+ * The construct owns every argument it emits — whether the value comes from a dedicated typed
291
+ * prop (e.g. `continuousLogging`, `enableMetrics`, `sparkUI`) or from the job class itself
292
+ * (e.g. `--job-language`). Those arguments, plus the arguments Glue reserves for its own use,
293
+ * MUST be configured through their dedicated props rather than the untyped `defaultArguments`
294
+ * map, so there is exactly one way to express each intent. Passing such a key through
295
+ * `defaultArguments` therefore throws instead of silently winning or being silently dropped.
296
+ *
297
+ * A managed key whose supplied value is identical to the construct's value is not contradictory,
298
+ * so it is allowed rather than rejected (auto-correcting config is preferred over errors).
299
+ * Glue-reserved keys are never emitted by the construct, so there is no value to reconcile and
300
+ * they always throw.
241
301
  *
302
+ * The reserved set is `_managedArgumentKeys` — every key the construct declared through
303
+ * {@link setManagedArgument}, whether or not a value was emitted for it. It is deliberately NOT
304
+ * derived from the keys that carry a value: a typed prop that turns a feature *off* (e.g.
305
+ * `enableMetrics: false`) emits no value but still reserves its key, so `defaultArguments` cannot
306
+ * silently re-enable it.
307
+ *
308
+ * Conflict detection relies on string equality of the argument keys, which cannot see through
309
+ * unresolved tokens (e.g. a key produced by `CfnJson` that only resolves at deploy time). If a
310
+ * key is a token, the check is skipped for that key and a synthesis-time warning is emitted, so
311
+ * the (rare) case where a token key resolves to a managed argument at deploy time — in which the
312
+ * construct-managed value would silently take precedence — is surfaced rather than hidden.
313
+ *
314
+ * @param defaultArguments the caller-supplied escape-hatch arguments, if any
242
315
  * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
243
316
  */
244
- checkNoReservedArgs(defaultArguments) {
317
+ mergeDefaultArguments(defaultArguments) {
245
318
  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
- });
319
+ if (Object.keys(defaultArguments).some((arg) => cdk.Token.isUnresolved(arg))) {
320
+ 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).');
321
+ }
322
+ const conflicts = Object.keys(defaultArguments).filter((arg) => Job.GLUE_RESERVED_ARGUMENTS.has(arg)
323
+ || (this._managedArgumentKeys.has(arg)
324
+ && !(Object.hasOwn(this._managedArguments, arg) && defaultArguments[arg] === this._managedArguments[arg])));
325
+ if (conflicts.length > 0) {
326
+ 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);
327
+ }
252
328
  }
253
329
  (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;
330
+ return { ...defaultArguments, ...this._managedArguments };
255
331
  }
256
332
  /**
257
- * Setup Continuous Logging Properties
258
- * @param role The IAM role to use for continuous logging
333
+ * Register (and, when enabled, emit) the continuous-logging arguments this job manages.
334
+ *
335
+ * All five continuous-logging keys are reserved on every job type regardless of configuration:
336
+ * they are always registered through {@link setManagedArgument}, and carry a value only when
337
+ * logging is enabled. This keeps `defaultArguments` from re-enabling logging a user turned off.
338
+ *
339
+ * @param role The IAM role to grant write access to a custom log group, if one is provided
259
340
  * @param props The properties for continuous logging configuration
260
- * @returns String containing the args for the continuous logging command
341
+ * @param securityConfiguration The security configuration attached to the job, if any
261
342
  */
262
- setupContinuousLogging(role, props) {
343
+ setupContinuousLogging(role, props, securityConfiguration) {
263
344
  try {
264
345
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ContinuousLoggingProps(props);
346
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ISecurityConfiguration(securityConfiguration);
265
347
  }
266
348
  catch (error) {
267
349
  if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
@@ -269,29 +351,24 @@ class Job extends JobBase {
269
351
  }
270
352
  throw error;
271
353
  }
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;
354
+ // Continuous logging is on unless the developer has explicitly disabled it.
355
+ const enabled = !(props && !props.enabled);
356
+ // When logging is on, the logs are written to an unencrypted CloudWatch log group unless a
357
+ // SecurityConfiguration is attached. We cannot introspect whether the attached
358
+ // SecurityConfiguration actually configures cloudWatchEncryption (the ISecurityConfiguration
359
+ // interface only exposes the name), so we only warn when none is attached at all to avoid
360
+ // false positives.
361
+ if (enabled && !securityConfiguration) {
362
+ 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
363
  }
294
- return args;
364
+ // A custom log group is only wired up (and only granted write) when logging is enabled.
365
+ const logGroup = enabled ? props?.logGroup : undefined;
366
+ logGroup?.grantWrite(role);
367
+ this.setManagedArgument('--enable-continuous-cloudwatch-log', enabled ? 'true' : undefined);
368
+ this.setManagedArgument('--enable-continuous-log-filter', enabled && props?.quiet ? 'true' : undefined);
369
+ this.setManagedArgument('--continuous-log-logGroup', logGroup?.logGroupName);
370
+ this.setManagedArgument('--continuous-log-logStreamPrefix', enabled ? props?.logStreamPrefix : undefined);
371
+ this.setManagedArgument('--continuous-log-conversionPattern', enabled ? props?.conversionPattern : undefined);
295
372
  }
296
373
  codeS3ObjectUrl(code) {
297
374
  try {
@@ -325,4 +402,4 @@ function metricRule(rule, props) {
325
402
  ...props,
326
403
  }).attachTo(rule);
327
404
  }
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==
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQXlEO0FBQ3pELCtEQUFpRDtBQUVqRCx5REFBMkM7QUFFM0Msc0RBQXdDO0FBQ3hDLDRFQUE0RDtBQUs1RCw0Q0FBd0M7QUFDeEMsa0VBQXFFO0FBcUhyRTs7Ozs7O0dBTUc7QUFDSCxNQUFzQixPQUFRLFNBQVEsR0FBRyxDQUFDLFFBQVE7O0lBS2hEOztPQUVHO0lBQ0gsSUFBVyxNQUFNO1FBQ2YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksT0FBTyxDQUFDLEVBQVUsRUFBRSxVQUFpQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkIsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDO1lBQzVELE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVEOzs7Ozs7T0FNRztJQUNPLGFBQWEsQ0FBQyxFQUFVLEVBQUUsUUFBa0IsRUFBRSxVQUFpQyxFQUFFOzs7Ozs7Ozs7O1FBQ3pGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzVCLFdBQVcsRUFBRSxnQ0FBZ0MsSUFBSSxDQUFD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Ozs7Ozs7UUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUN6RCxPQUFPLFFBQVEsVUFBVSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDaEU7O0FBN0tILGtCQThLQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFrQixFQUFFLEtBQWdDO0lBQ3RFLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzNCLFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDMUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRztRQUMvQixHQUFHLEtBQUs7S0FDVCxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgSUpvYlJlZiwgSm9iUmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjb25zdHJ1Y3RzIGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlIH0gZnJvbSAnLi4vY29kZSc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1R5cGUsIEdsdWVWZXJzaW9uIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEpvYlN0YXRlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHdhcm5PblBsYWludGV4dFNlY3JldHMgfSBmcm9tICcuLi9wcml2YXRlL3NlY3JldC1kZXRlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBJU2VjdXJpdHlDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vc2VjdXJpdHktY29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIG5ldyBvciBhbiBpbXBvcnRlZCBHbHVlIEpvYlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElKb2IgZXh0ZW5kcyBjZGsuSVJlc291cmNlLCBpYW0uSUdyYW50YWJsZSwgSUpvYlJlZiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgam9iLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBqb2JOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGpvYi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgam9iQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBDbG91ZFdhdGNoIGV2ZW50IHJ1bGUgdHJpZ2dlcmVkIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgd2l0aCB0aGlzIGpvYi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL0V2ZW50VHlwZXMuaHRtbCNnbHVlLWV2ZW50LXR5cGVzXG4gICAqL1xuICBvbkV2ZW50KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBldmVudHMuT25FdmVudE9wdGlvbnMpOiBldmVudHMuUnVsZTtcblxuICAvKipcbiAgICogRGVmaW5lcyBhIENsb3VkV2F0Y2ggZXZlbnQgcnVsZSB0cmlnZ2VyZWQgd2hlbiB0aGlzIGpvYiBtb3ZlcyB0byB0aGUgU1VDQ0VFREVEIHN0YXRlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uU3VjY2VzcyhpZDogc3RyaW5nLCBvcHRpb25zPzogZXZlbnRzLk9uRXZlbnRPcHRpb25zKTogZXZlbnRzLlJ1bGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBDbG91ZFdhdGNoIGV2ZW50IHJ1bGUgdHJpZ2dlcmVkIHdoZW4gdGhpcyBqb2IgbW92ZXMgdG8gdGhlIEZBSUxFRCBzdGF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL0V2ZW50VHlwZXMuaHRtbCNnbHVlLWV2ZW50LXR5cGVzXG4gICAqL1xuICBvbkZhaWx1cmUoaWQ6IHN0cmluZywgb3B0aW9ucz86IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyk6IGV2ZW50cy5SdWxlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgQ2xvdWRXYXRjaCBldmVudCBydWxlIHRyaWdnZXJlZCB3aGVuIHRoaXMgam9iIG1vdmVzIHRvIHRoZSBUSU1FT1VUIHN0YXRlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uVGltZW91dChpZDogc3RyaW5nLCBvcHRpb25zPzogZXZlbnRzLk9uRXZlbnRPcHRpb25zKTogZXZlbnRzLlJ1bGU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBuYW1lIG9mIHRoZSBtZXRyaWMgdHlwaWNhbGx5IHByZWZpeGVkIHdpdGggYGdsdWUuZHJpdmVyLmAsIGBnbHVlLjxleGVjdXRvcklkPi5gIG9yIGBnbHVlLkFMTC5gLlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgbWV0cmljIHR5cGUuXG4gICAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgb3B0aW9ucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvcmluZy1hd3NnbHVlLXdpdGgtY2xvdWR3YXRjaC1tZXRyaWNzLmh0bWxcbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHR5cGU6IE1ldHJpY1R5cGUsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHN1Y2Nlc3MuXG4gICAqL1xuICBtZXRyaWNTdWNjZXNzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIGZhaWx1cmUuXG4gICAqL1xuICBtZXRyaWNGYWlsdXJlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHRpbWVvdXQuXG4gICAqL1xuICBtZXRyaWNUaW1lb3V0KHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZW5hYmxpbmcgQ29udGludW91cyBMb2dnaW5nIGZvciBHbHVlIEpvYnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1jb250aW51b3VzLWxvZ2dpbmctZW5hYmxlLmh0bWxcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludW91c0xvZ2dpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBFbmFibGUgY29udGludW91cyBsb2dnaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBDbG91ZFdhdGNoIGxvZyBncm91cCBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbG9nIGdyb3VwIGlzIGNyZWF0ZWQgd2l0aCBuYW1lIGAvYXdzLWdsdWUvam9icy9sb2dzLXYyL2AuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIENsb3VkV2F0Y2ggbG9nIHN0cmVhbSBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGpvYiBydW4gSUQuXG4gICAqL1xuICByZWFkb25seSBsb2dTdHJlYW1QcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBvdXQgbm9uLXVzZWZ1bCBBcGFjaGUgU3BhcmsgZHJpdmVyL2V4ZWN1dG9yIGFuZCBBcGFjaGUgSGFkb29wIFlBUk4gaGVhcnRiZWF0IGxvZyBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgcHJvdmlkZWQgY29udmVyc2lvbiBwYXR0ZXJuLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgTG9nNGogQ29udmVyc2lvbiBQYXR0ZXJuIHRvIGN1c3RvbWl6ZSBkcml2ZXIgYW5kIGV4ZWN1dG9yIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAlZHt5eS9NTS9kZCBISDptbTpzc30gJXAgJWN7MX06ICVtJW5gXG4gICAqL1xuICByZWFkb25seSBjb252ZXJzaW9uUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgaXMgbmVlZGVkIHRvIGJlIGFibGUgdG8gaW1wb3J0IGV4aXN0aW5nIEpvYnMgaW50byBhIENESyBhcHAgdG9cbiAqIHJlZmVyZW5jZSBhcyBwYXJ0IG9mIGEgbGFyZ2VyIHN0YWNrIG9yIGNvbnN0cnVjdC4gSm9iQmFzZSBoYXMgdGhlIHN1YnNldFxuICogb2YgYXR0cmlidXRlcyByZXF1aXJlZCB0byBpZGVudGlmeSBhbmQgcmVmZXJlbmNlIGFuIGV4aXN0aW5nIEdsdWUgSm9iLFxuICogYXMgd2VsbCBhcyBzb21lIENsb3VkV2F0Y2ggbWV0cmljIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5cbiAqIGV2ZW50LWRyaXZlbiBmbG93IHVzaW5nIHRoZSBqb2IuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2JCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUpvYiB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBqb2JBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgdG8gdGhpcyBKb2IgcmVzb3VyY2UsIGZvciB1c2Ugd2l0aCB0aGUgZ2VuZXJhdGVkIEwxIHJlZiBpbnRlcmZhY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGpvYlJlZigpOiBKb2JSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IGpvYk5hbWU6IHRoaXMuam9iTmFtZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggRXZlbnQgUnVsZSBmb3IgdGhpcyBHbHVlIEpvYiB3aGVuIGl0J3MgaW4gYSBnaXZlbiBzdGF0ZVxuICAgKlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBvcHRpb25zIGV2ZW50IG9wdGlvbnMuIE5vdGUgdGhhdCBzb21lIHZhbHVlcyBhcmUgb3ZlcnJpZGRlbiBpZiBwcm92aWRlZCwgdGhlc2UgYXJlXG4gICAqICAtIGV2ZW50UGF0dGVybi5zb3VyY2UgPSBbJ2F3cy5nbHVlJ11cbiAgICogIC0gZXZlbnRQYXR0ZXJuLmRldGFpbFR5cGUgPSBbJ0dsdWUgSm9iIFN0YXRlIENoYW5nZScsICdHbHVlIEpvYiBSdW4gU3RhdHVzJ11cbiAgICogIC0gZXZlbnRQYXR0ZXJuLmRldGFpbC5qb2JOYW1lID0gW3RoaXMuam9iTmFtZV1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL0V2ZW50VHlwZXMuaHRtbCNnbHVlLWV2ZW50LXR5cGVzXG4gICAqL1xuICBwdWJsaWMgb25FdmVudChpZDogc3RyaW5nLCBvcHRpb25zOiBldmVudHMuT25FdmVudE9wdGlvbnMgPSB7fSk6IGV2ZW50cy5SdWxlIHtcbiAgICBjb25zdCBydWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsIGlkLCBvcHRpb25zKTtcbiAgICBydWxlLmFkZFRhcmdldChvcHRpb25zLnRhcmdldCk7XG4gICAgcnVsZS5hZGRFdmVudFBhdHRlcm4oe1xuICAgICAgc291cmNlOiBbJ2F3cy5nbHVlJ10sXG4gICAgICBkZXRhaWxUeXBlOiBbJ0dsdWUgSm9iIFN0YXRlIENoYW5nZScsICdHbHVlIEpvYiBSdW4gU3RhdHVzJ10sXG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgam9iTmFtZTogW3RoaXMuam9iTmFtZV0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggRXZlbnQgUnVsZSBmb3IgdGhlIHRyYW5zaXRpb24gaW50byB0aGUgaW5wdXQgam9iU3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBqb2JTdGF0ZSB0aGUgam9iIHN0YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCBldmVudCBvcHRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uU3RhdGVDaGFuZ2UoaWQ6IHN0cmluZywgam9iU3RhdGU6IEpvYlN0YXRlLCBvcHRpb25zOiBldmVudHMuT25FdmVudE9wdGlvbnMgPSB7fSk6IGV2ZW50cy5SdWxlIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5vbkV2ZW50KGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYFJ1bGUgdHJpZ2dlcmVkIHdoZW4gR2x1ZSBqb2IgJHt0aGlzLmpvYk5hbWV9IGlzIGluICR7am9iU3RhdGV9IHN0YXRlYCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgcnVsZS5hZGRFdmVudFBhdHRlcm4oe1xuICAgICAgZGV0YWlsOiB7XG4gICAgICAgIHN0YXRlOiBbam9iU3RhdGVdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBDbG91ZFdhdGNoIEV2ZW50IFJ1bGUgbWF0Y2hpbmcgSm9iU3RhdGUuU1VDQ0VFREVELlxuICAgKlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IGlkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCBldmVudCBvcHRpb25zLiBkZWZhdWx0IGlzIHt9LlxuICAgKi9cbiAgcHVibGljIG9uU3VjY2VzcyhpZDogc3RyaW5nLCBvcHRpb25zOiBldmVudHMuT25FdmVudE9wdGlvbnMgPSB7fSk6IGV2ZW50cy5SdWxlIHtcbiAgICByZXR1cm4gdGhpcy5vblN0YXRlQ2hhbmdlKGlkLCBKb2JTdGF0ZS5TVUNDRUVERUQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIENsb3VkV2F0Y2ggRXZlbnQgUnVsZSBtYXRjaGluZyBGQUlMRUQgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuIGRlZmF1bHQgaXMge30uXG4gICAqL1xuICBwdWJsaWMgb25GYWlsdXJlKGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIHJldHVybiB0aGlzLm9uU3RhdGVDaGFuZ2UoaWQsIEpvYlN0YXRlLkZBSUxFRCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIG1hdGNoaW5nIFRJTUVPVVQgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuIGRlZmF1bHQgaXMge30uXG4gICAqL1xuICBwdWJsaWMgb25UaW1lb3V0KGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIHJldHVybiB0aGlzLm9uU3RhdGVDaGFuZ2UoaWQsIEpvYlN0YXRlLlRJTUVPVVQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBuYW1lIG9mIHRoZSBtZXRyaWMgdHlwaWNhbGx5IHByZWZpeGVkIHdpdGggYGdsdWUuZHJpdmVyLmAsIGBnbHVlLjxleGVjdXRvcklkPi5gIG9yIGBnbHVlLkFMTC5gLlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgbWV0cmljIHR5cGUuXG4gICAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgb3B0aW9ucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvcmluZy1hd3NnbHVlLXdpdGgtY2xvdWR3YXRjaC1tZXRyaWNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB0eXBlOiBNZXRyaWNUeXBlLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBuYW1lc3BhY2U6ICdHbHVlJyxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgSm9iTmFtZTogdGhpcy5qb2JOYW1lLFxuICAgICAgICBKb2JSdW5JZDogJ0FMTCcsXG4gICAgICAgIFR5cGU6IHR5cGUsXG4gICAgICB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2Igc3VjY2Vzcy5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgaXMgYmFzZWQgb24gdGhlIFJ1bGUgcmV0dXJuZWQgYnkgbm8tYXJncyBvblN1Y2Nlc3MoKSBjYWxsLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1N1Y2Nlc3MocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG1ldHJpY1J1bGUodGhpcy5tZXRyaWNKb2JTdGF0ZVJ1bGUoJ1N1Y2Nlc3NNZXRyaWNSdWxlJywgSm9iU3RhdGUuU1VDQ0VFREVEKSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIGZhaWx1cmUuXG4gICAqXG4gICAqIFRoaXMgbWV0cmljIGlzIGJhc2VkIG9uIHRoZSBSdWxlIHJldHVybmVkIGJ5IG5vLWFyZ3Mgb25GYWlsdXJlKCkgY2FsbC5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNGYWlsdXJlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBtZXRyaWNSdWxlKHRoaXMubWV0cmljSm9iU3RhdGVSdWxlKCdGYWlsdXJlTWV0cmljUnVsZScsIEpvYlN0YXRlLkZBSUxFRCksIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIE1ldHJpYyBpbmRpY2F0aW5nIGpvYiB0aW1lb3V0LlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyBpcyBiYXNlZCBvbiB0aGUgUnVsZSByZXR1cm5lZCBieSBuby1hcmdzIG9uVGltZW91dCgpIGNhbGwuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGltZW91dChwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbWV0cmljUnVsZSh0aGlzLm1ldHJpY0pvYlN0YXRlUnVsZSgnVGltZW91dE1ldHJpY1J1bGUnLCBKb2JTdGF0ZS5USU1FT1VUKSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgcmV0cmlldmVzIGEgc2luZ2xldG9uIGV2ZW50IHJ1bGUgZm9yIHRoZSBpbnB1dCBqb2Igc3RhdGUgZm9yIHVzZSB3aXRoIHRoZSBtZXRyaWMgSm9iU3RhdGUgbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIGpvYlN0YXRlIHRoZSBqb2Igc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIG1ldHJpY0pvYlN0YXRlUnVsZShpZDogc3RyaW5nLCBqb2JTdGF0ZTogSm9iU3RhdGUpOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS50cnlGaW5kQ2hpbGQoaWQpIGFzIGV2ZW50cy5SdWxlID8/IHRoaXMub25TdGF0ZUNoYW5nZShpZCwgam9iU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGpvYiBhcm5cbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEpvYkFybihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGpvYk5hbWU6IHN0cmluZykgOiBzdHJpbmcge1xuICAgIHJldHVybiBjZGsuU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnZ2x1ZScsXG4gICAgICByZXNvdXJjZTogJ2pvYicsXG4gICAgICByZXNvdXJjZU5hbWU6IGpvYk5hbWUsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHN1YnNldCBvZiBKb2IgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBqb2JcbiAqIGludG8gYSBDREsgcHJvamVjdC4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB1c2luZyBmcm9tSm9iQXR0cmlidXRlc1xuICogdG8gaWRlbnRpZnkgYW5kIHJlZmVyZW5jZSB0aGUgZXhpc3Rpbmcgam9iLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGpvYi5cbiAgICovXG4gIHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGFzc3VtZWQgYnkgR2x1ZSB0byBydW4gdGhpcyBqb2IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG59XG5cbi8qKlxuICogSm9iUHJvcHMgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgR2x1ZSBKb2JzIHVzaW5nIHRoaXMgTDIgQ29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYlByb3BzIHtcbiAgLyoqXG4gICAqIFNjcmlwdCBDb2RlIExvY2F0aW9uIChyZXF1aXJlZClcbiAgICogU2NyaXB0IHRvIHJ1biB3aGVuIHRoZSBHbHVlIGpvYiBleGVjdXRlcy4gQ2FuIGJlIHVwbG9hZGVkXG4gICAqIGZyb20gdGhlIGxvY2FsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdXNpbmcgZnJvbUFzc2V0XG4gICAqIG9yIHJlZmVyZW5jZWQgdmlhIFMzIGxvY2F0aW9uIHVzaW5nIGZyb21CdWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdDogQ29kZTtcblxuICAvKipcbiAgICogSUFNIFJvbGUgKHJlcXVpcmVkKVxuICAgKiBJQU0gUm9sZSB0byB1c2UgZm9yIEdsdWUgam9iIGV4ZWN1dGlvblxuICAgKiBNdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgZGV2ZWxvcGVyIGJlY2F1c2UgdGhlIEwyIGRvZXNuJ3QgaGF2ZSB2aXNpYmlsaXR5XG4gICAqIGludG8gdGhlIGFjdGlvbnMgdGhlIHNjcmlwdChzKSB0YWtlcyBkdXJpbmcgdGhlIGpvYiBleGVjdXRpb25cbiAgICogVGhlIHJvbGUgbXVzdCB0cnVzdCB0aGUgR2x1ZSBzZXJ2aWNlIHByaW5jaXBhbCAoZ2x1ZS5hbWF6b25hd3MuY29tKVxuICAgKiBhbmQgYmUgZ3JhbnRlZCBzdWZmaWNpZW50IHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9nZXR0aW5nLXN0YXJ0ZWQtYWNjZXNzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBqb2IgKG9wdGlvbmFsKVxuICAgKiBEZXZlbG9wZXItc3BlY2lmaWVkIG5hbWUgb2YgdGhlIEdsdWUgam9iXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBqb2JOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiAob3B0aW9uYWwpXG4gICAqIERldmVsb3Blci1zcGVjaWZpZWQgZGVzY3JpcHRpb24gb2YgdGhlIEdsdWUgam9iXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXggQ29uY3VycmVudCBSdW5zIChvcHRpb25hbClcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJ1bnMgdGhpcyBHbHVlIGpvYiBjYW4gY29uY3VycmVudGx5IHJ1blxuICAgKlxuICAgKiBBbiBlcnJvciBpcyByZXR1cm5lZCB3aGVuIHRoaXMgdGhyZXNob2xkIGlzIHJlYWNoZWQuIFRoZSBtYXhpbXVtIHZhbHVlXG4gICAqIHlvdSBjYW4gc3BlY2lmeSBpcyBjb250cm9sbGVkIGJ5IGEgc2VydmljZSBsaW1pdC5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29uY3VycmVudFJ1bnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgQXJndW1lbnRzIChvcHRpb25hbClcbiAgICogVGhlIGRlZmF1bHQgYXJndW1lbnRzIGZvciBldmVyeSBydW4gb2YgdGhpcyBHbHVlIGpvYixcbiAgICogc3BlY2lmaWVkIGFzIG5hbWUtdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIFRoaXMgbWFwIGlzIHRoZSBlc2NhcGUgaGF0Y2ggZm9yIEdsdWUgam9iIGFyZ3VtZW50cyB0aGF0IHRoaXMgY29uc3RydWN0IGRvZXMgbm90IG1vZGVsLiBJdFxuICAgKiBNVVNUIE5PVCBiZSB1c2VkIHRvIHNldCBhcmd1bWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgYSBkZWRpY2F0ZWQgcHJvcCDigJQgY29uZmlndXJlIHRob3NlIHRocm91Z2hcbiAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcCBpbnN0ZWFkIChgY29udGludW91c0xvZ2dpbmdgLCBgZW5hYmxlTWV0cmljc2AsXG4gICAqIGBlbmFibGVPYnNlcnZhYmlsaXR5TWV0cmljc2AsIGBzcGFya1VJYCwgYGNsYXNzTmFtZWAsIGBleHRyYUphcnNgLCBgZXh0cmFKYXJzRmlyc3RgLFxuICAgKiBgZXh0cmFQeXRob25GaWxlc2AsIGBleHRyYUZpbGVzYCkuIFBhc3NpbmcgYSBjb25zdHJ1Y3QtbWFuYWdlZCBhcmd1bWVudCAoZS5nLlxuICAgKiBgLS1lbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZ2AsIGAtLWVuYWJsZS1tZXRyaWNzYCwgYC0tZW5hYmxlLXNwYXJrLXVpYCxcbiAgICogYC0tam9iLWxhbmd1YWdlYCkgb3IgYSBHbHVlLXJlc2VydmVkIGFyZ3VtZW50IChgLS1kZWJ1Z2AsIGAtLW1vZGVgLCBgLS1KT0JfTkFNRWAsIGAtLWVuZHBvaW50YClcbiAgICogaGVyZSB0aHJvd3MgYXQgc3ludGhlc2lzIHRpbWUsIHNvIHRoZXJlIGlzIGV4YWN0bHkgb25lIHdheSB0byBleHByZXNzIGVhY2ggaW50ZW50LlxuICAgKlxuICAgKiBBbHNvIG5vdGUgdGhhdCB0aGVzZSBhcmUgZW1pdHRlZCB2ZXJiYXRpbSBpbnRvIHRoZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSwgc28gYXZvaWRcbiAgICogcGxhY2luZyBzZWNyZXRzIGhlcmUgaW4gcGxhaW50ZXh0LiBQYXNzIHNlY3JldHMgdG8gdGhlIGpvYiBhdCBydW50aW1lXG4gICAqIHRocm91Z2ggQVdTIFNlY3JldHMgTWFuYWdlciBpbnN0ZWFkLiBBIHN5bnRoZXNpcy10aW1lIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIGFuIGFyZ3VtZW50IGtleSBsb29rcyBsaWtlIGEgY3JlZGVudGlhbCBhbmQgaG9sZHMgYSBwbGFpbnRleHQgbGl0ZXJhbC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICogZm9yIGEgbGlzdCBvZiByZXNlcnZlZCBwYXJhbWV0ZXJzXG4gICAqIEBkZWZhdWx0IC0gbm8gYXJndW1lbnRzXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QXJndW1lbnRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQ29ubmVjdGlvbnMgKG9wdGlvbmFsKVxuICAgKiBMaXN0IG9mIGNvbm5lY3Rpb25zIHRvIHVzZSBmb3IgdGhpcyBHbHVlIGpvYlxuICAgKiBDb25uZWN0aW9ucyBhcmUgdXNlZCB0byBjb25uZWN0IHRvIG90aGVyIEFXUyBTZXJ2aWNlIG9yIHJlc291cmNlcyB3aXRoaW4gYSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdIC0gbm8gY29ubmVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBqb2JcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25zPzogSUNvbm5lY3Rpb25bXTtcblxuICAvKipcbiAgICogTWF4IFJldHJpZXMgKG9wdGlvbmFsKVxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBHbHVlIHBlcmZvcm1zIGlmIHRoZSBqb2IgZmFpbHNcbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCAob3B0aW9uYWwpXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgdGhhdCBhIGpvYiBydW4gY2FuIGNvbnN1bWUgcmVzb3VyY2VzIGJlZm9yZSBpdCBpc1xuICAgKiB0ZXJtaW5hdGVkIGFuZCBlbnRlcnMgVElNRU9VVCBzdGF0dXMuIFNwZWNpZmllZCBpbiBtaW51dGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyODgwICgyIGRheXMgZm9yIG5vbi1zdHJlYW1pbmcpXG4gICAqXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogY2RrLkR1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBDb25maWd1cmF0aW9uIChvcHRpb25hbClcbiAgICogRGVmaW5lcyB0aGUgZW5jcnlwdGlvbiBvcHRpb25zIGZvciB0aGUgR2x1ZSBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWN1cml0eSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlDb25maWd1cmF0aW9uPzogSVNlY3VyaXR5Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGFncyAob3B0aW9uYWwpXG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIEdsdWUgam9iIHJlc291cmNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCB7fSAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBHbHVlIFZlcnNpb25cbiAgICogVGhlIHZlcnNpb24gb2YgR2x1ZSB0byB1c2UgdG8gZXhlY3V0ZSB0aGlzIGpvYlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRldGVybWluZWQgYnkgdGhlIGpvYiB0eXBlOiA0LjAgZm9yIEVUTCBhbmQgU3RyZWFtaW5nLCA1LjAgZm9yIEZsZXgsIDMuMCBmb3IgUHl0aG9uIFNoZWxsXG4gICAqL1xuICByZWFkb25seSBnbHVlVmVyc2lvbj86IEdsdWVWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGNvbnRpbnVvdXMgbG9nZ2luZyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY29udGludW91cyBsb2dnaW5nIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3ItY29udGludW91cy1sb2dnaW5nLWVuYWJsZS5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqKi9cbiAgcmVhZG9ubHkgY29udGludW91c0xvZ2dpbmc/OiBDb250aW51b3VzTG9nZ2luZ1Byb3BzO1xufVxuXG4vKipcbiAqIEEgR2x1ZSBKb2IuXG4gKiBAcmVzb3VyY2UgQVdTOjpHbHVlOjpKb2JcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpvYiBleHRlbmRzIEpvYkJhc2Uge1xuICAvKipcbiAgICogSWRlbnRpZmllcyBhbiBleGlzdGluZyBHbHVlIEpvYiBmcm9tIGEgc3Vic2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBjYW5cbiAgICogYmUgcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiBhbm90aGVyIFN0YWNrIG9yIENvbnN0cnVjdC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKVxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIGlkLlxuICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBmb3IgdGhlIEdsdWUgSm9iIHdlIHdhbnQgdG8gaW1wb3J0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kb2JBdHRyaWJ1dGVzKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEpvYkF0dHJpYnV0ZXMpOiBJSm9iIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBKb2JCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBqb2JOYW1lID0gYXR0cnMuam9iTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBqb2JBcm4gPSB0aGlzLmJ1aWxkSm9iQXJuKHNjb3BlLCBhdHRycy5qb2JOYW1lKTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbCA9IGF0dHJzLnJvbGUgPz8gbmV3IGlhbS5Vbmtub3duUHJpbmNpcGFsKHsgcmVzb3VyY2U6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmd1bWVudCBrZXlzIHRoYXQgR2x1ZSByZXNlcnZlcyBmb3IgaXRzIG93biB1c2UgYW5kIHRoYXQgYSBjYWxsZXIgbXVzdCBuZXZlciBzZXQgdGhyb3VnaFxuICAgKiBgZGVmYXVsdEFyZ3VtZW50c2AuIFVubGlrZSBjb25zdHJ1Y3QtbWFuYWdlZCBhcmd1bWVudHMgKHdoaWNoIGFyZSBkZXJpdmVkIGZyb20gd2hhdCBlYWNoIGpvYlxuICAgKiBjbGFzcyBlbWl0cyksIHRoZXNlIGFyZSBvd25lZCBieSB0aGUgR2x1ZSBzZXJ2aWNlIGl0c2VsZiBhbmQgYXJlIHJlc2VydmVkIGZvciBldmVyeSBqb2IgdHlwZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdMVUVfUkVTRVJWRURfQVJHVU1FTlRTID0gbmV3IFNldChbJy0tZGVidWcnLCAnLS1tb2RlJywgJy0tSk9CX05BTUUnLCAnLS1lbmRwb2ludCddKTtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIEdsdWUgYXNzdW1lcyB0byBydW4gdGhpcyBqb2IuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWJzdHJhY3Qgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0LW1hbmFnZWQgam9iIGFyZ3VtZW50cyB0aGF0IGFyZSBhY3R1YWxseSBlbWl0dGVkIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLFxuICAgKiBhY2N1bXVsYXRlZCB2aWEge0BsaW5rIHNldE1hbmFnZWRBcmd1bWVudH0uIFBhc3NlZCB0aHJvdWdoIHRvIGBDZm5Kb2IuZGVmYXVsdEFyZ3VtZW50c2AgYWZ0ZXJcbiAgICogYmVpbmcgbWVyZ2VkIHdpdGggdGhlIHVzZXItc3VwcGxpZWQgYGRlZmF1bHRBcmd1bWVudHNgIGJ5IHtAbGluayBtZXJnZURlZmF1bHRBcmd1bWVudHN9LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWFuYWdlZEFyZ3VtZW50czogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBFdmVyeSBhcmd1bWVudCBrZXkgdGhpcyBjb25zdHJ1Y3QgbWFuYWdlcywgYWNjdW11bGF0ZWQgdmlhIHtAbGluayBzZXRNYW5hZ2VkQXJndW1lbnR9IOKAlCB3aGV0aGVyXG4gICAqIG9yIG5vdCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGVtaXRzIGEgdmFsdWUgZm9yIGl0LiBUaGlzIGlzIHRoZSByZXNlcnZlZCBzZXQgdGhhdCBhXG4gICAqIHVzZXItc3VwcGxpZWQgYGRlZmF1bHRBcmd1bWVudHNgIG11c3Qgbm90IGNvbGxpZGUgd2l0aC4gUmVnaXN0ZXJpbmcgYSBrZXkgZXZlbiB3aGVuIGl0cyB2YWx1ZVxuICAgKiBpcyBgdW5kZWZpbmVkYCAoZmVhdHVyZSBkaXNhYmxlZCBvciB1bnNldCkgaXMgd2hhdCBrZWVwcyBgZGVmYXVsdEFyZ3VtZW50c2AgZnJvbSBzaWxlbnRseVxuICAgKiByZS1lbmFibGluZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX21hbmFnZWRBcmd1bWVudEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRGVjbGFyZSBga2V5YCBhcyBjb25zdHJ1Y3QtbWFuYWdlZCBhbmQsIHdoZW4gYHZhbHVlYCBpcyBkZWZpbmVkLCBlbWl0IGl0IGludG8gdGhlIGpvYidzXG4gICAqIGFyZ3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgc2luZ2xlIHNpbmsgZm9yIGV2ZXJ5IGFyZ3VtZW50IGEgam9iIGNvbnN0cnVjdCBkZXJpdmVzIGZyb20gaXRzIHR5cGVkIHByb3BzIChvclxuICAgKiBmcm9tIHRoZSBqb2IgY2xhc3MgaXRzZWxmKS4gQ2FsbCBpdCBvbmNlIHBlciBtYW5hZ2VkIGtleSwgcGFzc2luZyBgdW5kZWZpbmVkYCBhcyB0aGUgdmFsdWUgd2hlblxuICAgKiB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHR1cm5lZCBvZmYgb3IgdW5zZXQg4oCUIHRoZSBrZXkgaXMgc3RpbGwgcmVzZXJ2ZWQgZnJvbVxuICAgKiBgZGVmYXVsdEFyZ3VtZW50c2AgZWl0aGVyIHdheSwgc28gYSBkaXNhYmxlZCBmZWF0dXJlIGNhbm5vdCBiZSByZS1lbmFibGVkIHRocm91Z2ggdGhlIGVzY2FwZVxuICAgKiBoYXRjaC4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIG90aGVyIHdheSBmb3IgYSBzdWJjbGFzcyB0byBlbWl0IGEgbWFuYWdlZCBhcmd1bWVudCwgc28gdGhlXG4gICAqIHJlc2VydmVkIHNldCBjYW4gbmV2ZXIgZHJpZnQgZnJvbSB3aGF0IGlzIGVtaXR0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIEdsdWUgYXJndW1lbnQga2V5LCBlLmcuIGAtLWVuYWJsZS1tZXRyaWNzYFxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGVtaXQsIG9yIGB1bmRlZmluZWRgIHRvIHJlc2VydmUgdGhlIGtleSB3aXRob3V0IGVtaXR0aW5nIGl0XG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0TWFuYWdlZEFyZ3VtZW50KGtleTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX21hbmFnZWRBcmd1bWVudEtleXMuYWRkKGtleSk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21hbmFnZWRBcmd1bWVudHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSB0aGUgY3VzdG9tZXItc3VwcGxpZWQgYGRlZmF1bHRBcmd1bWVudHNgIHdpdGggdGhlIGFyZ3VtZW50cyB0aGlzIGNvbnN0cnVjdCBtYW5hZ2VzLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0IG93bnMgZXZlcnkgYXJndW1lbnQgaXQgZW1pdHMg4oCUIHdoZXRoZXIgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBkZWRpY2F0ZWQgdHlwZWRcbiAgICogcHJvcCAoZS5nLiBgY29udGludW91c0xvZ2dpbmdgLCBgZW5hYmxlTWV0cmljc2AsIGBzcGFya1VJYCkgb3IgZnJvbSB0aGUgam9iIGNsYXNzIGl0c2VsZlxuICAgKiAoZS5nLiBgLS1qb2ItbGFuZ3VhZ2VgKS4gVGhvc2UgYXJndW1lbnRzLCBwbHVzIHRoZSBhcmd1bWVudHMgR2x1ZSByZXNlcnZlcyBmb3IgaXRzIG93biB1c2UsXG4gICAqIE1VU1QgYmUgY29uZmlndXJlZCB0aHJvdWdoIHRoZWlyIGRlZGljYXRlZCBwcm9wcyByYXRoZXIgdGhhbiB0aGUgdW50eXBlZCBgZGVmYXVsdEFyZ3VtZW50c2BcbiAgICogbWFwLCBzbyB0aGVyZSBpcyBleGFjdGx5IG9uZSB3YXkgdG8gZXhwcmVzcyBlYWNoIGludGVudC4gUGFzc2luZyBzdWNoIGEga2V5IHRocm91Z2hcbiAgICogYGRlZmF1bHRBcmd1bWVudHNgIHRoZXJlZm9yZSB0aHJvd3MgaW5zdGVhZCBvZiBzaWxlbnRseSB3aW5uaW5nIG9yIGJlaW5nIHNpbGVudGx5IGRyb3BwZWQuXG4gICAqXG4gICAqIEEgbWFuYWdlZCBrZXkgd2hvc2Ugc3VwcGxpZWQgdmFsdWUgaXMgaWRlbnRpY2FsIHRvIHRoZSBjb25zdHJ1Y3QncyB2YWx1ZSBpcyBub3QgY29udHJhZGljdG9yeSxcbiAgICogc28gaXQgaXMgYWxsb3dlZCByYXRoZXIgdGhhbiByZWplY3RlZCAoYXV0by1jb3JyZWN0aW5nIGNvbmZpZyBpcyBwcmVmZXJyZWQgb3ZlciBlcnJvcnMpLlxuICAgKiBHbHVlLXJlc2VydmVkIGtleXMgYXJlIG5ldmVyIGVtaXR0ZWQgYnkgdGhlIGNvbnN0cnVjdCwgc28gdGhlcmUgaXMgbm8gdmFsdWUgdG8gcmVjb25jaWxlIGFuZFxuICAgKiB0aGV5IGFsd2F5cyB0aHJvdy5cbiAgICpcbiAgICogVGhlIHJlc2VydmVkIHNldCBpcyBgX21hbmFnZWRBcmd1bWVudEtleXNgIOKAlCBldmVyeSBrZXkgdGhlIGNvbnN0cnVjdCBkZWNsYXJlZCB0aHJvdWdoXG4gICAqIHtAbGluayBzZXRNYW5hZ2VkQXJndW1lbnR9LCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIHdhcyBlbWl0dGVkIGZvciBpdC4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVFxuICAgKiBkZXJpdmVkIGZyb20gdGhlIGtleXMgdGhhdCBjYXJyeSBhIHZhbHVlOiBhIHR5cGVkIHByb3AgdGhhdCB0dXJucyBhIGZlYXR1cmUgKm9mZiogKGUuZy5cbiAgICogYGVuYWJsZU1ldHJpY3M6IGZhbHNlYCkgZW1pdHMgbm8gdmFsdWUgYnV0IHN0aWxsIHJlc2VydmVzIGl0cyBrZXksIHNvIGBkZWZhdWx0QXJndW1lbnRzYCBjYW5ub3RcbiAgICogc2lsZW50bHkgcmUtZW5hYmxlIGl0LlxuICAgKlxuICAgKiBDb25mbGljdCBkZXRlY3Rpb24gcmVsaWVzIG9uIHN0cmluZyBlcXVhbGl0eSBvZiB0aGUgYXJndW1lbnQga2V5cywgd2hpY2ggY2Fubm90IHNlZSB0aHJvdWdoXG4gICAqIHVucmVzb2x2ZWQgdG9rZW5zIChlLmcuIGEga2V5IHByb2R1Y2VkIGJ5IGBDZm5Kc29uYCB0aGF0IG9ubHkgcmVzb2x2ZXMgYXQgZGVwbG95IHRpbWUpLiBJZiBhXG4gICAqIGtleSBpcyBhIHRva2VuLCB0aGUgY2hlY2sgaXMgc2tpcHBlZCBmb3IgdGhhdCBrZXkgYW5kIGEgc3ludGhlc2lzLXRpbWUgd2FybmluZyBpcyBlbWl0dGVkLCBzb1xuICAgKiB0aGUgKHJhcmUpIGNhc2Ugd2hlcmUgYSB0b2tlbiBrZXkgcmVzb2x2ZXMgdG8gYSBtYW5hZ2VkIGFyZ3VtZW50IGF0IGRlcGxveSB0aW1lIOKAlCBpbiB3aGljaCB0aGVcbiAgICogY29uc3RydWN0LW1hbmFnZWQgdmFsdWUgd291bGQgc2lsZW50bHkgdGFrZSBwcmVjZWRlbmNlIOKAlCBpcyBzdXJmYWNlZCByYXRoZXIgdGhhbiBoaWRkZW4uXG4gICAqXG4gICAqIEBwYXJhbSBkZWZhdWx0QXJndW1lbnRzIHRoZSBjYWxsZXItc3VwcGxpZWQgZXNjYXBlLWhhdGNoIGFyZ3VtZW50cywgaWYgYW55XG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICBwcm90ZWN0ZWQgbWVyZ2VEZWZhdWx0QXJndW1lbnRzKFxuICAgIGRlZmF1bHRBcmd1bWVudHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LFxuICApOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAoZGVmYXVsdEFyZ3VtZW50cykge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlZmF1bHRBcmd1bWVudHMpLnNvbWUoKGFyZykgPT4gY2RrLlRva2VuLmlzVW5yZXNvbHZlZChhcmcpKSkge1xuICAgICAgICBjZGsuQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAgICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYTp0b2tlbkpvYkFyZ3VtZW50S2V5JyxcbiAgICAgICAgICAnZGVmYXVsdEFyZ3VtZW50cyBjb250YWlucyBhbiB1bnJlc29sdmVkIHRva2VuIGFzIGFuIGFyZ3VtZW50IGtleSwgc28gaXQgY2Fubm90IGJlIGNoZWNrZWQgZm9yIGNvbmZsaWN0cyB3aXRoIGNvbnN0cnVjdC1tYW5hZ2VkIGFyZ3VtZW50cy4gSWYgaXQgcmVzb2x2ZXMgdG8gYSBtYW5hZ2VkIGFyZ3VtZW50IGF0IGRlcGxveSB0aW1lLCB0aGUgY29uc3RydWN0LW1hbmFnZWQgdmFsdWUgd2lsbCB0YWtlIHByZWNlZGVuY2UuIENvbmZpZ3VyZSBtYW5hZ2VkIGFyZ3VtZW50cyB0aHJvdWdoIHRoZWlyIGRlZGljYXRlZCBwcm9wcyAoZS5nLiBjb250aW51b3VzTG9nZ2luZywgZW5hYmxlTWV0cmljcywgZW5hYmxlT2JzZXJ2YWJpbGl0eU1ldHJpY3MsIHNwYXJrVUkpLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25mbGljdHMgPSBPYmplY3Qua2V5cyhkZWZhdWx0QXJndW1lbnRzKS5maWx0ZXIoXG4gICAgICAgIChhcmcpID0+IEpvYi5HTFVFX1JFU0VSVkVEX0FSR1VNRU5UUy5oYXMoYXJnKVxuICAgICAgICAgIHx8ICh0aGlzLl9tYW5hZ2VkQXJndW1lbnRLZXlzLmhhcyhhcmcpXG4gICAgICAgICAgICAmJiAhKE9iamVjdC5oYXNPd24odGhpcy5fbWFuYWdlZEFyZ3VtZW50cywgYXJnKSAmJiBkZWZhdWx0QXJndW1lbnRzW2FyZ10gPT09IHRoaXMuX21hbmFnZWRBcmd1bWVudHNbYXJnXSkpLFxuICAgICAgKTtcbiAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgTWFuYWdlZEpvYkFyZ3VtZW50YCxcbiAgICAgICAgICBgdGhlIGpvYiBhcmd1bWVudChzKSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0cyl9IGFyZSBtYW5hZ2VkIGJ5IHRoZSBjb25zdHJ1Y3Qgb3IgcmVzZXJ2ZWQgYnkgR2x1ZTsgY29uZmlndXJlIHRoZW0gdGhyb3VnaCB0aGUgY29ycmVzcG9uZGluZyBwcm9wcyAoZS5nLiBjb250aW51b3VzTG9nZ2luZywgZW5hYmxlTWV0cmljcywgZW5hYmxlT2JzZXJ2YWJpbGl0eU1ldHJpY3MsIHNwYXJrVUkpIGluc3RlYWQgb2YgZGVmYXVsdEFyZ3VtZW50c2AsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2Fybk9uUGxhaW50ZXh0U2VjcmV0cyhcbiAgICAgIHRoaXMsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzLFxuICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOnBsYWludGV4dEpvYkFyZ3VtZW50U2VjcmV0JyxcbiAgICAgICdQYXNzIHNlY3JldHMgdG8gdGhlIGpvYiBhdCBydW50aW1lIHRocm91Z2ggQVdTIFNlY3JldHMgTWFuYWdlciBpbnN0ZWFkIG9mIGVtYmVkZGluZyB0aGVtIGluIGBkZWZhdWx0QXJndW1lbnRzYC4nLFxuICAgICk7XG4gICAgcmV0dXJuIHsgLi4uZGVmYXVsdEFyZ3VtZW50cywgLi4udGhpcy5fbWFuYWdlZEFyZ3VtZW50cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIChhbmQsIHdoZW4gZW5hYmxlZCwgZW1pdCkgdGhlIGNvbnRpbnVvdXMtbG9nZ2luZyBhcmd1bWVudHMgdGhpcyBqb2IgbWFuYWdlcy5cbiAgICpcbiAgICogQWxsIGZpdmUgY29udGludW91cy1sb2dnaW5nIGtleXMgYXJlIHJlc2VydmVkIG9uIGV2ZXJ5IGpvYiB0eXBlIHJlZ2FyZGxlc3Mgb2YgY29uZmlndXJhdGlvbjpcbiAgICogdGhleSBhcmUgYWx3YXlzIHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgc2V0TWFuYWdlZEFyZ3VtZW50fSwgYW5kIGNhcnJ5IGEgdmFsdWUgb25seSB3aGVuXG4gICAqIGxvZ2dpbmcgaXMgZW5hYmxlZC4gVGhpcyBrZWVwcyBgZGVmYXVsdEFyZ3VtZW50c2AgZnJvbSByZS1lbmFibGluZyBsb2dnaW5nIGEgdXNlciB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgSUFNIHJvbGUgdG8gZ3JhbnQgd3JpdGUgYWNjZXNzIHRvIGEgY3VzdG9tIGxvZyBncm91cCwgaWYgb25lIGlzIHByb3ZpZGVkXG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgY29udGludW91cyBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHNlY3VyaXR5Q29uZmlndXJhdGlvbiBUaGUgc2VjdXJpdHkgY29uZmlndXJhdGlvbiBhdHRhY2hlZCB0byB0aGUgam9iLCBpZiBhbnlcbiAgICovXG4gIHByb3RlY3RlZCBzZXR1cENvbnRpbnVvdXNMb2dnaW5nKHJvbGU6IGlhbS5JUm9sZSwgcHJvcHM6IENvbnRpbnVvdXNMb2dnaW5nUHJvcHMgfCB1bmRlZmluZWQsIHNlY3VyaXR5Q29uZmlndXJhdGlvbj86IElTZWN1cml0eUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICAvLyBDb250aW51b3VzIGxvZ2dpbmcgaXMgb24gdW5sZXNzIHRoZSBkZXZlbG9wZXIgaGFzIGV4cGxpY2l0bHkgZGlzYWJsZWQgaXQuXG4gICAgY29uc3QgZW5hYmxlZCA9ICEocHJvcHMgJiYgIXByb3BzLmVuYWJsZWQpO1xuXG4gICAgLy8gV2hlbiBsb2dnaW5nIGlzIG9uLCB0aGUgbG9ncyBhcmUgd3JpdHRlbiB0byBhbiB1bmVuY3J5cHRlZCBDbG91ZFdhdGNoIGxvZyBncm91cCB1bmxlc3MgYVxuICAgIC8vIFNlY3VyaXR5Q29uZmlndXJhdGlvbiBpcyBhdHRhY2hlZC4gV2UgY2Fubm90IGludHJvc3BlY3Qgd2hldGhlciB0aGUgYXR0YWNoZWRcbiAgICAvLyBTZWN1cml0eUNvbmZpZ3VyYXRpb24gYWN0dWFsbHkgY29uZmlndXJlcyBjbG91ZFdhdGNoRW5jcnlwdGlvbiAodGhlIElTZWN1cml0eUNvbmZpZ3VyYXRpb25cbiAgICAvLyBpbnRlcmZhY2Ugb25seSBleHBvc2VzIHRoZSBuYW1lKSwgc28gd2Ugb25seSB3YXJuIHdoZW4gbm9uZSBpcyBhdHRhY2hlZCBhdCBhbGwgdG8gYXZvaWRcbiAgICAvLyBmYWxzZSBwb3NpdGl2ZXMuXG4gICAgaWYgKGVuYWJsZWQgJiYgIXNlY3VyaXR5Q29uZmlndXJhdGlvbikge1xuICAgICAgY2RrLkFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOnVuZW5jcnlwdGVkQ29udGludW91c0xvZ2dpbmcnLFxuICAgICAgICAnQ29udGludW91cyBDbG91ZFdhdGNoIGxvZ2dpbmcgaXMgZW5hYmxlZCBidXQgbm8gU2VjdXJpdHlDb25maWd1cmF0aW9uIHdpdGggY2xvdWRXYXRjaEVuY3J5cHRpb24gaXMgYXR0YWNoZWQuIEpvYiBzdGRvdXQgYW5kIHN0ZGVyciB3aWxsIGJlIHdyaXR0ZW4gdG8gYW4gdW5lbmNyeXB0ZWQgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvZW5jcnlwdGlvbi1zZWN1cml0eS1jb25maWd1cmF0aW9uLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBIGN1c3RvbSBsb2cgZ3JvdXAgaXMgb25seSB3aXJlZCB1cCAoYW5kIG9ubHkgZ3JhbnRlZCB3cml0ZSkgd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQuXG4gICAgY29uc3QgbG9nR3JvdXAgPSBlbmFibGVkID8gcHJvcHM/LmxvZ0dyb3VwIDogdW5kZWZpbmVkO1xuICAgIGxvZ0dyb3VwPy5ncmFudFdyaXRlKHJvbGUpO1xuXG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoJy0tZW5hYmxlLWNvbnRpbnVvdXMtY2xvdWR3YXRjaC1sb2cnLCBlbmFibGVkID8gJ3RydWUnIDogdW5kZWZpbmVkKTtcbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudCgnLS1lbmFibGUtY29udGludW91cy1sb2ctZmlsdGVyJywgZW5hYmxlZCAmJiBwcm9wcz8ucXVpZXQgPyAndHJ1ZScgOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuc2V0TWFuYWdlZEFyZ3VtZW50KCctLWNvbnRpbnVvdXMtbG9nLWxvZ0dyb3VwJywgbG9nR3JvdXA/LmxvZ0dyb3VwTmFtZSk7XG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoJy0tY29udGludW91cy1sb2ctbG9nU3RyZWFtUHJlZml4JywgZW5hYmxlZCA/IHByb3BzPy5sb2dTdHJlYW1QcmVmaXggOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuc2V0TWFuYWdlZEFyZ3VtZW50KCctLWNvbnRpbnVvdXMtbG9nLWNvbnZlcnNpb25QYXR0ZXJuJywgZW5hYmxlZCA/IHByb3BzPy5jb252ZXJzaW9uUGF0dGVybiA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29kZVMzT2JqZWN0VXJsKGNvZGU6IENvZGUpIHtcbiAgICBjb25zdCBzM0xvY2F0aW9uID0gY29kZS5iaW5kKHRoaXMsIHRoaXMucm9sZSkuczNMb2NhdGlvbjtcbiAgICByZXR1cm4gYHMzOi8vJHtzM0xvY2F0aW9uLmJ1Y2tldE5hbWV9LyR7czNMb2NhdGlvbi5vYmplY3RLZXl9YDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggTWV0cmljIHRoYXQncyBiYXNlZCBvbiBHbHVlIEpvYiBldmVudHNcbiAqIHtAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXN9XG4gKiBUaGUgbWV0cmljIGhhcyBuYW1lc3BhY2UgPSAnQVdTL0V2ZW50cycsIG1ldHJpY05hbWUgPSAnVHJpZ2dlcmVkUnVsZXMnIGFuZCBSdWxlTmFtZSA9IHJ1bGUucnVsZU5hbWUgZGltZW5zaW9uLlxuICpcbiAqIEBwYXJhbSBydWxlIGZvciB1c2UgaW4gc2V0dGluZyBSdWxlTmFtZSBkaW1lbnNpb24gdmFsdWVcbiAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXRyaWNSdWxlKHJ1bGU6IGV2ZW50cy5JUnVsZSwgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgIG5hbWVzcGFjZTogJ0FXUy9FdmVudHMnLFxuICAgIG1ldHJpY05hbWU6ICdUcmlnZ2VyZWRSdWxlcycsXG4gICAgZGltZW5zaW9uc01hcDogeyBSdWxlTmFtZTogcnVsZS5ydWxlTmFtZSB9LFxuICAgIHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5TVU0sXG4gICAgLi4ucHJvcHMsXG4gIH0pLmF0dGFjaFRvKHJ1bGUpO1xufVxuXG4iXX0=
@@ -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
  }
@@ -78,7 +78,7 @@ let PySparkEtlJob = (() => {
78
78
  PySparkEtlJob = _classThis = _classDescriptor.value;
79
79
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
80
80
  }
81
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkEtlJob", version: "2.268.0-alpha.0" };
81
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkEtlJob", version: "2.269.0-alpha.0" };
82
82
  /** Uniquely identifies this class. */
83
83
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.PySparkEtlJob';
84
84
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -98,11 +98,10 @@ let PySparkEtlJob = (() => {
98
98
  }
99
99
  // Enhanced CDK Analytics Telemetry
100
100
  (0, metadata_resource_1.addConstructMetadata)(this, props);
101
- // Combine command line arguments into a single line item
102
- const defaultArguments = {
103
- ...this.executableArguments(props),
104
- ...this.nonExecutableCommonArguments(props),
105
- };
101
+ // Register the construct-managed arguments, then merge in the user's escape-hatch arguments.
102
+ this.executableArguments(props);
103
+ this.nonExecutableCommonArguments(props);
104
+ const defaultArguments = this.mergeDefaultArguments(props.defaultArguments);
106
105
  if (props.jobRunQueuingEnabled === true && props.maxRetries !== undefined && props.maxRetries > 0) {
107
106
  core_1.Annotations.of(this).addWarningV2((0, helpers_internal_1.lit) `GlueMaxRetriesQueuingEnabled`, `maxRetries was set to ${props.maxRetries}. Overriding it to 0 with since job run queuing is enabled (service constraint)`);
108
107
  }
@@ -136,15 +135,11 @@ let PySparkEtlJob = (() => {
136
135
  return this.getResourceNameAttribute(this.resource.ref);
137
136
  }
138
137
  /**
139
- * Set the executable arguments with best practices enabled by default
140
- *
141
- * @returns An array of arguments for Glue to use on execution
138
+ * Register the executable arguments with best practices enabled by default.
142
139
  */
143
140
  executableArguments(props) {
144
- const args = {};
145
- args['--job-language'] = constants_1.JobLanguage.PYTHON;
146
- this.setupExtraCodeArguments(args, props);
147
- return args;
141
+ this.setManagedArgument('--job-language', constants_1.JobLanguage.PYTHON);
142
+ this.setupExtraCodeArguments(props);
148
143
  }
149
144
  static {
150
145
  __runInitializers(_classThis, _classExtraInitializers);
@@ -153,4 +148,4 @@ let PySparkEtlJob = (() => {
153
148
  return PySparkEtlJob = _classThis;
154
149
  })();
155
150
  exports.PySparkEtlJob = PySparkEtlJob;
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlzcGFyay1ldGwtam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHlzcGFyay1ldGwtam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUE4QztBQUU5QywyQ0FBK0M7QUFDL0MsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFHMUUsNENBQTRGO0FBRTVGLDJDQUF1QztBQTJEdkM7Ozs7Ozs7Ozs7OztHQVlHO0lBRVUsYUFBYTs0QkFEekIsb0NBQWtCOzs7O3NCQUNnQixvQkFBUTs7Ozs2QkFBaEIsU0FBUSxXQUFROzs7O3NDQWdEeEMsaUNBQWM7dUNBS2QsaUNBQWM7WUFKZix5S0FBVyxNQUFNLDZEQUVoQjtZQUdELDRLQUFXLE9BQU8sNkRBRWpCO1lBeERILDZLQXFFQzs7Ozs7UUFwRUMsc0NBQXNDO1FBQy9CLE1BQU0sQ0FBVSxxQkFBcUIsR0FBVyx1Q0FBdUMsQ0FBQztRQUN2RixRQUFRLEdBSEwsbURBQWEsQ0FHQztRQUV6Qjs7V0FFRztRQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7WUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Ozs7OzttREFUZixhQUFhOzs7O1lBVXRCLG1DQUFtQztZQUNuQyxJQUFBLHdDQUFvQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsQyx5REFBeUQ7WUFDekQsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUM7YUFDNUMsQ0FBQztZQUVGLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxH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Zm5Kb2IgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBsaXQsIG1lbW9pemVkR2V0dGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlIH0gZnJvbSAnLi4vY29kZSc7XG5pbXBvcnQgeyBKb2JUeXBlLCBHbHVlVmVyc2lvbiwgSm9iTGFuZ3VhZ2UsIFB5dGhvblZlcnNpb24sIFdvcmtlclR5cGUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBTcGFya0pvYlByb3BzIH0gZnJvbSAnLi9zcGFyay1qb2InO1xuaW1wb3J0IHsgU3BhcmtKb2IgfSBmcm9tICcuL3NwYXJrLWpvYic7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBQeXRob24gU3BhcmsgRVRMIGpvYlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB5U3BhcmtFdGxKb2JQcm9wcyBleHRlbmRzIFNwYXJrSm9iUHJvcHMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiBhIG5vdGlmaWNhdGlvbiAob3B0aW9uYWwpLlxuICAgKiBBZnRlciBhIGpvYiBydW4gc3RhcnRzLCB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyBhIGpvYiBydW4gZGVsYXkgbm90aWZpY2F0aW9uLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZ5RGVsYXlBZnRlcj86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogRXh0cmEgUHl0aG9uIEZpbGVzIFMzIFVSTCAob3B0aW9uYWwpXG4gICAqIFMzIFVSTCB3aGVyZSBhZGRpdGlvbmFsIHB5dGhvbiBkZXBlbmRlbmNpZXMgYXJlIGxvY2F0ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFQeXRob25GaWxlcz86IENvZGVbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBmaWxlcywgc3VjaCBhcyBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgQVdTIEdsdWUgY29waWVzIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB5b3VyIHNjcmlwdCBiZWZvcmUgZXhlY3V0aW5nIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGZpbGVzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhRmlsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIEV4dHJhIEphcnMgUzMgVVJMIChvcHRpb25hbClcbiAgICogUzMgVVJMIHdoZXJlIGFkZGl0aW9uYWwgamFyIGRlcGVuZGVuY2llcyBhcmUgbG9jYXRlZFxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGphciBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFKYXJzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSBwcmlvcml0aXplcyB0aGUgY3VzdG9tZXIncyBleHRyYSBKQVIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBwcmlvcml0eSBpcyBub3QgZ2l2ZW4gdG8gdXNlci1wcm92aWRlZCBqYXJzXG4gICAqXG4gICAqIEBzZWUgYC0tdXNlci1qYXJzLWZpcnN0YCBpbiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFyc0ZpcnN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucyBmb3IgdGhpcyBqb2IuXG4gICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGpvYiBydW5zLlxuICAgKiBJZiBmYWxzZSBvciBub3QgcG9wdWxhdGVkLCB0aGUgam9iIHJ1bnMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBmb3IgcXVldWVpbmcuXG4gICAqIElmIHRoaXMgZmllbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIHNldCBpbiB0aGUgam9iIHJ1biwgdGhlbiB0aGUgdmFsdWUgZnJvbVxuICAgKiB0aGUgam9iIHJ1biBmaWVsZCB3aWxsIGJlIHVzZWQuIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gZmFsc2UgZm9yIGZsZXggam9icy5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBlbmFibGVkLCBtYXhSZXRyaWVzIG11c3QgYmUgc2V0IHRvIHplcm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBqb2JSdW5RdWV1aW5nRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHlTcGFyayBFVEwgSm9icyBjbGFzc1xuICpcbiAqIEVUTCBqb2JzIHN1cHBvcnQgcHlTcGFyayBhbmQgU2NhbGEgbGFuZ3VhZ2VzLCBmb3Igd2hpY2ggdGhlcmUgYXJlIHNlcGFyYXRlXG4gKiBidXQgc2ltaWxhciBjb25zdHJ1Y3RvcnMuIEVUTCBqb2JzIGRlZmF1bHQgdG8gdGhlIEcxIHdvcmtlciB0eXBlLCBidXQgeW91XG4gKiBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggb3RoZXIgc3VwcG9ydGVkIHdvcmtlciB0eXBlIHZhbHVlc1xuICogKEcxLCBHMiwgRzQgYW5kIEc4KS4gRVRMIGpvYnMgZGVmYXVsdHMgdG8gR2x1ZSB2ZXJzaW9uIDQuMCwgd2hpY2ggeW91IGNhblxuICogb3ZlcnJpZGUgdG8gMy4wLiBUaGUgZm9sbG93aW5nIEVUTCBmZWF0dXJlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0OlxuICogLS1lbmFibGUtbWV0cmljcywgLS1lbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZy4gVGhlIFNwYXJrIFVJXG4gKiAoLS1lbmFibGUtc3BhcmstdWkpIGlzIG9mZiBieSBkZWZhdWx0OyBlbmFibGUgaXQgYnkgc2V0dGluZyB0aGUgYHNwYXJrVUlgIHByb3AuXG4gKiBZb3UgY2FuIGZpbmQgbW9yZSBkZXRhaWxzIGFib3V0IHZlcnNpb24sIHdvcmtlciB0eXBlIGFuZCBvdGhlciBmZWF0dXJlc1xuICogaW4gR2x1ZSdzIHB1YmxpYyBkb2N1bWVudGF0aW9uLlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUHlTcGFya0V0bEpvYiBleHRlbmRzIFNwYXJrSm9iIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZ2x1ZS1hbHBoYS5QeVNwYXJrRXRsSm9iJztcbiAgcHJpdmF0ZSByZXNvdXJjZTogQ2ZuSm9iO1xuXG4gIC8qKlxuICAgKiBQeVNwYXJrRXRsSm9iIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUHlTcGFya0V0bEpvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyBDb21iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4udGhpcy5leGVjdXRhYmxlQXJndW1lbnRzKHByb3BzKSxcbiAgICAgIC4uLnRoaXMubm9uRXhlY3V0YWJsZUNvbW1vbkFyZ3VtZW50cyhwcm9wcyksXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA9PT0gdHJ1ZSAmJiBwcm9wcy5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiYgcHJvcHMubWF4UmV0cmllcyA+IDApIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihsaXRgR2x1ZU1heFJldHJpZXNRdWV1aW5nRW5hYmxlZGAsXG4gICAgICAgIGBtYXhSZXRyaWVzIHdhcyBzZXQgdG8gJHtwcm9wcy5tYXhSZXRyaWVzfS4gT3ZlcnJpZGluZyBpdCB0byAwIHdpdGggc2luY2Ugam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgKHNlcnZpY2UgY29uc3RyYWludClgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkpvYih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBjb21tYW5kOiB7XG4gICAgICAgIG5hbWU6IEpvYlR5cGUuRVRMLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogdGhpcy5jb2RlUzNPYmplY3RVcmwocHJvcHMuc2NyaXB0KSxcbiAgICAgICAgcHl0aG9uVmVyc2lvbjogUHl0aG9uVmVyc2lvbi5USFJFRSxcbiAgICAgIH0sXG4gICAgICBnbHVlVmVyc2lvbjogcHJvcHMuZ2x1ZVZlcnNpb24gPz8gR2x1ZVZlcnNpb24uVjRfMCxcbiAgICAgIHdvcmtlclR5cGU6IHByb3BzLndvcmtlckNvbmZpZ3VyYXRpb24/LndvcmtlclR5cGUgPz8gV29ya2VyVHlwZS5HXzFYLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiBwcm9wcy53b3JrZXJDb25maWd1cmF0aW9uPy5udW1iZXJPZldvcmtlcnMgPz8gMTAsXG4gICAgICBtYXhSZXRyaWVzOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IDAgOiBwcm9wcy5tYXhSZXRyaWVzLFxuICAgICAgam9iUnVuUXVldWluZ0VuYWJsZWQ6IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID8gcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgOiBmYWxzZSxcbiAgICAgIG5vdGlmaWNhdGlvblByb3BlcnR5OiBwcm9wcy5ub3RpZnlEZWxheUFmdGVyID8geyBub3RpZnlEZWxheUFmdGVyOiBwcm9wcy5ub3RpZnlEZWxheUFmdGVyLnRvTWludXRlcygpIH0gOiB1bmRlZmluZWQsXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogcHJvcHMubWF4Q29uY3VycmVudFJ1bnMgPyB7IG1heENvbmN1cnJlbnRSdW5zOiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyB9IDogdW5kZWZpbmVkLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dD8udG9NaW51dGVzKCksXG4gICAgICBjb25uZWN0aW9uczogcHJvcHMuY29ubmVjdGlvbnMgPyB7IGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24pID0+IGNvbm5lY3Rpb24uY29ubmVjdGlvbk5hbWUpIH0gOiB1bmRlZmluZWQsXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IHByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbj8uc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgam9iQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRKb2JBcm4odGhpcywgdGhpcy5qb2JOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IGpvYk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUodGhpcy5yZXNvdXJjZS5yZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZXhlY3V0YWJsZSBhcmd1bWVudHMgd2l0aCBiZXN0IHByYWN0aWNlcyBlbmFibGVkIGJ5IGRlZmF1bHRcbiAgICpcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJndW1lbnRzIGZvciBHbHVlIHRvIHVzZSBvbiBleGVjdXRpb25cbiAgICovXG4gIHByaXZhdGUgZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wczogUHlTcGFya0V0bEpvYlByb3BzKSB7XG4gICAgY29uc3QgYXJnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGFyZ3NbJy0tam9iLWxhbmd1YWdlJ10gPSBKb2JMYW5ndWFnZS5QWVRIT047XG4gICAgdGhpcy5zZXR1cEV4dHJhQ29kZUFyZ3VtZW50cyhhcmdzLCBwcm9wcyk7XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cbn1cbiJdfQ==
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlzcGFyay1ldGwtam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHlzcGFyay1ldGwtam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUE4QztBQUU5QywyQ0FBK0M7QUFDL0MsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFHMUUsNENBQTRGO0FBRTVGLDJDQUF1QztBQTJEdkM7Ozs7Ozs7Ozs7OztHQVlHO0lBRVUsYUFBYTs0QkFEekIsb0NBQWtCOzs7O3NCQUNnQixvQkFBUTs7Ozs2QkFBaEIsU0FBUSxXQUFROzs7O3NDQStDeEMsaUNBQWM7dUNBS2QsaUNBQWM7WUFKZix5S0FBVyxNQUFNLDZEQUVoQjtZQUdELDRLQUFXLE9BQU8sNkRBRWpCO1lBdkRILDZLQWdFQzs7Ozs7UUEvREMsc0NBQXNDO1FBQy9CLE1BQU0sQ0FBVSxxQkFBcUIsR0FBVyx1Q0FBdUMsQ0FBQztRQUN2RixRQUFRLEdBSEwsbURBQWEsQ0FHQztRQUV6Qjs7V0FFRztRQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7WUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Ozs7OzttREFUZixhQUFhOzs7O1lBVXRCLG1DQUFtQztZQUNuQyxJQUFBLHdDQUFvQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsQyw2RkFBNkY7WUFDN0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUU1RSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFD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d3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBsaXQsIG1lbW9pemVkR2V0dGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlIH0gZnJvbSAnLi4vY29kZSc7XG5pbXBvcnQgeyBKb2JUeXBlLCBHbHVlVmVyc2lvbiwgSm9iTGFuZ3VhZ2UsIFB5dGhvblZlcnNpb24sIFdvcmtlclR5cGUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBTcGFya0pvYlByb3BzIH0gZnJvbSAnLi9zcGFyay1qb2InO1xuaW1wb3J0IHsgU3BhcmtKb2IgfSBmcm9tICcuL3NwYXJrLWpvYic7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBQeXRob24gU3BhcmsgRVRMIGpvYlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB5U3BhcmtFdGxKb2JQcm9wcyBleHRlbmRzIFNwYXJrSm9iUHJvcHMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiBhIG5vdGlmaWNhdGlvbiAob3B0aW9uYWwpLlxuICAgKiBBZnRlciBhIGpvYiBydW4gc3RhcnRzLCB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyBhIGpvYiBydW4gZGVsYXkgbm90aWZpY2F0aW9uLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZ5RGVsYXlBZnRlcj86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogRXh0cmEgUHl0aG9uIEZpbGVzIFMzIFVSTCAob3B0aW9uYWwpXG4gICAqIFMzIFVSTCB3aGVyZSBhZGRpdGlvbmFsIHB5dGhvbiBkZXBlbmRlbmNpZXMgYXJlIGxvY2F0ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFQeXRob25GaWxlcz86IENvZGVbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBmaWxlcywgc3VjaCBhcyBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgQVdTIEdsdWUgY29waWVzIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB5b3VyIHNjcmlwdCBiZWZvcmUgZXhlY3V0aW5nIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGZpbGVzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhRmlsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIEV4dHJhIEphcnMgUzMgVVJMIChvcHRpb25hbClcbiAgICogUzMgVVJMIHdoZXJlIGFkZGl0aW9uYWwgamFyIGRlcGVuZGVuY2llcyBhcmUgbG9jYXRlZFxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGphciBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFKYXJzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSBwcmlvcml0aXplcyB0aGUgY3VzdG9tZXIncyBleHRyYSBKQVIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBwcmlvcml0eSBpcyBub3QgZ2l2ZW4gdG8gdXNlci1wcm92aWRlZCBqYXJzXG4gICAqXG4gICAqIEBzZWUgYC0tdXNlci1qYXJzLWZpcnN0YCBpbiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFyc0ZpcnN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucyBmb3IgdGhpcyBqb2IuXG4gICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGpvYiBydW5zLlxuICAgKiBJZiBmYWxzZSBvciBub3QgcG9wdWxhdGVkLCB0aGUgam9iIHJ1bnMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBmb3IgcXVldWVpbmcuXG4gICAqIElmIHRoaXMgZmllbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIHNldCBpbiB0aGUgam9iIHJ1biwgdGhlbiB0aGUgdmFsdWUgZnJvbVxuICAgKiB0aGUgam9iIHJ1biBmaWVsZCB3aWxsIGJlIHVzZWQuIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gZmFsc2UgZm9yIGZsZXggam9icy5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBlbmFibGVkLCBtYXhSZXRyaWVzIG11c3QgYmUgc2V0IHRvIHplcm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBqb2JSdW5RdWV1aW5nRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHlTcGFyayBFVEwgSm9icyBjbGFzc1xuICpcbiAqIEVUTCBqb2JzIHN1cHBvcnQgcHlTcGFyayBhbmQgU2NhbGEgbGFuZ3VhZ2VzLCBmb3Igd2hpY2ggdGhlcmUgYXJlIHNlcGFyYXRlXG4gKiBidXQgc2ltaWxhciBjb25zdHJ1Y3RvcnMuIEVUTCBqb2JzIGRlZmF1bHQgdG8gdGhlIEcxIHdvcmtlciB0eXBlLCBidXQgeW91XG4gKiBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggb3RoZXIgc3VwcG9ydGVkIHdvcmtlciB0eXBlIHZhbHVlc1xuICogKEcxLCBHMiwgRzQgYW5kIEc4KS4gRVRMIGpvYnMgZGVmYXVsdHMgdG8gR2x1ZSB2ZXJzaW9uIDQuMCwgd2hpY2ggeW91IGNhblxuICogb3ZlcnJpZGUgdG8gMy4wLiBUaGUgZm9sbG93aW5nIEVUTCBmZWF0dXJlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0OlxuICogLS1lbmFibGUtbWV0cmljcywgLS1lbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZy4gVGhlIFNwYXJrIFVJXG4gKiAoLS1lbmFibGUtc3BhcmstdWkpIGlzIG9mZiBieSBkZWZhdWx0OyBlbmFibGUgaXQgYnkgc2V0dGluZyB0aGUgYHNwYXJrVUlgIHByb3AuXG4gKiBZb3UgY2FuIGZpbmQgbW9yZSBkZXRhaWxzIGFib3V0IHZlcnNpb24sIHdvcmtlciB0eXBlIGFuZCBvdGhlciBmZWF0dXJlc1xuICogaW4gR2x1ZSdzIHB1YmxpYyBkb2N1bWVudGF0aW9uLlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUHlTcGFya0V0bEpvYiBleHRlbmRzIFNwYXJrSm9iIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZ2x1ZS1hbHBoYS5QeVNwYXJrRXRsSm9iJztcbiAgcHJpdmF0ZSByZXNvdXJjZTogQ2ZuSm9iO1xuXG4gIC8qKlxuICAgKiBQeVNwYXJrRXRsSm9iIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUHlTcGFya0V0bEpvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgY29uc3RydWN0LW1hbmFnZWQgYXJndW1lbnRzLCB0aGVuIG1lcmdlIGluIHRoZSB1c2VyJ3MgZXNjYXBlLWhhdGNoIGFyZ3VtZW50cy5cbiAgICB0aGlzLmV4ZWN1dGFibGVBcmd1bWVudHMocHJvcHMpO1xuICAgIHRoaXMubm9uRXhlY3V0YWJsZUNvbW1vbkFyZ3VtZW50cyhwcm9wcyk7XG4gICAgY29uc3QgZGVmYXVsdEFyZ3VtZW50cyA9IHRoaXMubWVyZ2VEZWZhdWx0QXJndW1lbnRzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpO1xuXG4gICAgaWYgKHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID09PSB0cnVlICYmIHByb3BzLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5tYXhSZXRyaWVzID4gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKGxpdGBHbHVlTWF4UmV0cmllc1F1ZXVpbmdFbmFibGVkYCxcbiAgICAgICAgYG1heFJldHJpZXMgd2FzIHNldCB0byAke3Byb3BzLm1heFJldHJpZXN9LiBPdmVycmlkaW5nIGl0IHRvIDAgd2l0aCBzaW5jZSBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCAoc2VydmljZSBjb25zdHJhaW50KWApO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuSm9iKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHByb3BzLmpvYk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICByb2xlOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgbmFtZTogSm9iVHlwZS5FVEwsXG4gICAgICAgIHNjcmlwdExvY2F0aW9uOiB0aGlzLmNvZGVTM09iamVjdFVybChwcm9wcy5zY3JpcHQpLFxuICAgICAgICBweXRob25WZXJzaW9uOiBQeXRob25WZXJzaW9uLlRIUkVFLFxuICAgICAgfSxcbiAgICAgIGdsdWVWZXJzaW9uOiBwcm9wcy5nbHVlVmVyc2lvbiA/PyBHbHVlVmVyc2lvbi5WNF8wLFxuICAgICAgd29ya2VyVHlwZTogcHJvcHMud29ya2VyQ29uZmlndXJhdGlvbj8ud29ya2VyVHlwZSA/PyBXb3JrZXJUeXBlLkdfMVgsXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHByb3BzLndvcmtlckNvbmZpZ3VyYXRpb24/Lm51bWJlck9mV29ya2VycyA/PyAxMCxcbiAgICAgIG1heFJldHJpZXM6IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID8gMCA6IHByb3BzLm1heFJldHJpZXMsXG4gICAgICBqb2JSdW5RdWV1aW5nRW5hYmxlZDogcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgPyBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA6IGZhbHNlLFxuICAgICAgbm90aWZpY2F0aW9uUHJvcGVydHk6IHByb3BzLm5vdGlmeURlbGF5QWZ0ZXIgPyB7IG5vdGlmeURlbGF5QWZ0ZXI6IHByb3BzLm5vdGlmeURlbGF5QWZ0ZXIudG9NaW51dGVzKCkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyA/IHsgbWF4Q29uY3VycmVudFJ1bnM6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zIH0gOiB1bmRlZmluZWQsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Py50b01pbnV0ZXMoKSxcbiAgICAgIGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucyA/IHsgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5jb25uZWN0aW9uTmFtZSkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uPy5zZWN1cml0eUNvbmZpZ3VyYXRpb25OYW1lLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgfSk7XG4gIH1cblxuICBAbWVtb2l6ZWRHZXR0ZXJcbiAgcHVibGljIGdldCBqb2JBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZEpvYkFybih0aGlzLCB0aGlzLmpvYk5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgam9iTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZSh0aGlzLnJlc291cmNlLnJlZik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGV4ZWN1dGFibGUgYXJndW1lbnRzIHdpdGggYmVzdCBwcmFjdGljZXMgZW5hYmxlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRhYmxlQXJndW1lbnRzKHByb3BzOiBQeVNwYXJrRXRsSm9iUHJvcHMpOiB2b2lkIHtcbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudCgnLS1qb2ItbGFuZ3VhZ2UnLCBKb2JMYW5ndWFnZS5QWVRIT04pO1xuICAgIHRoaXMuc2V0dXBFeHRyYUNvZGVBcmd1bWVudHMocHJvcHMpO1xuICB9XG59XG4iXX0=