@decaf-ts/core 0.5.25 → 0.5.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.esm.cjs CHANGED
@@ -1,9 +1,10 @@
1
1
  import { InjectableRegistryImp, Injectables, inject, injectable } from '@decaf-ts/injectable-decorators';
2
2
  import { __decorate, __metadata } from 'tslib';
3
- import { BadRequestError, InternalError, Repository as Repository$1, Context, DefaultRepositoryFlags, OperationKeys, modelToTransient, DBKeys, wrapMethodWithContext, enforceDBDecorators, ValidationError, findPrimaryKey, DefaultSeparator, BulkCrudOperationKeys, NotFoundError, timestamp, ConflictError, onCreateUpdate, onCreate, onUpdate, onDelete, afterAny, readonly } from '@decaf-ts/db-decorators';
4
- import { Model, Decoration, DefaultFlavour, hashObj, sf, ModelKeys, required, Validation, ValidationKeys, propMetadata, prop, type, list } from '@decaf-ts/decorator-validation';
3
+ import { BadRequestError, InternalError, Repository as Repository$1, Context, DefaultRepositoryFlags, OperationKeys, modelToTransient, DBKeys, wrapMethodWithContext, enforceDBDecorators, ValidationError, findPrimaryKey, DefaultSeparator, BulkCrudOperationKeys, NotFoundError, timestamp, ConflictError, onCreateUpdate, onCreate, onUpdate, onDelete, afterAny, readonly, BaseError } from '@decaf-ts/db-decorators';
4
+ import { Model, Decoration, DefaultFlavour, hashObj, sf, ModelKeys, required, Validation, ValidationKeys, propMetadata, prop, type, list, model } from '@decaf-ts/decorator-validation';
5
5
  import { LoggedClass, Logging } from '@decaf-ts/logging';
6
6
  import { apply, metadata, Reflection } from '@decaf-ts/reflection';
7
+ import { Lock } from '@decaf-ts/transactional-decorators';
7
8
 
8
9
  /**
9
10
  * @description Persistence-related constant keys
@@ -4316,6 +4317,953 @@ __decorate([
4316
4317
  __metadata("design:returntype", Promise)
4317
4318
  ], Statement.prototype, "execute", null);
4318
4319
 
4320
+ /**
4321
+ * @description RAM-specific paginator implementation
4322
+ * @summary Extends the base Paginator class to provide pagination functionality for RAM adapter queries.
4323
+ * This class handles the pagination of query results from the in-memory storage, allowing
4324
+ * for efficient retrieval of large result sets in smaller chunks.
4325
+ * @template M - The model type being paginated
4326
+ * @template R - The result type returned by the paginator
4327
+ * @class RamPaginator
4328
+ * @category Ram
4329
+ * @example
4330
+ * ```typescript
4331
+ * // Create a query for User model
4332
+ * const query: RawRamQuery<User> = {
4333
+ * select: undefined, // Select all fields
4334
+ * from: User,
4335
+ * where: (user) => user.active === true
4336
+ * };
4337
+ *
4338
+ * // Create a paginator with page size of 10
4339
+ * const paginator = new RamPaginator<User, User>(adapter, query, 10, User);
4340
+ *
4341
+ * // Get the first page of results
4342
+ * const firstPage = await paginator.page(1);
4343
+ *
4344
+ * // Get the next page
4345
+ * const secondPage = await paginator.page(2);
4346
+ * ```
4347
+ */
4348
+ class RamPaginator extends Paginator {
4349
+ constructor(adapter, query, size, clazz) {
4350
+ super(adapter, query, size, clazz);
4351
+ }
4352
+ /**
4353
+ * @description Prepares a RAM query for pagination
4354
+ * @summary Modifies the raw query statement to include pagination parameters.
4355
+ * This protected method sets the limit parameter on the query to match the page size.
4356
+ * @param {RawRamQuery<M>} rawStatement - The original query statement
4357
+ * @return {RawRamQuery<M>} The modified query with pagination parameters
4358
+ */
4359
+ prepare(rawStatement) {
4360
+ const query = Object.assign({}, rawStatement);
4361
+ query.limit = this.size;
4362
+ return query;
4363
+ }
4364
+ /**
4365
+ * @description Retrieves a specific page of results
4366
+ * @summary Executes the query with pagination parameters to retrieve a specific page of results.
4367
+ * This method calculates the appropriate skip value based on the page number and page size,
4368
+ * executes the query, and updates the current page tracking.
4369
+ * @param {number} [page=1] - The page number to retrieve (1-based)
4370
+ * @return {Promise<R[]>} A promise that resolves to an array of results for the requested page
4371
+ */
4372
+ async page(page = 1) {
4373
+ const statement = this.prepare(this.statement);
4374
+ if (!this._recordCount || !this._totalPages) {
4375
+ this._totalPages = this._recordCount = 0;
4376
+ const results = await this.adapter.raw({ ...statement, limit: undefined }) || [];
4377
+ this._recordCount = results.length;
4378
+ if (this._recordCount > 0) {
4379
+ const size = statement?.limit || this.size;
4380
+ this._totalPages = Math.ceil(this._recordCount / size);
4381
+ }
4382
+ }
4383
+ page = this.validatePage(page);
4384
+ statement.skip = (page - 1) * this.size;
4385
+ const results = await this.adapter.raw(statement);
4386
+ this._currentPage = page;
4387
+ return results;
4388
+ }
4389
+ }
4390
+
4391
+ /**
4392
+ * @description RAM-specific query statement builder
4393
+ * @summary Extends the base Statement class to provide query building functionality for the RAM adapter.
4394
+ * This class translates high-level query operations into predicates that can filter and sort
4395
+ * in-memory data structures.
4396
+ * @template M - The model type being queried
4397
+ * @template R - The result type returned by the query
4398
+ * @param {RamAdapter} adapter - The RAM adapter instance to use for executing queries
4399
+ * @class RamStatement
4400
+ * @category Ram
4401
+ * @example
4402
+ * ```typescript
4403
+ * // Create a statement for querying User models
4404
+ * const statement = new RamStatement<User, User>(ramAdapter);
4405
+ *
4406
+ * // Build a query to find active users with age > 18
4407
+ * const results = await statement
4408
+ * .from(User)
4409
+ * .where(Condition.and(
4410
+ * Condition.eq('active', true),
4411
+ * Condition.gt('age', 18)
4412
+ * ))
4413
+ * .orderBy('lastName', 'asc')
4414
+ * .limit(10)
4415
+ * .execute();
4416
+ * ```
4417
+ */
4418
+ class RamStatement extends Statement {
4419
+ constructor(adapter) {
4420
+ super(adapter);
4421
+ }
4422
+ /**
4423
+ * @description Creates a sort comparator function
4424
+ * @summary Generates a function that compares two model instances based on the orderBy criteria.
4425
+ * This method handles different data types (string, number, date) and sort directions (asc, desc).
4426
+ * @return {function(Model, Model): number} A comparator function for sorting model instances
4427
+ */
4428
+ getSort() {
4429
+ return (el1, el2) => {
4430
+ if (!this.orderBySelector)
4431
+ throw new InternalError("orderBySelector not set. Should be impossible");
4432
+ const selector = this.orderBySelector;
4433
+ const [key, direction] = selector;
4434
+ const type = Reflection.getTypeFromDecorator(el1, key);
4435
+ if (!type)
4436
+ throw new QueryError(`type not compatible with sorting: ${type}`);
4437
+ switch (type) {
4438
+ case "string":
4439
+ case "String":
4440
+ return ((direction === "asc" ? 1 : -1) *
4441
+ el1[key].localeCompare(el2[key]));
4442
+ case "number":
4443
+ case "Number":
4444
+ return ((direction === "asc" ? 1 : -1) *
4445
+ (el1[key] -
4446
+ el2[key]));
4447
+ case "object":
4448
+ case "Object":
4449
+ if (el1[key] instanceof Date &&
4450
+ el2[key] instanceof Date)
4451
+ return ((direction === "asc" ? 1 : -1) *
4452
+ (el1[key].valueOf() -
4453
+ el2[key].valueOf()));
4454
+ throw new QueryError(`Sorting not supported for not date classes`);
4455
+ default:
4456
+ throw new QueryError(`sorting not supported for type ${type}`);
4457
+ }
4458
+ };
4459
+ }
4460
+ /**
4461
+ * @description Builds a RAM query from the statement
4462
+ * @summary Converts the statement's selectors and conditions into a RawRamQuery object
4463
+ * that can be executed by the RAM adapter. This method assembles all query components
4464
+ * (select, from, where, limit, offset, sort) into the final query structure.
4465
+ * @return {RawRamQuery<M>} The constructed RAM query object
4466
+ */
4467
+ build() {
4468
+ const result = {
4469
+ select: this.selectSelector,
4470
+ from: this.fromSelector,
4471
+ where: this.whereCondition
4472
+ ? this.parseCondition(this.whereCondition).where
4473
+ : // eslint-disable-next-line @typescript-eslint/no-unused-vars
4474
+ (el) => {
4475
+ return true;
4476
+ },
4477
+ limit: this.limitSelector,
4478
+ skip: this.offsetSelector,
4479
+ };
4480
+ if (this.orderBySelector)
4481
+ result.sort = this.getSort();
4482
+ return result;
4483
+ }
4484
+ /**
4485
+ * @description Creates a paginator for the query
4486
+ * @summary Builds the query and wraps it in a RamPaginator to enable pagination of results.
4487
+ * This allows retrieving large result sets in smaller chunks.
4488
+ * @param {number} size - The page size (number of results per page)
4489
+ * @return {Promise<Paginator<M, R, RawRamQuery<M>>>} A promise that resolves to a paginator for the query
4490
+ */
4491
+ async paginate(size) {
4492
+ try {
4493
+ const query = this.build();
4494
+ return new RamPaginator(this.adapter, query, size, this.fromSelector);
4495
+ }
4496
+ catch (e) {
4497
+ throw new InternalError(e);
4498
+ }
4499
+ }
4500
+ /**
4501
+ * @description Parses a condition into a RAM query predicate
4502
+ * @summary Converts a Condition object into a predicate function that can be used
4503
+ * to filter model instances in memory. This method handles both simple conditions
4504
+ * (equals, greater than, etc.) and complex conditions with logical operators (AND, OR).
4505
+ * @template M - The model type for the condition
4506
+ * @param {Condition<M>} condition - The condition to parse
4507
+ * @return {RawRamQuery<M>} A RAM query object with a where predicate function
4508
+ * @mermaid
4509
+ * sequenceDiagram
4510
+ * participant Caller
4511
+ * participant RamStatement
4512
+ * participant SimpleCondition
4513
+ * participant ComplexCondition
4514
+ *
4515
+ * Caller->>RamStatement: parseCondition(condition)
4516
+ * alt Simple condition (eq, gt, lt, etc.)
4517
+ * RamStatement->>SimpleCondition: Extract attr1, operator, comparison
4518
+ * SimpleCondition-->>RamStatement: Return predicate function
4519
+ * else Logical operator (AND, OR)
4520
+ * RamStatement->>ComplexCondition: Extract nested conditions
4521
+ * RamStatement->>RamStatement: parseCondition(leftCondition)
4522
+ * RamStatement->>RamStatement: parseCondition(rightCondition)
4523
+ * ComplexCondition-->>RamStatement: Combine predicates with logical operator
4524
+ * end
4525
+ * RamStatement-->>Caller: Return query with where predicate
4526
+ */
4527
+ parseCondition(condition) {
4528
+ return {
4529
+ where: (m) => {
4530
+ const { attr1, operator, comparison } = condition;
4531
+ if ([GroupOperator.AND, GroupOperator.OR, Operator.NOT].indexOf(operator) === -1) {
4532
+ switch (operator) {
4533
+ case Operator.BIGGER:
4534
+ return m[attr1] > comparison;
4535
+ case Operator.BIGGER_EQ:
4536
+ return m[attr1] >= comparison;
4537
+ case Operator.DIFFERENT:
4538
+ return m[attr1] !== comparison;
4539
+ case Operator.EQUAL:
4540
+ return m[attr1] === comparison;
4541
+ case Operator.REGEXP:
4542
+ if (typeof m[attr1] !== "string")
4543
+ throw new QueryError(`Invalid regexp comparison on a non string attribute: ${m[attr1]}`);
4544
+ return !!m[attr1].match(new RegExp(comparison, "g"));
4545
+ case Operator.SMALLER:
4546
+ return m[attr1] < comparison;
4547
+ case Operator.SMALLER_EQ:
4548
+ return m[attr1] <= comparison;
4549
+ default:
4550
+ throw new InternalError(`Invalid operator for standard comparisons: ${operator}`);
4551
+ }
4552
+ }
4553
+ else if (operator === Operator.NOT) {
4554
+ throw new InternalError("Not implemented");
4555
+ }
4556
+ else {
4557
+ const op1 = this.parseCondition(attr1);
4558
+ const op2 = this.parseCondition(comparison);
4559
+ switch (operator) {
4560
+ case GroupOperator.AND:
4561
+ return op1.where(m) && op2.where(m);
4562
+ case GroupOperator.OR:
4563
+ return op1.where(m) || op2.where(m);
4564
+ default:
4565
+ throw new InternalError(`Invalid operator for And/Or comparisons: ${operator}`);
4566
+ }
4567
+ }
4568
+ },
4569
+ };
4570
+ }
4571
+ }
4572
+
4573
+ /**
4574
+ * @description Context class for RAM adapter operations
4575
+ * @summary Provides a specialized context for RAM adapter operations, extending the base Context with RAM-specific flags. This context is used to pass operation parameters and user information.
4576
+ * @class RamContext
4577
+ * @category Ram
4578
+ * @example
4579
+ * ```typescript
4580
+ * // Create a new RAM context
4581
+ * const context = new RamContext();
4582
+ * // Optionally set a flag
4583
+ * context.set('UUID', '123e4567-e89b-12d3-a456-426614174000');
4584
+ * // Access a flag from the context
4585
+ * const uuid = context.get('UUID');
4586
+ * ```
4587
+ * @mermaid
4588
+ * sequenceDiagram
4589
+ * participant Caller
4590
+ * participant RamContext
4591
+ * participant BaseContext as Context
4592
+ * Caller->>RamContext: new RamContext()
4593
+ * RamContext->>BaseContext: super()
4594
+ * RamContext-->>Caller: instance
4595
+ */
4596
+ class RamContext extends Context {
4597
+ constructor() {
4598
+ super();
4599
+ }
4600
+ }
4601
+
4602
+ /**
4603
+ * @description RAM sequence model for auto-incrementing values
4604
+ * @summary A model class that represents a sequence in the RAM adapter. It stores the current value
4605
+ * of a sequence that can be used for generating sequential identifiers for entities.
4606
+ * The sequence is identified by its ID and maintains the current value.
4607
+ * @param {ModelArg<Sequence>} seq - Initial sequence data
4608
+ * @class Sequence
4609
+ * @category Ram
4610
+ * @example
4611
+ * ```typescript
4612
+ * // Create a new sequence
4613
+ * const orderSequence = new Sequence({ id: 'order_seq', current: 1 });
4614
+ *
4615
+ * // Use the sequence to get the next value
4616
+ * const nextOrderId = parseInt(orderSequence.current.toString()) + 1;
4617
+ * orderSequence.current = nextOrderId;
4618
+ * ```
4619
+ */
4620
+ let RamSequenceModel = class RamSequenceModel extends BaseModel {
4621
+ constructor(seq) {
4622
+ super(seq);
4623
+ }
4624
+ };
4625
+ __decorate([
4626
+ pk(),
4627
+ __metadata("design:type", String)
4628
+ ], RamSequenceModel.prototype, "id", void 0);
4629
+ __decorate([
4630
+ required(),
4631
+ index(),
4632
+ __metadata("design:type", Object)
4633
+ ], RamSequenceModel.prototype, "current", void 0);
4634
+ RamSequenceModel = __decorate([
4635
+ table("__RamSequence"),
4636
+ model(),
4637
+ __metadata("design:paramtypes", [Object])
4638
+ ], RamSequenceModel);
4639
+
4640
+ /**
4641
+ * @description RAM-specific sequence implementation
4642
+ * @summary Extends the base Sequence class to provide auto-incrementing sequence functionality
4643
+ * for the RAM adapter. This class manages sequences stored in memory, allowing for the generation
4644
+ * of sequential identifiers for entities.
4645
+ * @param {SequenceOptions} options - Configuration options for the sequence
4646
+ * @param {RamAdapter} adapter - The RAM adapter instance to use for storage
4647
+ * @class RamSequence
4648
+ * @category Ram
4649
+ * @example
4650
+ * ```typescript
4651
+ * // Create a new numeric sequence starting at 1
4652
+ * const sequence = new RamSequence({
4653
+ * name: 'order_sequence',
4654
+ * type: 'Number',
4655
+ * startWith: 1,
4656
+ * incrementBy: 1
4657
+ * }, ramAdapter);
4658
+ *
4659
+ * // Get the next value in the sequence
4660
+ * const nextId = await sequence.next();
4661
+ *
4662
+ * // Get a range of values
4663
+ * const idRange = await sequence.range(5); // Returns 5 sequential values
4664
+ * ```
4665
+ */
4666
+ class RamSequence extends Sequence {
4667
+ constructor(options, adapter) {
4668
+ super(options);
4669
+ this.repo = Repository.forModel(RamSequenceModel, adapter.alias);
4670
+ }
4671
+ /**
4672
+ * @description Retrieves the current value of the sequence
4673
+ * @summary Gets the current value of the sequence from storage. If the sequence
4674
+ * doesn't exist yet, it returns the configured starting value.
4675
+ * @return A promise that resolves to the current sequence value
4676
+ */
4677
+ async current() {
4678
+ const { name, startWith } = this.options;
4679
+ try {
4680
+ const sequence = await this.repo.read(name);
4681
+ return this.parse(sequence.current);
4682
+ }
4683
+ catch (e) {
4684
+ if (e instanceof NotFoundError) {
4685
+ if (typeof startWith === "undefined")
4686
+ throw new InternalError("Starting value is not defined for a non existing sequence");
4687
+ try {
4688
+ return this.parse(startWith);
4689
+ }
4690
+ catch (e) {
4691
+ throw new InternalError(`Failed to parse initial value for sequence ${startWith}: ${e}`);
4692
+ }
4693
+ }
4694
+ throw new InternalError(`Failed to retrieve current value for sequence ${name}: ${e}`);
4695
+ }
4696
+ }
4697
+ /**
4698
+ * @description Parses a value according to the sequence type
4699
+ * @summary Converts a value to the appropriate type for the sequence (string, number, or bigint)
4700
+ * using the base Sequence class's parseValue method.
4701
+ * @param {string | number | bigint} value - The value to parse
4702
+ * @return {string | number | bigint} The parsed value in the correct type
4703
+ */
4704
+ parse(value) {
4705
+ return Sequence.parseValue(this.options.type, value);
4706
+ }
4707
+ /**
4708
+ * @description Increments the sequence value
4709
+ * @summary Increases the current sequence value by the specified amount and persists
4710
+ * the new value to storage. This method handles both numeric and BigInt sequence types.
4711
+ * @param {string | number | bigint} current - The current value of the sequence
4712
+ * @param {number} [count] - Optional amount to increment by, defaults to the sequence's incrementBy value
4713
+ * @return A promise that resolves to the new sequence value after incrementing
4714
+ */
4715
+ async increment(current, count) {
4716
+ const { type, incrementBy, name } = this.options;
4717
+ let next;
4718
+ const toIncrementBy = count || incrementBy;
4719
+ if (toIncrementBy % incrementBy !== 0)
4720
+ throw new InternalError(`Value to increment does not consider the incrementBy setting: ${incrementBy}`);
4721
+ switch (type) {
4722
+ case "Number":
4723
+ next = this.parse(current) + toIncrementBy;
4724
+ break;
4725
+ case "BigInt":
4726
+ next = this.parse(current) + BigInt(toIncrementBy);
4727
+ break;
4728
+ default:
4729
+ throw new InternalError("Should never happen");
4730
+ }
4731
+ let seq;
4732
+ const repo = this.repo.override({
4733
+ ignoredValidationProperties: ["updatedOn"],
4734
+ });
4735
+ try {
4736
+ seq = await repo.update(new RamSequenceModel({ id: name, current: next }));
4737
+ }
4738
+ catch (e) {
4739
+ if (!(e instanceof NotFoundError)) {
4740
+ throw e;
4741
+ }
4742
+ seq = await repo.create(new RamSequenceModel({ id: name, current: next }));
4743
+ }
4744
+ return seq.current;
4745
+ }
4746
+ /**
4747
+ * @description Gets the next value in the sequence
4748
+ * @summary Retrieves the current value of the sequence and increments it by the
4749
+ * configured increment amount. This is the main method used to get a new sequential value.
4750
+ * @return A promise that resolves to the next value in the sequence
4751
+ */
4752
+ async next() {
4753
+ const current = await this.current();
4754
+ return this.increment(current);
4755
+ }
4756
+ /**
4757
+ * @description Generates a range of sequential values
4758
+ * @summary Retrieves a specified number of sequential values from the sequence.
4759
+ * This is useful when you need to allocate multiple IDs at once.
4760
+ * The method increments the sequence by the total amount needed and returns all values in the range.
4761
+ * @param {number} count - The number of sequential values to generate
4762
+ * @return A promise that resolves to an array of sequential values
4763
+ */
4764
+ async range(count) {
4765
+ const current = (await this.current());
4766
+ const incrementBy = this.parse(this.options.incrementBy);
4767
+ const next = await this.increment(current, this.parse(count) * incrementBy);
4768
+ const range = [];
4769
+ for (let i = 1; i <= count; i++) {
4770
+ range.push(current + incrementBy * this.parse(i));
4771
+ }
4772
+ if (range[range.length - 1] !== next)
4773
+ throw new InternalError("Miscalculation of range");
4774
+ return range;
4775
+ }
4776
+ }
4777
+
4778
+ /**
4779
+ * @description Sets the created by field on a model during RAM create/update operations
4780
+ * @summary Automatically populates a model field with the UUID from the context during create or update operations.
4781
+ * This function is designed to be used as a handler for RAM operations to track entity creation.
4782
+ * @template M - Type of the model being created/updated
4783
+ * @template R - Type of the repository handling the model
4784
+ * @template V - Type of the relations metadata
4785
+ * @template F - Type of the RAM flags
4786
+ * @template C - Type of the context
4787
+ * @param {R} this - The repository instance
4788
+ * @param {Context<F>} context - The operation context containing user identification
4789
+ * @param {V} data - The relations metadata
4790
+ * @param key - The property key to set with the UUID
4791
+ * @param {M} model - The model instance being created/updated
4792
+ * @return {Promise<void>} A promise that resolves when the field has been set
4793
+ * @function createdByOnRamCreateUpdate
4794
+ * @memberOf module:core
4795
+ * @category Ram
4796
+ */
4797
+ async function createdByOnRamCreateUpdate(context, data, key, model) {
4798
+ const uuid = context.get("UUID");
4799
+ if (!uuid)
4800
+ throw new UnsupportedError("This adapter does not support user identification");
4801
+ model[key] = uuid;
4802
+ }
4803
+
4804
+ /**
4805
+ * @description Identifier for the RAM adapter
4806
+ * @summary A constant string that uniquely identifies the RAM adapter in the system. Used for adapter type identification and configuration across the core module.
4807
+ * @const RamFlavour
4808
+ * @memberOf module:core
4809
+ * @category Ram
4810
+ */
4811
+ const RamFlavour = "ram";
4812
+
4813
+ Adapter.setCurrent(RamFlavour);
4814
+ /**
4815
+ * @description In-memory adapter for data persistence
4816
+ * @summary The RamAdapter provides an in-memory implementation of the persistence layer.
4817
+ * It stores data in JavaScript Maps and provides CRUD operations and query capabilities.
4818
+ * This adapter is useful for testing, prototyping, and applications that don't require
4819
+ * persistent storage across application restarts.
4820
+ * @class RamAdapter
4821
+ * @category Ram
4822
+ * @example
4823
+ * ```typescript
4824
+ * // Create a new RAM adapter
4825
+ * const adapter = new RamAdapter('myRamAdapter');
4826
+ *
4827
+ * // Create a repository for a model
4828
+ * const userRepo = new (adapter.repository<User>())(User, adapter);
4829
+ *
4830
+ * // Perform CRUD operations
4831
+ * const user = new User({ name: 'John', email: 'john@example.com' });
4832
+ * await userRepo.create(user);
4833
+ * const retrievedUser = await userRepo.findById(user.id);
4834
+ * ```
4835
+ * @mermaid
4836
+ * sequenceDiagram
4837
+ * participant Client
4838
+ * participant Repository
4839
+ * participant RamAdapter
4840
+ * participant Storage as In-Memory Storage
4841
+ *
4842
+ * Client->>Repository: create(model)
4843
+ * Repository->>RamAdapter: create(tableName, id, model)
4844
+ * RamAdapter->>RamAdapter: lock.acquire()
4845
+ * RamAdapter->>Storage: set(id, model)
4846
+ * RamAdapter->>RamAdapter: lock.release()
4847
+ * RamAdapter-->>Repository: model
4848
+ * Repository-->>Client: model
4849
+ *
4850
+ * Client->>Repository: findById(id)
4851
+ * Repository->>RamAdapter: read(tableName, id)
4852
+ * RamAdapter->>Storage: get(id)
4853
+ * Storage-->>RamAdapter: model
4854
+ * RamAdapter-->>Repository: model
4855
+ * Repository-->>Client: model
4856
+ */
4857
+ class RamAdapter extends Adapter {
4858
+ constructor(conf = {}, alias) {
4859
+ super(conf, RamFlavour, alias);
4860
+ this.Context = RamContext;
4861
+ this.indexes = {};
4862
+ this.lock = new Lock();
4863
+ }
4864
+ /**
4865
+ * @description Gets the repository constructor for a model
4866
+ * @summary Returns a constructor for creating repositories that work with the specified model type.
4867
+ * This method overrides the base implementation to provide RAM-specific repository functionality.
4868
+ * @template M - The model type for the repository
4869
+ * @return {Constructor<RamRepository<M>>} A constructor for creating RAM repositories
4870
+ */
4871
+ repository() {
4872
+ return super.repository();
4873
+ }
4874
+ /**
4875
+ * @description Creates operation flags with UUID
4876
+ * @summary Extends the base flags with a UUID for user identification.
4877
+ * This method ensures that all operations have a unique identifier for tracking purposes.
4878
+ * @template M - The model type for the operation
4879
+ * @param {OperationKeys} operation - The type of operation being performed
4880
+ * @param {Constructor<M>} model - The model constructor
4881
+ * @param {Partial<RamFlags>} flags - Partial flags to be extended
4882
+ * @return {Promise<RamFlags>} Complete flags with UUID
4883
+ */
4884
+ async flags(operation, model, flags) {
4885
+ return Object.assign(await super.flags(operation, model, flags), {
4886
+ UUID: this.config.user || "" + Date.now(),
4887
+ });
4888
+ }
4889
+ /**
4890
+ * @description Indexes models in the RAM adapter
4891
+ * @summary A no-op indexing method for the RAM adapter.
4892
+ * Since RAM adapter doesn't require explicit indexing, this method simply resolves immediately.
4893
+ * @param models - Models to be indexed (unused)
4894
+ * @return {Promise<any>} A promise that resolves when indexing is complete
4895
+ */
4896
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4897
+ async index(...models) {
4898
+ return Promise.resolve(undefined);
4899
+ }
4900
+ /**
4901
+ * @description Prepares a model for storage
4902
+ * @summary Converts a model instance to a format suitable for storage in the RAM adapter.
4903
+ * This method extracts the primary key and creates a record without the primary key field.
4904
+ * @template M - The model type being prepared
4905
+ * @param {M} model - The model instance to prepare
4906
+ * @param pk - The primary key property name
4907
+ * @return Object containing the record and ID
4908
+ */
4909
+ prepare(model, pk) {
4910
+ const prepared = super.prepare(model, pk);
4911
+ delete prepared.record[pk];
4912
+ return prepared;
4913
+ }
4914
+ /**
4915
+ * @description Converts a stored record back to a model instance
4916
+ * @summary Reconstructs a model instance from a stored record by adding back the primary key.
4917
+ * This method is the inverse of the prepare method.
4918
+ * @template M - The model type to revert to
4919
+ * @param {Record<string, any>} obj - The stored record
4920
+ * @param {string | Constructor<M>} clazz - The model class or name
4921
+ * @param pk - The primary key property name
4922
+ * @param {string | number} id - The primary key value
4923
+ * @return {M} The reconstructed model instance
4924
+ */
4925
+ revert(obj, clazz, pk, id) {
4926
+ const res = super.revert(obj, clazz, pk, id);
4927
+ return res;
4928
+ }
4929
+ /**
4930
+ * @description Creates a new record in the in-memory storage
4931
+ * @summary Stores a new record in the specified table with the given ID.
4932
+ * This method acquires a lock to ensure thread safety, creates the table if it doesn't exist,
4933
+ * checks for conflicts, and stores the model.
4934
+ * @param {string} tableName - The name of the table to store the record in
4935
+ * @param {string | number} id - The unique identifier for the record
4936
+ * @param {Record<string, any>} model - The record data to store
4937
+ * @return {Promise<Record<string, any>>} A promise that resolves to the stored record
4938
+ * @mermaid
4939
+ * sequenceDiagram
4940
+ * participant Caller
4941
+ * participant RamAdapter
4942
+ * participant Storage as In-Memory Storage
4943
+ *
4944
+ * Caller->>RamAdapter: create(tableName, id, model)
4945
+ * RamAdapter->>RamAdapter: lock.acquire()
4946
+ * RamAdapter->>Storage: has(tableName)
4947
+ * alt Table doesn't exist
4948
+ * RamAdapter->>Storage: set(tableName, new Map())
4949
+ * end
4950
+ * RamAdapter->>Storage: has(id)
4951
+ * alt Record exists
4952
+ * RamAdapter-->>Caller: throw ConflictError
4953
+ * end
4954
+ * RamAdapter->>Storage: set(id, model)
4955
+ * RamAdapter->>RamAdapter: lock.release()
4956
+ * RamAdapter-->>Caller: model
4957
+ */
4958
+ async create(tableName, id, model) {
4959
+ await this.lock.acquire();
4960
+ if (!this.client.has(tableName))
4961
+ this.client.set(tableName, new Map());
4962
+ if (this.client.get(tableName) && this.client.get(tableName)?.has(id))
4963
+ throw new ConflictError(`Record with id ${id} already exists in table ${tableName}`);
4964
+ this.client.get(tableName)?.set(id, model);
4965
+ this.lock.release();
4966
+ return model;
4967
+ }
4968
+ /**
4969
+ * @description Retrieves a record from in-memory storage
4970
+ * @summary Fetches a record with the specified ID from the given table.
4971
+ * This method checks if the table and record exist and throws appropriate errors if not.
4972
+ * @param {string} tableName - The name of the table to retrieve from
4973
+ * @param {string | number} id - The unique identifier of the record to retrieve
4974
+ * @return {Promise<Record<string, any>>} A promise that resolves to the retrieved record
4975
+ * @mermaid
4976
+ * sequenceDiagram
4977
+ * participant Caller
4978
+ * participant RamAdapter
4979
+ * participant Storage as In-Memory Storage
4980
+ *
4981
+ * Caller->>RamAdapter: read(tableName, id)
4982
+ * RamAdapter->>Storage: has(tableName)
4983
+ * alt Table doesn't exist
4984
+ * RamAdapter-->>Caller: throw NotFoundError
4985
+ * end
4986
+ * RamAdapter->>Storage: has(id)
4987
+ * alt Record doesn't exist
4988
+ * RamAdapter-->>Caller: throw NotFoundError
4989
+ * end
4990
+ * RamAdapter->>Storage: get(id)
4991
+ * Storage-->>RamAdapter: record
4992
+ * RamAdapter-->>Caller: record
4993
+ */
4994
+ async read(tableName, id) {
4995
+ if (!this.client.has(tableName))
4996
+ throw new NotFoundError(`Table ${tableName} not found`);
4997
+ if (!this.client.get(tableName)?.has(id))
4998
+ throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
4999
+ return this.client.get(tableName)?.get(id);
5000
+ }
5001
+ /**
5002
+ * @description Updates an existing record in the in-memory storage
5003
+ * @summary Updates a record with the specified ID in the given table.
5004
+ * This method acquires a lock to ensure thread safety, checks if the table and record exist,
5005
+ * and updates the record with the new data.
5006
+ * @param {string} tableName - The name of the table containing the record
5007
+ * @param {string | number} id - The unique identifier of the record to update
5008
+ * @param {Record<string, any>} model - The new record data
5009
+ * @return {Promise<Record<string, any>>} A promise that resolves to the updated record
5010
+ * @mermaid
5011
+ * sequenceDiagram
5012
+ * participant Caller
5013
+ * participant RamAdapter
5014
+ * participant Storage as In-Memory Storage
5015
+ *
5016
+ * Caller->>RamAdapter: update(tableName, id, model)
5017
+ * RamAdapter->>RamAdapter: lock.acquire()
5018
+ * RamAdapter->>Storage: has(tableName)
5019
+ * alt Table doesn't exist
5020
+ * RamAdapter-->>Caller: throw NotFoundError
5021
+ * end
5022
+ * RamAdapter->>Storage: has(id)
5023
+ * alt Record doesn't exist
5024
+ * RamAdapter-->>Caller: throw NotFoundError
5025
+ * end
5026
+ * RamAdapter->>Storage: set(id, model)
5027
+ * RamAdapter->>RamAdapter: lock.release()
5028
+ * RamAdapter-->>Caller: model
5029
+ */
5030
+ async update(tableName, id, model) {
5031
+ await this.lock.acquire();
5032
+ if (!this.client.has(tableName))
5033
+ throw new NotFoundError(`Table ${tableName} not found`);
5034
+ if (!this.client.get(tableName)?.has(id))
5035
+ throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
5036
+ this.client.get(tableName)?.set(id, model);
5037
+ this.lock.release();
5038
+ return model;
5039
+ }
5040
+ /**
5041
+ * @description Deletes a record from the in-memory storage
5042
+ * @summary Removes a record with the specified ID from the given table.
5043
+ * This method acquires a lock to ensure thread safety, checks if the table and record exist,
5044
+ * retrieves the record before deletion, and then removes it from storage.
5045
+ * @param {string} tableName - The name of the table containing the record
5046
+ * @param {string | number} id - The unique identifier of the record to delete
5047
+ * @return {Promise<Record<string, any>>} A promise that resolves to the deleted record
5048
+ * @mermaid
5049
+ * sequenceDiagram
5050
+ * participant Caller
5051
+ * participant RamAdapter
5052
+ * participant Storage as In-Memory Storage
5053
+ *
5054
+ * Caller->>RamAdapter: delete(tableName, id)
5055
+ * RamAdapter->>RamAdapter: lock.acquire()
5056
+ * RamAdapter->>Storage: has(tableName)
5057
+ * alt Table doesn't exist
5058
+ * RamAdapter-->>Caller: throw NotFoundError
5059
+ * end
5060
+ * RamAdapter->>Storage: has(id)
5061
+ * alt Record doesn't exist
5062
+ * RamAdapter-->>Caller: throw NotFoundError
5063
+ * end
5064
+ * RamAdapter->>Storage: get(id)
5065
+ * Storage-->>RamAdapter: record
5066
+ * RamAdapter->>Storage: delete(id)
5067
+ * RamAdapter->>RamAdapter: lock.release()
5068
+ * RamAdapter-->>Caller: record
5069
+ */
5070
+ async delete(tableName, id) {
5071
+ await this.lock.acquire();
5072
+ if (!this.client.has(tableName))
5073
+ throw new NotFoundError(`Table ${tableName} not found`);
5074
+ if (!this.client.get(tableName)?.has(id))
5075
+ throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
5076
+ const natived = this.client.get(tableName)?.get(id);
5077
+ this.client.get(tableName)?.delete(id);
5078
+ this.lock.release();
5079
+ return natived;
5080
+ }
5081
+ /**
5082
+ * @description Gets or creates a table in the in-memory storage
5083
+ * @summary Retrieves the Map representing a table for a given model or table name.
5084
+ * If the table doesn't exist, it creates a new one. This is a helper method used
5085
+ * by other methods to access the correct storage location.
5086
+ * @template M - The model type for the table
5087
+ * @param {string | Constructor<M>} from - The model class or table name
5088
+ * @return {Map<string | number, any> | undefined} The table Map or undefined
5089
+ */
5090
+ tableFor(from) {
5091
+ if (typeof from === "string")
5092
+ from = Model.get(from);
5093
+ const table = Repository.table(from);
5094
+ if (!this.client.has(table))
5095
+ this.client.set(table, new Map());
5096
+ return this.client.get(table);
5097
+ }
5098
+ /**
5099
+ * @description Executes a raw query against the in-memory storage
5100
+ * @summary Performs a query operation on the in-memory data store using the provided query specification.
5101
+ * This method supports filtering, sorting, pagination, and field selection.
5102
+ * @template R - The return type of the query
5103
+ * @param {RawRamQuery<any>} rawInput - The query specification
5104
+ * @return {Promise<R>} A promise that resolves to the query results
5105
+ * @mermaid
5106
+ * sequenceDiagram
5107
+ * participant Caller
5108
+ * participant RamAdapter
5109
+ * participant Storage as In-Memory Storage
5110
+ *
5111
+ * Caller->>RamAdapter: raw(rawInput)
5112
+ * RamAdapter->>RamAdapter: tableFor(from)
5113
+ * alt Table doesn't exist
5114
+ * RamAdapter-->>Caller: throw InternalError
5115
+ * end
5116
+ * RamAdapter->>RamAdapter: findPrimaryKey(new from())
5117
+ * RamAdapter->>Storage: entries()
5118
+ * Storage-->>RamAdapter: entries
5119
+ * loop For each entry
5120
+ * RamAdapter->>RamAdapter: revert(r, from, id, pk)
5121
+ * end
5122
+ * alt Where condition exists
5123
+ * RamAdapter->>RamAdapter: result.filter(where)
5124
+ * end
5125
+ * alt Sort condition exists
5126
+ * RamAdapter->>RamAdapter: result.sort(sort)
5127
+ * end
5128
+ * alt Skip specified
5129
+ * RamAdapter->>RamAdapter: result.slice(skip)
5130
+ * end
5131
+ * alt Limit specified
5132
+ * RamAdapter->>RamAdapter: result.slice(0, limit)
5133
+ * end
5134
+ * alt Select fields specified
5135
+ * loop For each result
5136
+ * RamAdapter->>RamAdapter: Filter to selected fields
5137
+ * end
5138
+ * end
5139
+ * RamAdapter-->>Caller: result
5140
+ */
5141
+ async raw(rawInput) {
5142
+ const { where, sort, limit, skip, from } = rawInput;
5143
+ let { select } = rawInput;
5144
+ const collection = this.tableFor(from);
5145
+ if (!collection)
5146
+ throw new InternalError(`Table ${from} not found in RamAdapter`);
5147
+ const { id, props } = findPrimaryKey(new from());
5148
+ let result = Array.from(collection.entries()).map(([pk, r]) => this.revert(r, from, id, Sequence.parseValue(props.type, pk)));
5149
+ result = where ? result.filter(where) : result;
5150
+ if (sort)
5151
+ result = result.sort(sort);
5152
+ if (skip)
5153
+ result = result.slice(skip);
5154
+ if (limit)
5155
+ result = result.slice(0, limit);
5156
+ if (select) {
5157
+ select = Array.isArray(select) ? select : [select];
5158
+ result = result.map((r) => Object.entries(r).reduce((acc, [key, val]) => {
5159
+ if (select.includes(key))
5160
+ acc[key] = val;
5161
+ return acc;
5162
+ }, {}));
5163
+ }
5164
+ return result;
5165
+ }
5166
+ /**
5167
+ * @description Parses and converts errors to appropriate types
5168
+ * @summary Ensures that errors are of the correct type for consistent error handling.
5169
+ * If the error is already a BaseError, it's returned as is; otherwise, it's wrapped in an InternalError.
5170
+ * @template V - The expected error type, extending BaseError
5171
+ * @param {Error} err - The error to parse
5172
+ * @return {V} The parsed error of the expected type
5173
+ */
5174
+ parseError(err) {
5175
+ if (err instanceof BaseError)
5176
+ return err;
5177
+ return new InternalError(err);
5178
+ }
5179
+ /**
5180
+ * @description Creates a new statement builder for queries
5181
+ * @summary Factory method that creates a new RamStatement instance for building queries.
5182
+ * This method allows for fluent query construction against the RAM adapter.
5183
+ * @template M - The model type for the statement
5184
+ * @return {RamStatement<M, any>} A new statement builder instance
5185
+ */
5186
+ Statement() {
5187
+ return new RamStatement(this);
5188
+ }
5189
+ /**
5190
+ * @description Creates a new sequence for generating sequential IDs
5191
+ * @summary Factory method that creates a new RamSequence instance for ID generation.
5192
+ * This method provides a way to create auto-incrementing sequences for entity IDs.
5193
+ * @param {SequenceOptions} options - Configuration options for the sequence
5194
+ * @return {Promise<Sequence>} A promise that resolves to the new sequence instance
5195
+ */
5196
+ async Sequence(options) {
5197
+ return new RamSequence(options, this);
5198
+ }
5199
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
5200
+ for(config, ...args) {
5201
+ if (!this.proxies)
5202
+ this.proxies = {};
5203
+ const key = `${this.alias} - ${hashObj(config)}`;
5204
+ if (key in this.proxies)
5205
+ return this.proxies[key];
5206
+ const proxy = new Proxy(this, {
5207
+ get: (target, p, receiver) => {
5208
+ if (p === "_config") {
5209
+ const originalConf = Reflect.get(target, p, receiver);
5210
+ return Object.assign({}, originalConf, config);
5211
+ }
5212
+ return Reflect.get(target, p, receiver);
5213
+ },
5214
+ });
5215
+ this.proxies[key] = proxy;
5216
+ return proxy;
5217
+ }
5218
+ /**
5219
+ * @description Sets up RAM-specific decorations for model properties
5220
+ * @summary Configures decorations for createdBy and updatedBy fields in the RAM adapter.
5221
+ * This static method is called during initialization to set up handlers that automatically
5222
+ * populate these fields with the current user's UUID during create and update operations.
5223
+ * @return {void}
5224
+ * @mermaid
5225
+ * sequenceDiagram
5226
+ * participant RamAdapter
5227
+ * participant Decoration
5228
+ * participant Repository
5229
+ *
5230
+ * RamAdapter->>Repository: key(PersistenceKeys.CREATED_BY)
5231
+ * Repository-->>RamAdapter: createdByKey
5232
+ * RamAdapter->>Repository: key(PersistenceKeys.UPDATED_BY)
5233
+ * Repository-->>RamAdapter: updatedByKey
5234
+ *
5235
+ * RamAdapter->>Decoration: flavouredAs(RamFlavour)
5236
+ * Decoration-->>RamAdapter: DecoratorBuilder
5237
+ * RamAdapter->>Decoration: for(createdByKey)
5238
+ * RamAdapter->>Decoration: define(onCreate, propMetadata)
5239
+ * RamAdapter->>Decoration: apply()
5240
+ *
5241
+ * RamAdapter->>Decoration: flavouredAs(RamFlavour)
5242
+ * Decoration-->>RamAdapter: DecoratorBuilder
5243
+ * RamAdapter->>Decoration: for(updatedByKey)
5244
+ * RamAdapter->>Decoration: define(onCreate, propMetadata)
5245
+ * RamAdapter->>Decoration: apply()
5246
+ */
5247
+ static decoration() {
5248
+ super.decoration();
5249
+ const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
5250
+ const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
5251
+ Decoration.flavouredAs(RamFlavour)
5252
+ .for(createdByKey)
5253
+ .define(onCreate(createdByOnRamCreateUpdate), propMetadata(createdByKey, {}))
5254
+ .apply();
5255
+ Decoration.flavouredAs(RamFlavour)
5256
+ .for(updatedByKey)
5257
+ .define(onCreateUpdate(createdByOnRamCreateUpdate), propMetadata(updatedByKey, {}))
5258
+ .apply();
5259
+ }
5260
+ getClient() {
5261
+ return new Map();
5262
+ }
5263
+ }
5264
+ RamAdapter.decoration();
5265
+ Adapter.setCurrent(RamFlavour);
5266
+
4319
5267
  /**
4320
5268
  * @module core
4321
5269
  * @description Core module for the Decaf TypeScript framework
@@ -4331,7 +5279,7 @@ Injectables.setRegistry(new InjectablesRegistry());
4331
5279
  * @const VERSION
4332
5280
  * @memberOf module:core
4333
5281
  */
4334
- const VERSION = "0.5.25";
5282
+ const VERSION = "0.5.26";
4335
5283
 
4336
- export { Adapter, AuthorizationError, BaseModel, BigIntSequence, Cascade, Condition, ConnectionError, DefaultCascade, DefaultSequenceOptions, Dispatch, ForbiddenError, GroupOperator, InjectablesRegistry, NoneSequenceOptions, NumericSequence, ObserverError, ObserverHandler, Operator, OrderDirection, Paginator, PagingError, PersistenceKeys, QueryError, Repository, Sequence, Statement, UnsupportedError, VERSION, cacheModelForPopulate, column, createOrUpdate, createdAt, createdBy, createdByOnCreateUpdate, final, generateInjectableNameForRepository, getColumnName, getPopulateKey, getTableName, index, manyToMany, manyToOne, oneToMany, oneToManyOnCreate, oneToManyOnDelete, oneToManyOnUpdate, oneToOne, oneToOneOnCreate, oneToOneOnDelete, oneToOneOnUpdate, pk, pkOnCreate, populate, repository, repositoryFromTypeMetadata, sequenceNameForModel, table, unique, uniqueOnCreateUpdate, updatedAt, updatedBy, uses };
4337
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvcGVyc2lzdGVuY2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2Vycm9ycy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9TZXF1ZW5jZS50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvRGlzcGF0Y2gudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIiwiLi4vc3JjL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zLnRzIiwiLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9xdWVyeS9lcnJvcnMudHMiLCIuLi9zcmMvcXVlcnkvQ29uZGl0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2lkZW50aXR5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gUGVyc2lzdGVuY2UtcmVsYXRlZCBjb25zdGFudCBrZXlzXG4gKiBAc3VtbWFyeSBFbnVtIGNvbnRhaW5pbmcgc3RyaW5nIGNvbnN0YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIHBlcnNpc3RlbmNlIGxheWVyIGZvciBtZXRhZGF0YSwgcmVsYXRpb25zLCBhbmQgb3RoZXIgcGVyc2lzdGVuY2UtcmVsYXRlZCBvcGVyYXRpb25zXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gUGVyc2lzdGVuY2VLZXlzIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGluZGV4IG1ldGFkYXRhICovXG4gIElOREVYID0gXCJpbmRleFwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciB1bmlxdWUgY29uc3RyYWludCBtZXRhZGF0YSAqL1xuICBVTklRVUUgPSBcInVuaXF1ZVwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBhZGFwdGVyIG1ldGFkYXRhICovXG4gIEFEQVBURVIgPSBcImFkYXB0ZXJcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIGZvciBpbmplY3RhYmxlIGFkYXB0ZXIgbmFtZXMgKi9cbiAgSU5KRUNUQUJMRSA9IFwiZGVjYWZfezB9X2FkYXB0ZXJfZm9yX3sxfVwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciB0YWJsZSBuYW1lIG1ldGFkYXRhICovXG4gIFRBQkxFID0gXCJ0YWJsZVwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBjb2x1bW4gbmFtZSBtZXRhZGF0YSAqL1xuICBDT0xVTU4gPSBcImNvbHVtblwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBnZW5lcmFsIG1ldGFkYXRhIHN0b3JhZ2UgKi9cbiAgTUVUQURBVEEgPSBcIl9fbWV0YWRhdGFcIixcblxuICAvLyBPd25lcnNoaXBcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNyZWF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIE9XTkVSU0hJUCA9IFwib3duZXJzaGlwXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNyZWF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIENSRUFURURfQlkgPSBgJHtPV05FUlNISVB9LmNyZWF0ZWQtYnlgLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciB1cGRhdGVkLWJ5IG93bmVyc2hpcCBtZXRhZGF0YSAqL1xuICBVUERBVEVEX0JZID0gYCR7T1dORVJTSElQfS51cGRhdGVkLWJ5YCxcblxuICAvLyBSZWxhdGlvbnNcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgcmVsYXRpb25zIG1ldGFkYXRhIHN0b3JhZ2UgKi9cbiAgUkVMQVRJT05TID0gXCJfX3JlbGF0aW9uc1wiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciByZWxhdGlvbnMgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBSRUxBVElPTiA9IFwicmVsYXRpb25cIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3Igb25lLXRvLW9uZSByZWxhdGlvbiBtZXRhZGF0YSAqL1xuICBPTkVfVE9fT05FID0gYCR7UkVMQVRJT059Lm9uZS10by1vbmVgLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBvbmUtdG8tbWFueSByZWxhdGlvbiBtZXRhZGF0YSAqL1xuICBPTkVfVE9fTUFOWSA9IGAke1JFTEFUSU9OfS5vbmUtdG8tbWFueWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG1hbnktdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE1BTllfVE9fT05FID0gYCR7UkVMQVRJT059Lm1hbnktdG8tb25lYCxcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG1hbnktdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE1BTllfVE9fTUFOWSA9IGAke1JFTEFUSU9OfS5tYW55LXRvLW1hbnlgLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBwb3B1bGF0ZSBtZXRhZGF0YSAqL1xuICBQT1BVTEFURSA9IFwicG9wdWxhdGVcIixcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBtYWtlcyBhIG1ldGhvZCBub24tY29uZmlndXJhYmxlXG4gKiBAc3VtbWFyeSBUaGlzIGRlY29yYXRvciBwcmV2ZW50cyBhIG1ldGhvZCBmcm9tIGJlaW5nIG92ZXJyaWRkZW4gYnkgbWFraW5nIGl0IG5vbi1jb25maWd1cmFibGUuXG4gKiBJdCB0aHJvd3MgYW4gZXJyb3IgaWYgdXNlZCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIGEgbWV0aG9kLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gbWV0aG9kc1xuICogQGZ1bmN0aW9uIGZpbmFsXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsKCkge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluYWwgZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb24gbWV0aG9kc1wiKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8uY29uZmlndXJhYmxlKSB7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cbiIsImltcG9ydCB7IEJhZFJlcXVlc3RFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHVzZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSBhbiBhY3Rpb25cbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHJlc291cmNlIG9yIHBlcmZvcm0gYW4gYWN0aW9uIHdpdGhvdXQgcHJvcGVyIGF1dGhlbnRpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBvZiB0aHJvd2luZyBhbiBBdXRob3JpemF0aW9uRXJyb3JcbiAqIGlmICghdXNlci5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICogICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKCdVc2VyIG5vdCBhdXRoZW50aWNhdGVkJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhvcml6YXRpb25FcnJvciBleHRlbmRzIEJhZFJlcXVlc3RFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IsIG5hbWUgPSBBdXRob3JpemF0aW9uRXJyb3IubmFtZSwgY29kZSA9IDQwMSkge1xuICAgIHN1cGVyKG1zZywgbmFtZSwgY29kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSB1c2VyIGlzIGZvcmJpZGRlbiBmcm9tIGFjY2Vzc2luZyBhIHJlc291cmNlXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSByZXNvdXJjZSBvciBwZXJmb3JtIGFuIGFjdGlvbiB0aGV5IGRvbid0IGhhdmUgcGVybWlzc2lvbiBmb3JcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRm9yYmlkZGVuRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgRm9yYmlkZGVuRXJyb3JcbiAqIGlmICghdXNlci5oYXNQZXJtaXNzaW9uKCdhZG1pbicpKSB7XG4gKiAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignVXNlciBkb2VzIG5vdCBoYXZlIGFkbWluIHBlcm1pc3Npb25zJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgRm9yYmlkZGVuRXJyb3IubmFtZSwgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2aWNlIGZhaWxzXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBhcHBsaWNhdGlvbiBmYWlscyB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVxdWlyZWQgc2VydmljZSBvciByZXNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBDb25uZWN0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgQ29ubmVjdGlvbkVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBkYXRhYmFzZS5jb25uZWN0KCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byBkYXRhYmFzZScpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29ubmVjdGlvbkVycm9yLm5hbWUsIDUwMyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBPYnNlcnZlckZpbHRlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIG9ic2VydmVycyBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gKiBAc3VtbWFyeSBUaGUgT2JzZXJ2ZXJIYW5kbGVyIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGNlbnRyYWxpemVkXG4gKiB3YXkgdG8gbWFuYWdlIG11bHRpcGxlIG9ic2VydmVycy4gSXQgYWxsb3dzIHJlZ2lzdGVyaW5nIG9ic2VydmVycyB3aXRoIG9wdGlvbmFsIGZpbHRlcnMgdG8gY29udHJvbFxuICogd2hpY2ggZXZlbnRzIHRoZXkgcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvciwgYW5kIGhhbmRsZXMgdGhlIHByb2Nlc3Mgb2Ygbm90aWZ5aW5nIGFsbCByZWxldmFudFxuICogb2JzZXJ2ZXJzIHdoZW4gZGF0YWJhc2UgZXZlbnRzIG9jY3VyLlxuICogQGNsYXNzIE9ic2VydmVySGFuZGxlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhbiBvYnNlcnZlciBoYW5kbGVyXG4gKiBjb25zdCBoYW5kbGVyID0gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyXG4gKiBjb25zdCBteU9ic2VydmVyID0ge1xuICogICByZWZyZXNoOiBhc3luYyAodGFibGUsIGV2ZW50LCBpZCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGBDaGFuZ2UgaW4gJHt0YWJsZX06ICR7ZXZlbnR9IGZvciBJRCAke2lkfWApO1xuICogICB9XG4gKiB9O1xuICpcbiAqIC8vIEFkZCBvYnNlcnZlciB3aXRoIGEgZmlsdGVyIGZvciBvbmx5IHVzZXIgdGFibGUgZXZlbnRzXG4gKiBoYW5kbGVyLm9ic2VydmUobXlPYnNlcnZlciwgKHRhYmxlLCBldmVudCwgaWQpID0+IHRhYmxlID09PSAndXNlcnMnKTtcbiAqXG4gKiAvLyBOb3RpZnkgb2JzZXJ2ZXJzIGFib3V0IGFuIGV2ZW50XG4gKiBhd2FpdCBoYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhsb2dnZXIsICd1c2VycycsICdDUkVBVEUnLCAxMjMpO1xuICpcbiAqIC8vIFJlbW92ZSBhbiBvYnNlcnZlciB3aGVuIG5vIGxvbmdlciBuZWVkZWRcbiAqIGhhbmRsZXIudW5PYnNlcnZlKG15T2JzZXJ2ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNlcnZlckhhbmRsZXIgaW1wbGVtZW50cyBPYnNlcnZhYmxlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG9ic2VydmVyIG9iamVjdHMgYWxvbmcgd2l0aCB0aGVpciBvcHRpb25hbCBmaWx0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJzOiB7XG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyO1xuICAgIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyO1xuICB9W10gPSBbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjb3VudCBvZiBvYnNlcnZlcnMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGhhbmRsZXJcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqL1xuICBjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBuZXcgb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byB0aGUgY29sbGVjdGlvbiB3aXRoIGFuIG9wdGlvbmFsIGZpbHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5tYXAoKG8pID0+IG8ub2JzZXJ2ZXIpLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiT2JzZXJ2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goeyBvYnNlcnZlcjogb2JzZXJ2ZXIsIGZpbHRlcjogZmlsdGVyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIGZyb20gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byBmaW5kIE9ic2VydmVyXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCByZWxldmFudCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG9ic2VydmVycyBiYXNlZCBvbiB0aGVpciBmaWx0ZXIgZnVuY3Rpb25zIGFuZCBjYWxscyByZWZyZXNoIG9uIGVhY2ggbWF0Y2hpbmcgb2JzZXJ2ZXJcbiAgICogQHBhcmFtIHtMb2dnZXJ9IGxvZyAtIExvZ2dlciBmb3IgcmVjb3JkaW5nIG5vdGlmaWNhdGlvbiBhY3Rpdml0aWVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlckhhbmRsZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlclxuICAgKlxuICAgKiAgIENsaWVudC0+Pk9ic2VydmVySGFuZGxlcjogdXBkYXRlT2JzZXJ2ZXJzKGxvZywgdGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IEZpbHRlciBvYnNlcnZlcnNcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIG9ic2VydmVyIHdpdGggbWF0Y2hpbmcgZmlsdGVyXG4gICAqICAgICBhbHQgT2JzZXJ2ZXIgaGFzIGZpbHRlclxuICAgKiAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogQXBwbHkgZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpXG4gICAqICAgICAgIGFsdCBGaWx0ZXIgdGhyb3dzIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgdHJ1ZVxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgZmFsc2VcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBObyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IHJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVySGFuZGxlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgIGFsdCBSZXN1bHQgaXMgcmVqZWN0ZWRcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0tPj5DbGllbnQ6IFJldHVyblxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIGxvZzogTG9nZ2VyLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aGlzLm9ic2VydmVyc1xuICAgICAgICAuZmlsdGVyKChvKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXIgfSA9IG87XG4gICAgICAgICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBmaWx0ZXIgb2JzZXJ2ZXIgJHtvLm9ic2VydmVyLnRvU3RyaW5nKCl9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKG8pID0+IHtcbiAgICAgICAgICBvLm9ic2VydmVyLnJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXS50b1N0cmluZygpfTogJHtyZXN1bHQucmVhc29ufWBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWwgYnkgY2hlY2tpbmcgbWV0YWRhdGEgb3IgZmFsbGluZyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3RvciBuYW1lXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgdG8gZ2V0IHRoZSB0YWJsZSBuYW1lIGZvclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFibGUgbmFtZSBmb3IgdGhlIG1vZGVsXG4gKiBAZnVuY3Rpb24gZ2V0VGFibGVOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTmFtZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBzdHJpbmcge1xuICBjb25zdCBvYmogPSBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbDtcblxuICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKSxcbiAgICBvYmpcbiAgKTtcbiAgaWYgKG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG4gIGlmIChtb2RlbCBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgcmV0dXJuIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cbiAgcmV0dXJuIG1vZGVsLm5hbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5OYW1lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBhdHRyaWJ1dGU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLFxuICAgIG1vZGVsLFxuICAgIGF0dHJpYnV0ZVxuICApO1xuICByZXR1cm4gbWV0YWRhdGEgPyBtZXRhZGF0YSA6IGF0dHJpYnV0ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGJ5IGNvbWJpbmluZyB0aGUgdGFibGUgbmFtZSB3aXRoIGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgdGhlIHNlcXVlbmNlIG5hbWUgZm9yXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gYXJncyAtIEFkZGl0aW9uYWwgc3RyaW5nIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhlIHNlcXVlbmNlIG5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBuYW1lXG4gKiBAZnVuY3Rpb24gc2VxdWVuY2VOYW1lRm9yTW9kZWxcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VOYW1lRm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogc3RyaW5nW11cbikge1xuICByZXR1cm4gW2dldFRhYmxlTmFtZShtb2RlbCksIC4uLmFyZ3NdLmpvaW4oXCJfXCIpO1xufVxuIiwiaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIENvbnRleHQsXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgRGVmYXVsdFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dHVhbCxcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBtb2RlbFRvVHJhbnNpZW50LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgRGVmYXVsdEZsYXZvdXIsXG4gIGhhc2hPYmosXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBNb2RlbFJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUmF3RXhlY3V0b3JcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4vU2VxdWVuY2VcIjtcbmltcG9ydCB7IEVycm9yUGFyc2VyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IGZpbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IERpc3BhdGNoIH0gZnJvbSBcIi4vRGlzcGF0Y2hcIjtcbmltcG9ydCB7IHR5cGUgRXZlbnRJZHMsIHR5cGUgT2JzZXJ2ZXJGaWx0ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJIYW5kbGVyIH0gZnJvbSBcIi4vT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZSwgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IGFzIFJlcG8gfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXJEaXNwYXRjaCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbkRlY29yYXRpb24uc2V0Rmxhdm91clJlc29sdmVyKChvYmo6IG9iamVjdCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBBZGFwdGVyLmZsYXZvdXJPZihNb2RlbC5pc01vZGVsKG9iaikgPyBvYmouY29uc3RydWN0b3IgOiAob2JqIGFzIGFueSkpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyIHx8XG4gICAgICBEZWZhdWx0Rmxhdm91clxuICAgICk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgLy8gcmV0dXJuIERlZmF1bHRGbGF2b3VyO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEFkYXB0ZXIuY3VycmVudEZsYXZvdXIgfHwgRGVmYXVsdEZsYXZvdXI7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIERlZmF1bHRGbGF2b3VyO1xuICB9XG59KTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgRmFjYWRlIGNsYXNzIGZvciBwZXJzaXN0ZW5jZSBhZGFwdGVyc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbCBkYXRhYmFzZSBhZGFwdGVycyBpbiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuIFRoaXMgY2xhc3NcbiAqIGltcGxlbWVudHMgc2V2ZXJhbCBpbnRlcmZhY2VzIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IEFQSSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucywgb2JzZXJ2ZXJcbiAqIHBhdHRlcm4gc3VwcG9ydCwgYW5kIGVycm9yIGhhbmRsaW5nLiBJdCBtYW5hZ2VzIGFkYXB0ZXIgcmVnaXN0cmF0aW9uLCBDUlVEIG9wZXJhdGlvbnMsIGFuZFxuICogb2JzZXJ2ZXIgbm90aWZpY2F0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBDT05GSUcgLSBUaGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gKiBAdGVtcGxhdGUgUVVFUlkgLSBUaGUgcXVlcnkgb2JqZWN0IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlclxuICogQHRlbXBsYXRlIEZMQUdTIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIENPTlRFWFQgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0NPTkZJR30gX2NvbmZpZyAtIFRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWRhcHRlciB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW19hbGlhc10gLSBPcHRpb25hbCBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGlzIGFkYXB0ZXJcbiAqIEBjbGFzcyBBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW1wbGVtZW50aW5nIGEgY29uY3JldGUgYWRhcHRlclxuICogY2xhc3MgUG9zdGdyZXNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxwZy5Qb29sQ29uZmlnLCBwZy5RdWVyeSwgUG9zdGdyZXNGbGFncywgUG9zdGdyZXNDb250ZXh0PiB7XG4gKiAgIGNvbnN0cnVjdG9yKGNsaWVudDogcGcuUG9vbENvbmZpZykge1xuICogICAgIHN1cGVyKGNsaWVudCwgJ3Bvc3RncmVzJyk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gKiAgICAgLy8gU2V0IHVwIHRoZSBhZGFwdGVyXG4gKiAgICAgYXdhaXQgdGhpcy5uYXRpdmUuY29ubmVjdCgpO1xuICogICB9XG4gKlxuICogICBhc3luYyBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpIHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgY3JlYXRpbmcgcmVjb3Jkc1xuICogICAgIGNvbnN0IGNvbHVtbnMgPSBPYmplY3Qua2V5cyhtb2RlbCkuam9pbignLCAnKTtcbiAqICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKG1vZGVsKTtcbiAqICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKChfLCBpKSA9PiBgJCR7aSsxfWApLmpvaW4oJywgJyk7XG4gKlxuICogICAgIGNvbnN0IHF1ZXJ5ID0gYElOU0VSVCBJTlRPICR7dGFibGVOYW1lfSAoJHtjb2x1bW5zfSkgVkFMVUVTICgke3BsYWNlaG9sZGVyc30pIFJFVFVSTklORyAqYDtcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5xdWVyeShxdWVyeSwgdmFsdWVzKTtcbiAqICAgICByZXR1cm4gcmVzdWx0LnJvd3NbMF07XG4gKiAgIH1cbiAqXG4gKiAgIC8vIE90aGVyIHJlcXVpcmVkIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMuLi5cbiAqIH1cbiAqXG4gKiAvLyBVc2luZyB0aGUgYWRhcHRlclxuICogY29uc3QgcGdDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25TdHJpbmcpO1xuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3N0Z3Jlc0FkYXB0ZXIocGdDbGllbnQpO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKlxuICogLy8gU2V0IGFzIHRoZSBkZWZhdWx0IGFkYXB0ZXJcbiAqIEFkYXB0ZXIuc2V0Q3VycmVudCgncG9zdGdyZXMnKTtcbiAqXG4gKiAvLyBQZXJmb3JtIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCBhZGFwdGVyLmNyZWF0ZSgndXNlcnMnLCAxLCB7IG5hbWU6ICdKb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9KTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBBZGFwdGVyIHtcbiAqICAgICArWSBuYXRpdmVcbiAqICAgICArc3RyaW5nIGZsYXZvdXJcbiAqICAgICArc3RyaW5nIGFsaWFzXG4gKiAgICAgK2NyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgICArcmVhZCh0YWJsZU5hbWUsIGlkKVxuICogICAgICt1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK2RlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArc3RhdGljIGN1cnJlbnRcbiAqICAgICArc3RhdGljIGdldChmbGF2b3VyKVxuICogICAgICtzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyKVxuICogICB9XG4gKlxuICogICBjbGFzcyBSYXdFeGVjdXRvciB7XG4gKiAgICAgK3JhdyhxdWVyeSlcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgT2JzZXJ2YWJsZSB7XG4gKiAgICAgK29ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcilcbiAqICAgICArdW5PYnNlcnZlKG9ic2VydmVyKVxuICogICAgICt1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZClcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgT2JzZXJ2ZXIge1xuICogICAgICtyZWZyZXNoKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIEVycm9yUGFyc2VyIHtcbiAqICAgICArcGFyc2VFcnJvcihlcnIpXG4gKiAgIH1cbiAqXG4gKiAgIEFkYXB0ZXIgLS18PiBSYXdFeGVjdXRvclxuICogICBBZGFwdGVyIC0tfD4gT2JzZXJ2YWJsZVxuICogICBBZGFwdGVyIC0tfD4gT2JzZXJ2ZXJcbiAqICAgQWRhcHRlciAtLXw+IEVycm9yUGFyc2VyXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBZGFwdGVyPFxuICAgIENPTkYsXG4gICAgQ09OTixcbiAgICBRVUVSWSxcbiAgICBGTEFHUyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDT05URVhUIGV4dGVuZHMgQ29udGV4dDxGTEFHUz4gPSBDb250ZXh0PEZMQUdTPixcbiAgPlxuICBleHRlbmRzIExvZ2dlZENsYXNzXG4gIGltcGxlbWVudHNcbiAgICBSYXdFeGVjdXRvcjxRVUVSWT4sXG4gICAgQ29udGV4dHVhbDxGTEFHUywgQ09OVEVYVD4sXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBPYnNlcnZlcixcbiAgICBFcnJvclBhcnNlclxue1xuICBwcml2YXRlIHN0YXRpYyBfY3VycmVudEZsYXZvdXI6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pj4gPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VSZXBvc2l0b3J5OiBDb25zdHJ1Y3RvcjxcbiAgICBSZXBvc2l0b3J5PGFueSwgYW55LCBhbnksIGFueSwgYW55PlxuICA+O1xuICBwcml2YXRlIHN0YXRpYyBfYmFzZURpc3BhdGNoOiBDb25zdHJ1Y3RvcjxEaXNwYXRjaD47XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoPzogQWRhcHRlckRpc3BhdGNoO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvYnNlcnZlckhhbmRsZXI/OiBPYnNlcnZlckhhbmRsZXI7XG5cbiAgcHJvdGVjdGVkIF9jbGllbnQ/OiBDT05OO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmF0aXZlIHBlcnNpc3RlbmNlIGNvbmZpZ1xuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICAgKiBAdGVtcGxhdGUgQ09ORlxuICAgKiBAcmV0dXJuIHtDT05GfSBUaGUgbmF0aXZlIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICovXG4gIGdldCBjb25maWcoKTogQ09ORiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlcidzIGFsaWFzIG9yIGZsYXZvciBuYW1lXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGFsaWFzIGlmIHNldCwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGZsYXZvciBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFkYXB0ZXIncyBpZGVudGlmaWVyXG4gICAqL1xuICBnZXQgYWxpYXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXMgfHwgdGhpcy5mbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGFkYXB0ZXJcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0sIFFVRVJZLCBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4sIEZMQUdTLCBDT05URVhUPj59IFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yXG4gICAqL1xuICByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oKTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxcbiAgICAgIE0sXG4gICAgICBRVUVSWSxcbiAgICAgIEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIEZMQUdTLCBDT05URVhUPixcbiAgICAgIEZMQUdTLFxuICAgICAgQ09OVEVYVFxuICAgID5cbiAgPiB7XG4gICAgaWYgKCFBZGFwdGVyLl9iYXNlUmVwb3NpdG9yeSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgVGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiB3aGVuIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgcmVwbGFjZWQgbGF6aWx5YFxuICAgICAgKTtcbiAgICByZXR1cm4gQWRhcHRlci5fYmFzZVJlcG9zaXRvcnk7XG4gIH1cblxuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgYXN5bmMgc2h1dGRvd25Qcm94aWVzKGs/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucHJveGllcykgcmV0dXJuO1xuICAgIGlmIChrICYmICEoayBpbiB0aGlzLnByb3hpZXMpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHByb3h5IGZvdW5kIGZvciAke2t9YCk7XG4gICAgaWYgKCFrKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb3hpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByb3hpZXNba2V5XS5zaHV0ZG93bigpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBwcm94aWVkIGFkYXB0ZXIgJHtrZXl9OiAke2V9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMucHJveGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb3hpZXNba10uc2h1dGRvd24oKTtcbiAgICAgICAgZGVsZXRlIHRoaXMucHJveGllc1trXTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBwcm94aWVkIGFkYXB0ZXIgJHtrfTogJHtlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2h1dHMgZG93biB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgdGFza3MsIHN1Y2ggYXMgY2xvc2luZyBjb25uZWN0aW9uc1xuICAgKiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGVuc3VyZSB0byBjYWxsIHRoZSBiYXNlIG1ldGhvZCBmaXJzdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNodXRkb3duIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNodXRkb3duUHJveGllcygpO1xuICAgIGlmICh0aGlzLmRpc3BhdGNoKSBhd2FpdCB0aGlzLmRpc3BhdGNoLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgYWRhcHRlciB3aXRoIHRoZSBuYXRpdmUgZHJpdmVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIGFkYXB0ZXIgY2FjaGVcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IENPTkYsXG4gICAgcmVhZG9ubHkgZmxhdm91cjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHRoaXMuYWxpYXMgaW4gQWRhcHRlci5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYCR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBhbHJlYWR5IHJlZ2lzdGVyZWRgXG4gICAgICApO1xuICAgIEFkYXB0ZXIuX2NhY2hlW3RoaXMuYWxpYXNdID0gdGhpcztcbiAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgYENyZWF0ZWQgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyICR7dGhpcy5fYWxpYXMgPyBgKCR7dGhpcy5mbGF2b3VyfSkgYCA6IFwiXCJ9IHBlcnNpc3RlbmNlIGFkYXB0ZXJgXG4gICAgKTtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBEZWZpbmVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciBhcyBjdXJyZW50YCk7XG4gICAgICBBZGFwdGVyLl9jdXJyZW50Rmxhdm91ciA9IHRoaXMuYWxpYXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBzdGF0ZW1lbnQgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBxdWVyaWVzIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7U3RhdGVtZW50fSBBIHN0YXRlbWVudCBidWlsZGVyIGZvciB0aGUgbW9kZWxcbiAgICovXG4gIGFic3RyYWN0IFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFN0YXRlbWVudDxRVUVSWSwgTSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgZGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgZGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtEaXNwYXRjaH0gQSBuZXcgZGlzcGF0Y2ggaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBEaXNwYXRjaCgpOiBEaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBBZGFwdGVyLl9iYXNlRGlzcGF0Y2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBvYnNlcnZlciBoYW5kbGVyXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhbiBvYnNlcnZlciBoYW5kbGVyIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7T2JzZXJ2ZXJIYW5kbGVyfSBBIG5ldyBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb2x1bW4gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFhdHRyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBkYXRhYmFzZSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGRhdGFiYXNlLXNwZWNpZmljIGVycm9ycyBpbnRvIHN0YW5kYXJkaXplZCBhcHBsaWNhdGlvbiBlcnJvcnNcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIG9yaWdpbmFsIGRhdGFiYXNlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gQSBzdGFuZGFyZGl6ZWQgZXJyb3JcbiAgICovXG4gIGFic3RyYWN0IHBhcnNlRXJyb3IoZXJyOiBFcnJvcik6IEJhc2VFcnJvcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGFueSBuZWNlc3Nhcnkgc2V0dXAgZm9yIHRoZSBhZGFwdGVyLCBzdWNoIGFzIGVzdGFibGlzaGluZyBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgcmVwb3NpdG9yeSBmbGFncyBmb3IgYW4gb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHNldCBvZiBmbGFncyB0aGF0IGRlc2NyaWJlIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCBjb21iaW5pbmcgZGVmYXVsdCBmbGFncyB3aXRoIG92ZXJyaWRlc1xuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IEZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxGPn0gVGhlIGNvbXBsZXRlIHNldCBvZiBmbGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxGTEFHUz4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RkxBR1M+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJlcG9zaXRvcnlGbGFncywgZmxhZ3MsIHtcbiAgICAgIGFmZmVjdGVkVGFibGVzOiBnZXRUYWJsZU5hbWUobW9kZWwpLFxuICAgICAgd3JpdGVPcGVyYXRpb246IG9wZXJhdGlvbiAhPT0gT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgfSkgYXMgRkxBR1M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb250ZXh0IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0IGNsYXNzIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhpcyBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgQ29udGV4dCA9IENvbnRleHQ8RkxBR1M+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNvbnRleHQgZm9yIGEgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGNvbnRleHQgb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCB1c2VkIGZvciB0cmFja2luZyBhbmQgYXVkaXRpbmdcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLkNSRUFURXxPcGVyYXRpb25LZXlzLlJFQUR8T3BlcmF0aW9uS2V5cy5VUERBVEV8T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IG92ZXJyaWRlcyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRleHQgb2JqZWN0XG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZMQUdTPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxDT05URVhUPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY29udGV4dCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyBjb250ZXh0IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uIG9uICR7bW9kZWwubmFtZX0gbW9kZWwgd2l0aCBmbGFnIG92ZXJyaWRlczogJHtKU09OLnN0cmluZ2lmeShvdmVycmlkZXMpfWBcbiAgICApO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBvdmVycmlkZXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZShmbGFncykgYXMgdW5rbm93biBhcyBDT05URVhUO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBwZXJzaXN0ZW5jZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIGludG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGFiYXNlIHN0b3JhZ2UsXG4gICAqIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nIGFuZCBzZXBhcmF0aW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTVxuICApOiB7XG4gICAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQgPSBtb2RlbFRvVHJhbnNpZW50KG1vZGVsKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhzcGxpdC5tb2RlbCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gYWNjdW07XG4gICAgICAgIGNvbnN0IG1hcHBlZFByb3AgPSBnZXRDb2x1bW5OYW1lKG1vZGVsLCBrZXkpO1xuICAgICAgICBpZiAodGhpcy5pc1Jlc2VydmVkKG1hcHBlZFByb3ApKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSBuYW1lICR7bWFwcGVkUHJvcH0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgICAgYWNjdW1bbWFwcGVkUHJvcF0gPSB2YWw7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiByZXN1bHQsXG4gICAgICBpZDogbW9kZWxbcGtdIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGRhdGFiYXNlIGRhdGEgYmFjayBpbnRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVjb25zdHJ1Y3RzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBkYXRhYmFzZSBkYXRhLCBoYW5kbGluZyBjb2x1bW4gbWFwcGluZ1xuICAgKiBhbmQgcmVhdHRhY2hpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0gb2JqIC0gVGhlIGRhdGFiYXNlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ3xDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcGFyYW0gW3RyYW5zaWVudF0gLSBUcmFuc2llbnQgcHJvcGVydGllcyB0byByZWF0dGFjaFxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBjb25zdCBvYjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIG9iW3BrIGFzIHN0cmluZ10gPSBpZDtcbiAgICBjb25zdCBtID0gKFxuICAgICAgdHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiID8gTW9kZWwuYnVpbGQob2IsIGNsYXp6KSA6IG5ldyBjbGF6eihvYilcbiAgICApIGFzIE07XG4gICAgbG9nLnNpbGx5KGBSZWJ1aWxkaW5nIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfWApO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gb2JqW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBwaykgcmV0dXJuIGFjY3VtO1xuICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPSBvYmpbZ2V0Q29sdW1uTmFtZShhY2N1bSwga2V5KV07XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgbSk7XG5cbiAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gcmVzdWx0KVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFRyYW5zaWVudCBwcm9wZXJ0eSAke2tleX0gYWxyZWFkeSBleGlzdHMgb24gbW9kZWwgJHttLmNvbnN0cnVjdG9yLm5hbWV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgICByZXN1bHRba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nICR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHttLmNvbnN0cnVjdG9yLm5hbWV9IGlkICR7aWR9OiAke21ldGFkYXRhfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgYSBuZXcgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGFuZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGluc2VydCBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgZm9yIHRoZSBuZXcgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgZGF0YSB0byBpbnNlcnQgZm9yIGVhY2ggcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy5jcmVhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJlYWQgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFJlYWRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5yZWFkKHRhYmxlTmFtZSwgaSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgYW4gZXhpc3RpbmcgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGluIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSAgbW9kZWwgLSBUaGUgbmV3IGRhdGEgZm9yIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyBtdWx0aXBsZSBleGlzdGluZyByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbmV3IGRhdGEgZm9yIGVhY2ggcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgVXBkYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy51cGRhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgZGVsZXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBEZWxldGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaWQubWFwKChpKSA9PiB0aGlzLmRlbGV0ZSh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBleGVjdXRpbmcgZGF0YWJhc2Utc3BlY2lmaWMgcXVlcmllcyBkaXJlY3RseVxuICAgKiBAdGVtcGxhdGUgUSAtIFRoZSByYXcgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcXVlcnlcbiAgICogQHBhcmFtIHtRfSByYXdJbnB1dCAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqL1xuICBhYnN0cmFjdCByYXc8Uj4ocmF3SW5wdXQ6IFFVRVJZLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRvIGJlIG5vdGlmaWVkIGFib3V0IGRhdGFiYXNlIGNoYW5nZXMuIFRoZSBvYnNlcnZlciBjYW4gb3B0aW9uYWxseVxuICAgKiBwcm92aWRlIGEgZmlsdGVyIGZ1bmN0aW9uIHRvIHJlY2VpdmUgb25seSBzcGVjaWZpYyBldmVudHMuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJGaWx0ZXJ9IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwib2JzZXJ2ZXJIYW5kbGVyXCIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuT2JzZXJ2ZXJIYW5kbGVyKCksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMub2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBSZWdpc3RlcmluZyBuZXcgb2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfWApO1xuICAgIGlmICghdGhpcy5kaXNwYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZm9yKHRoaXMub2JzZXJ2ZSkuaW5mbyhgQ3JlYXRpbmcgZGlzcGF0Y2ggZm9yICR7dGhpcy5hbGlhc31gKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLkRpc3BhdGNoKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoLm9ic2VydmUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIG9ic2VydmVyIHNvIGl0IG5vIGxvbmdlciByZWNlaXZlcyBkYXRhYmFzZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVuT2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBPYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9IHJlbW92ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IFNlbmRzIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZSxcbiAgICogZmlsdGVyaW5nIGJhc2VkIG9uIGVhY2ggb2JzZXJ2ZXIncyBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciBhZGFwdGVyICR7dGhpcy5hbGlhc31gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBpZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgZGF0YSBiYXNlZCBvbiBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IEltcGxlbWVudGF0aW9uIG9mIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgbWV0aG9kIHRoYXQgZGVsZWdhdGVzIHRvIHVwZGF0ZU9ic2VydmVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGV2ZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlZnJlc2ggaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkYXB0ZXJcbiAgICovXG4gIG92ZXJyaWRlIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmZsYXZvdXJ9IHBlcnNpc3RlbmNlIEFkYXB0ZXJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGZsYXZvciBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgZmxhdm9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY2xhc3NcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyIGZsYXZvciBuYW1lXG4gICAqL1xuICBzdGF0aWMgZmxhdm91ck9mPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YSh0aGlzLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgdGhpcy5jdXJyZW50Py5mbGF2b3VyXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY3VycmVudEZsYXZvdXIoKSB7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcGVyc2lzdGVuY2UgZmxhdm91ciBzZXQuIFBsZWFzZSBpbml0aWFsaXplIHlvdXIgYWRhcHRlcmBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gVGhlIGN1cnJlbnQgYWRhcHRlclxuICAgKi9cbiAgc3RhdGljIGdldCBjdXJyZW50KCk6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFkYXB0ZXIuZ2V0KHRoaXMuY3VycmVudEZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGFkYXB0ZXIgYnkgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlZ2lzdGVyZWQgYWRhcHRlciBieSBpdHMgZmxhdm9yIG5hbWVcbiAgICogQHRlbXBsYXRlIENPTkYgLSBUaGUgZGF0YWJhc2UgZHJpdmVyIGNvbmZpZ1xuICAgKiBAdGVtcGxhdGUgQ09OTiAtIFRoZSBkYXRhYmFzZSBkcml2ZXIgaW5zdGFuY2VcbiAgICogQHRlbXBsYXRlIFFVRVJZIC0gVGhlIHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIENDT05URVhUIC0gVGhlIGNvbnRleHQgdHlwZVxuICAgKiBAdGVtcGxhdGUgRkxBR1MgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIENPTlRFWFQsIEZMQUdTPiB8IHVuZGVmaW5lZH0gVGhlIGFkYXB0ZXIgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldDxcbiAgICBDT05GLFxuICAgIENPTk4sXG4gICAgUVVFUlksXG4gICAgQ09OVEVYVCBleHRlbmRzIENvbnRleHQ8RkxBR1M+LFxuICAgIEZMQUdTIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICA+KGZsYXZvdXI/OiBhbnkpOiBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4gfCB1bmRlZmluZWQge1xuICAgIGlmICghZmxhdm91cikgcmV0dXJuIEFkYXB0ZXIuZ2V0KHRoaXMuX2N1cnJlbnRGbGF2b3VyKTtcbiAgICBpZiAoZmxhdm91ciBpbiB0aGlzLl9jYWNoZSkgcmV0dXJuIHRoaXMuX2NhY2hlW2ZsYXZvdXJdO1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBBZGFwdGVyIHJlZ2lzdGVyZWQgdW5kZXIgJHtmbGF2b3VyfS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ2hhbmdlcyB3aGljaCBhZGFwdGVyIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG5hbWUgb2YgdGhlIGFkYXB0ZXIgdG8gc2V0IGFzIGN1cnJlbnRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRDdXJyZW50KGZsYXZvdXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnRGbGF2b3VyID0gZmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1ldGFkYXRhIGtleVxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBzdGFuZGFyZGl6ZWQgbWV0YWRhdGEga2V5IGZvciBwZXJzaXN0ZW5jZS1yZWxhdGVkIG1ldGFkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgYmFzZSBrZXkgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgbWV0YWRhdGEga2V5XG4gICAqL1xuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFJlcG8ua2V5KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIG1vZGVscyBhc3NvY2lhdGVkIHdpdGggYW4gYWRhcHRlciBmbGF2b3JcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBtb2RlbCBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCB0byB1c2UgYSBzcGVjaWZpYyBhZGFwdGVyIGZsYXZvclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGFkYXB0ZXIgZmxhdm9yIHRvIGZpbmQgbW9kZWxzIGZvclxuICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9yc1xuICAgKi9cbiAgc3RhdGljIG1vZGVsczxNIGV4dGVuZHMgTW9kZWw+KGZsYXZvdXI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IChNb2RlbCBhcyBhbnkpLmdldFJlZ2lzdHJ5KCkgYXMgTW9kZWxSZWdpc3RyeTxhbnk+O1xuICAgICAgY29uc3QgY2FjaGUgPSAoXG4gICAgICAgIHJlZ2lzdHJ5IGFzIHVua25vd24gYXMgeyBjYWNoZTogUmVjb3JkPHN0cmluZywgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+PiB9XG4gICAgICApLmNhY2hlO1xuICAgICAgY29uc3QgbWFuYWdlZE1vZGVsczogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10gPSBPYmplY3QudmFsdWVzKGNhY2hlKVxuICAgICAgICAubWFwKChtOiBNb2RlbENvbnN0cnVjdG9yPE0+KSA9PiB7XG4gICAgICAgICAgbGV0IGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmICYmIGYgPT09IGZsYXZvdXIpIHJldHVybiBtO1xuICAgICAgICAgIGlmICghZikge1xuICAgICAgICAgICAgY29uc3QgcmVwbyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIFJlcG8ua2V5KERCS2V5cy5SRVBPU0lUT1JZKSxcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXJlcG8pIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSAodGhpcy5fYmFzZVJlcG9zaXRvcnkgYXMgYW55KS5mb3JNb2RlbChtKTtcblxuICAgICAgICAgICAgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgcmVwb3NpdG9yeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigobSkgPT4gISFtKTtcbiAgICAgIHJldHVybiBtYW5hZ2VkTW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGRlY29yYXRpb24oKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBwcm94aWVzPzogUmVjb3JkPHN0cmluZywgdHlwZW9mIHRoaXM+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgY2xpZW50IGluc3RhbmNlIGZvciB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHJldHVybiB0aGUgY2xpZW50IGluc3RhbmNlIGZvciB0aGUgYWRhcHRlci5cbiAgICogQHRlbXBsYXRlIENPTiAtIFRoZSB0eXBlIG9mIHRoZSBjbGllbnQgaW5zdGFuY2VcbiAgICogQHJldHVybiB7Q09OfSBUaGUgY2xpZW50IGluc3RhbmNlIGZvciB0aGUgYWRhcHRlclxuICAgKiBAYWJzdHJhY3RcbiAgICogQGZ1bmN0aW9uIGdldENsaWVudFxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAgICogQGluc3RhbmNlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGllbnQoKTogQ09OTjtcblxuICBAZmluYWwoKVxuICBnZXQgY2xpZW50KCk6IENPTk4ge1xuICAgIGlmICghdGhpcy5fY2xpZW50KSB7XG4gICAgICB0aGlzLl9jbGllbnQgPSB0aGlzLmdldENsaWVudCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBmb3IoY29uZmlnOiBQYXJ0aWFsPENPTkY+LCAuLi5hcmdzOiBhbnlbXSk6IHR5cGVvZiB0aGlzIHtcbiAgICBpZiAoIXRoaXMucHJveGllcykgdGhpcy5wcm94aWVzID0ge307XG4gICAgY29uc3Qga2V5ID0gYCR7dGhpcy5hbGlhc30gLSAke2hhc2hPYmooY29uZmlnKX1gO1xuICAgIGlmIChrZXkgaW4gdGhpcy5wcm94aWVzKSByZXR1cm4gdGhpcy5wcm94aWVzW2tleV0gYXMgdHlwZW9mIHRoaXM7XG5cbiAgICBsZXQgY2xpZW50OiBhbnk7XG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcywgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcIl9jb25maWdcIikge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ29uZjogQ09ORiA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbENvbmYsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgICAgc2V0OiAodGFyZ2V0OiBhbnksIHA6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY2xpZW50XCIpIHtcbiAgICAgICAgICBjbGllbnQgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwLCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3hpZXNba2V5XSA9IHByb3h5O1xuICAgIHJldHVybiBwcm94eTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bWVyYXRpb24gb2YgcG9zc2libGUgc29ydCBkaXJlY3Rpb25zLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYXZhaWxhYmxlIHNvcnQgZGlyZWN0aW9ucyBmb3Igb3JkZXJpbmcgcXVlcnkgcmVzdWx0cy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBPcmRlckRpcmVjdGlvbiB7XG4gIC8qKiBBc2NlbmRpbmcgb3JkZXIgKEEgdG8gWiwgMCB0byA5KSAqL1xuICBBU0MgPSBcImFzY1wiLFxuXG4gIC8qKiBEZXNjZW5kaW5nIG9yZGVyIChaIHRvIEEsIDkgdG8gMCkgKi9cbiAgRFNDID0gXCJkZXNjXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW1lcmF0aW9uIG9mIGNhc2NhZGUgb3BlcmF0aW9uIHR5cGVzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYXZhaWxhYmxlIGNhc2NhZGUgYmVoYXZpb3JzIGZvciBlbnRpdHkgcmVsYXRpb25zaGlwcy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBDYXNjYWRlIHtcbiAgLyoqIFBlcmZvcm0gY2FzY2FkZSBvcGVyYXRpb24gb24gcmVsYXRlZCBlbnRpdGllcyAqL1xuICBDQVNDQURFID0gXCJjYXNjYWRlXCIsXG4gIC8qKiBEbyBub3QgcGVyZm9ybSBjYXNjYWRlIG9wZXJhdGlvbiBvbiByZWxhdGVkIGVudGl0aWVzICovXG4gIE5PTkUgPSBcIm5vbmVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgb2YgdGhlIGRlZmF1bHQgY2FzY2FkZSBjb25maWd1cmF0aW9uIG9iamVjdCB1c2VkIGluIHJlcG9zaXRvcmllcy5cbiAqIEBzdW1tYXJ5IERvY3VtZW50cyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjYXNjYWRlIGNvbmZpZ3VyYXRpb24gd2l0aCBleHBsaWNpdCB1cGRhdGUgYW5kIGRlbGV0ZSBiZWhhdmlvcnMuXG4gKiBAcHJvcGVydHkgeydjYXNjYWRlJ3wnbm9uZSd9IHVwZGF0ZSAtIERldGVybWluZXMgd2hldGhlciB1cGRhdGVzIGNhc2NhZGUgdG8gcmVsYXRlZCBlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7J2Nhc2NhZGUnfCdub25lJ30gZGVsZXRlIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIGRlbGV0ZXMgY2FzY2FkZSB0byByZWxhdGVkIGVudGl0aWVzLlxuICogQHR5cGVEZWYgRGVmYXVsdENhc2NhZGVDb25maWdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdENhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxufTtcbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFVuc3VwcG9ydGVkRXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc2VxdWVuY2VOYW1lRm9yTW9kZWwgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgdmFsdWVzIChsaWtlIHByaW1hcnkga2V5cykgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLlxuICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3MgaGFuZGxlIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHNlcXVlbmNlcyBhcmUgc3RvcmVkIGFuZCBpbmNyZW1lbnRlZCBpbiBkaWZmZXJlbnRcbiAqIGRhdGFiYXNlIHN5c3RlbXMuXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlIGdlbmVyYXRvclxuICogQGNsYXNzIFNlcXVlbmNlXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZVxuICogY2xhc3MgUG9zdGdyZXNTZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAqICAgY29uc3RydWN0b3Iob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7XG4gKiAgICAgc3VwZXIob3B0aW9ucyk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgbmV4dCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgbmV4dHZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5uZXh0dmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHRvIGdldCBjdXJyZW50IHZhbHVlIGZyb20gUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy5leGVjdXRvci5yYXcoYFNFTEVDVCBjdXJydmFsKCcke3RoaXMub3B0aW9ucy5uYW1lfScpYCk7XG4gKiAgICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdC5yb3dzWzBdLmN1cnJ2YWwpO1xuICogICB9XG4gKlxuICogICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHRvIGdldCBhIHJhbmdlIG9mIHZhbHVlc1xuICogICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAqICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAqICAgICAgIHZhbHVlcy5wdXNoKGF3YWl0IHRoaXMubmV4dCgpKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHZhbHVlcztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIFVzYWdlXG4gKiBjb25zdCBzZXF1ZW5jZSA9IG5ldyBQb3N0Z3Jlc1NlcXVlbmNlKHtcbiAqICAgbmFtZTogJ3VzZXJfaWRfc2VxJyxcbiAqICAgZXhlY3V0b3I6IGRiRXhlY3V0b3JcbiAqIH0pO1xuICpcbiAqIGNvbnN0IG5leHRJZCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VxdWVuY2Uge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBMYXppbHkgaW5pdGlhbGl6ZWQgbG9nZ2VyIGZvciB0aGUgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjZXNzb3IgZm9yIHRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgR2V0cyBvciBpbml0aWFsaXplcyB0aGUgbG9nZ2VyIGZvciB0aGlzIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGxvZ2dlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNlcXVlbmNlIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnNcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHNlcXVlbmNlLCBpbmNyZW1lbnRpbmcgaXQgaW4gdGhlIHByb2Nlc3NcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IG5leHQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZSB3aXRob3V0IGluY3JlbWVudGluZyBpdFxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgcmFuZ2Ugb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIG11bHRpcGxlIHNlcXVlbnRpYWwgdmFsdWVzIGF0IG9uY2UsIHdoaWNoIGNhbiBiZSBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgbmV4dCgpIG11bHRpcGxlIHRpbWVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2Ygc2VxdWVudGlhbCB2YWx1ZXMgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKi9cbiAgYWJzdHJhY3QgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBwcmltYXJ5IGtleSBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFV0aWxpdHkgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc3RhbmRhcmRpemVkIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TXxDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2VxdWVuY2UgbmFtZSBmb3IgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICovXG4gIHN0YXRpYyBwazxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICByZXR1cm4gc2VxdWVuY2VOYW1lRm9yTW9kZWwobW9kZWwsIFwicGtcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgc2VxdWVuY2UgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlIChOdW1iZXIgb3IgQmlnSW50KVxuICAgKiBAcGFyYW0ge1wiTnVtYmVyXCJ8XCJCaWdJbnRcInx1bmRlZmluZWR9IHR5cGUgLSBUaGUgdGFyZ2V0IHR5cGUgdG8gY29udmVydCB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gICAqIEByZXR1cm4ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBUaGUgY29udmVydGVkIHZhbHVlXG4gICAqL1xuICBzdGF0aWMgcGFyc2VWYWx1ZShcbiAgICB0eXBlOiBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICk6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHBhcnNlSW50KHZhbHVlKVxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6IEJpZ0ludCh2YWx1ZSk7XG4gICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgIHJldHVybiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBzZXF1ZW5jZSB0eXBlOiAke3R5cGV9IGZvciBhZGFwdGVyICR7dGhpc31gXG4gICAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yIGEgbW9kZWwgc2hvdWxkIHVzZVxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byBhIG1vZGVsIGNsYXNzIHRvIGluZGljYXRlIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yXG4gKiBzaG91bGQgYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGF0YWJhc2Ugb3BlcmF0aW9ucyBvbiBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiBUaGUgZmxhdm9yIGlzIGEgc3RyaW5nXG4gKiBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSByZWdpc3RlcmVkIGFkYXB0ZXIgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFkYXB0ZXIgZmxhdm9yIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBtb2RlbCBjbGFzc1xuICogQGZ1bmN0aW9uIHVzZXNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzKGZsYXZvdXI6IHN0cmluZykge1xuICByZXR1cm4gZnVuY3Rpb24gdXNlcyhvcmlnaW5hbDogYW55KSB7XG4gICAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgZmxhdm91cikpKFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBDb250ZXh0LFxuICBEQktleXMsXG4gIERlZmF1bHRTZXBhcmF0b3IsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB3cmFwTWV0aG9kV2l0aENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFdoZXJlT3B0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L29wdGlvbnNcIjtcbmltcG9ydCB7IE9yZGVyQnlTZWxlY3RvciwgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnkvc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lLCBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXZlbnRJZHMsXG4gIEluZmVycmVkQWRhcHRlckNvbmZpZyxcbiAgdHlwZSBPYnNlcnZlckZpbHRlcixcbn0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgYWxpYXMgZm9yIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBzaW1wbGlmaWVkIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbW9yZSBjb25jaXNlIHdheSB0byByZWZlcmVuY2UgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICogQHR5cGVkZWYgUmVwb1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcG88XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IGFueSxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBhbnksXG4gIFEgPSBhbnksXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBRLCBGLCBDPiA9IGFueSxcbj4gPSBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gbW9kZWxzIG9uIGEgdGFibGUgYnkgdGFibGUgd2F5LlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeWluZyBjYXBhYmlsaXRpZXMsIGFuZCBvYnNlcnZlciBwYXR0ZXJuIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbCBwZXJzaXN0ZW5jZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGZvciBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtBfSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVwb3NpdG9yeSBpbml0aWFsaXphdGlvbi5cbiAqIEBjbGFzcyBSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCB1c2VyUmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoVXNlcik7XG4gKlxuICogLy8gVXNpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdKb2huJyB9KSk7XG4gKiBjb25zdCByZXRyaWV2ZWRVc2VyID0gYXdhaXQgdXNlclJlcG8ucmVhZCh1c2VyLmlkKTtcbiAqIHVzZXIubmFtZSA9ICdKYW5lJztcbiAqIGF3YWl0IHVzZXJSZXBvLnVwZGF0ZSh1c2VyKTtcbiAqIGF3YWl0IHVzZXJSZXBvLmRlbGV0ZSh1c2VyLmlkKTtcbiAqXG4gKiAvLyBRdWVyeWluZyB3aXRoIGNvbmRpdGlvbnNcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgdXNlclJlcG9cbiAqICAgLnNlbGVjdCgpXG4gKiAgIC53aGVyZSh7IG5hbWU6ICdKYW5lJyB9KVxuICogICAub3JkZXJCeSgnY3JlYXRlZEF0JywgT3JkZXJEaXJlY3Rpb24uRFNDKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICpcbiAqICAgQy0+PitSOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5SOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFItPj4rQTogcHJlcGFyZShtb2RlbClcbiAqICAgQS0tPj4tUjogcHJlcGFyZWQgZGF0YVxuICogICBSLT4+K0E6IGNyZWF0ZSh0YWJsZSwgaWQsIHJlY29yZClcbiAqICAgQS0+PitEQjogSW5zZXJ0IE9wZXJhdGlvblxuICogICBEQi0tPj4tQTogUmVzdWx0XG4gKiAgIEEtLT4+LVI6IHJlY29yZFxuICogICBSLT4+K0E6IHJldmVydChyZWNvcmQpXG4gKiAgIEEtLT4+LVI6IG1vZGVsIGluc3RhbmNlXG4gKiAgIFItPj5SOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFItPj4rTzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBDUkVBVEUsIGlkKVxuICogICBPLS0+Pi1SOiBOb3RpZmljYXRpb24gY29tcGxldGVcbiAqICAgUi0tPj4tQzogY3JlYXRlZCBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeTxcbiAgICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gICAgUSxcbiAgICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgZXh0ZW5kcyBSZXA8TSwgRiwgQz5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUXVlcmlhYmxlPE0+LCBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQ29uc3RydWN0b3I8UmVwbzxNb2RlbD4+IHwgUmVwbzxNb2RlbD5cbiAgPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfb3ZlcnJpZGVzPzogUGFydGlhbDxGPjtcblxuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvZ2dlciBmb3IgdGhpcyByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcilcbiAgICAgIHRoaXMubG9nZ2VyID0gKFxuICAgICAgICB0aGlzLmFkYXB0ZXJbXCJsb2dcIiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5hZGFwdGVyXSBhcyBMb2dnZXJcbiAgICAgICkuZm9yKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICAgKiBAcmV0dXJuIHtBfSBUaGUgYWRhcHRlciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyBmb3VuZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUYWJsZSBuYW1lIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHByb3BlcnRpZXMgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBzZXF1ZW5jZSBvcHRpb25zIGNvbnRhaW5pbmcgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IHBrUHJvcHMoKTogU2VxdWVuY2VPcHRpb25zIHtcbiAgICByZXR1cm4gc3VwZXIucGtQcm9wcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHtcbiAgICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoY2xhenosIHRoaXMsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgY2xhenpcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZsYXZvdXIgJiYgZmxhdm91ciAhPT0gYWRhcHRlci5mbGF2b3VyKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSW5jb21wYXRpYmxlIGZsYXZvdXJzXCIpO1xuICAgICAgICB1c2VzKGFkYXB0ZXIuZmxhdm91cikoY2xhenopO1xuICAgICAgfVxuICAgIH1cbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgICAgbSxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm94eSB3aXRoIG92ZXJyaWRkZW4gcmVwb3NpdG9yeSBmbGFncy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgZmxhZ3Mgb3ZlcnJpZGRlbi5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIFRoZSBmbGFncyB0byBvdmVycmlkZS5cbiAgICogQHJldHVybiB7UmVwb3NpdG9yeX0gQSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBvdmVycmlkZGVuIGZsYWdzLlxuICAgKi9cbiAgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8Rj4pOiBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm92ZXJyaWRlKVxuICAgICAgLmRlYnVnKGBPdmVycmlkaW5nIHJlcG9zaXRvcnkgZmxhZ3Mgd2l0aCAke0pTT04uc3RyaW5naWZ5KGZsYWdzKX1gKTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKHAgIT09IFwiX292ZXJyaWRlc1wiKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0LCBmbGFncyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggYSBzcGVjaWZpYyBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHR5cGUgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHRlbXBsYXRlIEMgLSBUaGUgdHlwZSBvZiB0aGUgY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj59IGNvbmYgLSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25zIHRvIG92ZXJyaWRlLlxuICAgKiBAcGFyYW0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYW5kIGFyZ3VtZW50cy5cbiAgICovXG4gIGZvcihcbiAgICBjb25mOiBQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcImFkYXB0ZXJcIikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZm9yKGNvbmYsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlci5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgcHJlcGFyZXMgaXQgZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZSB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICBsZXQgYzogQyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQztcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQb3N0LWNyZWF0aW9uIGhvb2suXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGFmdGVyIGEgbW9kZWwgaXMgY3JlYXRlZCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBjcmVhdGVkIG1vZGVsLlxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBwcm9jZXNzZWQgbW9kZWwuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlU3VmZml4KG1vZGVsLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgY3JlYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgICBjb25zdCBvcHRzID0gUmVwb3NpdG9yeS5nZXRTZXF1ZW5jZU9wdGlvbnMobW9kZWxzWzBdKTtcbiAgICBsZXQgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgaWYgKCFvcHRzLm5hbWUpIG9wdHMubmFtZSA9IFNlcXVlbmNlLnBrKG1vZGVsc1swXSk7XG4gICAgICBpZHMgPSBhd2FpdCAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKG9wdHMpKS5yYW5nZShtb2RlbHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bdGhpcy5wa10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgUHJpbWFyeSBrZXkgaXMgbm90IGRlZmluZWQgZm9yIG1vZGVsIGluIHBvc2l0aW9uICR7aX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1bdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgaWYgKG9wdHMudHlwZSkgbVt0aGlzLnBrXSA9IGlkc1tpXSBhcyBNW2tleW9mIE1dO1xuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBpZ25vcmVkUHJvcHMgPVxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyguLi5pZ25vcmVkUHJvcHMpKSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGVycm9ycy5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgIGlmIChlKVxuICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgdW5kZWZpbmVkKTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2VzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9yTWVzc2FnZXMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgYSBtb2RlbCBieSBJRC5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIHJlYWRpbmcgYSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIG1vZGVsW3RoaXMucGtdID0ga2V5IGFzIE1ba2V5b2YgTV07XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIG11bHRpcGxlIG1vZGVscyBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGxQcmVmaXgoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgICAgICBtW3RoaXMucGtdID0gayBhcyBNW2tleW9mIE1dO1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGNoYW5nZXMgdG8gYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCB3aXRoIHJlZnJlc2hlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciB1cGRhdGUgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgdGhlIG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgcGsgPSBtb2RlbFt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgaWYgKCFwaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICk7XG4gICAgY29uc3Qgb2xkTW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQocGssIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgICBvbGRNb2RlbCxcbiAgICAgICAgLi4uUmVwb3NpdG9yeS5yZWxhdGlvbnModGhpcy5jbGFzcyksXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSkge1xuICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG1vZGVsKSlcbiAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtb2RlbCwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIG11bHRpcGxlIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBiYXRjaCBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSB1cGRhdGVkIG1vZGVscyB3aXRoIHJlZnJlc2hlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZS5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYW55IG1vZGVsIGhhcyBubyBwcmltYXJ5IGtleSB2YWx1ZS5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgaWRzID0gbW9kZWxzLm1hcCgobSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIGlmICghaWQpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwibWlzc2luZyBpZCBvbiB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuICAgIGNvbnN0IG9sZE1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgIG0gPSB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSk7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgICAgICBvbGRNb2RlbHNbaV1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBpZ25vcmVkUHJvcHMgPVxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0sIG0sIC4uLmlnbm9yZWRQcm9wcykpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcblxuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgYSBtb2RlbCBieSBJRC5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7YW55fSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZVByZWZpeChrZXk6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGtleSwgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVBbGxQcmVmaXgoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgbW9kZWxzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRob3V0IHNwZWNpZnlpbmcgZmllbGRzLlxuICAgKiBAc3VtbWFyeSBTdGFydHMgYnVpbGRpbmcgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIGFsbCBmaWVsZHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzZWxlY3Q8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdLFxuICA+KCk6IFdoZXJlT3B0aW9uPE0sIE1bXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VsZWN0IHF1ZXJ5IHdpdGggc3BlY2lmaWMgZmllbGRzLlxuICAgKiBAc3VtbWFyeSBTdGFydHMgYnVpbGRpbmcgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIG9ubHkgdGhlIHNwZWNpZmllZCBmaWVsZHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkcy5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBXaGVyZU9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VsZWN0IG1ldGhvZC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBtb2RlbCB3aXRoIG9wdGlvbmFsIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gW3NlbGVjdG9yXSAtIE9wdGlvbmFsIGZpZWxkcyB0byBzZWxlY3QuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyLlxuICAgKi9cbiAgc2VsZWN0PFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdPihcbiAgICBzZWxlY3Rvcj86IHJlYWRvbmx5IFsuLi5TXVxuICApOiBXaGVyZU9wdGlvbjxNLCBNW10+IHwgV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyXG4gICAgICAuU3RhdGVtZW50PE0+KClcbiAgICAgIC5zZWxlY3Qoc2VsZWN0b3IgYXMgcmVhZG9ubHkgWy4uLlNdKVxuICAgICAgLmZyb20odGhpcy5jbGFzcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcXVlcnkgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbnMgYW5kIG9wdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc2ltcGxpZmllZCB3YXkgdG8gcXVlcnkgdGhlIGRhdGFiYXNlIHdpdGggY29tbW9uIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGZpbHRlciByZWNvcmRzLlxuICAgKiBAcGFyYW0gb3JkZXJCeSAtIFRoZSBmaWVsZCB0byBvcmRlciByZXN1bHRzIGJ5LlxuICAgKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbb3JkZXI9T3JkZXJEaXJlY3Rpb24uQVNDXSAtIFRoZSBzb3J0IGRpcmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gLSBPcHRpb25hbCBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXSAtIE9wdGlvbmFsIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHF1ZXJ5IHJlc3VsdHMgYXMgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4sXG4gICAgb3JkZXJCeToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlclxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHNvcnQ6IE9yZGVyQnlTZWxlY3RvcjxNPiA9IFtvcmRlckJ5LCBvcmRlciBhcyBPcmRlckRpcmVjdGlvbl07XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlbGVjdCgpLndoZXJlKGNvbmRpdGlvbikub3JkZXJCeShzb3J0KTtcbiAgICBpZiAobGltaXQpIHF1ZXJ5LmxpbWl0KGxpbWl0KTtcbiAgICBpZiAoc2tpcCkgcXVlcnkub2Zmc2V0KHNraXApO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIG1vZGVscyBpbiB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciB0byBsaW1pdCB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI29ic2VydmV9XG4gICAqL1xuICBAZmluYWwoKVxuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwib2JzZXJ2ZXJIYW5kbGVyXCIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuT2JzZXJ2ZXJIYW5kbGVyKCksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgdGhpcy5hZGFwdGVyLm9ic2VydmUodGhpcywgKHRhYmxlOiBzdHJpbmcpID0+IHRhYmxlTmFtZSA9PT0gdGFibGUpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYG5vdyBvYnNlcnZpbmcgJHt0aGlzLmFkYXB0ZXJ9IGZpbHRlcmluZyBvbiB0YWJsZSA9PT0gJHt0YWJsZU5hbWV9YFxuICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgbG9nLnZlcmJvc2UoYFJlZ2lzdGVyZWQgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gb2JzZXJ2ZXIgc28gaXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSN1bk9ic2VydmV9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gbW9yZSBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBmb3IgJHt0aGlzLmFkYXB0ZXJ9LCB1bnN1YnNjcmliaW5nYFxuICAgICAgKTtcbiAgICAgIHRoaXMuYWRhcHRlci51bk9ic2VydmUodGhpcyk7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBObyBsb25nZXIgb2JzZXJ2aW5nIGFkYXB0ZXIgJHt0aGlzLmFkYXB0ZXIuZmxhdm91cn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgb2YgYW4gZXZlbnQuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSBkYXRhYmFzZSBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG9ic2VydmVyIGhhbmRsZXIgaXMgbm90IGluaXRpYWxpemVkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVwZGF0ZU9ic2VydmVycylcbiAgICAgIC52ZXJib3NlKFxuICAgICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgICApO1xuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRoaXMubG9nLFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIEFycmF5LmlzQXJyYXkoaWQpXG4gICAgICAgID8gaWQubWFwKChpKSA9PiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpKSBhcyBzdHJpbmcpXG4gICAgICAgIDogKFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5wa1Byb3BzLnR5cGUsIGlkKSBhcyBzdHJpbmcpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB1cGRhdGVPYnNlcnZlcnMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgb2YgYW4gZXZlbnQgKGFsaWFzIGZvciB1cGRhdGVPYnNlcnZlcnMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3IgcmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIGEgcmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUmVwbzxNPi5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgZGVmYXVsdCBhZGFwdGVyIGZsYXZvdXIgaWYgbm90IHNwZWNpZmllZCBvbiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge1J9IEEgcmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIG1vZGVsLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBhZGFwdGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBmbGF2b3VyLlxuICAgKi9cbiAgc3RhdGljIGZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbCwgUiBleHRlbmRzIFJlcG88TT4+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhbGlhcz86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSIHtcbiAgICBsZXQgcmVwbzogUiB8IENvbnN0cnVjdG9yPFI+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgX2FsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgdHJ5IHtcbiAgICAgIHJlcG8gPSB0aGlzLmdldChtb2RlbCwgX2FsaWFzKSBhcyBDb25zdHJ1Y3RvcjxSPiB8IFI7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXBvID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChyZXBvIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIHJlcG8gYXMgUjtcblxuICAgIGNvbnN0IGZsYXZvdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBhbGlhcyB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgKHJlcG8gJiZcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIHJlcG8pKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91cjtcbiAgICBjb25zdCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQgPSBmbGF2b3VyXG4gICAgICA/IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZvdW5kIGZsYXZvdXIgJHtmbGF2b3VyfWBcbiAgICAgICk7XG5cbiAgICByZXBvID0gcmVwbyB8fCAoYWRhcHRlci5yZXBvc2l0b3J5KCkgYXMgQ29uc3RydWN0b3I8Uj4pO1xuICAgIHJldHVybiBuZXcgcmVwbyhhZGFwdGVyLCBtb2RlbCwgLi4uYXJncykgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBmcm9tIHRoZSBjYWNoZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwgZnJvbSB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBUaGUgYWRhcHRlciBhbGlhcy5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVwb3NpdG9yeSBpcyByZWdpc3RlcmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKTogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+IHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVbbmFtZV0gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT47XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGZpbmQgcmVwb3NpdG9yeSByZWdpc3RlcmVkIHVuZGVyICR7bmFtZX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgQXNzb2NpYXRlcyBhIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCBhIG1vZGVsIGluIHRoZSBpbnRlcm5hbCBjYWNoZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gcmVwbyAtIFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSB0aGUgYWRhcHRlciBhbGlhcy9mbGF2b3VyLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhIHJlcG9zaXRvcnkgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcmVwbzogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBuYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgaWYgKGFsaWFzKSB7XG4gICAgICBuYW1lID0gW25hbWUsIGFsaWFzXS5qb2luKERlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGAke25hbWV9IGFscmVhZHkgcmVnaXN0ZXJlZCBhcyBhIHJlcG9zaXRvcnlgKTtcbiAgICB0aGlzLl9jYWNoZVtuYW1lXSA9IHJlcG8gYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIG1ldGFkYXRhIG9uIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEF0dGFjaGVzIG1ldGFkYXRhIHRvIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7YW55fSBtZXRhZGF0YSAtIFRoZSBtZXRhZGF0YSB0byBhdHRhY2ggdG8gdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHNldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIG1ldGFkYXRhOiBhbnkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgcHJldmlvdXNseSBhdHRhY2hlZCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBtZXRhZGF0YSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgc3RhdGljIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvciA/IGRlc2NyaXB0b3IudmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBEZWxldGVzIHRoZSBtZXRhZGF0YSBwcm9wZXJ0eSBmcm9tIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvcikgZGVsZXRlIChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgc2VxdWVuY2Ugb3B0aW9ucyBmb3IgYSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleSBmcm9tIG1ldGFkYXRhLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7U2VxdWVuY2VPcHRpb25zfSBUaGUgc2VxdWVuY2Ugb3B0aW9ucyBmb3IgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXkuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHNlcXVlbmNlIG9wdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXRTZXF1ZW5jZU9wdGlvbnM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobW9kZWwpLmlkO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCksXG4gICAgICBtb2RlbCxcbiAgICAgIHBrIGFzIHN0cmluZ1xuICAgICk7XG4gICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIHNlcXVlbmNlIG9wdGlvbnMgZGVmaW5lZCBmb3IgbW9kZWwuIGRpZCB5b3UgdXNlIHRoZSBAcGsgZGVjb3JhdG9yP1wiXG4gICAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIGluZGV4ZXMgZGVmaW5lZCBvbiBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIGluZGV4IG1ldGFkYXRhIGZyb20gYSBtb2RlbCdzIHByb3BlcnR5IGRlY29yYXRvcnMuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+Pn0gQSBuZXN0ZWQgcmVjb3JkIG9mIHByb3BlcnR5IG5hbWVzIHRvIGluZGV4IG1ldGFkYXRhLlxuICAgKi9cbiAgc3RhdGljIGluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgY29uc3QgaW5kZXhEZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwgOiBuZXcgbW9kZWwoKSxcbiAgICAgIERCS2V5cy5SRUZMRUNUXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoaW5kZXhEZWNvcmF0b3JzIHx8IHt9KS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+PiwgW2ssIHZhbF0pID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHZhbC5maWx0ZXIoKHYpID0+IHYua2V5LnN0YXJ0c1dpdGgoUGVyc2lzdGVuY2VLZXlzLklOREVYKSk7XG4gICAgICAgIGlmIChkZWNzICYmIGRlY3MubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWM7XG4gICAgICAgICAgICBhY2N1bVtrXSA9IGFjY3VtW2tdIHx8IHt9O1xuICAgICAgICAgICAgYWNjdW1ba11ba2V5XSA9IHByb3BzIGFzIEluZGV4TWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIHJlbGF0aW9uIHByb3BlcnRpZXMgZGVmaW5lZCBvbiBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWVzIG9mIGFsbCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyByZWxhdGlvbnMgaW4gdGhlIG1vZGVsIGhpZXJhcmNoeS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgYXJlIHJlbGF0aW9ucy5cbiAgICovXG4gIHN0YXRpYyByZWxhdGlvbnM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcHJvdG90eXBlID1cbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWxcbiAgICAgICAgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gICAgICAgIDogKG1vZGVsIGFzIGFueSkucHJvdG90eXBlO1xuICAgIHdoaWxlIChwcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gcHJvdG90eXBlW1BlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlNdO1xuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnByb3BzKTtcbiAgICAgIH1cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyB0YWJsZTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRUYWJsZU5hbWUobW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb2x1bW4gbmFtZSBmb3IgYSBtb2RlbCBhdHRyaWJ1dGUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZS9wcm9wZXJ0eSBuYW1lLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHN0YXRpYyBjb2x1bW48TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRDb2x1bW5OYW1lKG1vZGVsLCBhdHRyaWJ1dGUpO1xuICB9XG59XG5cbmlmIChBZGFwdGVyKSBBZGFwdGVyW1wiX2Jhc2VSZXBvc2l0b3J5XCJdID0gUmVwb3NpdG9yeTtcbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBzZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgdW5pcXVlIGluamVjdGFibGUgbmFtZSBmb3IgYSByZXBvc2l0b3J5LlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBpbmplY3RhYmxlIHRva2VuIGZvciByZXBvc2l0b3JpZXMgdXNpbmcgdGhlIGFkYXB0ZXIgZmxhdm91ciBhbmQgbW9kZWwgdGFibGUgbmFtZS5cbiAqIFRoaXMgaGVscHMgdGhlIERJIHN5c3RlbSByZWdpc3RlciBhbmQgcmVzb2x2ZSByZXBvc2l0b3J5IGluc3RhbmNlcyBjb25zaXN0ZW50bHkgYWNyb3NzIGFkYXB0ZXJzLlxuICogQHRlbXBsYXRlIFQgVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUPiB8IFR9IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSBmcm9tIHdoaWNoIHRvIGRlcml2ZSB0aGUgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyL2FsaWFzLiBJZiBvbWl0dGVkLCBpdCBpcyByZWFkIGZyb20gbW9kZWwgbWV0YWRhdGEuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgbmFtZXNwYWNlZCBpbmplY3RhYmxlIHRva2VuIGZvciB0aGUgcmVwb3NpdG9yeSAoZS5nLiwgXCJkYjpyZXBvOnJhbTp1c2Vyc1wiKS5cbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBmbGF2b3VyIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZyb20gYXJndW1lbnRzIG9yIG1ldGFkYXRhLlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0IE1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTIGFzIFN0cmluZyBGb3JtYXR0ZXJcbiAqICAgQy0+PlU6IGNhbGwobW9kZWwsIGZsYXZvdXI/KVxuICogICBhbHQgZmxhdm91ciBwcm92aWRlZFxuICogICAgIFUtLT4+VTogdXNlIHByb3ZpZGVkIGZsYXZvdXJcbiAqICAgZWxzZSBmbGF2b3VyIG5vdCBwcm92aWRlZFxuICogICAgIFUtPj5BOiBBZGFwdGVyLmtleShBREFQVEVSKVxuICogICAgIFUtPj5SOiBnZXRNZXRhZGF0YShrZXksIG1vZGVsfG1vZGVsLmN0b3IpXG4gKiAgICAgYWx0IG1ldGFkYXRhIHByZXNlbnRcbiAqICAgICAgIFItLT4+VTogZmxhdm91clxuICogICAgIGVsc2UgbWlzc2luZ1xuICogICAgICAgVS0tPj5DOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBVLT4+Uzogc2YoSU5KRUNUQUJMRSwgZmxhdm91ciwgUmVwb3NpdG9yeS50YWJsZShtb2RlbCkpXG4gKiAgIFMtLT4+QzogdG9rZW4gc3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPiB8IFQsXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICghZmxhdm91cikge1xuICAgIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKTtcbiAgICBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIGtleSxcbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsXG4gICAgKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXRyaWV2ZSBmbGF2b3VyIGZyb20gbW9kZWwgJHttb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IubmFtZSA6IG1vZGVsLm5hbWV9YFxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gc2YoUGVyc2lzdGVuY2VLZXlzLklOSkVDVEFCTEUsIGZsYXZvdXIsIGdldFRhYmxlTmFtZShtb2RlbCkpO1xufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlcyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ2lzdHJ5IGZvciBpbmplY3RhYmxlIHJlcG9zaXRvcmllcyB3aXRoIGF1dG8tcmVzb2x1dGlvbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFuIEluamVjdGFibGVSZWdpc3RyeSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJlc29sdmVzIHJlcG9zaXRvcmllcyBieSBtb2RlbCBuYW1lIG9yIGNvbnN0cnVjdG9yLiBJZiBhIHJlcG9zaXRvcnlcbiAqIGlzIG5vdCBleHBsaWNpdGx5IHJlZ2lzdGVyZWQsIGl0IGF0dGVtcHRzIHRvIGluZmVyIHRoZSBjb3JyZWN0IHJlcG9zaXRvcnkgdXNpbmcgbW9kZWwgbWV0YWRhdGEgYW5kIHRoZSBhY3RpdmUgb3Igc3BlY2lmaWVkIGFkYXB0ZXIgZmxhdm91ci5cbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHJlcXVpcmVkOyB0aGUgc3VwZXJjbGFzcyBoYW5kbGVzIGludGVybmFsIHN0YXRlLlxuICogQGNsYXNzIEluamVjdGFibGVzUmVnaXN0cnlcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZTogcmV0cmlldmUgYSByZXBvc2l0b3J5IGJ5IG1vZGVsIG5hbWVcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVzUmVnaXN0cnkoKTtcbiAqIGNvbnN0IHVzZXJSZXBvID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5PignVXNlcicpO1xuICogLy8gSWYgVXNlclJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCwgaXQgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkIGlmIGEgVXNlciBtb2RlbCBleGlzdHMuXG4gKlxuICogLy8gUmV0cmlldmUgYnkgY29uc3RydWN0b3IgYW5kIHNwZWNpZnkgYWRhcHRlciBmbGF2b3VyXG4gKiBjb25zdCByZXBvQnlDdG9yID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5PihVc2VyTW9kZWwsICdyYW0nKTtcbiAqXG4gKiAvLyBSZXRyaWV2ZSBieSBzeW1ib2wgKGUuZy4sIGluamVjdGFibGUgdG9rZW4pXG4gKiBjb25zdCB0b2tlbiA9IFN5bWJvbC5mb3IoJ1VzZXJSZXBvc2l0b3J5Jyk7XG4gKiBjb25zdCBieVRva2VuID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5Pih0b2tlbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29uc3VtZXJcbiAqICAgcGFydGljaXBhbnQgUiBhcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IEIgYXMgQmFzZVJlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgQSBhcyBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJQIGFzIFJlcG9zaXRvcnlcbiAqICAgQy0+PlI6IGdldChuYW1lLCBmbGF2b3VyPylcbiAqICAgYWN0aXZhdGUgUlxuICogICBSLT4+Qjogc3VwZXIuZ2V0KG5hbWUpXG4gKiAgIGFsdCBGb3VuZCBpbiBiYXNlIHJlZ2lzdHJ5XG4gKiAgICAgQi0tPj5SOiBpbmplY3RhYmxlXG4gKiAgICAgUi0tPj5DOiBpbmplY3RhYmxlXG4gKiAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgUi0+Pk06IE1vZGVsLmdldChuYW1lKVxuICogICAgIGFsdCBNb2RlbCBmb3VuZFxuICogICAgICAgUi0+PkE6IHJlc29sdmUgZmxhdm91ciAoZnJvbSBhcmcvbWV0YWRhdGEvY3VycmVudClcbiAqICAgICAgIFItPj5SUDogUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbEN0b3IsIGFsaWFzKVxuICogICAgICAgYWx0IFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgICAgUlAtLT4+UjogcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogICAgICAgICBSLS0+PkM6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgIGVsc2UgUmVwb3NpdG9yeSBjdG9yXG4gKiAgICAgICAgIFItPj5BOiBBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpIG9yIEFkYXB0ZXIuY3VycmVudFxuICogICAgICAgICBBLS0+PlI6IGFkYXB0ZXIgaW5zdGFuY2VcbiAqICAgICAgICAgUi0+PlJQOiBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKVxuICogICAgICAgICBSLS0+PkM6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgIGVuZFxuICogICAgIGVsc2UgTW9kZWwgbm90IGZvdW5kXG4gKiAgICAgICBSLS0+PkM6IHVuZGVmaW5lZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzUmVnaXN0cnkgZXh0ZW5kcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAge1xuICBwcml2YXRlIGxvZ2dlcj86IExvZ2dlcjtcblxuICBwcm90ZWN0ZWQgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5sb2dnZXIpIHRoaXMubG9nZ2VyID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFuIGluamVjdGFibGUgd2l0aCByZXBvc2l0b3J5IGF1dG8tcmVzb2x1dGlvbi5cbiAgICogQHN1bW1hcnkgQXR0ZW1wdHMgdG8gZ2V0IGFuIGluamVjdGFibGUgZnJvbSB0aGUgYmFzZSByZWdpc3RyeTsgaWYgbm90IGZvdW5kIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBrbm93biBtb2RlbCwgaXRcbiAgICogcmVzb2x2ZXMgdGhlIGFwcHJvcHJpYXRlIHJlcG9zaXRvcnkgdXNpbmcgdGhlIHNwZWNpZmllZCBmbGF2b3VyIG9yIG1vZGVsIG1ldGFkYXRhLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGN1cnJlbnQgYWRhcHRlciB3aGVuIG5lZWRlZC5cbiAgICogQHRlbXBsYXRlIFQgVGhlIGluamVjdGFibGUgdHlwZSB0byBiZSByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvcjxUPn0gbmFtZSBUb2tlbiwgbW9kZWwgbmFtZSwgb3IgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmplY3RhYmxlIG9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ciAoZS5nLiwgXCJyYW1cIikuIElmIG9taXR0ZWQsIGRlcml2ZXMgZnJvbSBtZXRhZGF0YSBvciBjdXJyZW50IGFkYXB0ZXIuXG4gICAqIEByZXR1cm4ge1QgfCB1bmRlZmluZWR9IFRoZSBsb2NhdGVkIG9yIGF1dG8tY3JlYXRlZCBpbmplY3RhYmxlIGluc3RhbmNlOyBvdGhlcndpc2UgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSByZXNvbHZlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBnZXQobmFtZSwgZmxhdm91cj8pXG4gICAqICAgcGFydGljaXBhbnQgQlIgYXMgQmFzZVJlZ2lzdHJ5XG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFJQIGFzIFJlcG9zaXRvcnlcbiAgICogICBHLT4+QlI6IHN1cGVyLmdldChuYW1lKVxuICAgKiAgIGFsdCBGb3VuZFxuICAgKiAgICAgQlItLT4+RzogaW5qZWN0YWJsZVxuICAgKiAgIGVsc2UgTm90IGZvdW5kXG4gICAqICAgICBHLT4+TTogZGVyaXZlIG1vZGVsQ3RvciBmcm9tIG5hbWVcbiAgICogICAgIGFsdCBtb2RlbEN0b3IgcmVzb2x2ZWRcbiAgICogICAgICAgRy0+PkE6IHJlc29sdmUgZmxhdm91ciAoYXJnIHwgbWV0YWRhdGEgfCBjdXJyZW50KVxuICAgKiAgICAgICBHLT4+UlA6IFJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWxDdG9yLCBhbGlhcylcbiAgICogICAgICAgYWx0IHJldHVybnMgaW5zdGFuY2VcbiAgICogICAgICAgICBSUC0tPj5HOiBSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAqICAgICAgIGVsc2UgcmV0dXJucyBjdG9yXG4gICAqICAgICAgICAgRy0+PkE6IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpIHwgQWRhcHRlci5jdXJyZW50XG4gICAqICAgICAgICAgQS0tPj5HOiBhZGFwdGVyIGluc3RhbmNlXG4gICAqICAgICAgICAgRy0+PlJQOiBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2Ugbm8gbW9kZWxDdG9yXG4gICAqICAgICAgIEctLT4+RzogcmV0dXJuIHVuZGVmaW5lZFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgQ29uc3RydWN0b3I8VD4gfCBzdHJpbmcsXG4gICAgZmxhdm91cj86IHN0cmluZ1xuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXQpO1xuICAgIC8vIEZpcnN0LCB0cnkgYmFzZSByZWdpc3RyeSwgYnV0IGd1YXJkIGFnYWluc3QgdGhyb3duIGVycm9yc1xuICAgIGxldCBpbmplY3RhYmxlOiBUIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RhYmxlID0gc3VwZXIuZ2V0KG5hbWUgYXMgYW55KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGhhbmRsZSBpdCBsYXRlclxuICAgIH1cblxuICAgIGlmICghaW5qZWN0YWJsZSkge1xuICAgICAgbGV0IG1vZGVsQ3RvcjogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiKSBtb2RlbEN0b3IgPSBuYW1lIGFzIENvbnN0cnVjdG9yPGFueT47XG4gICAgICBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBtb2RlbEN0b3IgPSBNb2RlbC5nZXQobmFtZS50b1N0cmluZygpKSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT47XG4gICAgICB9XG5cbiAgICAgIGlmICghbW9kZWxDdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBSZXNvbHZlIGZsYXZvdXIgZnJvbSBtZXRhZGF0YSBpZiBub3QgcHJvdmlkZWRcbiAgICAgIGNvbnN0IG1ldGFLZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgICBjb25zdCByZXNvbHZlZEZsYXZvdXIgPVxuICAgICAgICBmbGF2b3VyIHx8XG4gICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIG1vZGVsQ3RvcikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGFuIGFsaWFzIHRvIHVzZTogcHJlZmVyIGEgZGlyZWN0bHkgcmVnaXN0ZXJlZCBhZGFwdGVyOyBvdGhlcndpc2UsIGlmIHRoZSBjdXJyZW50IGFkYXB0ZXJcbiAgICAgICAgLy8gaGFzIHRoZSBzYW1lIGZsYXZvdXIsIHVzZSBpdHMgYWxpYXMgdG8gc2F0aXNmeSBSZXBvc2l0b3J5LmZvck1vZGVsL0FkYXB0ZXIuZ2V0IGxvb2t1cHMuXG4gICAgICAgIGxldCBhbGlhc1RvVXNlID0gcmVzb2x2ZWRGbGF2b3VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyZXNvbHZlZEZsYXZvdXIpIEFkYXB0ZXIuZ2V0KHJlc29sdmVkRmxhdm91cik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBBZGFwdGVyLmN1cnJlbnQgYXMgYW55O1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuZmxhdm91ciA9PT0gcmVzb2x2ZWRGbGF2b3VyKVxuICAgICAgICAgICAgYWxpYXNUb1VzZSA9IGN1cnJlbnQuYWxpYXM7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3RhYmxlID0gUmVwb3NpdG9yeS5mb3JNb2RlbChcbiAgICAgICAgICBtb2RlbEN0b3IgYXMgQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICBhbGlhc1RvVXNlXG4gICAgICAgICkgYXMgVDtcbiAgICAgICAgaWYgKGluamVjdGFibGUgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSByZXR1cm4gaW5qZWN0YWJsZSBhcyBUO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgcmVnaXN0ZXIgdGhlIHJlc29sdmVkIGluamVjdGFibGUgbmFtZSBmb3IgbGF0ZXIgcmV0cmlldmFsXG4gICAgICAgIGNvbnN0IGYgPVxuICAgICAgICAgIHJlc29sdmVkRmxhdm91ciB8fFxuICAgICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIChpbmplY3RhYmxlIGFzIGFueSkuY29uc3RydWN0b3IpIGFzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCB1bmRlZmluZWQpIHx8XG4gICAgICAgICAgKFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YUtleSwgbW9kZWxDdG9yKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5KFxuICAgICAgICAgICAgbW9kZWxDdG9yIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICAgIGYgYXMgc3RyaW5nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcmVwb3NpdG9yeSBvciBhZGFwdGVyIGZvdW5kLiBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCBhZGFwdGVyLiBFcnJvcjogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgSlNPTi5zdHJpbmdpZnkoZSl9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXBvQ3RvciA9IChSZXBvc2l0b3J5IGFzIGFueSlbXCJnZXRcIl0obW9kZWxDdG9yLCByZXNvbHZlZEZsYXZvdXIpO1xuICAgICAgICBpZiAodHlwZW9mIHJlcG9DdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyID0gcmVzb2x2ZWRGbGF2b3VyXG4gICAgICAgICAgICA/IChBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpIGFzIGFueSlcbiAgICAgICAgICAgIDogKEFkYXB0ZXIuY3VycmVudCBhcyBhbnkpO1xuICAgICAgICAgIGlmICghYWRhcHRlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyByZXBvQ3RvcihhZGFwdGVyLCBtb2RlbEN0b3IpO1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZSBhcyBUO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluamVjdGFibGUgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4vQWRhcHRlclwiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlckRpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVzIGRhdGFiYXNlIG9wZXJhdGlvbiBldmVudHMgdG8gb2JzZXJ2ZXJzXG4gKiBAc3VtbWFyeSBUaGUgRGlzcGF0Y2ggY2xhc3MgaW1wbGVtZW50cyB0aGUgT2JzZXJ2YWJsZSBpbnRlcmZhY2UgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmNlcHRpbmdcbiAqIGRhdGFiYXNlIG9wZXJhdGlvbnMgZnJvbSBhbiBBZGFwdGVyIGFuZCBub3RpZnlpbmcgb2JzZXJ2ZXJzIHdoZW4gY2hhbmdlcyBvY2N1ci4gSXQgdXNlcyBwcm94aWVzIHRvXG4gKiB3cmFwIHRoZSBhZGFwdGVyJ3MgQ1JVRCBtZXRob2RzIGFuZCBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgb2JzZXJ2ZXIgdXBkYXRlcyBhZnRlciBvcGVyYXRpb25zIGNvbXBsZXRlLlxuICogQHRlbXBsYXRlIFkgLSBUaGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlciB0eXBlXG4gKiBAcGFyYW0ge3ZvaWR9IC0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVyc1xuICogQGNsYXNzIERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRpbmcgYW5kIHVzaW5nIGEgRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IERpc3BhdGNoPFBvc3RncmVzRHJpdmVyPigpO1xuICpcbiAqIC8vIENvbm5lY3QgaXQgdG8gYW4gYWRhcHRlclxuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3N0Z3Jlc0FkYXB0ZXIoY29ubmVjdGlvbik7XG4gKiBkaXNwYXRjaC5vYnNlcnZlKGFkYXB0ZXIpO1xuICpcbiAqIC8vIE5vdyBhbnkgQ1JVRCBvcGVyYXRpb25zIG9uIHRoZSBhZGFwdGVyIHdpbGwgYXV0b21hdGljYWxseVxuICogLy8gdHJpZ2dlciBvYnNlcnZlciBub3RpZmljYXRpb25zXG4gKiBhd2FpdCBhZGFwdGVyLmNyZWF0ZSgndXNlcnMnLCAxMjMsIHVzZXJNb2RlbCk7XG4gKiAvLyBPYnNlcnZlcnMgd2lsbCBiZSBub3RpZmllZCBhYm91dCB0aGUgY3JlYXRpb25cbiAqXG4gKiAvLyBXaGVuIGRvbmUsIHlvdSBjYW4gZGlzY29ubmVjdFxuICogZGlzcGF0Y2gudW5PYnNlcnZlKGFkYXB0ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwYXRjaCBleHRlbmRzIExvZ2dlZENsYXNzIGltcGxlbWVudHMgQWRhcHRlckRpc3BhdGNoIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgYWRhcHRlciBiZWluZyBvYnNlcnZlZFxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2UgdG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXIgd2hvc2Ugb3BlcmF0aW9ucyBhcmUgYmVpbmcgbW9uaXRvcmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWRhcHRlcj86IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdCBvZiBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAgICogQHN1bW1hcnkgQXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIG1vZGVscyE6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSB3aXRob3V0IGFueSBhZGFwdGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZGlzcGF0Y2ggYnkgcHJveHlpbmcgYWRhcHRlciBtZXRob2RzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgcHJveGllcyBvbiB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyB0byBpbnRlcmNlcHQgb3BlcmF0aW9ucyBhbmQgbm90aWZ5IG9ic2VydmVycy5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBhZGFwdGVyIGlzIG9ic2VydmVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IERpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFByb3h5XG4gICAqXG4gICAqICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gICAqICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogQ2hlY2sgaWYgYWRhcHRlciBleGlzdHNcbiAgICogICBhbHQgTm8gYWRhcHRlclxuICAgKiAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIENSVUQgbWV0aG9kXG4gICAqICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIGlmIG1ldGhvZCBleGlzdHNcbiAgICogICAgIGFsdCBNZXRob2QgZG9lc24ndCBleGlzdFxuICAgKiAgICAgICBEaXNwYXRjaC0tPj5EaXNwYXRjaDogVGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IEdldCBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gICAqICAgICBsb29wIFdoaWxlIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4gICAqICAgICAgIERpc3BhdGNoLT4+QWRhcHRlcjogQ2hlY2sgcHJvdG90eXBlIGNoYWluXG4gICAqICAgICBlbmRcbiAgICpcbiAgICogICAgIGFsdCBEZXNjcmlwdG9yIG5vdCBmb3VuZCBvciBub3Qgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogTG9nIGVycm9yIGFuZCBjb250aW51ZVxuICAgKiAgICAgZWxzZSBEZXNjcmlwdG9yIGZvdW5kIGFuZCB3cml0YWJsZVxuICAgKiAgICAgICBEaXNwYXRjaC0+PlByb3h5OiBDcmVhdGUgcHJveHkgZm9yIG1ldGhvZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IFJlcGxhY2UgbWV0aG9kIHdpdGggcHJveHlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIC8vIEdyYWNlZnVsbHkgc2tpcCBpbml0aWFsaXphdGlvbiB3aGVuIG5vIGFkYXB0ZXIgaXMgb2JzZXJ2ZWQgeWV0LlxuICAgICAgLy8gU29tZSB0ZXN0cyBvciBzZXR1cHMgbWF5IGNvbnN0cnVjdCBhIERpc3BhdGNoIGJlZm9yZSBjYWxsaW5nIG9ic2VydmUoKS5cbiAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcsIHdlIG5vLW9wIHNvIHRoYXQgbGF0ZXIgb2JzZXJ2ZSgpIGNhbiBwcm9jZWVkLlxuICAgICAgdGhpcy5sb2cud2FybihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2g7IHNraXBwaW5nIGluaXRpYWxpemF0aW9uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+O1xuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICBpZiAoIWFkYXB0ZXJbbWV0aG9kXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke21ldGhvZH0gbm90IGZvdW5kIGluICR7YWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWRhcHRlciwgbWV0aG9kKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2QpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke21ldGhvZH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIGFkYXB0ZXJbbWV0aG9kXSA9IG5ldyBQcm94eShhZGFwdGVyW21ldGhvZF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jICh0YXJnZXQ6IGFueSwgdGhpc0FyZywgYXJnQXJyYXk6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgW3RhYmxlTmFtZSwgaWRzXSA9IGFyZ0FycmF5O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGVOYW1lLCBidWxrVG9TaW5nbGUobWV0aG9kKSwgaWRzIGFzIEV2ZW50SWRzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBPYnNlcnZlciByZWZyZXNoIGRpc3BhdGNoZWQgYnkgJHttZXRob2R9IGZvciAke3RhYmxlTmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBwa3M6ICR7aWRzfWApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke21ldGhvZH0gb24gJHt0YWJsZU5hbWV9OiAke2V9YFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBkaXNwYXRjaFxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgd2hlbiB0aGUgZGlzcGF0Y2ggaXMgbm8gbG9uZ2VyIG5lZWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNsb3NpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHRvIG5vdGhpbmcgaW4gdGhpcyBpbnN0YW5jZSBidXQgbWF5IGJlIHJlcXVpcmVkIGZvciBjbG9zaW5nIGNvbm5lY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBvYnNlcnZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoIShvYnNlcnZlciBpbnN0YW5jZW9mIEFkYXB0ZXIpKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJPbmx5IEFkYXB0ZXJzIGNhbiBiZSBvYnNlcnZlZCBieSBkaXNwYXRjaFwiKTtcbiAgICB0aGlzLmFkYXB0ZXIgPSBvYnNlcnZlcjtcbiAgICB0aGlzLm1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgdGhpcy5pbml0aWFsaXplKCkudGhlbigoKSA9PlxuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYERpc3BhdGNoIGluaXRpYWxpemVkIGZvciAke3RoaXMuYWRhcHRlciEuYWxpYXN9IGFkYXB0ZXJgXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgRGlzY29ubmVjdHMgdGhpcyBkaXNwYXRjaCBmcm9tIGFuIGFkYXB0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgYWRhcHRlciB0byBzdG9wIG9ic2VydmluZ1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmFkYXB0ZXIgIT09IG9ic2VydmVyKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIFwiT25seSB0aGUgYWRhcHRlciB0aGF0IHdhcyB1c2VkIHRvIG9ic2VydmUgY2FuIGJlIHVub2JzZXJ2ZWRcIlxuICAgICAgKTtcbiAgICB0aGlzLmFkYXB0ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3RhYmxlfToke2V2ZW50fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2godGFibGUsIGV2ZW50LCBpZCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG59XG5cbmlmIChBZGFwdGVyKSBBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERCS2V5cywgSVJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBkZWNvcmF0b3IgZm9yIG1vZGVsIGNsYXNzZXMuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIGNsYXNzLiBDYW4gYmUgdXNlZCBhcyBib3RoIGEgcHJvcGVydHkgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGRlY29yYXRvci5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUPn0gbW9kZWwgLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSAtIHRoZSByZXF1aXJlZCBhZGFwdGVyJ3MgZmxhdm91ci9hbGlhcy4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBtb2RlbCBtZXRhZGF0YS4uXG4gKiBAcmV0dXJuIHthbnl9IC0gVGhlIGRlY29yYXRvciBmdW5jdGlvbi5cbiAqIEBmdW5jdGlvbiByZXBvc2l0b3J5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTWV0YWRhdGFcbiAqXG4gKiAgIEMtPj5EOiBBcHBseSBAcmVwb3NpdG9yeShNb2RlbClcbiAqICAgYWx0IFByb3BlcnR5IERlY29yYXRvclxuICogICAgIEQtPj5EOiBDaGVjayBpZiBwcm9wZXJ0eUtleSBleGlzdHNcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3QobmFtZSkgZGVjb3JhdG9yXG4gKiAgIGVsc2UgQ2xhc3MgRGVjb3JhdG9yXG4gKiAgICAgRC0+Pk06IFNldCByZXBvc2l0b3J5IG1ldGFkYXRhIG9uIG1vZGVsXG4gKiAgICAgRC0+PlI6IFJlZ2lzdGVyIG1vZGVsIHdpdGggUmVwb3NpdG9yeVxuICogICAgIEQtPj4rQzogUmV0dXJuIGluamVjdGFibGUgZGVjb3JhdG9yIHdpdGggY29uZmlnXG4gKiAgICAgQy0+PkM6IERlZmluZSBEQktleXMuQ0xBU1MgcHJvcGVydHlcbiAqICAgZW5kXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IGFueSB7XG4gIHJldHVybiAoKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgaWYgKHByb3BlcnR5S2V5KSB7XG4gICAgICByZXR1cm4gaW5qZWN0KG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCkoXG4gICAgICAgIG9yaWdpbmFsLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBtZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuUkVQT1NJVE9SWSksIG9yaWdpbmFsLm5hbWUpKG1vZGVsKTtcbiAgICBmbGF2b3VyID1cbiAgICAgIGZsYXZvdXIgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBvcmlnaW5hbCk7XG4gICAgUmVwb3NpdG9yeS5yZWdpc3RlcihcbiAgICAgIG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCxcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgZmxhdm91clxuICAgICk7XG4gICAgcmV0dXJuIGluamVjdGFibGUobW9kZWxbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsLCB7XG4gICAgICBjYWxsYmFjazogKGluc3RhbmNlOiBJUmVwb3NpdG9yeTxUPikgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdGFuY2UsIERCS2V5cy5DTEFTUywge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH0sXG4gICAgfSkob3JpZ2luYWwpO1xuICB9KSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIG9ic2VydmVyIGNvbW11bmljYXRpb24gZmFpbHMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGJldHdlZW4gcmVwb3NpdG9yaWVzLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdC5cbiAqIEBjbGFzcyBPYnNlcnZlckVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogdHJ5IHtcbiAqICAgLy8gU29tZSByZXBvc2l0b3J5IG9ic2VydmVyIG9wZXJhdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgT2JzZXJ2ZXJFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09ic2VydmVyIGNvbW11bmljYXRpb24gZmFpbGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNlcnZlckVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE9ic2VydmVyRXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNlcXVlbmNlc1xuICogQGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcXVlbmNlT3B0aW9uczxcbiAgVFlQRSA9IFwiTnVtYmVyXCIgfCBcIkJpZ0ludFwiIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbmFtZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICBnZW5lcmF0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRhdGEgdHlwZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNlcXVlbmNlIGdlbmVyYXRlcyBOdW1iZXIgb3IgQmlnSW50IHZhbHVlc1xuICAgKi9cbiAgdHlwZTogVFlQRTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2Ugc3RhcnRzIHdpdGhcbiAgICovXG4gIHN0YXJ0V2l0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgZWFjaCBzdGVwIGluIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzZXF1ZW5jZSBpbmNyZWFzZXMgd2l0aCBlYWNoIGNhbGxcbiAgICovXG4gIGluY3JlbWVudEJ5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25hbCBtaW5pbXVtIHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGxvd2VzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1pblZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBoaWdoZXN0IHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIGNhbiBnZW5lcmF0ZVxuICAgKi9cbiAgbWF4VmFsdWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBzZXF1ZW5jZSBzaG91bGQgY3ljbGUgd2hlbiByZWFjaGluZyBpdHMgbGltaXRzXG4gICAqIEBzdW1tYXJ5IElmIHRydWUsIHRoZSBzZXF1ZW5jZSB3aWxsIHJlc3RhcnQgZnJvbSBtaW5WYWx1ZSB3aGVuIHJlYWNoaW5nIG1heFZhbHVlXG4gICAqL1xuICBjeWNsZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBvcHRpb25zIGZvciBzZXF1ZW5jZXNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmb3IgbnVtYmVyIHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgTm9uZVNlcXVlbmNlT3B0aW9uczogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiB1bmRlZmluZWQsXG4gIGdlbmVyYXRlZDogZmFsc2UsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IE5vbmVTZXF1ZW5jZU9wdGlvbnM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgbnVtZXJpYyBzZXF1ZW5jZXNcbiAqIEBzdW1tYXJ5IENvbmZpZ3VyYXRpb24gZm9yIHN0YW5kYXJkIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOdW1lcmljU2VxdWVuY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY1NlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSB7XG4gIHR5cGU6IFwiTnVtYmVyXCIsXG4gIGdlbmVyYXRlZDogdHJ1ZSxcbiAgc3RhcnRXaXRoOiAwLFxuICBpbmNyZW1lbnRCeTogMSxcbiAgY3ljbGU6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJlZGVmaW5lZCBvcHRpb25zIGZvciBCaWdJbnQgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBCaWdJbnQgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgQmlnSW50U2VxdWVuY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgQmlnSW50U2VxdWVuY2U6IFNlcXVlbmNlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gIHt9LFxuICBOdW1lcmljU2VxdWVuY2UsXG4gIHtcbiAgICB0eXBlOiBcIkJpZ0ludFwiLFxuICB9XG4pO1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIHF1ZXJ5IGNvbmRpdGlvbnNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgZm9yIGNvbXBhcmluZyB2YWx1ZXMgaW4gZGF0YWJhc2UgcXVlcmllc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9wZXJhdG9yIHtcbiAgLyoqIEVxdWFsIGNvbXBhcmlzb24gKD0pICovXG4gIEVRVUFMID0gXCJFUVVBTFwiLFxuICAvKiogTm90IGVxdWFsIGNvbXBhcmlzb24gKCE9KSAqL1xuICBESUZGRVJFTlQgPSBcIkRJRkZFUkVOVFwiLFxuICAvKiogR3JlYXRlciB0aGFuIGNvbXBhcmlzb24gKD4pICovXG4gIEJJR0dFUiA9IFwiQklHR0VSXCIsXG4gIC8qKiBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPj0pICovXG4gIEJJR0dFUl9FUSA9IFwiQklHR0VSX0VRXCIsXG4gIC8qKiBMZXNzIHRoYW4gY29tcGFyaXNvbiAoPCkgKi9cbiAgU01BTExFUiA9IFwiU01BTExFUlwiLFxuICAvKiogTGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKDw9KSAqL1xuICBTTUFMTEVSX0VRID0gXCJTTUFMTEVSX0VRXCIsXG4gIC8vIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgLyoqIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpICovXG4gIE5PVCA9IFwiTk9UXCIsXG4gIC8qKiBJbmNsdXNpb24gb3BlcmF0b3IgKElOKSAqL1xuICBJTiA9IFwiSU5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIC8qKiBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgKi9cbiAgUkVHRVhQID0gXCJSRUdFWFBcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9naWNhbCBvcGVyYXRvcnMgZm9yIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBncm91cGluZyBtdWx0aXBsZSBjb25kaXRpb25zIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBHcm91cE9wZXJhdG9yIHtcbiAgLyoqIExvZ2ljYWwgQU5EIG9wZXJhdG9yIC0gYWxsIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlICovXG4gIEFORCA9IFwiQU5EXCIsXG4gIC8qKiBMb2dpY2FsIE9SIG9wZXJhdG9yIC0gYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUgKi9cbiAgT1IgPSBcIk9SXCIsXG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biBkdXJpbmcgcXVlcnkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcXVlcnkgYnVpbGRpbmcgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBRdWVyeUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFF1ZXJ5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gZHVyaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcGFnaW5hdGlvbiBzZXR1cCBvciBleGVjdXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIFBhZ2luZ0Vycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdpbmdFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBQYWdpbmdFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGVPcHRpb24sIENvbmRpdGlvbkJ1aWxkZXJPcHRpb24gfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQge1xuICBDb25kaXRpb25hbEFzeW5jLFxuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG50eXBlIEluZmVyQXN5bmM8TT4gPSBNIGV4dGVuZHMgTW9kZWw8aW5mZXIgQT4gPyBBIDogZmFsc2U7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbmRpdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgQSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBxdWVyeSBjb25kaXRpb25zIHdpdGggc3VwcG9ydCBmb3IgY29tcGxleCBsb2dpY2FsIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGNsYXNzIGFsbG93cyBmb3IgYnVpbGRpbmcgYW5kIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zIHVzaW5nIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQsIE9SLCBOT1QpXG4gKiBhbmQgY29tcGFyaXNvbiBvcGVyYXRvcnMgKGVxdWFscywgbm90IGVxdWFscywgZ3JlYXRlciB0aGFuLCBldGMuKS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uZGl0aW9uPE0+fSBhdHRyMSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSBvciBhIG5lc3RlZCBjb25kaXRpb25cbiAqIEBwYXJhbSB7T3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yfSBvcGVyYXRvciAtIFRoZSBvcGVyYXRvciB0byB1c2UgZm9yIHRoZSBjb25kaXRpb25cbiAqIEBwYXJhbSB7YW55fSBjb21wYXJpc29uIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdCBvciBhbm90aGVyIGNvbmRpdGlvblxuICogQGNsYXNzIENvbmRpdGlvblxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSBjb25kaXRpb25cbiAqIGNvbnN0IG5hbWVDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlKFwibmFtZVwiKS5lcShcIkpvaG5cIik7XG4gKlxuICogLy8gQ3JlYXRlIGEgY29tcGxleCBjb25kaXRpb25cbiAqIGNvbnN0IGNvbXBsZXhDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlKFwiYWdlXCIpLmd0KDE4KVxuICogICAuYW5kKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJzdGF0dXNcIikuZXEoXCJhY3RpdmVcIikpO1xuICpcbiAqIC8vIFVzZSB0aGUgYnVpbGRlciBwYXR0ZXJuXG4gKiBjb25zdCB1c2VyUXVlcnkgPSBDb25kaXRpb24uYnVpbGRlcigpXG4gKiAgIC5hdHRyaWJ1dGUoXCJlbWFpbFwiKS5yZWdleHAoXCIuKkBleGFtcGxlLmNvbVwiKVxuICogICAuYW5kKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJsYXN0TG9naW5cIikuZ3QobmV3IERhdGUoXCIyMDIzLTAxLTAxXCIpKSk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IERldlxuICogICBwYXJ0aWNpcGFudCBDb25kaXRpb25cbiAqICAgRGV2LT4+Q29uZGl0aW9uOiBidWlsZGVyKCkuYXR0cmlidXRlKFwiYWdlXCIpLmd0KDE4KVxuICogICBDb25kaXRpb24tLT4+RGV2OiBDb25kaXRpb24oYWdlID4gMTgpXG4gKiAgIERldi0+PkNvbmRpdGlvbjogLmFuZChhdHRyaWJ1dGUoXCJzdGF0dXNcIikuZXEoXCJhY3RpdmVcIikpXG4gKiAgIENvbmRpdGlvbi0tPj5EZXY6IENvbmRpdGlvbigoYWdlID4gMTgpIEFORCAoc3RhdHVzID0gXCJhY3RpdmVcIikpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25kaXRpb248TSBleHRlbmRzIE1vZGVsPGFueT4+IGV4dGVuZHMgTW9kZWw8SW5mZXJBc3luYzxNPj4ge1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgYXR0cjE/OiBzdHJpbmcgfCBDb25kaXRpb248TT4gPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+LFxuICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IsXG4gICAgY29tcGFyaXNvbjogYW55XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hdHRyMSA9IGF0dHIxO1xuICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICB0aGlzLmNvbXBhcmlzb24gPSBjb21wYXJpc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21iaW5lcyB0aGlzIGNvbmRpdGlvbiB3aXRoIGFub3RoZXIgdXNpbmcgbG9naWNhbCBBTkRcbiAgICogQHN1bW1hcnkgSm9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBBTkQgb3BlcmF0b3IsIHJlcXVpcmluZyBib3RoIHRvIGJlIHRydWVcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gY29tYmluZSB3aXRoIHRoaXMgb25lXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgQU5EIG9wZXJhdGlvblxuICAgKi9cbiAgYW5kKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmFuZCh0aGlzLCBjb25kaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21iaW5lcyB0aGlzIGNvbmRpdGlvbiB3aXRoIGFub3RoZXIgdXNpbmcgbG9naWNhbCBPUlxuICAgKiBAc3VtbWFyeSBKb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIE9SIG9wZXJhdG9yLCByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHRvIGJlIHRydWVcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gY29tYmluZSB3aXRoIHRoaXMgb25lXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgT1Igb3BlcmF0aW9uXG4gICAqL1xuICBvcihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5vcih0aGlzLCBjb25kaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmVnYXRpb24gY29uZGl0aW9uXG4gICAqIEBzdW1tYXJ5IEV4Y2x1ZGVzIGEgdmFsdWUgZnJvbSB0aGUgcmVzdWx0IGJ5IGFwcGx5aW5nIGEgTk9UIG9wZXJhdG9yXG4gICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gbmVnYXRlXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgTk9UIG9wZXJhdGlvblxuICAgKi9cbiAgbm90KHZhbDogYW55KTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbih0aGlzLCBPcGVyYXRvci5OT1QsIHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyB0aGUgY29uZGl0aW9uIGFuZCBjaGVja3MgZm9yIGVycm9yc1xuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoZSBjb25kaXRpb24gaXMgcHJvcGVybHkgZm9ybWVkXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nW119IGV4Y2VwdGlvbnMgLSBGaWVsZHMgdG8gZXhjbHVkZSBmcm9tIHZhbGlkYXRpb25cbiAgICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWR9IEVycm9yIGRlZmluaXRpb24gaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdXG4gICk6IENvbmRpdGlvbmFsQXN5bmM8SW5mZXJBc3luYzxNPiwgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjb25kaXRpb25DaGVjayA9ICgpOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkT3BNZXNzYWdlID0gYEludmFsaWQgb3BlcmF0b3IgJHt0aGlzLm9wZXJhdG9yfX1gO1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cjEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbilcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tcGFyaXNvbjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246XG4gICAgICAgICAgICAgICAgXCJCb3RoIHNpZGVzIG9mIHRoZSBjb21wYXJpc29uIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhPcGVyYXRvcikuaW5kZXhPZih0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yKSA9PT0gLTEpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZXJhdG9yOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogaW52YWxpZE9wTWVzc2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYXR0cjEgaW5zdGFuY2VvZiBDb25kaXRpb24pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEodGhpcy5jb21wYXJpc29uIGluc3RhbmNlb2YgQ29uZGl0aW9uKSAmJlxuICAgICAgICAgIHRoaXMub3BlcmF0b3IgIT09IE9wZXJhdG9yLk5PVFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBpbnZhbGlkT3BNZXNzYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhHcm91cE9wZXJhdG9yKS5pbmRleE9mKFxuICAgICAgICAgICAgdGhpcy5vcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICAgICAgKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGludmFsaWRPcE1lc3NhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoIXRoaXMuaXNBc3luYygpKVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGVycm9ycyBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCkgPz9cbiAgICAgICAgKGNvbmRpdGlvbkNoZWNrKCkgYXMgYW55KVxuICAgICAgKTtcblxuICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIGVycm9ycyBhcyB1bmtub3duIGFzIFByb21pc2U8TW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+XG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc29sdmVkID8/IGNvbmRpdGlvbkNoZWNrKCk7XG4gICAgfSkoKSBhcyBDb25kaXRpb25hbEFzeW5jPEluZmVyQXN5bmM8TT4sIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdGhhdCBjb21iaW5lcyB0d28gY29uZGl0aW9ucyB3aXRoIGxvZ2ljYWwgQU5EXG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdGhhdCBqb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIEFORCBvcGVyYXRvciwgcmVxdWlyaW5nIGJvdGggdG8gYmUgdHJ1ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMiAtIFRoZSBzZWNvbmQgY29uZGl0aW9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgQU5EIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIGFuZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbmRpdGlvbjE6IENvbmRpdGlvbjxNPixcbiAgICBjb25kaXRpb24yOiBDb25kaXRpb248TT5cbiAgKTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmdyb3VwKGNvbmRpdGlvbjEsIEdyb3VwT3BlcmF0b3IuQU5ELCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdGhhdCBjb21iaW5lcyB0d28gY29uZGl0aW9ucyB3aXRoIGxvZ2ljYWwgT1JcbiAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0aGF0IGpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gT1Igb3BlcmF0b3IsIHJlcXVpcmluZyBhdCBsZWFzdCBvbmUgdG8gYmUgdHJ1ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMiAtIFRoZSBzZWNvbmQgY29uZGl0aW9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgT1Igb3BlcmF0aW9uXG4gICAqL1xuICBzdGF0aWMgb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjb25kaXRpb24xOiBDb25kaXRpb248TT4sXG4gICAgY29uZGl0aW9uMjogQ29uZGl0aW9uPE0+XG4gICk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLk9SLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdGhhdCBncm91cHMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhIHNwZWNpZmllZCBvcGVyYXRvclxuICAgKiBAc3VtbWFyeSBQcml2YXRlIHN0YXRpYyBtZXRob2QgdGhhdCBjb21iaW5lcyB0d28gY29uZGl0aW9ucyB1c2luZyB0aGUgc3BlY2lmaWVkIGdyb3VwIG9wZXJhdG9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjEgLSBUaGUgZmlyc3QgY29uZGl0aW9uXG4gICAqIEBwYXJhbSB7R3JvdXBPcGVyYXRvcn0gb3BlcmF0b3IgLSBUaGUgZ3JvdXAgb3BlcmF0b3IgdG8gdXNlIChBTkQsIE9SKVxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMiAtIFRoZSBzZWNvbmQgY29uZGl0aW9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZ3JvdXBlZCBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdyb3VwPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uPE0+LFxuICAgIG9wZXJhdG9yOiBHcm91cE9wZXJhdG9yLFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvbjxNPlxuICApOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvbjEsIG9wZXJhdG9yLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNvbmRpdGlvbiBidWlsZGVyIGZvciBhIHNwZWNpZmljIG1vZGVsIGF0dHJpYnV0ZVxuICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRoYXQgaW5pdGlhbGl6ZXMgYSBjb25kaXRpb24gYnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIGJ1aWxkIGEgY29uZGl0aW9uIGZvclxuICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IEEgY29uZGl0aW9uIGJ1aWxkZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXR0cmlidXRlXG4gICAqL1xuICBzdGF0aWMgYXR0cmlidXRlPE0gZXh0ZW5kcyBNb2RlbD4oYXR0cjoga2V5b2YgTSkge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXI8TT4oKS5hdHRyaWJ1dGUoYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB0aGUgYXR0cmlidXRlIG1ldGhvZFxuICAgKiBAc3VtbWFyeSBTaG9ydGhhbmQgbWV0aG9kIHRoYXQgaW5pdGlhbGl6ZXMgYSBjb25kaXRpb24gYnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIGJ1aWxkIGEgY29uZGl0aW9uIGZvclxuICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IEEgY29uZGl0aW9uIGJ1aWxkZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXR0cmlidXRlXG4gICAqL1xuICBzdGF0aWMgYXR0cjxNIGV4dGVuZHMgTW9kZWw+KGF0dHI6IGtleW9mIE0pIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUoYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGEgZmx1ZW50IEFQSSB0byBidWlsZCBxdWVyeSBjb25kaXRpb25zXG4gICAqIEBzdW1tYXJ5IEEgYnVpbGRlciBjbGFzcyB0aGF0IHNpbXBsaWZpZXMgdGhlIGNyZWF0aW9uIG9mIGRhdGFiYXNlIHF1ZXJ5IGNvbmRpdGlvbnNcbiAgICogd2l0aCBhIGNoYWluYWJsZSBpbnRlcmZhY2UgZm9yIHNldHRpbmcgYXR0cmlidXRlcyBhbmQgb3BlcmF0b3JzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gYnVpbGRlciBvcGVyYXRlcyBvblxuICAgKiBAY2xhc3MgQ29uZGl0aW9uQnVpbGRlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRlciA9IGNsYXNzIENvbmRpdGlvbkJ1aWxkZXI8TSBleHRlbmRzIE1vZGVsPlxuICAgIGltcGxlbWVudHMgQ29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPiwgQXR0cmlidXRlT3B0aW9uPE0+XG4gIHtcbiAgICBhdHRyMT86IGtleW9mIE0gfCBDb25kaXRpb248TT4gPSB1bmRlZmluZWQ7XG4gICAgb3BlcmF0b3I/OiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgY29tcGFyaXNvbj86IGFueSA9IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggbW9kZWwgYXR0cmlidXRlIHRoZSBjb25kaXRpb24gd2lsbCBvcGVyYXRlIG9uXG4gICAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIHVzZSBpbiB0aGUgY29uZGl0aW9uXG4gICAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBUaGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZShhdHRyOiBrZXlvZiBNKTogQXR0cmlidXRlT3B0aW9uPE0+IHtcbiAgICAgIHRoaXMuYXR0cjEgPSBhdHRyO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB0aGUgYXR0cmlidXRlIG1ldGhvZFxuICAgICAqIEBzdW1tYXJ5IFNob3J0aGFuZCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCBtb2RlbCBhdHRyaWJ1dGUgdGhlIGNvbmRpdGlvbiB3aWxsIG9wZXJhdGUgb25cbiAgICAgKiBAcGFyYW0gYXR0ciAtIFRoZSBtb2RlbCBhdHRyaWJ1dGUgdG8gdXNlIGluIHRoZSBjb25kaXRpb25cbiAgICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IFRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAgICovXG4gICAgYXR0cihhdHRyOiBrZXlvZiBNKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gZXF1YWxpdHkgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uXG4gICAgICovXG4gICAgZXEodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkVRVUFMLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluZXF1YWxpdHkgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGluZXF1YWxpdHkgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGRpZih2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuRElGRkVSRU5ULCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ3JlYXRlciB0aGFuIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBndCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuQklHR0VSLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbGVzcyB0aGFuIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgbGVzcyB0aGFuIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBsdCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuU01BTExFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gICAgICovXG4gICAgZ3RlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5CSUdHRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGx0ZSh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuU01BTExFUl9FUSwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmNsdXNpb24gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCBhcnJheVxuICAgICAqIEBwYXJhbSB7YW55W119IGFyciAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gY2hlY2sgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgaW5jbHVzaW9uIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBpbihhcnI6IGFueVtdKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5JTiwgYXJyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgcmVnZXhwKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5SRUdFWFAsIG5ldyBSZWdFeHAodmFsKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBvcGVyYXRvciBhbmQgY29tcGFyaXNvbiB2YWx1ZSBmb3IgdGhlIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IFByaXZhdGUgbWV0aG9kIHRoYXQgY29uZmlndXJlcyB0aGUgY29uZGl0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYXRvciBhbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge09wZXJhdG9yfSBvcCAtIFRoZSBvcGVyYXRvciB0byB1c2UgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYXRvciBhbmQgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldE9wKG9wOiBPcGVyYXRvciwgdmFsOiBhbnkpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSBvcDtcbiAgICAgIHRoaXMuY29tcGFyaXNvbiA9IHZhbDtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdHMgYSBDb25kaXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgYnVpbGRlcidzIHN0YXRlXG4gICAgICogQHN1bW1hcnkgRmluYWxpemVzIHRoZSBjb25kaXRpb24gYnVpbGRpbmcgcHJvY2VzcyBieSBjcmVhdGluZyBhIG5ldyBDb25kaXRpb24gaW5zdGFuY2VcbiAgICAgKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiB0aGUgY29uZGl0aW9uIGNhbm5vdCBiZSBidWlsdCBkdWUgdG8gaW52YWxpZCBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgY29uZmlndXJlZCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZCgpOiBDb25kaXRpb248TT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5hdHRyMSBhcyBzdHJpbmcgfCBDb25kaXRpb248TT4sXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcixcbiAgICAgICAgICB0aGlzLmNvbXBhcmlzb24gYXMgYW55XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbmRpdGlvbiBidWlsZGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gYnVpbGRlciB3aWxsIG9wZXJhdGUgb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBidWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcjxNPigpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3IgdXBkYXRlcyBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY3JlYXRlIGEgbmV3IG1vZGVsIG9yIHVwZGF0ZSBhbiBleGlzdGluZyBvbmUgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgcHJpbWFyeSBrZXlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY3JlYXRlIG9yIHVwZGF0ZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7UmVwbzxNLCBGLCBDb250ZXh0PEY+Pn0gW3JlcG9zaXRvcnldIC0gT3B0aW9uYWwgcmVwb3NpdG9yeSB0byB1c2UgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIG9yIHVwZGF0ZWQgbW9kZWxcbiAqIEBmdW5jdGlvbiBjcmVhdGVPclVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKlxuICogICBDYWxsZXItPj5jcmVhdGVPclVwZGF0ZTogbW9kZWwsIGNvbnRleHQsIHJlcG9zaXRvcnk/XG4gKiAgIGFsdCByZXBvc2l0b3J5IG5vdCBwcm92aWRlZFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+TW9kZWw6IGdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKVxuICogICAgIE1vZGVsLS0+PmNyZWF0ZU9yVXBkYXRlOiBjb25zdHJ1Y3RvclxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogcmVwb3NpdG9yeVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBwcmltYXJ5IGtleSB1bmRlZmluZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbCwgY29udGV4dClcbiAqICAgICBSZXBvc2l0b3J5LS0+PmNyZWF0ZU9yVXBkYXRlOiBjcmVhdGVkIG1vZGVsXG4gKiAgIGVsc2UgcHJpbWFyeSBrZXkgZGVmaW5lZFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogdXBkYXRlKG1vZGVsLCBjb250ZXh0KVxuICogICAgIGFsdCB1cGRhdGUgc3VjY2Vzc2Z1bFxuICogICAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogdXBkYXRlZCBtb2RlbFxuICogICAgIGVsc2UgTm90Rm91bmRFcnJvclxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiBjcmVhdGUobW9kZWwsIGNvbnRleHQpXG4gKiAgICAgICBSZXBvc2l0b3J5LS0+PmNyZWF0ZU9yVXBkYXRlOiBjcmVhdGVkIG1vZGVsXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqICAgY3JlYXRlT3JVcGRhdGUtLT4+Q2FsbGVyOiBtb2RlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIG1vZGVsOiBNLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBhbGlhcz86IHN0cmluZyxcbiAgcmVwb3NpdG9yeT86IFJlcG88TSwgRiwgQ29udGV4dDxGPj5cbik6IFByb21pc2U8TT4ge1xuICBpZiAoIXJlcG9zaXRvcnkpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYENvdWxkIG5vdCBmaW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeS5mb3JNb2RlbDxNLCBSZXBvPE0+PihcbiAgICAgIGNvbnN0cnVjdG9yIGFzIHVua25vd24gYXMgTW9kZWxDb25zdHJ1Y3RvcjxNPixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuICBpZiAodHlwZW9mIG1vZGVsW3JlcG9zaXRvcnkucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gIGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVwb3NpdG9yeS51cGRhdGUobW9kZWwsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkuY3JlYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgYW4gZXhpc3RpbmcgbW9kZWwgb3IgY3JlYXRpbmcgYSBuZXcgb25lXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPbkNyZWF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uQ3JlYXRlOiBpbm5lclJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+aW5uZXJSZXBvOiByZWFkKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlYWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gcHJvcGVydHlWYWx1ZVxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pk1vZGVsOiBnZXQoZGF0YS5jbGFzcylcbiAqICAgICBNb2RlbC0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjb25zdHJ1Y3RvclxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgICBSZXBvc2l0b3J5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwbzogY3JlYXRlKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgcmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjcmVhdGVkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBjcmVhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPbkNyZWF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IGNyZWF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICAgICk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkYXRhLmNsYXNzID1cbiAgICB0eXBlb2YgZGF0YS5jbGFzcyA9PT0gXCJzdHJpbmdcIiA/IGRhdGEuY2xhc3MgOiAoZGF0YS5jbGFzcyBhcyBhbnkpKCkubmFtZTtcblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChkYXRhLmNsYXNzIGFzIHN0cmluZyk7XG4gIGlmICghY29uc3RydWN0b3IpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYENvdWxkIG5vdCBmaW5kIG1vZGVsICR7ZGF0YS5jbGFzc31gKTtcbiAgY29uc3QgcmVwbzogUmVwbzxhbnk+ID0gUmVwb3NpdG9yeS5mb3JNb2RlbChjb25zdHJ1Y3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKHByb3BlcnR5VmFsdWUpO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KGNyZWF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgY3JlYXRlZFtwa10sIGNyZWF0ZWQpO1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY3JlYXRlZFtwa107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdXBkYXRlc1xuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiB1cGRhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgYW4gZXhpc3RpbmcgbW9kZWwgb3IgdXBkYXRpbmcgdGhlIHJlbGF0ZWQgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9PbmVPblVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb09uZU9uVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPblVwZGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IGNoZWNrIGlmIGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uVXBkYXRlOiBpbm5lclJlcG9cbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+aW5uZXJSZXBvOiByZWFkKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25VcGRhdGU6IHJlYWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IHNldCBtb2RlbFtrZXldID0gcHJvcGVydHlWYWx1ZVxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNyZWF0ZU9yVXBkYXRlOiBtb2RlbFtrZXldLCBjb250ZXh0XG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9PbmVPblVwZGF0ZTogdXBkYXRlZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5maW5kUHJpbWFyeUtleTogdXBkYXRlZFxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvT25lT25VcGRhdGU6IHBrXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgdXBkYXRlZFtwa10sIHVwZGF0ZWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogc2V0IG1vZGVsW2tleV0gPSB1cGRhdGVkW3BrXVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICAgICk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgY3JlYXRlT3JVcGRhdGUoXG4gICAgbW9kZWxba2V5XSBhcyBNLFxuICAgIGNvbnRleHQsXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkodXBkYXRlZCkuaWQ7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICB1cGRhdGVkW3BrXSBhcyBzdHJpbmcsXG4gICAgdXBkYXRlZFxuICApO1xuICBtb2RlbFtrZXldID0gdXBkYXRlZFtwa107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgZGVsZXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgdGhlIHJlbGF0ZWQgbW9kZWwgaWYgY2FzY2FkZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPbkRlbGV0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25EZWxldGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+Pm9uZVRvT25lT25EZWxldGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPbkRlbGV0ZTogaW5uZXJSZXBvXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldLCBjb250ZXh0KVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgIGVsc2UgcHJvcGVydHlWYWx1ZSBpcyBhIE1vZGVsIGluc3RhbmNlXG4gKiAgICAgb25lVG9PbmVPbkRlbGV0ZS0+PmlubmVyUmVwbzogZGVsZXRlKG1vZGVsW2tleV1baW5uZXJSZXBvLnBrXSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSwgZGVsZXRlZFxuICogICBvbmVUb09uZU9uRGVsZXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9PbmVPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcbiAgaWYgKGRhdGEuY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICBjb25zdCBpbm5lclJlcG86IFJlcG88TT4gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIGxldCBkZWxldGVkOiBNO1xuICBpZiAoIShwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgTW9kZWwpKVxuICAgIGRlbGV0ZWQgPSBhd2FpdCBpbm5lclJlcG8uZGVsZXRlKG1vZGVsW2tleV0gYXMgc3RyaW5nLCBjb250ZXh0KTtcbiAgZWxzZVxuICAgIGRlbGV0ZWQgPSBhd2FpdCBpbm5lclJlcG8uZGVsZXRlKFxuICAgICAgKG1vZGVsW2tleV0gYXMgTSlbaW5uZXJSZXBvLnBrIGFzIGtleW9mIE1dIGFzIHN0cmluZyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgZGVsZXRlZFtpbm5lclJlcG8ucGtdIGFzIHN0cmluZyxcbiAgICBkZWxldGVkXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgbW9kZWxzIG9yIGNyZWF0aW5nIG5ldyBvbmVzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZXMgZXhpc3RzIGFuZCBoYXMgbGVuZ3RoXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIGFsbCBlbGVtZW50cyBoYXZlIHNhbWUgdHlwZVxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgYWx0IGFycmF5VHlwZSBpcyBub3QgXCJvYmplY3RcIlxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVwb1xuICogICAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG86IHJlYWQoaWQpXG4gKiAgICAgICByZXBvLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIHJlYWRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdXG4gKiAgIGVsc2UgYXJyYXlUeXBlIGlzIFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBwcm9wZXJ0eVZhbHVlc1swXVxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBwa05hbWVcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgcmVzdWx0IHNldFxuICogICAgIGxvb3AgZm9yIGVhY2ggbSBpbiBwcm9wZXJ0eVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jcmVhdGVPclVwZGF0ZTogbSwgY29udGV4dFxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlY29yZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFkZCByZWNvcmRbcGtOYW1lXSB0byByZXN1bHRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi5yZXN1bHRdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcyB8fCAhcHJvcGVydHlWYWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1swXTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFsuLi5wcm9wZXJ0eVZhbHVlc10pO1xuICBpZiAoYXJyYXlUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXksIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoaWQpO1xuICAgICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkKTtcbiAgICB9XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBrTmFtZSA9IGZpbmRQcmltYXJ5S2V5KHByb3BlcnR5VmFsdWVzWzBdKS5pZDtcblxuICBjb25zdCByZXN1bHQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBwcm9wZXJ0eVZhbHVlcykge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKG0sIGNvbnRleHQsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmQpO1xuICAgIHJlc3VsdC5hZGQocmVjb3JkW3BrTmFtZV0pO1xuICB9XG5cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi5yZXN1bHRdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB1cGRhdGVzXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiB1cGRhdGluZyBhIG1vZGVsLCBkZWxlZ2F0aW5nIHRvIG9uZVRvTWFueU9uQ3JlYXRlIGlmIGNhc2NhZGUgdXBkYXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25VcGRhdGVcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25DcmVhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uVXBkYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25VcGRhdGU6IGNoZWNrIGlmIGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqXG4gKiAgIGFsdCBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKiAgICAgb25lVG9NYW55T25VcGRhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogYXBwbHkodGhpcywgW2NvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxdKVxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+Pm9uZVRvTWFueU9uVXBkYXRlOiB2b2lkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25VcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNhc2NhZGUgfSA9IGRhdGE7XG4gIGlmIChjYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIHJldHVybiBvbmVUb01hbnlPbkNyZWF0ZS5hcHBseSh0aGlzIGFzIGFueSwgW1xuICAgIGNvbnRleHQsXG4gICAgZGF0YSxcbiAgICBrZXkgYXMga2V5b2YgTW9kZWwsXG4gICAgbW9kZWwsXG4gIF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBkZWxldGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgYWxsIHJlbGF0ZWQgbW9kZWxzIGlmIGNhc2NhZGUgZGVsZXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIGNhc2NhZGUuZGVsZXRlIGlzIENBU0NBREVcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgdmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqXG4gKiAgIGFsdCBpc0luc3RhbnRpYXRlZCAoYXJyYXlUeXBlIGlzIFwib2JqZWN0XCIpXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbCh2YWx1ZXNbMF0pXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb01hbnlPbkRlbGV0ZTogcmVwb1xuICogICBlbHNlIG5vdCBpbnN0YW50aWF0ZWRcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBpZCBpbiB1bmlxdWVWYWx1ZXNcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG86IGRlbGV0ZShpZCwgY29udGV4dClcbiAqICAgICByZXBvLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkYXRhLmNhc2NhZGUuZGVsZXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgdmFsdWVzID0gbW9kZWxba2V5XSBhcyBhbnk7XG4gIGlmICghdmFsdWVzIHx8ICF2YWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiB2YWx1ZXNbMF07XG4gIGNvbnN0IGFyZUFsbFNhbWVUeXBlID0gdmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpO1xuICBpZiAoIWFyZUFsbFNhbWVUeXBlKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdLCB0aGlzLmFkYXB0ZXIuYWxpYXMpXG4gICAgOiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuXG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoW1xuICAgIC4uLihpc0luc3RhbnRpYXRlZFxuICAgICAgPyB2YWx1ZXMubWFwKCh2OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2W3JlcG8ucGsgYXMgc3RyaW5nXSlcbiAgICAgIDogdmFsdWVzKSxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgcmVwby5kZWxldGUoaWQsIGNvbnRleHQpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZCk7XG4gIH1cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBrZXkgZm9yIGNhY2hpbmcgcG9wdWxhdGVkIG1vZGVsIHJlbGF0aW9uc2hpcHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSB1bmlxdWUga2V5IGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzIGluIHRoZSBjYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgZG90LXNlcGFyYXRlZCBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleShcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4pIHtcbiAgcmV0dXJuIFtQZXJzaXN0ZW5jZUtleXMuUE9QVUxBVEUsIHRhYmxlTmFtZSwgZmllbGROYW1lLCBpZF0uam9pbihcIi5cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhY2hlcyBhIG1vZGVsIGZvciBsYXRlciBwb3B1bGF0aW9uXG4gKiBAc3VtbWFyeSBTdG9yZXMgYSBtb2RlbCBpbiB0aGUgY29udGV4dCBjYWNoZSBmb3IgZWZmaWNpZW50IHJldHJpZXZhbCBkdXJpbmcgcmVsYXRpb25zaGlwIHBvcHVsYXRpb25cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmVudE1vZGVsIC0gVGhlIHBhcmVudCBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHBrVmFsdWUgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7YW55fSBjYWNoZVZhbHVlIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNhY2hlXG4gKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY2FjaGUgb3BlcmF0aW9uXG4gKiBAZnVuY3Rpb24gY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuPihcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgcGFyZW50TW9kZWw6IE0sXG4gIHByb3BlcnR5S2V5OiBrZXlvZiBNIHwgc3RyaW5nLFxuICBwa1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGNhY2hlVmFsdWU6IGFueVxuKSB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkoXG4gICAgcGFyZW50TW9kZWwuY29uc3RydWN0b3IubmFtZSxcbiAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmcsXG4gICAgcGtWYWx1ZVxuICApO1xuICByZXR1cm4gY29udGV4dC5hY2N1bXVsYXRlKHsgW2NhY2hlS2V5XTogY2FjaGVWYWx1ZSB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUG9wdWxhdGVzIGEgbW9kZWwncyByZWxhdGlvbnNoaXBcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgYXR0YWNoZXMgcmVsYXRlZCBtb2RlbHMgdG8gYSBtb2RlbCdzIHJlbGF0aW9uc2hpcCBwcm9wZXJ0eVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBwb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwb3B1bGF0ZVxuICogICBwYXJ0aWNpcGFudCBmZXRjaFBvcHVsYXRlVmFsdWVzXG4gKiAgIHBhcnRpY2lwYW50IGdldFBvcHVsYXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqXG4gKiAgIENhbGxlci0+PnBvcHVsYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IGNoZWNrIGlmIGRhdGEucG9wdWxhdGUgaXMgdHJ1ZVxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBnZXQgbmVzdGVkIHZhbHVlIGFuZCBjaGVjayBpZiBpdCBleGlzdHNcbiAqXG4gKiAgIHBvcHVsYXRlLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogY29udGV4dCwgbW9kZWwsIGtleSwgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXVxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGluaXRpYWxpemUgdmFyaWFibGVzXG4gKlxuICogICBsb29wIGZvciBlYWNoIHByb0tleVZhbHVlIGluIHByb3BLZXlWYWx1ZXNcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Z2V0UG9wdWxhdGVLZXk6IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsIHByb3BOYW1lLCBwcm9LZXlWYWx1ZVxuICogICAgIGdldFBvcHVsYXRlS2V5LS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNhY2hlS2V5XG4gKlxuICogICAgIGFsdCB0cnkgdG8gZ2V0IGZyb20gY2FjaGVcbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5Db250ZXh0OiBnZXQoY2FjaGVLZXkpXG4gKiAgICAgICBDb250ZXh0LS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVsc2UgY2F0Y2ggZXJyb3JcbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BOYW1lXG4gKiAgICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiByZXBvXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwbzogcmVhZChwcm9LZXlWYWx1ZSlcbiAqICAgICAgIHJlcG8tLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogdmFsXG4gKiAgICAgZW5kXG4gKlxuICogICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBhZGQgdmFsIHRvIHJlc3VsdHNcbiAqICAgZW5kXG4gKlxuICogICBmZXRjaFBvcHVsYXRlVmFsdWVzLS0+PnBvcHVsYXRlOiByZXN1bHRzXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IHNldCBtb2RlbFtrZXldID0gaXNBcnIgPyByZXMgOiByZXNbMF1cbiAqICAgcG9wdWxhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEucG9wdWxhdGUpIHJldHVybjtcbiAgY29uc3QgbmVzdGVkOiBhbnkgPSBtb2RlbFtrZXldO1xuICBjb25zdCBpc0FyciA9IEFycmF5LmlzQXJyYXkobmVzdGVkKTtcbiAgaWYgKHR5cGVvZiBuZXN0ZWQgPT09IFwidW5kZWZpbmVkXCIgfHwgKGlzQXJyICYmIG5lc3RlZC5sZW5ndGggPT09IDApKSByZXR1cm47XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjOiBDb250ZXh0PEY+LFxuICAgIG1vZGVsOiBNLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgcHJvcEtleVZhbHVlczogYW55W10sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGNvbnN0IHJlc3VsdHM6IE1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvS2V5VmFsdWUgb2YgcHJvcEtleVZhbHVlcykge1xuICAgICAgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsID0gYXdhaXQgYy5nZXQoY2FjaGVLZXkgYXMgYW55KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwgcHJvcE5hbWUsIGFsaWFzKTtcbiAgICAgICAgaWYgKCFyZXBvKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHJlcG9cIik7XG4gICAgICAgIHZhbCA9IGF3YWl0IHJlcG8ucmVhZChwcm9LZXlWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSBhcyBzdHJpbmcsXG4gICAgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXSxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGNvbW1vbiBKYXZhU2NyaXB0IHR5cGVzXG4gKiBAc3VtbWFyeSBBbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBjb21tb24gSmF2YVNjcmlwdCB0eXBlcyB0aGF0IGFyZSBub3QgY3VzdG9tIG1vZGVsIHR5cGVzXG4gKiBAY29uc3QgY29tbW9tVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5jb25zdCBjb21tb21UeXBlcyA9IFtcbiAgXCJhcnJheVwiLFxuICBcInN0cmluZ1wiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgcHJvcGVydHkgYmFzZWQgb24gaXRzIHR5cGUgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEV4YW1pbmVzIGEgbW9kZWwgcHJvcGVydHkncyB0eXBlIG1ldGFkYXRhIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgcmVwb3NpdG9yeSBmb3IgcmVsYXRlZCBtb2RlbHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge2FueX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgY29udGFpbmluZyB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZXhhbWluZVxuICogQHJldHVybiB7UmVwbzxNPn0gQSByZXBvc2l0b3J5IGZvciB0aGUgbW9kZWwgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgUmVmbGVjdFxuICogICBwYXJ0aWNpcGFudCBWYWxpZGF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqXG4gKiAgIENhbGxlci0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwgcHJvcGVydHlLZXlcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+VmFsaWRhdGlvbjoga2V5KEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHlLZXldKSA/IFZhbGlkYXRpb25LZXlzLkxJU1QgOiBWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICogICBWYWxpZGF0aW9uLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiB2YWxpZGF0aW9uS2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlJlZmxlY3Q6IGdldE1ldGFkYXRhKHZhbGlkYXRpb25LZXksIG1vZGVsLCBwcm9wZXJ0eUtleSlcbiAqICAgUmVmbGVjdC0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdHlwZXNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGRldGVybWluZSBjdXN0b21UeXBlcyBiYXNlZCBvbiBwcm9wZXJ0eSB0eXBlXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIHR5cGVzIGFuZCBjdXN0b21UeXBlcyBleGlzdFxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY3JlYXRlIGFsbG93ZWRUeXBlcyBhcnJheVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBmaW5kIGNvbnN0cnVjdG9yTmFtZSBub3QgaW4gY29tbW9tVHlwZXNcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY2hlY2sgaWYgY29uc3RydWN0b3JOYW1lIGV4aXN0c1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5Nb2RlbDogZ2V0KGNvbnN0cnVjdG9yTmFtZSlcbiAqICAgTW9kZWwtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNvbnN0cnVjdG9yXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yIGV4aXN0c1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgUmVwb3NpdG9yeS0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogcmVwb1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+Q2FsbGVyOiByZXBvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgYWxpYXM/OiBzdHJpbmdcbik6IFJlcG88TT4ge1xuICBjb25zdCB0eXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgVmFsaWRhdGlvbi5rZXkoXG4gICAgICBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICAgICAgPyBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRVxuICAgICksXG4gICAgbW9kZWwsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nXG4gICk7XG4gIGNvbnN0IGN1c3RvbVR5cGVzOiBhbnkgPSBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICA/IHR5cGVzLmNsYXp6XG4gICAgOiB0eXBlcy5jdXN0b21UeXBlcztcbiAgaWYgKCF0eXBlcyB8fCAhY3VzdG9tVHlwZXMpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZpbmQgdHlwZXMgZGVjb3JhdG9ycyBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eUtleSBhcyBzdHJpbmd9YFxuICAgICk7XG5cbiAgY29uc3QgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IChcbiAgICBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKSA/IFsuLi5jdXN0b21UeXBlc10gOiBbY3VzdG9tVHlwZXNdXG4gICkubWFwKCh0KSA9PiAodHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIiA/IHQoKSA6IHQpKTtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gYWxsb3dlZFR5cGVzLmZpbmQoXG4gICAgKHQpID0+ICFjb21tb21UeXBlcy5pbmNsdWRlcyhgJHt0fWAudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKCFjb25zdHJ1Y3Rvck5hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgUHJvcGVydHkga2V5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29uc3RydWN0b3IgdHlwZWBcbiAgICApO1xuICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfCB1bmRlZmluZWQgPSBNb2RlbC5nZXQoY29uc3RydWN0b3JOYW1lKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtjb25zdHJ1Y3Rvck5hbWV9YCk7XG5cbiAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IsIGFsaWFzKTtcbn1cblxuIiwiaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25VcGRhdGUsXG4gIGFmdGVyQW55LFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHQsXG4gIHRpbWVzdGFtcCxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSwgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q2FzY2FkZSwgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBsaXN0LFxuICBNb2RlbCxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQge1xuICBKb2luQ29sdW1uT3B0aW9ucyxcbiAgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgSm9pblRhYmxlT3B0aW9ucyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBvbmVUb01hbnlPbkNyZWF0ZSxcbiAgb25lVG9NYW55T25EZWxldGUsXG4gIG9uZVRvTWFueU9uVXBkYXRlLFxuICBvbmVUb09uZU9uQ3JlYXRlLFxuICBvbmVUb09uZU9uRGVsZXRlLFxuICBvbmVUb09uZU9uVXBkYXRlLFxuICBwb3B1bGF0ZSBhcyBwb3AsXG59IGZyb20gXCIuL2NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbCBjbGFzcyBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzc1xuICogQGZ1bmN0aW9uIHRhYmxlXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGFibGU8T1BUUyA9IHN0cmluZz4ob3B0czogT1BUUykge1xuICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtZXRhZGF0YSxcbiAgICAgIGFyZ3M6IFtrZXksIG9wdHNdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgcHJvcGVydHlcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIHNwZWNpZmljIGNvbHVtbiBuYW1lIGluIHRoZSBkYXRhYmFzZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIGluIHRoZSBkYXRhYmFzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNvbHVtblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbHVtbjxPUFRTID0gc3RyaW5nPihjb2x1bW5OYW1lPzogT1BUUykge1xuICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1uKGssIGMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbHVtbihvYmo6IGFueSwgYXR0cjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BNZXRhZGF0YShrLCBjIHx8IGF0dHIpKG9iaiwgYXR0cik7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgYXJnczogW2tleSwgY29sdW1uTmFtZV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmRleCBvbiBhIG1vZGVsIHByb3BlcnR5IGZvciBpbXByb3ZlZCBxdWVyeSBwZXJmb3JtYW5jZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSB0byBiZSBpbmRleGVkIGluIHRoZSBkYXRhYmFzZSwgb3B0aW9uYWxseSB3aXRoIHNwZWNpZmljIGRpcmVjdGlvbnMgYW5kIGNvbXBvc2l0aW9uc1xuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbltdfSBbZGlyZWN0aW9uc10gLSBPcHRpb25hbCBhcnJheSBvZiBzb3J0IGRpcmVjdGlvbnMgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0byBjcmVhdGUgYSBjb21wb3NpdGUgaW5kZXhcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBpbmRleFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KCk6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgobmFtZTogc3RyaW5nKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgZGlyZWN0aW9uczogT3JkZXJEaXJlY3Rpb25bXVxuKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgZGlyZWN0aW9uczogT3JkZXJEaXJlY3Rpb25bXSxcbiAgbmFtZTogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KGNvbXBvc2l0aW9uczogc3RyaW5nW10pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBjb21wb3NpdGlvbnM6IHN0cmluZ1tdLFxuICBuYW1lOiBzdHJpbmdcbik6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdIHwgc3RyaW5nW10gfCBzdHJpbmcsXG4gIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBuYW1lPzogc3RyaW5nXG4pIHtcbiAgZnVuY3Rpb24gaW5kZXgoXG4gICAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10gfCBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIGlmICh0eXBlb2YgZGlyZWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbmFtZSA9IGRpcmVjdGlvbnM7XG4gICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgY29tcG9zaXRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbXBvc2l0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbmFtZSA9IGNvbXBvc2l0aW9ucztcbiAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCFjb21wb3NpdGlvbnMgJiYgZGlyZWN0aW9ucykge1xuICAgICAgaWYgKFxuICAgICAgICBkaXJlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgKGQpID0+ICFbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdLmluY2x1ZGVzKGQgYXMgYW55KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29tcG9zaXRpb25zID0gZGlyZWN0aW9ucyBhcyBzdHJpbmdbXTtcbiAgICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKFxuICAgICAgUmVwb3NpdG9yeS5rZXkoXG4gICAgICAgIGAke1BlcnNpc3RlbmNlS2V5cy5JTkRFWH0ke2NvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoID8gYC4ke2NvbXBvc2l0aW9ucy5qb2luKFwiLlwiKX1gIDogXCJcIn1gXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBkaXJlY3Rpb25zOiBkaXJlY3Rpb25zLFxuICAgICAgICBjb21wb3NpdGlvbnM6IGNvbXBvc2l0aW9ucyxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgIH0gYXMgSW5kZXhNZXRhZGF0YVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLklOREVYKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBpbmRleCxcbiAgICAgIGFyZ3M6IFtkaXJlY3Rpb25zLCBjb21wb3NpdGlvbnMsIG5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVuZm9yY2VzIHVuaXF1ZW5lc3MgY29uc3RyYWludCBkdXJpbmcgbW9kZWwgY3JlYXRpb24gYW5kIHVwZGF0ZVxuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgdW5pcXVlIGRlY29yYXRvciB0byBjaGVjayBpZiBhIHByb3BlcnR5IHZhbHVlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhYmFzZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgbWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIG1ldGFkYXRhIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciB1bmlxdWVuZXNzXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2sgaXMgY29tcGxldGUgb3IgcmVqZWN0cyB3aXRoIGEgQ29uZmxpY3RFcnJvclxuICogQGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNlbGVjdCgpXG4gICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoa2V5KS5lcShtb2RlbFtrZXldKSlcbiAgICAuZXhlY3V0ZSgpO1xuICBpZiAoZXhpc3RpbmcubGVuZ3RoKVxuICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgYG1vZGVsIGFscmVhZHkgZXhpc3RzIHdpdGggcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBlcXVhbCB0byAke0pTT04uc3RyaW5naWZ5KChtb2RlbCBhcyBhbnkpW2tleV0sIHVuZGVmaW5lZCwgMil9YFxuICAgICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRhZ3MgYSBwcm9wZXJ0eSBhcyB1bmlxdWVcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVuc3VyZXMgYSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmlxdWUgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1bmlxdWVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEB1bmlxdWUoKVxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlVXBkYXRlKHVuaXF1ZU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHVzZXIgaWRlbnRpZmljYXRpb24gZm9yIG93bmVyc2hpcCB0cmFja2luZ1xuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZGVjb3JhdG9ycyB0byBzZXQgb3duZXJzaGlwIGluZm9ybWF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzdG9yZSB0aGUgdXNlciBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aXRoIGFuIEF1dGhvcml6YXRpb25FcnJvciBpZiB1c2VyIGlkZW50aWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWRcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBkYXRhOiBWLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhY2tzIHRoZSBjcmVhdG9yIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQGNyZWF0ZWRCeSgpXG4gKiAgIGNyZWF0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgbGFzdCB1cGRhdGVyIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGxhc3QgdXBkYXRlZCB0aGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1cGRhdGVkQnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgRG9jdW1lbnQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdXBkYXRlZEJ5KClcbiAqICAgbGFzdEVkaXRvciE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRBdCgpIHtcbiAgcmV0dXJuIHRpbWVzdGFtcChbT3BlcmF0aW9uS2V5cy5DUkVBVEVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRBdCgpIHtcbiAgcmV0dXJuIHRpbWVzdGFtcCgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBvbmVUb09uZShQcm9maWxlKVxuICogICBwcm9maWxlITogc3RyaW5nIHwgUHJvZmlsZTtcbiAqIH1cbiAqXG4gKiBjbGFzcyBQcm9maWxlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgYmlvITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlLFxuICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICBmaz86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FKTtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuXG4gIGZ1bmN0aW9uIG9uZVRvT25lRGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5Db2x1bW5PcHRzPzogSm9pbkNvbHVtbk9wdGlvbnMsXG4gICAgZms/OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICBpZiAoam9pbkNvbHVtbk9wdHMpIG1ldGEuam9pblRhYmxlID0gam9pbkNvbHVtbk9wdHM7XG4gICAgaWYgKGZrKSBtZXRhLm5hbWUgPSBmaztcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvT25lT25DcmVhdGUsIG1ldGEpLFxuICAgICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb09uZU9uRGVsZXRlLCBtZXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvbmVUb09uZURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luQ29sdW1uT3B0cywgZmtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqXG4gKiAgIEBvbmVUb01hbnkoQm9vaylcbiAqICAgYm9va3MhOiBzdHJpbmdbXSB8IEJvb2tbXTtcbiAqIH1cbiAqXG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9PbmVcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZTogYm9vbGVhbiA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpO1xuXG4gIGZ1bmN0aW9uIG9uZVRvTWFueURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgZms/OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIGxpc3QoW1xuICAgICAgICBjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgU3RyaW5nLFxuICAgICAgICBOdW1iZXIsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQmlnaW50IGlzIG5vdCBhIGNvbnN0cnVjdG9yXG4gICAgICAgIEJpZ0ludCxcbiAgICAgIF0pLFxuICAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9NYW55RGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5UYWJsZU9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlID0gdHJ1ZSxcbiAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICBmaz86IHN0cmluZ1xuKSB7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuXG4gIGZ1bmN0aW9uIG1hbnlUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgZms/OiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKCFjbGF6ei5uYW1lKVxuICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3I8TT4pKCkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICAvLyBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtYW55VG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pblRhYmxlT3B0cywgZmtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuXG4gIGZ1bmN0aW9uIG1hbnlUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbGwocG9wdWxhdGUsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsImltcG9ydCB7XG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0U2VxdWVuY2VPcHRpb25zLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG59IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgcmVhZG9ubHksXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tIFwiLi4vbW9kZWwvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgc2VxdWVuY2VOYW1lRm9yTW9kZWwgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcmltYXJ5IGtleSBjcmVhdGlvblxuICogQHN1bW1hcnkgSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcHJpbWFyeSBrZXkgdmFsdWVzIGZvciBtb2RlbHMgdXNpbmcgc2VxdWVuY2VzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSB0aGF0IGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIHRoYXQgZXh0ZW5kcyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgZXhlY3V0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBzZXF1ZW5jZSBvcHRpb25zXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgYXMgcHJpbWFyeSBrZXlcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByaW1hcnkga2V5IGlzIHNldFxuICogQGZ1bmN0aW9uIHBrT25DcmVhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHBrT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTZXF1ZW5jZVxuICpcbiAqICAgTW9kZWwtPj5wa09uQ3JlYXRlOiBDYWxsIHdpdGggbW9kZWwgaW5zdGFuY2VcbiAqICAgTm90ZSBvdmVyIHBrT25DcmVhdGU6IENoZWNrIGlmIGtleSBhbHJlYWR5IGV4aXN0c1xuICogICBhbHQgS2V5IGV4aXN0cyBvciBubyB0eXBlIHNwZWNpZmllZFxuICogICAgIHBrT25DcmVhdGUtLT4+TW9kZWw6IFJldHVybiBlYXJseVxuICogICBlbHNlIEtleSBuZWVkcyB0byBiZSBjcmVhdGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PnBrT25DcmVhdGU6IEdlbmVyYXRlIHNlcXVlbmNlIG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PkFkYXB0ZXI6IFJlcXVlc3QgU2VxdWVuY2UoZGF0YSlcbiAqICAgICBBZGFwdGVyLT4+U2VxdWVuY2U6IENyZWF0ZSBzZXF1ZW5jZVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBzZXF1ZW5jZVxuICogICAgIHBrT25DcmVhdGUtPj5TZXF1ZW5jZTogQ2FsbCBuZXh0KClcbiAqICAgICBTZXF1ZW5jZS0tPj5wa09uQ3JlYXRlOiBSZXR1cm4gbmV4dCB2YWx1ZVxuICogICAgIHBrT25DcmVhdGUtPj5Nb2RlbDogU2V0IHByaW1hcnkga2V5IHZhbHVlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGtPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFNlcXVlbmNlT3B0aW9ucyxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnR5cGUgfHwgIWRhdGEuZ2VuZXJhdGVkIHx8IG1vZGVsW2tleV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXRQcmltYXJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgbGV0IHNlcXVlbmNlOiBTZXF1ZW5jZTtcbiAgdHJ5IHtcbiAgICBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShkYXRhKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAgc2V0UHJpbWFyeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBLZXkgRGVjb3JhdG9yXG4gKiBAc3VtbWFyeSBNYXJrcyBhIHByb3BlcnR5IGFzIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5IHdpdGggYXV0b21hdGljIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGNvbWJpbmVzIG11bHRpcGxlIGJlaGF2aW9yczogaXQgbWFya3MgdGhlIHByb3BlcnR5IGFzIHVuaXF1ZSwgcmVxdWlyZWQsXG4gKiBhbmQgZW5zdXJlcyB0aGUgaW5kZXggaXMgY3JlYXRlZCBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHNlcXVlbmNlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09taXQ8U2VxdWVuY2VPcHRpb25zLCBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiPn0gb3B0cyAtIE9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtb2RlbCBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gcGtcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBwaygpXG4gKiAgIGlkITogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBrKFxuICBvcHRzOiBPbWl0PFxuICAgIFNlcXVlbmNlT3B0aW9ucyxcbiAgICBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiXG4gID4gPSBEZWZhdWx0U2VxdWVuY2VPcHRpb25zXG4pIHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsIG9wdHMsIHtcbiAgICBnZW5lcmF0ZWQ6XG4gICAgICBvcHRzLnR5cGUgJiYgdHlwZW9mIG9wdHMuZ2VuZXJhdGVkID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IG9wdHMuZ2VuZXJhdGVkIHx8IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMuZ2VuZXJhdGVkLFxuICB9KSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcbiAgZnVuY3Rpb24gcGtEZWMob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9iajogYW55LCBhdHRyOiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgaW5kZXgoW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXSksXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIHByb3BNZXRhZGF0YShrZXksIG9wdGlvbnMpLFxuICAgICAgICBvbkNyZWF0ZShwa09uQ3JlYXRlLCBvcHRpb25zKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKERCS2V5cy5JRCwgYXR0cilcbiAgICAgICkob2JqLCBhdHRyKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHBrRGVjLFxuICAgICAgYXJnczogW29wdHNdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjcmVhdGVkQXQsIHVwZGF0ZWRBdCB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBtb2RlbCBjbGFzcyBmb3IgYWxsIGRvbWFpbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBNb2RlbCBjbGFzcyBmcm9tIGRlY29yYXRvci12YWxpZGF0aW9uIGFuZCBhZGRzIHRpbWVzdGFtcCBmdW5jdGlvbmFsaXR5LlxuICogQWxsIGRvbWFpbiBtb2RlbHMgaW4gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyB0byBpbmhlcml0IGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBiZWhhdmlvcnMuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEJhc2VNb2RlbD59IGFyZyAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIGRhdGEgZm9yIHRoZSBtb2RlbFxuICogQGNsYXNzIEJhc2VNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqICAgXG4gKiAgIEBlbWFpbCgpXG4gKiAgIGVtYWlsITogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IoZGF0YT86IE1vZGVsQXJnPFVzZXI+KSB7XG4gKiAgICAgc3VwZXIoZGF0YSk7XG4gKiAgIH1cbiAqIH1cbiAqIFxuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgdXNlcm5hbWU6ICdqb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IEF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgbW9kZWwgaXMgY3JlYXRlZFxuICAgKi9cbiAgQGNyZWF0ZWRBdCgpXG4gIGNyZWF0ZWRPbiE6IERhdGU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMYXN0IHVwZGF0ZSB0aW1lc3RhbXAgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSB3aGVuZXZlciB0aGUgbW9kZWwgaXMgbW9kaWZpZWRcbiAgICovXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkT24hOiBEYXRlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGFnaW5nRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwYWdpbmF0aW9uIGZvciBkYXRhYmFzZSBxdWVyaWVzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBuYXZpZ2F0aW5nIHRocm91Z2ggcGFnaW5hdGVkIHF1ZXJ5IHJlc3VsdHNcbiAqXG4gKiBUaGlzIGFic3RyYWN0IGNsYXNzIG1hbmFnZXMgdGhlIHN0YXRlIGFuZCBuYXZpZ2F0aW9uIG9mIHBhZ2luYXRlZCBkYXRhYmFzZSBxdWVyeSByZXN1bHRzLlxuICogSXQgdHJhY2tzIHRoZSBjdXJyZW50IHBhZ2UsIHRvdGFsIHBhZ2VzLCBhbmQgcmVjb3JkIGNvdW50LCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIG1vdmluZyBiZXR3ZWVuIHBhZ2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBwYWdpbmF0b3Igb3BlcmF0ZXMgb25cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBwYWdpbmF0ZWQgcXVlcnkgKGRlZmF1bHRzIHRvIE1bXSlcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgKGRlZmF1bHRzIHRvIGFueSlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIFEsIGFueSwgYW55Pn0gYWRhcHRlciAtIFRoZSBkYXRhYmFzZSBhZGFwdGVyIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBwYXJhbSB7UX0gcXVlcnkgLSBUaGUgcXVlcnkgdG8gcGFnaW5hdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiByZWNvcmRzIHBlciBwYWdlXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIHR5cGVcbiAqIEBjbGFzcyBQYWdpbmF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBwYWdpbmF0b3IgZm9yIGEgdXNlciBxdWVyeVxuICogY29uc3QgdXNlclF1ZXJ5ID0gZGIuc2VsZWN0KCkuZnJvbShVc2VyKTtcbiAqIGNvbnN0IHBhZ2luYXRvciA9IGF3YWl0IHVzZXJRdWVyeS5wYWdpbmF0ZSgxMCk7IC8vIDEwIHVzZXJzIHBlciBwYWdlXG4gKlxuICogLy8gR2V0IHRoZSBmaXJzdCBwYWdlIG9mIHJlc3VsdHNcbiAqIGNvbnN0IGZpcnN0UGFnZSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICpcbiAqIC8vIE5hdmlnYXRlIHRvIHRoZSBuZXh0IHBhZ2VcbiAqIGNvbnN0IHNlY29uZFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IubmV4dCgpO1xuICpcbiAqIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFnaW5hdGlvblxuICogY29uc29sZS5sb2coYFBhZ2UgJHtwYWdpbmF0b3IuY3VycmVudH0gb2YgJHtwYWdpbmF0b3IudG90YWx9LCAke3BhZ2luYXRvci5jb3VudH0gdG90YWwgcmVjb3Jkc2ApO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvclxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERhdGFiYXNlXG4gKlxuICogICBDbGllbnQtPj5QYWdpbmF0b3I6IG5ldyBQYWdpbmF0b3IoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KVxuICogICBDbGllbnQtPj5QYWdpbmF0b3I6IHBhZ2UoMSlcbiAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiB2YWxpZGF0ZVBhZ2UoMSlcbiAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBwcmVwYXJlKHF1ZXJ5KVxuICogICBQYWdpbmF0b3ItPj5BZGFwdGVyOiBleGVjdXRlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvblxuICogICBBZGFwdGVyLT4+RGF0YWJhc2U6IGV4ZWN1dGUgcXVlcnlcbiAqICAgRGF0YWJhc2UtLT4+QWRhcHRlcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJldHVybiByZXN1bHRzXG4gKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJldHVybiBwYWdlIHJlc3VsdHNcbiAqXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogbmV4dCgpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogcGFnZShjdXJyZW50ICsgMSlcbiAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiB2YWxpZGF0ZVBhZ2UoY3VycmVudCArIDEpXG4gKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IGV4ZWN1dGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgUGFnaW5hdG9yLS0+PkNsaWVudDogcmV0dXJuIHBhZ2UgcmVzdWx0c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUiA9IE1bXSwgUSA9IGFueT4ge1xuICBwcm90ZWN0ZWQgX2N1cnJlbnRQYWdlITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3RvdGFsUGFnZXMhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfcmVjb3JkQ291bnQhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsaW1pdCE6IG51bWJlcjtcblxuICBwcml2YXRlIF9zdGF0ZW1lbnQ/OiBRO1xuXG4gIGdldCBjdXJyZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZTtcbiAgfVxuXG4gIGdldCB0b3RhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxQYWdlcztcbiAgfVxuXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZWNvcmRDb3VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgc3RhdGVtZW50KCkge1xuICAgIGlmICghdGhpcy5fc3RhdGVtZW50KSB0aGlzLl9zdGF0ZW1lbnQgPSB0aGlzLnByZXBhcmUodGhpcy5xdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgUSwgYW55LCBhbnk+LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBxdWVyeTogUSxcbiAgICByZWFkb25seSBzaXplOiBudW1iZXIsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByZXBhcmUocmF3U3RhdGVtZW50OiBRKTogUTtcblxuICBhc3luYyBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2UodGhpcy5jdXJyZW50ICsgMSk7XG4gIH1cblxuICBhc3luYyBwcmV2aW91cygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCAtIDEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICBpZiAocGFnZSA8IDEgfHwgIU51bWJlci5pc0ludGVnZXIocGFnZSkpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIFwiUGFnZSBudW1iZXIgY2Fubm90IGJlIHVuZGVyIDEgYW5kIG11c3QgYmUgYW4gaW50ZWdlclwiXG4gICAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdG90YWxQYWdlcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwYWdlID4gdGhpcy5fdG90YWxQYWdlcylcbiAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcbiAgICAgICAgYE9ubHkgJHt0aGlzLl90b3RhbFBhZ2VzfSBhcmUgYXZhaWxhYmxlLiBDYW5ub3QgZ28gdG8gcGFnZSAke3BhZ2V9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuXG4gIGFic3RyYWN0IHBhZ2UocGFnZT86IG51bWJlcik6IFByb21pc2U8UltdPjtcbn1cbiIsImltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRvciwgUmF3RXhlY3V0b3IgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGcm9tU2VsZWN0b3IsXG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgT3JkZXJCeVNlbGVjdG9yLFxuICBTZWxlY3RTZWxlY3Rvcixcbn0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi9Db25kaXRpb25cIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlscy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvdW50T3B0aW9uLFxuICBEaXN0aW5jdE9wdGlvbixcbiAgTGltaXRPcHRpb24sXG4gIE1heE9wdGlvbixcbiAgTWluT3B0aW9uLFxuICBPZmZzZXRPcHRpb24sXG4gIE9yZGVyQW5kR3JvdXBPcHRpb24sXG4gIFNlbGVjdE9wdGlvbixcbiAgV2hlcmVPcHRpb24sXG59IGZyb20gXCIuL29wdGlvbnNcIjtcbmltcG9ydCB7IFBhZ2luYXRhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUGFnaW5hdGFibGVcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNsYXNzIGZvciBkYXRhYmFzZSBxdWVyeSBzdGF0ZW1lbnRzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZvdW5kYXRpb24gZm9yIGJ1aWxkaW5nIGFuZCBleGVjdXRpbmcgZGF0YWJhc2UgcXVlcmllc1xuICpcbiAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cyB0aGUgcXVlcnkgYnVpbGRlciBwYXR0ZXJuIGZvciBjb25zdHJ1Y3RpbmdcbiAqIGRhdGFiYXNlIHF1ZXJpZXMuIEl0IHN1cHBvcnRzIHZhcmlvdXMgcXVlcnkgb3BlcmF0aW9ucyBsaWtlIHNlbGVjdCwgZnJvbSxcbiAqIHdoZXJlLCBvcmRlckJ5LCBncm91cEJ5LCBsaW1pdCwgYW5kIG9mZnNldC4gSXQgYWxzbyBwcm92aWRlcyBtZXRob2RzIGZvclxuICogZXhlY3V0aW5nIHF1ZXJpZXMgYW5kIGhhbmRsaW5nIHBhZ2luYXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSBzcGVjaWZpYyB0byB0aGUgZGF0YWJhc2UgYWRhcHRlclxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIHN0YXRlbWVudCBvcGVyYXRlcyBvblxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBRLCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgZGF0YWJhc2UgYWRhcHRlciB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAY2xhc3MgU3RhdGVtZW50XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc3RhdGVtZW50IHRvIHF1ZXJ5IHVzZXJzXG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgU1FMU3RhdGVtZW50KGFkYXB0ZXIpO1xuICogY29uc3QgdXNlcnMgPSBhd2FpdCBzdGF0ZW1lbnRcbiAqICAgLnNlbGVjdCgpXG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKFwic3RhdHVzXCIpLmVxKFwiYWN0aXZlXCIpKVxuICogICAub3JkZXJCeShbXCJjcmVhdGVkQXRcIiwgXCJERVNDXCJdKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKlxuICogLy8gVXNlIHBhZ2luYXRpb25cbiAqIGNvbnN0IHBhZ2luYXRvciA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuc2VsZWN0KClcbiAqICAgLmZyb20oVXNlcilcbiAqICAgLnBhZ2luYXRlKDIwKTsgLy8gMjAgdXNlcnMgcGVyIHBhZ2VcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEYXRhYmFzZVxuICpcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBzZWxlY3QoKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IGZyb20oTW9kZWwpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogd2hlcmUoY29uZGl0aW9uKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IG9yZGVyQnkoW2ZpZWxkLCBkaXJlY3Rpb25dKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IGxpbWl0KHZhbHVlKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IGV4ZWN1dGUoKVxuICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAqICAgU3RhdGVtZW50LT4+QWRhcHRlcjogcmF3KHF1ZXJ5KVxuICogICBBZGFwdGVyLT4+RGF0YWJhc2U6IGV4ZWN1dGUgcXVlcnlcbiAqICAgRGF0YWJhc2UtLT4+QWRhcHRlcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgQWRhcHRlci0tPj5TdGF0ZW1lbnQ6IHJldHVybiBwcm9jZXNzZWQgcmVzdWx0c1xuICogICBTdGF0ZW1lbnQtLT4+Q2xpZW50OiByZXR1cm4gZmluYWwgcmVzdWx0c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50PFEsIE0gZXh0ZW5kcyBNb2RlbCwgUj5cbiAgZXh0ZW5kcyBMb2dnZWRDbGFzc1xuICBpbXBsZW1lbnRzIEV4ZWN1dG9yPFI+LCBSYXdFeGVjdXRvcjxRPiwgUGFnaW5hdGFibGU8TSwgUiwgUT5cbntcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT5bXTtcbiAgcHJvdGVjdGVkIGRpc3RpbmN0U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIG1heFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBtaW5TZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgY291bnRTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgZnJvbVNlbGVjdG9yITogQ29uc3RydWN0b3I8TT47XG4gIHByb3RlY3RlZCB3aGVyZUNvbmRpdGlvbj86IENvbmRpdGlvbjxNPjtcbiAgcHJvdGVjdGVkIG9yZGVyQnlTZWxlY3Rvcj86IE9yZGVyQnlTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGdyb3VwQnlTZWxlY3Rvcj86IEdyb3VwQnlTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGxpbWl0U2VsZWN0b3I/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBvZmZzZXRTZWxlY3Rvcj86IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnksIFEsIGFueSwgYW55Pikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIHJldHVybiAodGhpcy5hZGFwdGVyIGFzIGFueSkubG9nLmZvcihTdGF0ZW1lbnQpO1xuICB9XG5cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBTZWxlY3RPcHRpb248TSwgTVtdPjtcbiAgc2VsZWN0PFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdPihcbiAgICBzZWxlY3RvcjogcmVhZG9ubHkgWy4uLlNdXG4gICk6IFNlbGVjdE9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT47XG5cbiAgQGZpbmFsKClcbiAgc2VsZWN0PFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdPihcbiAgICBzZWxlY3Rvcj86IHJlYWRvbmx5IFsuLi5TXVxuICApOiBTZWxlY3RPcHRpb248TSwgTVtdPiB8IFNlbGVjdE9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNlbGVjdFNlbGVjdG9yXCIsIHtcbiAgICAgIHZhbHVlOiBzZWxlY3RvcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcyBhcyBTZWxlY3RPcHRpb248TSwgTVtdPiB8IFNlbGVjdE9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBkaXN0aW5jdDxTIGV4dGVuZHMgU2VsZWN0U2VsZWN0b3I8TT4+KFxuICAgIHNlbGVjdG9yOiBTXG4gICk6IERpc3RpbmN0T3B0aW9uPE0sIE1bU11bXT4ge1xuICAgIHRoaXMuZGlzdGluY3RTZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIERpc3RpbmN0T3B0aW9uPE0sIE1bU11bXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBtYXg8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3RvcjogUyk6IE1heE9wdGlvbjxNLCBNW1NdPiB7XG4gICAgdGhpcy5tYXhTZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIE1heE9wdGlvbjxNLCBNW1NdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIG1pbjxTIGV4dGVuZHMgU2VsZWN0U2VsZWN0b3I8TT4+KHNlbGVjdG9yOiBTKTogTWluT3B0aW9uPE0sIE1bU10+IHtcbiAgICB0aGlzLm1pblNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgTWluT3B0aW9uPE0sIE1bU10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgY291bnQ8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3Rvcj86IFMpOiBDb3VudE9wdGlvbjxNLCBudW1iZXI+IHtcbiAgICB0aGlzLmNvdW50U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBDb3VudE9wdGlvbjxNLCBudW1iZXI+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIGZyb20oc2VsZWN0b3I6IEZyb21TZWxlY3RvcjxNPik6IFdoZXJlT3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLmZyb21TZWxlY3RvciA9IChcbiAgICAgIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmdldChzZWxlY3RvcikgOiBzZWxlY3RvclxuICAgICkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgaWYgKCF0aGlzLmZyb21TZWxlY3RvcilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGBDb3VsZCBub3QgZmluZCBzZWxlY3RvciBtb2RlbDogJHtzZWxlY3Rvcn1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyB3aGVyZShjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE9yZGVyQW5kR3JvdXBPcHRpb248TSwgUj4ge1xuICAgIHRoaXMud2hlcmVDb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgb3JkZXJCeShcbiAgICBzZWxlY3RvcjogT3JkZXJCeVNlbGVjdG9yPE0+XG4gICk6IExpbWl0T3B0aW9uPE0sIFI+ICYgT2Zmc2V0T3B0aW9uPFI+IHtcbiAgICB0aGlzLm9yZGVyQnlTZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIGdyb3VwQnkoc2VsZWN0b3I6IEdyb3VwQnlTZWxlY3RvcjxNPik6IExpbWl0T3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLmdyb3VwQnlTZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIGxpbWl0KHZhbHVlOiBudW1iZXIpOiBPZmZzZXRPcHRpb248Uj4ge1xuICAgIHRoaXMubGltaXRTZWxlY3RvciA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIG9mZnNldCh2YWx1ZTogbnVtYmVyKTogRXhlY3V0b3I8Uj4ge1xuICAgIHRoaXMub2Zmc2V0U2VsZWN0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxSPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5OiBRID0gdGhpcy5idWlsZCgpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnJhdyhxdWVyeSkpIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBRKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXc8Uj4ocmF3SW5wdXQpO1xuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3RvcikgcmV0dXJuIHJlc3VsdHM7XG4gICAgY29uc3QgcGtBdHRyID0gZmluZFByaW1hcnlLZXkoXG4gICAgICBuZXcgKHRoaXMuZnJvbVNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSgpXG4gICAgKS5pZDtcblxuICAgIGNvbnN0IHByb2Nlc3NvciA9IGZ1bmN0aW9uIHJlY29yZFByb2Nlc3NvcihcbiAgICAgIHRoaXM6IFN0YXRlbWVudDxRLCBNLCBSPixcbiAgICAgIHI6IGFueVxuICAgICkge1xuICAgICAgY29uc3QgaWQgPSByW3BrQXR0cl07XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChcbiAgICAgICAgcixcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3IgYXMgQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgcGtBdHRyLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBhbnk7XG4gICAgfS5iaW5kKHRoaXMgYXMgYW55KTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0cy5tYXAocHJvY2Vzc29yKSBhcyBSO1xuICAgIHJldHVybiBwcm9jZXNzb3IocmVzdWx0cykgYXMgUjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZCgpOiBRO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4sIC4uLmFyZ3M6IGFueVtdKTogUTtcbiAgYWJzdHJhY3QgcGFnaW5hdGUoc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgUT4+O1xufVxuIiwiLyoqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIG1vZHVsZSBmb3IgdGhlIERlY2FmIFR5cGVTY3JpcHQgZnJhbWV3b3JrXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZm91bmRhdGlvbmFsIGNvbXBvbmVudHMgb2YgdGhlIERlY2FmIGZyYW1ld29yaywgaW5jbHVkaW5nIGlkZW50aXR5IG1hbmFnZW1lbnQsXG4gKiBtb2RlbCBkZWZpbml0aW9ucywgcmVwb3NpdG9yeSBwYXR0ZXJucywgcGVyc2lzdGVuY2UgbGF5ZXIsIHF1ZXJ5IGJ1aWxkaW5nLCBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKiBJdCBleHBvcnRzIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHNldHMgdXAgdGhlIGluamVjdGFibGUgcmVnaXN0cnkgZm9yIHJlcG9zaXRvcnkgZGVjb3JhdG9ycy5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlc1JlZ2lzdHJ5IH0gZnJvbSBcIi4vcmVwb3NpdG9yeS9pbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuXG4vLyBvdmVycmlkZXMgdGhlIHByZXZpb3VzIEluamVjdGFibGVzIHJlZ2lzdHJ5IHRvIGVuYWJsZSB0aGUgQHJlcG9zaXRvcnkgZGVjb3JhdG9yXG5JbmplY3RhYmxlcy5zZXRSZWdpc3RyeShuZXcgSW5qZWN0YWJsZXNSZWdpc3RyeSgpKTtcblxuLy8gaW1wb3J0ZWQgZmlyc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJSZXBvc2l0b3J5IiwiUmVwbyIsIlJlcCIsInBvcHVsYXRlIiwicG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7OztBQU1HO0lBQ1M7QUFBWixDQUFBLFVBQVksZUFBZSxFQUFBOztBQUV6QixJQUFBLGVBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUdmLElBQUEsZUFBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCOztBQUdqQixJQUFBLGVBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjs7QUFHbkIsSUFBQSxlQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsMkJBQXdDOztBQUd4QyxJQUFBLGVBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUdmLElBQUEsZUFBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCOztBQUdqQixJQUFBLGVBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxZQUF1Qjs7O0FBSXZCLElBQUEsZUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCOztBQUd2QixJQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsR0FBQSxzQkFBc0M7O0FBR3RDLElBQUEsZUFBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLHNCQUFzQzs7O0FBS3RDLElBQUEsZUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFB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QUEsU0FBQSxFQUFBLFNBQUEsRUFBQSxJQUFBLENBQUE7QUFHTSxVQUFBLENBQUE7QUFETixJQUFBLEtBQUssRUFBRTs7OztBQUlQLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFNBQUEsRUFBQSxJQUFBLENBQUE7QUFHTSxVQUFBLENBQUE7QUFETixJQUFBLEtBQUssRUFBRTs7OztBQUlQLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLE9BQUEsRUFBQSxJQUFBLENBQUE7QUFHTSxVQUFBLENBQUE7QUFETixJQUFBLEtBQUssRUFBRTs7OztBQUlQLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFFBQUEsRUFBQSxJQUFBLENBQUE7QUFHSyxVQUFBLENBQUE7QUFETCxJQUFBLEtBQUssRUFBRTs7OztBQVFQLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFNBQUEsRUFBQSxJQUFBLENBQUE7O0FDdk1IOzs7Ozs7QUFNRztBQUtIO0FBQ0EsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7QUFhbEQ7Ozs7O0FBS0c7QUFDSSxNQUFNLE9BQU8sR0FBRzs7OzsifQ==
5284
+ export { Adapter, AuthorizationError, BaseModel, BigIntSequence, Cascade, Condition, ConnectionError, DefaultCascade, DefaultSequenceOptions, Dispatch, ForbiddenError, GroupOperator, InjectablesRegistry, NoneSequenceOptions, NumericSequence, ObserverError, ObserverHandler, Operator, OrderDirection, Paginator, PagingError, PersistenceKeys, QueryError, RamAdapter, Repository, Sequence, Statement, UnsupportedError, VERSION, cacheModelForPopulate, column, createOrUpdate, createdAt, createdBy, createdByOnCreateUpdate, final, generateInjectableNameForRepository, getColumnName, getPopulateKey, getTableName, index, manyToMany, manyToOne, oneToMany, oneToManyOnCreate, oneToManyOnDelete, oneToManyOnUpdate, oneToOne, oneToOneOnCreate, oneToOneOnDelete, oneToOneOnUpdate, pk, pkOnCreate, populate, repository, repositoryFromTypeMetadata, sequenceNameForModel, table, unique, uniqueOnCreateUpdate, updatedAt, updatedBy, uses };
5285
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvcGVyc2lzdGVuY2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2Vycm9ycy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9TZXF1ZW5jZS50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvRGlzcGF0Y2gudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIiwiLi4vc3JjL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zLnRzIiwiLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9xdWVyeS9lcnJvcnMudHMiLCIuLi9zcmMvcXVlcnkvQ29uZGl0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2lkZW50aXR5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvcmFtL1JhbVBhZ2luYXRvci50cyIsIi4uL3NyYy9yYW0vUmFtU3RhdGVtZW50LnRzIiwiLi4vc3JjL3JhbS9SYW1Db250ZXh0LnRzIiwiLi4vc3JjL3JhbS9tb2RlbC9SYW1TZXF1ZW5jZU1vZGVsLnRzIiwiLi4vc3JjL3JhbS9SYW1TZXF1ZW5jZS50cyIsIi4uL3NyYy9yYW0vaGFuZGxlcnMudHMiLCIuLi9zcmMvcmFtL2NvbnN0YW50cy50cyIsIi4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBQZXJzaXN0ZW5jZS1yZWxhdGVkIGNvbnN0YW50IGtleXNcbiAqIEBzdW1tYXJ5IEVudW0gY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIG1ldGFkYXRhLCByZWxhdGlvbnMsIGFuZCBvdGhlciBwZXJzaXN0ZW5jZS1yZWxhdGVkIG9wZXJhdGlvbnNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBQZXJzaXN0ZW5jZUtleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgaW5kZXggbWV0YWRhdGEgKi9cbiAgSU5ERVggPSBcImluZGV4XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVuaXF1ZSBjb25zdHJhaW50IG1ldGFkYXRhICovXG4gIFVOSVFVRSA9IFwidW5pcXVlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGFkYXB0ZXIgbWV0YWRhdGEgKi9cbiAgQURBUFRFUiA9IFwiYWRhcHRlclwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVGVtcGxhdGUgZm9yIGluamVjdGFibGUgYWRhcHRlciBuYW1lcyAqL1xuICBJTkpFQ1RBQkxFID0gXCJkZWNhZl97MH1fYWRhcHRlcl9mb3JfezF9XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRhYmxlIG5hbWUgbWV0YWRhdGEgKi9cbiAgVEFCTEUgPSBcInRhYmxlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNvbHVtbiBuYW1lIG1ldGFkYXRhICovXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGdlbmVyYWwgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBNRVRBREFUQSA9IFwiX19tZXRhZGF0YVwiLFxuXG4gIC8vIE93bmVyc2hpcFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgT1dORVJTSElQID0gXCJvd25lcnNoaXBcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgQ1JFQVRFRF9CWSA9IGAke09XTkVSU0hJUH0uY3JlYXRlZC1ieWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVwZGF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIFVQREFURURfQlkgPSBgJHtPV05FUlNISVB9LnVwZGF0ZWQtYnlgLFxuXG4gIC8vIFJlbGF0aW9uc1xuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciByZWxhdGlvbnMgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBSRUxBVElPTlMgPSBcIl9fcmVsYXRpb25zXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OID0gXCJyZWxhdGlvblwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBvbmUtdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19PTkUgPSBgJHtSRUxBVElPTn0ub25lLXRvLW9uZWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1tYW55IHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm9uZS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19PTkUgPSBgJHtSRUxBVElPTn0ubWFueS10by1vbmVgLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm1hbnktdG8tbWFueWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHBvcHVsYXRlIG1ldGFkYXRhICovXG4gIFBPUFVMQVRFID0gXCJwb3B1bGF0ZVwiLFxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1ha2VzIGEgbWV0aG9kIG5vbi1jb25maWd1cmFibGVcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIHByZXZlbnRzIGEgbWV0aG9kIGZyb20gYmVpbmcgb3ZlcnJpZGRlbiBieSBtYWtpbmcgaXQgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEl0IHRocm93cyBhbiBlcnJvciBpZiB1c2VkIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtZXRob2RzXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbCBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBtZXRob2RzXCIpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5jb25maWd1cmFibGUpIHtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQmFkUmVxdWVzdEVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIGFuIGFjdGlvblxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gd2l0aG91dCBwcm9wZXIgYXV0aGVudGljYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGFuIEF1dGhvcml6YXRpb25FcnJvclxuICogaWYgKCF1c2VyLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gKiAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoJ1VzZXIgbm90IGF1dGhlbnRpY2F0ZWQnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgQmFkUmVxdWVzdEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciwgbmFtZSA9IEF1dGhvcml6YXRpb25FcnJvci5uYW1lLCBjb2RlID0gNDAxKSB7XG4gICAgc3VwZXIobXNnLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHVzZXIgaXMgZm9yYmlkZGVuIGZyb20gYWNjZXNzaW5nIGEgcmVzb3VyY2VcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gYXV0aGVudGljYXRlZCB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHJlc291cmNlIG9yIHBlcmZvcm0gYW4gYWN0aW9uIHRoZXkgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGZvclxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGb3JiaWRkZW5FcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgdGhyb3dpbmcgYSBGb3JiaWRkZW5FcnJvclxuICogaWYgKCF1c2VyLmhhc1Blcm1pc3Npb24oJ2FkbWluJykpIHtcbiAqICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdVc2VyIGRvZXMgbm90IGhhdmUgYWRtaW4gcGVybWlzc2lvbnMnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBBdXRob3JpemF0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBGb3JiaWRkZW5FcnJvci5uYW1lLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgY29ubmVjdGlvbiB0byBhIHNlcnZpY2UgZmFpbHNcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGZhaWxzIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYSByZXF1aXJlZCBzZXJ2aWNlIG9yIHJlc291cmNlXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENvbm5lY3Rpb25FcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgdGhyb3dpbmcgYSBDb25uZWN0aW9uRXJyb3JcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGRhdGFiYXNlLmNvbm5lY3QoKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IHRvIGRhdGFiYXNlJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25FcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBDb25uZWN0aW9uRXJyb3IubmFtZSwgNTAzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgRXZlbnRJZHMsIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFuYWdlcyBhIGNvbGxlY3Rpb24gb2Ygb2JzZXJ2ZXJzIGZvciBkYXRhYmFzZSBldmVudHNcbiAqIEBzdW1tYXJ5IFRoZSBPYnNlcnZlckhhbmRsZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgT2JzZXJ2YWJsZSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWRcbiAqIHdheSB0byBtYW5hZ2UgbXVsdGlwbGUgb2JzZXJ2ZXJzLiBJdCBhbGxvd3MgcmVnaXN0ZXJpbmcgb2JzZXJ2ZXJzIHdpdGggb3B0aW9uYWwgZmlsdGVycyB0byBjb250cm9sXG4gKiB3aGljaCBldmVudHMgdGhleSByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yLCBhbmQgaGFuZGxlcyB0aGUgcHJvY2VzcyBvZiBub3RpZnlpbmcgYWxsIHJlbGV2YW50XG4gKiBvYnNlcnZlcnMgd2hlbiBkYXRhYmFzZSBldmVudHMgb2NjdXIuXG4gKiBAY2xhc3MgT2JzZXJ2ZXJIYW5kbGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGFuIG9ic2VydmVyIGhhbmRsZXJcbiAqIGNvbnN0IGhhbmRsZXIgPSBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYW4gb2JzZXJ2ZXJcbiAqIGNvbnN0IG15T2JzZXJ2ZXIgPSB7XG4gKiAgIHJlZnJlc2g6IGFzeW5jICh0YWJsZSwgZXZlbnQsIGlkKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coYENoYW5nZSBpbiAke3RhYmxlfTogJHtldmVudH0gZm9yIElEICR7aWR9YCk7XG4gKiAgIH1cbiAqIH07XG4gKlxuICogLy8gQWRkIG9ic2VydmVyIHdpdGggYSBmaWx0ZXIgZm9yIG9ubHkgdXNlciB0YWJsZSBldmVudHNcbiAqIGhhbmRsZXIub2JzZXJ2ZShteU9ic2VydmVyLCAodGFibGUsIGV2ZW50LCBpZCkgPT4gdGFibGUgPT09ICd1c2VycycpO1xuICpcbiAqIC8vIE5vdGlmeSBvYnNlcnZlcnMgYWJvdXQgYW4gZXZlbnRcbiAqIGF3YWl0IGhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKGxvZ2dlciwgJ3VzZXJzJywgJ0NSRUFURScsIDEyMyk7XG4gKlxuICogLy8gUmVtb3ZlIGFuIG9ic2VydmVyIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZFxuICogaGFuZGxlci51bk9ic2VydmUobXlPYnNlcnZlcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVySGFuZGxlciBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgQXJyYXkgb2Ygb2JzZXJ2ZXIgb2JqZWN0cyBhbG9uZyB3aXRoIHRoZWlyIG9wdGlvbmFsIGZpbHRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBvYnNlcnZlcnM6IHtcbiAgICBvYnNlcnZlcjogT2JzZXJ2ZXI7XG4gICAgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXI7XG4gIH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvdW50IG9mIG9ic2VydmVycyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaGFuZGxlclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICovXG4gIGNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG5ldyBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRvIHRoZSBjb2xsZWN0aW9uIHdpdGggYW4gb3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJGaWx0ZXJ9IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMucHVzaCh7IG9ic2VydmVyOiBvYnNlcnZlciwgZmlsdGVyOiBmaWx0ZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5tYXAoKG8pID0+IG8ub2JzZXJ2ZXIpLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIHJlbGV2YW50IG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IEZpbHRlcnMgb2JzZXJ2ZXJzIGJhc2VkIG9uIHRoZWlyIGZpbHRlciBmdW5jdGlvbnMgYW5kIGNhbGxzIHJlZnJlc2ggb24gZWFjaCBtYXRjaGluZyBvYnNlcnZlclxuICAgKiBAcGFyYW0ge0xvZ2dlcn0gbG9nIC0gTG9nZ2VyIGZvciByZWNvcmRpbmcgbm90aWZpY2F0aW9uIGFjdGl2aXRpZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVySGFuZGxlclxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyXG4gICAqXG4gICAqICAgQ2xpZW50LT4+T2JzZXJ2ZXJIYW5kbGVyOiB1cGRhdGVPYnNlcnZlcnMobG9nLCB0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKVxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVySGFuZGxlcjogRmlsdGVyIG9ic2VydmVyc1xuICAgKlxuICAgKiAgIGxvb3AgRm9yIGVhY2ggb2JzZXJ2ZXIgd2l0aCBtYXRjaGluZyBmaWx0ZXJcbiAgICogICAgIGFsdCBPYnNlcnZlciBoYXMgZmlsdGVyXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiBBcHBseSBmaWx0ZXIodGFibGUsIGV2ZW50LCBpZClcbiAgICogICAgICAgYWx0IEZpbHRlciB0aHJvd3MgZXJyb3JcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItPj5Mb2dnZXI6IExvZyBlcnJvclxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0tPj5PYnNlcnZlckhhbmRsZXI6IFNraXAgb2JzZXJ2ZXJcbiAgICogICAgICAgZWxzZSBGaWx0ZXIgcmV0dXJucyB0cnVlXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IHJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICogICAgICAgZWxzZSBGaWx0ZXIgcmV0dXJucyBmYWxzZVxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0tPj5PYnNlcnZlckhhbmRsZXI6IFNraXAgb2JzZXJ2ZXJcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIE5vIGZpbHRlclxuICAgKiAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXJIYW5kbGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICBsb29wIEZvciBlYWNoIHJlc3VsdFxuICAgKiAgICAgYWx0IFJlc3VsdCBpcyByZWplY3RlZFxuICAgKiAgICAgICBPYnNlcnZlckhhbmRsZXItPj5Mb2dnZXI6IExvZyBlcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgT2JzZXJ2ZXJIYW5kbGVyLS0+PkNsaWVudDogUmV0dXJuXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgbG9nOiBMb2dnZXIsXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRoaXMub2JzZXJ2ZXJzXG4gICAgICAgIC5maWx0ZXIoKG8pID0+IHtcbiAgICAgICAgICBjb25zdCB7IGZpbHRlciB9ID0gbztcbiAgICAgICAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXIodGFibGUsIGV2ZW50LCBpZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZpbHRlciBvYnNlcnZlciAke28ub2JzZXJ2ZXIudG9TdHJpbmcoKX06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgobykgPT4ge1xuICAgICAgICAgIG8ub2JzZXJ2ZXIucmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgICAgICAgfSlcbiAgICApO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKVxuICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgb2JzZXJ2YWJsZSAke3RoaXMub2JzZXJ2ZXJzW2ldLnRvU3RyaW5nKCl9OiAke3Jlc3VsdC5yZWFzb259YFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbCBieSBjaGVja2luZyBtZXRhZGF0YSBvciBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbnN0cnVjdG9yIG5hbWVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3RvciB0byBnZXQgdGhlIHRhYmxlIG5hbWUgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWxcbiAqIEBmdW5jdGlvbiBnZXRUYWJsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZyB7XG4gIGNvbnN0IG9iaiA9IG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsO1xuXG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLFxuICAgIG9ialxuICApO1xuICBpZiAobWV0YWRhdGEpIHtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cbiAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICByZXR1cm4gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICByZXR1cm4gbW9kZWwubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbk5hbWU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIGF0dHJpYnV0ZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTiksXG4gICAgbW9kZWwsXG4gICAgYXR0cmlidXRlXG4gICk7XG4gIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhIDogYXR0cmlidXRlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIHNlcXVlbmNlIG5hbWUgYnkgY29tYmluaW5nIHRoZSB0YWJsZSBuYW1lIHdpdGggYWRkaXRpb25hbCBhcmd1bWVudHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSB0aGUgc2VxdWVuY2UgbmFtZSBmb3JcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBhcmdzIC0gQWRkaXRpb25hbCBzdHJpbmcgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aGUgc2VxdWVuY2UgbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHNlcXVlbmNlIG5hbWVcbiAqIEBmdW5jdGlvbiBzZXF1ZW5jZU5hbWVGb3JNb2RlbFxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZU5hbWVGb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICAuLi5hcmdzOiBzdHJpbmdbXVxuKSB7XG4gIHJldHVybiBbZ2V0VGFibGVOYW1lKG1vZGVsKSwgLi4uYXJnc10uam9pbihcIl9cIik7XG59XG4iLCJpbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIERCS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgQ29udGV4dCxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0dWFsLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIG1vZGVsVG9UcmFuc2llbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdHlwZSBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmVyXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBEZWZhdWx0Rmxhdm91cixcbiAgaGFzaE9iaixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIE1vZGVsUmVnaXN0cnksXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUmF3RXhlY3V0b3IgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9SYXdFeGVjdXRvclwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgRXJyb3JQYXJzZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgRGlzcGF0Y2ggfSBmcm9tIFwiLi9EaXNwYXRjaFwiO1xuaW1wb3J0IHsgdHlwZSBFdmVudElkcywgdHlwZSBPYnNlcnZlckZpbHRlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi9PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lLCBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlckRpc3BhdGNoIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuRGVjb3JhdGlvbi5zZXRGbGF2b3VyUmVzb2x2ZXIoKG9iajogb2JqZWN0KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEFkYXB0ZXIuZmxhdm91ck9mKE1vZGVsLmlzTW9kZWwob2JqKSA/IG9iai5jb25zdHJ1Y3RvciA6IChvYmogYXMgYW55KSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXIgfHxcbiAgICAgIERlZmF1bHRGbGF2b3VyXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAvLyByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fCBEZWZhdWx0Rmxhdm91cjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBGYWNhZGUgY2xhc3MgZm9yIHBlcnNpc3RlbmNlIGFkYXB0ZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3IgYWxsIGRhdGFiYXNlIGFkYXB0ZXJzIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gVGhpcyBjbGFzc1xuICogaW1wbGVtZW50cyBzZXZlcmFsIGludGVyZmFjZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgQVBJIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLCBvYnNlcnZlclxuICogcGF0dGVybiBzdXBwb3J0LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEl0IG1hbmFnZXMgYWRhcHRlciByZWdpc3RyYXRpb24sIENSVUQgb3BlcmF0aW9ucywgYW5kXG4gKiBvYnNlcnZlciBub3RpZmljYXRpb25zLlxuICogQHRlbXBsYXRlIENPTkZJRyAtIFRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAqIEB0ZW1wbGF0ZSBRVUVSWSAtIFRoZSBxdWVyeSBvYmplY3QgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgRkxBR1MgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q09ORklHfSBfY29uZmlnIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyBhZGFwdGVyIHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbX2FsaWFzXSAtIE9wdGlvbmFsIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoaXMgYWRhcHRlclxuICogQGNsYXNzIEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbXBsZW1lbnRpbmcgYSBjb25jcmV0ZSBhZGFwdGVyXG4gKiBjbGFzcyBQb3N0Z3Jlc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPHBnLlBvb2xDb25maWcsIHBnLlF1ZXJ5LCBQb3N0Z3Jlc0ZsYWdzLCBQb3N0Z3Jlc0NvbnRleHQ+IHtcbiAqICAgY29uc3RydWN0b3IoY2xpZW50OiBwZy5Qb29sQ29uZmlnKSB7XG4gKiAgICAgc3VwZXIoY2xpZW50LCAncG9zdGdyZXMnKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAqICAgICAvLyBTZXQgdXAgdGhlIGFkYXB0ZXJcbiAqICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5jb25uZWN0KCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCkge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciBjcmVhdGluZyByZWNvcmRzXG4gKiAgICAgY29uc3QgY29sdW1ucyA9IE9iamVjdC5rZXlzKG1vZGVsKS5qb2luKCcsICcpO1xuICogICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMobW9kZWwpO1xuICogICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKF8sIGkpID0+IGAkJHtpKzF9YCkuam9pbignLCAnKTtcbiAqXG4gKiAgICAgY29uc3QgcXVlcnkgPSBgSU5TRVJUIElOVE8gJHt0YWJsZU5hbWV9ICgke2NvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSkgUkVUVVJOSU5HICpgO1xuICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubmF0aXZlLnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICogICAgIHJldHVybiByZXN1bHQucm93c1swXTtcbiAqICAgfVxuICpcbiAqICAgLy8gT3RoZXIgcmVxdWlyZWQgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4uLlxuICogfVxuICpcbiAqIC8vIFVzaW5nIHRoZSBhZGFwdGVyXG4gKiBjb25zdCBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblN0cmluZyk7XG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFBvc3RncmVzQWRhcHRlcihwZ0NsaWVudCk7XG4gKiBhd2FpdCBhZGFwdGVyLmluaXRpYWxpemUoKTtcbiAqXG4gKiAvLyBTZXQgYXMgdGhlIGRlZmF1bHQgYWRhcHRlclxuICogQWRhcHRlci5zZXRDdXJyZW50KCdwb3N0Z3JlcycpO1xuICpcbiAqIC8vIFBlcmZvcm0gb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IGFkYXB0ZXIuY3JlYXRlKCd1c2VycycsIDEsIHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIEFkYXB0ZXIge1xuICogICAgICtZIG5hdGl2ZVxuICogICAgICtzdHJpbmcgZmxhdm91clxuICogICAgICtzdHJpbmcgYWxpYXNcbiAqICAgICArY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtyZWFkKHRhYmxlTmFtZSwgaWQpXG4gKiAgICAgK3VwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgICArZGVsZXRlKHRhYmxlTmFtZSwgaWQpXG4gKiAgICAgK29ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcilcbiAqICAgICArdW5PYnNlcnZlKG9ic2VydmVyKVxuICogICAgICtzdGF0aWMgY3VycmVudFxuICogICAgICtzdGF0aWMgZ2V0KGZsYXZvdXIpXG4gKiAgICAgK3N0YXRpYyBzZXRDdXJyZW50KGZsYXZvdXIpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIFJhd0V4ZWN1dG9yIHtcbiAqICAgICArcmF3KHF1ZXJ5KVxuICogICB9XG4gKlxuICogICBjbGFzcyBPYnNlcnZhYmxlIHtcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3VwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBPYnNlcnZlciB7XG4gKiAgICAgK3JlZnJlc2godGFibGUsIGV2ZW50LCBpZClcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgRXJyb3JQYXJzZXIge1xuICogICAgICtwYXJzZUVycm9yKGVycilcbiAqICAgfVxuICpcbiAqICAgQWRhcHRlciAtLXw+IFJhd0V4ZWN1dG9yXG4gKiAgIEFkYXB0ZXIgLS18PiBPYnNlcnZhYmxlXG4gKiAgIEFkYXB0ZXIgLS18PiBPYnNlcnZlclxuICogICBBZGFwdGVyIC0tfD4gRXJyb3JQYXJzZXJcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFkYXB0ZXI8XG4gICAgQ09ORixcbiAgICBDT05OLFxuICAgIFFVRVJZLFxuICAgIEZMQUdTIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIENPTlRFWFQgZXh0ZW5kcyBDb250ZXh0PEZMQUdTPiA9IENvbnRleHQ8RkxBR1M+LFxuICA+XG4gIGV4dGVuZHMgTG9nZ2VkQ2xhc3NcbiAgaW1wbGVtZW50c1xuICAgIFJhd0V4ZWN1dG9yPFFVRVJZPixcbiAgICBDb250ZXh0dWFsPEZMQUdTLCBDT05URVhUPixcbiAgICBPYnNlcnZhYmxlLFxuICAgIE9ic2VydmVyLFxuICAgIEVycm9yUGFyc2VyXG57XG4gIHByaXZhdGUgc3RhdGljIF9jdXJyZW50Rmxhdm91cjogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+PiA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBfYmFzZVJlcG9zaXRvcnk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8YW55LCBhbnksIGFueSwgYW55LCBhbnk+XG4gID47XG4gIHByaXZhdGUgc3RhdGljIF9iYXNlRGlzcGF0Y2g6IENvbnN0cnVjdG9yPERpc3BhdGNoPjtcblxuICBwcm90ZWN0ZWQgZGlzcGF0Y2g/OiBBZGFwdGVyRGlzcGF0Y2g7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVySGFuZGxlcj86IE9ic2VydmVySGFuZGxlcjtcblxuICBwcm90ZWN0ZWQgX2NsaWVudD86IENPTk47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBuYXRpdmUgcGVyc2lzdGVuY2UgY29uZmlnXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gICAqIEB0ZW1wbGF0ZSBDT05GXG4gICAqIEByZXR1cm4ge0NPTkZ9IFRoZSBuYXRpdmUgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICAgKi9cbiAgZ2V0IGNvbmZpZygpOiBDT05GIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyJ3MgYWxpYXMgb3IgZmxhdm9yIG5hbWVcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgYWxpYXMgaWYgc2V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgZmxhdm9yIG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlcidzIGlkZW50aWZpZXJcbiAgICovXG4gIGdldCBhbGlhcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hbGlhcyB8fCB0aGlzLmZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgcmVwb3NpdG9yaWVzIHRoYXQgd29yayB3aXRoIHRoaXMgYWRhcHRlclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgUVVFUlksIEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIEZMQUdTLCBDT05URVhUPiwgRkxBR1MsIENPTlRFWFQ+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PigpOiBDb25zdHJ1Y3RvcjxcbiAgICBSZXBvc2l0b3J5PFxuICAgICAgTSxcbiAgICAgIFFVRVJZLFxuICAgICAgQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+LFxuICAgICAgRkxBR1MsXG4gICAgICBDT05URVhUXG4gICAgPlxuICA+IHtcbiAgICBpZiAoIUFkYXB0ZXIuX2Jhc2VSZXBvc2l0b3J5KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIHdoZW4gbmVjZXNzYXJ5LiBPdGhlcndpc2UgaXQgd2lsbCBiZSByZXBsYWNlZCBsYXppbHlgXG4gICAgICApO1xuICAgIHJldHVybiBBZGFwdGVyLl9iYXNlUmVwb3NpdG9yeTtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBhc3luYyBzaHV0ZG93blByb3hpZXMoaz86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5wcm94aWVzKSByZXR1cm47XG4gICAgaWYgKGsgJiYgIShrIGluIHRoaXMucHJveGllcykpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gcHJveHkgZm91bmQgZm9yICR7a31gKTtcbiAgICBpZiAoIWspIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucHJveGllcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJveGllc1trZXldLnNodXRkb3duKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIHByb3hpZWQgYWRhcHRlciAke2tleX06ICR7ZX1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5wcm94aWVzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJveGllc1trXS5zaHV0ZG93bigpO1xuICAgICAgICBkZWxldGUgdGhpcy5wcm94aWVzW2tdO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIHByb3hpZWQgYWRhcHRlciAke2t9OiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGFueSBuZWNlc3NhcnkgY2xlYW51cCB0YXNrcywgc3VjaCBhcyBjbG9zaW5nIGNvbm5lY3Rpb25zXG4gICAqIFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgZW5zdXJlIHRvIGNhbGwgdGhlIGJhc2UgbWV0aG9kIGZpcnN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2h1dGRvd24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2h1dGRvd25Qcm94aWVzKCk7XG4gICAgaWYgKHRoaXMuZGlzcGF0Y2gpIGF3YWl0IHRoaXMuZGlzcGF0Y2guY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBhZGFwdGVyIHdpdGggdGhlIG5hdGl2ZSBkcml2ZXIgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgYWRhcHRlciBjYWNoZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogQ09ORixcbiAgICByZWFkb25seSBmbGF2b3VyOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodGhpcy5hbGlhcyBpbiBBZGFwdGVyLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyICR7dGhpcy5fYWxpYXMgPyBgKCR7dGhpcy5mbGF2b3VyfSkgYCA6IFwiXCJ9IGFscmVhZHkgcmVnaXN0ZXJlZGBcbiAgICAgICk7XG4gICAgQWRhcHRlci5fY2FjaGVbdGhpcy5hbGlhc10gPSB0aGlzO1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgQ3JlYXRlZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgJHt0aGlzLl9hbGlhcyA/IGAoJHt0aGlzLmZsYXZvdXJ9KSBgIDogXCJcIn0gcGVyc2lzdGVuY2UgYWRhcHRlcmBcbiAgICApO1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudEZsYXZvdXIpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYERlZmluZWQgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyIGFzIGN1cnJlbnRgKTtcbiAgICAgIEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyID0gdGhpcy5hbGlhcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHN0YXRlbWVudCBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IHF1ZXJpZXMgZm9yIGEgc3BlY2lmaWMgbW9kZWxcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtTdGF0ZW1lbnR9IEEgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIHRoZSBtb2RlbFxuICAgKi9cbiAgYWJzdHJhY3QgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogU3RhdGVtZW50PFFVRVJZLCBNLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBkaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge0Rpc3BhdGNofSBBIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIERpc3BhdGNoKCk6IERpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IEFkYXB0ZXIuX2Jhc2VEaXNwYXRjaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGhhbmRsZXJcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIG9ic2VydmVyIGhhbmRsZXIgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtPYnNlcnZlckhhbmRsZXJ9IEEgbmV3IG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWF0dHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGRhdGFiYXNlIGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgZXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgZGF0YWJhc2Utc3BlY2lmaWMgZXJyb3JzIGludG8gc3RhbmRhcmRpemVkIGFwcGxpY2F0aW9uIGVycm9yc1xuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgb3JpZ2luYWwgZGF0YWJhc2UgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBBIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKi9cbiAgYWJzdHJhY3QgcGFyc2VFcnJvcihlcnI6IEVycm9yKTogQmFzZUVycm9yO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBzZXR1cCBmb3IgdGhlIGFkYXB0ZXIsIHN1Y2ggYXMgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb25zXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBJbml0aWFsaXphdGlvbiBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyByZXBvc2l0b3J5IGZsYWdzIGZvciBhbiBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc2V0IG9mIGZsYWdzIHRoYXQgZGVzY3JpYmUgYSBkYXRhYmFzZSBvcGVyYXRpb24sIGNvbWJpbmluZyBkZWZhdWx0IGZsYWdzIHdpdGggb3ZlcnJpZGVzXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgRmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IGZsYWdzIC0gQ3VzdG9tIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEY+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZMQUdTPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGTEFHUz4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLCBmbGFncywge1xuICAgICAgYWZmZWN0ZWRUYWJsZXM6IGdldFRhYmxlTmFtZShtb2RlbCksXG4gICAgICB3cml0ZU9wZXJhdGlvbjogb3BlcmF0aW9uICE9PSBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICB9KSBhcyBGTEFHUztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbnRleHQgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQgY2xhc3MgY29uc3RydWN0b3IgdXNlZCBieSB0aGlzIGFkYXB0ZXJcbiAgICovXG4gIHByb3RlY3RlZCBDb250ZXh0ID0gQ29udGV4dDxGTEFHUz47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY29udGV4dCBmb3IgYSBkYXRhYmFzZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgY29udGV4dCBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBkYXRhYmFzZSBvcGVyYXRpb24sIHVzZWQgZm9yIHRyYWNraW5nIGFuZCBhdWRpdGluZ1xuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXMuQ1JFQVRFfE9wZXJhdGlvbktleXMuUkVBRHxPcGVyYXRpb25LZXlzLlVQREFURXxPcGVyYXRpb25LZXlzLkRFTEVURX0gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gb3ZlcnJpZGVzIC0gQ3VzdG9tIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEM+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGV4dCBvYmplY3RcbiAgICovXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8RkxBR1M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPENPTlRFWFQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbC5uYW1lfSBtb2RlbCB3aXRoIGZsYWcgb3ZlcnJpZGVzOiAke0pTT04uc3RyaW5naWZ5KG92ZXJyaWRlcyl9YFxuICAgICk7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG92ZXJyaWRlcywgLi4uYXJncyk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKGZsYWdzKSBhcyB1bmtub3duIGFzIENPTlRFWFQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IG1vZGVsVG9UcmFuc2llbnQobW9kZWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHNwbGl0Lm1vZGVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBhY2N1bTtcbiAgICAgICAgY29uc3QgbWFwcGVkUHJvcCA9IGdldENvbHVtbk5hbWUobW9kZWwsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzZXJ2ZWQobWFwcGVkUHJvcCkpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFByb3BlcnR5IG5hbWUgJHttYXBwZWRQcm9wfSBpcyByZXNlcnZlZGApO1xuICAgICAgICBhY2N1bVttYXBwZWRQcm9wXSA9IHZhbDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHJlc3VsdCxcbiAgICAgIGlkOiBtb2RlbFtwa10gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgZGF0YWJhc2UgZGF0YSBiYWNrIGludG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZWNvbnN0cnVjdHMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGRhdGFiYXNlIGRhdGEsIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nXG4gICAqIGFuZCByZWF0dGFjaGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSBvYmogLSBUaGUgZGF0YWJhc2UgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjbGFzcyBvciBuYW1lXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlXG4gICAqIEBwYXJhbSBbdHJhbnNpZW50XSAtIFRyYW5zaWVudCBwcm9wZXJ0aWVzIHRvIHJlYXR0YWNoXG4gICAqIEByZXR1cm4ge019IFRoZSByZWNvbnN0cnVjdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGNvbnN0IG9iOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgb2JbcGsgYXMgc3RyaW5nXSA9IGlkO1xuICAgIGNvbnN0IG0gPSAoXG4gICAgICB0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBNb2RlbC5idWlsZChvYiwgY2xhenopIDogbmV3IGNsYXp6KG9iKVxuICAgICkgYXMgTTtcbiAgICBsb2cuc2lsbHkoYFJlYnVpbGRpbmcgbW9kZWwgJHttLmNvbnN0cnVjdG9yLm5hbWV9IGlkICR7aWR9YCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBvYmpbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhtKS5yZWR1Y2UoKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgPT09IHBrKSByZXR1cm4gYWNjdW07XG4gICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9IG9ialtnZXRDb2x1bW5OYW1lKGFjY3VtLCBrZXkpXTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBtKTtcblxuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiByZXN1bHQpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgJHt0aGlzLmZsYXZvdXJ9IHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH06ICR7bWV0YWRhdGF9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBhIG5ldyByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgbmV3IHJlY29yZFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgZGF0YSB0byBpbnNlcnRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGFuZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGluc2VydCBpbnRvXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBmb3IgdGhlIG5ldyByZWNvcmRzXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydCBmb3IgZWFjaCByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgY3JlYXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBDcmVhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLmNyZWF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uYXJncykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJlYWQgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWFkQWxsKTtcbiAgICBsb2cudmVyYm9zZShgUmVhZGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaWQubWFwKChpKSA9PiB0aGlzLnJlYWQodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyBhbiBleGlzdGluZyByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byB1cGRhdGVcbiAgICogQHBhcmFtICBtb2RlbCAtIFRoZSBuZXcgZGF0YSBmb3IgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIG11bHRpcGxlIGV4aXN0aW5nIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGluIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBuZXcgZGF0YSBmb3IgZWFjaCByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy51cGRhdGVBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBVcGRhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uYXJncykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYERlbGV0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMuZGVsZXRlKHRhYmxlTmFtZSwgaSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWxsb3dzIGV4ZWN1dGluZyBkYXRhYmFzZS1zcGVjaWZpYyBxdWVyaWVzIGRpcmVjdGx5XG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHJhdyBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge1F9IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIGFic3RyYWN0IHJhdzxSPihyYXdJbnB1dDogUVVFUlksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgZGF0YWJhc2UgY2hhbmdlcy4gVGhlIG9ic2VydmVyIGNhbiBvcHRpb25hbGx5XG4gICAqIHByb3ZpZGUgYSBmaWx0ZXIgZnVuY3Rpb24gdG8gcmVjZWl2ZSBvbmx5IHNwZWNpZmljIGV2ZW50cy5cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJvYnNlcnZlckhhbmRsZXJcIiwge1xuICAgICAgICB2YWx1ZTogdGhpcy5PYnNlcnZlckhhbmRsZXIoKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5vYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYFJlZ2lzdGVyaW5nIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gICAgaWYgKCF0aGlzLmRpc3BhdGNoKSB7XG4gICAgICB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKS5pbmZvKGBDcmVhdGluZyBkaXNwYXRjaCBmb3IgJHt0aGlzLmFsaWFzfWApO1xuICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuRGlzcGF0Y2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2gub2JzZXJ2ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb2JzZXJ2ZXIgc28gaXQgbm8gbG9uZ2VyIHJlY2VpdmVzIGRhdGFiYXNlIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgU2VuZHMgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlLFxuICAgKiBmaWx0ZXJpbmcgYmFzZWQgb24gZWFjaCBvYnNlcnZlcidzIGZpbHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yIGFkYXB0ZXIgJHt0aGlzLmFsaWFzfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRoaXMubG9nLFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIGlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyBkYXRhIGJhc2VkIG9uIGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgSW1wbGVtZW50YXRpb24gb2YgdGhlIE9ic2VydmVyIGludGVyZmFjZSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gdXBkYXRlT2JzZXJ2ZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgcmVsYXRlZCB0byB0aGUgZXZlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpZGVudGlmeWluZyB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKi9cbiAgb3ZlcnJpZGUgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgQWRhcHRlcmA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgZmxhdm9yIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgYWRhcHRlciBmbGF2b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFkYXB0ZXIgZmxhdm9yIG5hbWVcbiAgICovXG4gIHN0YXRpYyBmbGF2b3VyT2Y8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8TT4pOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKHRoaXMua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICB0aGlzLmN1cnJlbnQ/LmZsYXZvdXJcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldCBjdXJyZW50Rmxhdm91cigpIHtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBwZXJzaXN0ZW5jZSBmbGF2b3VyIHNldC4gUGxlYXNlIGluaXRpYWxpemUgeW91ciBhZGFwdGVyYFxuICAgICAgKTtcbiAgICByZXR1cm4gQWRhcHRlci5fY3VycmVudEZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgYWRhcHRlciB0aGF0IGlzIGN1cnJlbnRseSBzZXQgYXMgdGhlIGRlZmF1bHQgZm9yIG9wZXJhdGlvbnNcbiAgICogQHJldHVybiB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBUaGUgY3VycmVudCBhZGFwdGVyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGN1cnJlbnQoKTogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5jdXJyZW50Rmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYW4gYWRhcHRlciBieSBmbGF2b3JcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGJ5IGl0cyBmbGF2b3IgbmFtZVxuICAgKiBAdGVtcGxhdGUgQ09ORiAtIFRoZSBkYXRhYmFzZSBkcml2ZXIgY29uZmlnXG4gICAqIEB0ZW1wbGF0ZSBDT05OIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBpbnN0YW5jZVxuICAgKiBAdGVtcGxhdGUgUVVFUlkgLSBUaGUgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgQ0NPTlRFWFQgLSBUaGUgY29udGV4dCB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG5hbWUgb2YgdGhlIGFkYXB0ZXIgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7QWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgQ09OVEVYVCwgRkxBR1M+IHwgdW5kZWZpbmVkfSBUaGUgYWRhcHRlciBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZ2V0PFxuICAgIENPTkYsXG4gICAgQ09OTixcbiAgICBRVUVSWSxcbiAgICBDT05URVhUIGV4dGVuZHMgQ29udGV4dDxGTEFHUz4sXG4gICAgRkxBR1MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gID4oZmxhdm91cj86IGFueSk6IEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIEZMQUdTLCBDT05URVhUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmbGF2b3VyKSByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5fY3VycmVudEZsYXZvdXIpO1xuICAgIGlmIChmbGF2b3VyIGluIHRoaXMuX2NhY2hlKSByZXR1cm4gdGhpcy5fY2FjaGVbZmxhdm91cl07XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIEFkYXB0ZXIgcmVnaXN0ZXJlZCB1bmRlciAke2ZsYXZvdXJ9LmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDaGFuZ2VzIHdoaWNoIGFkYXB0ZXIgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byBzZXQgYXMgY3VycmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudEZsYXZvdXIgPSBmbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5XG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHN0YW5kYXJkaXplZCBtZXRhZGF0YSBrZXkgZm9yIHBlcnNpc3RlbmNlLXJlbGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBtZXRhZGF0YSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gUmVwby5rZXkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCBhbiBhZGFwdGVyIGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHVzZSBhIHNwZWNpZmljIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgYWRhcHRlciBmbGF2b3IgdG8gZmluZCBtb2RlbHMgZm9yXG4gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqL1xuICBzdGF0aWMgbW9kZWxzPE0gZXh0ZW5kcyBNb2RlbD4oZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gKE1vZGVsIGFzIGFueSkuZ2V0UmVnaXN0cnkoKSBhcyBNb2RlbFJlZ2lzdHJ5PGFueT47XG4gICAgICBjb25zdCBjYWNoZSA9IChcbiAgICAgICAgcmVnaXN0cnkgYXMgdW5rbm93biBhcyB7IGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPGFueT4+IH1cbiAgICAgICkuY2FjaGU7XG4gICAgICBjb25zdCBtYW5hZ2VkTW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXSA9IE9iamVjdC52YWx1ZXMoY2FjaGUpXG4gICAgICAgIC5tYXAoKG06IE1vZGVsQ29uc3RydWN0b3I8TT4pID0+IHtcbiAgICAgICAgICBsZXQgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGYgJiYgZiA9PT0gZmxhdm91cikgcmV0dXJuIG07XG4gICAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICBjb25zdCByZXBvID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgUmVwby5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcmVwbykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcmVwb3NpdG9yeSA9ICh0aGlzLl9iYXNlUmVwb3NpdG9yeSBhcyBhbnkpLmZvck1vZGVsKG0pO1xuXG4gICAgICAgICAgICBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICByZXBvc2l0b3J5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChtKSA9PiAhIW0pO1xuICAgICAgcmV0dXJuIG1hbmFnZWRNb2RlbHM7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGVjb3JhdGlvbigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHByb3hpZXM/OiBSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgdGhpcz47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBjbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcmV0dXJuIHRoZSBjbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgQ09OIC0gVGhlIHR5cGUgb2YgdGhlIGNsaWVudCBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtDT059IFRoZSBjbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZnVuY3Rpb24gZ2V0Q2xpZW50XG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENsaWVudCgpOiBDT05OO1xuXG4gIEBmaW5hbCgpXG4gIGdldCBjbGllbnQoKTogQ09OTiB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIHRoaXMuX2NsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGZvcihjb25maWc6IFBhcnRpYWw8Q09ORj4sIC4uLmFyZ3M6IGFueVtdKTogdHlwZW9mIHRoaXMge1xuICAgIGlmICghdGhpcy5wcm94aWVzKSB0aGlzLnByb3hpZXMgPSB7fTtcbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmFsaWFzfSAtICR7aGFzaE9iaihjb25maWcpfWA7XG4gICAgaWYgKGtleSBpbiB0aGlzLnByb3hpZXMpIHJldHVybiB0aGlzLnByb3hpZXNba2V5XSBhcyB0eXBlb2YgdGhpcztcblxuICAgIGxldCBjbGllbnQ6IGFueTtcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NvbmZpZ1wiKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxDb25mOiBDT05GID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsQ29uZiwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gXCJfY2xpZW50XCIpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6ICh0YXJnZXQ6IGFueSwgcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55LCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIGNsaWVudCA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LnNldCh0YXJnZXQsIHAsIHZhbHVlLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucHJveGllc1trZXldID0gcHJveHk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBzb3J0IGRpcmVjdGlvbnMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgc29ydCBkaXJlY3Rpb25zIGZvciBvcmRlcmluZyBxdWVyeSByZXN1bHRzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGlyZWN0aW9uIHtcbiAgLyoqIEFzY2VuZGluZyBvcmRlciAoQSB0byBaLCAwIHRvIDkpICovXG4gIEFTQyA9IFwiYXNjXCIsXG5cbiAgLyoqIERlc2NlbmRpbmcgb3JkZXIgKFogdG8gQSwgOSB0byAwKSAqL1xuICBEU0MgPSBcImRlc2NcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bWVyYXRpb24gb2YgY2FzY2FkZSBvcGVyYXRpb24gdHlwZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgY2FzY2FkZSBiZWhhdmlvcnMgZm9yIGVudGl0eSByZWxhdGlvbnNoaXBzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIENhc2NhZGUge1xuICAvKiogUGVyZm9ybSBjYXNjYWRlIG9wZXJhdGlvbiBvbiByZWxhdGVkIGVudGl0aWVzICovXG4gIENBU0NBREUgPSBcImNhc2NhZGVcIixcbiAgLyoqIERvIG5vdCBwZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgZGVmYXVsdCBjYXNjYWRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgaW4gcmVwb3NpdG9yaWVzLlxuICogQHN1bW1hcnkgRG9jdW1lbnRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNhc2NhZGUgY29uZmlndXJhdGlvbiB3aXRoIGV4cGxpY2l0IHVwZGF0ZSBhbmQgZGVsZXRlIGJlaGF2aW9ycy5cbiAqIEBwcm9wZXJ0eSB7J2Nhc2NhZGUnfCdub25lJ30gdXBkYXRlIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHVwZGF0ZXMgY2FzY2FkZSB0byByZWxhdGVkIGVudGl0aWVzLlxuICogQHByb3BlcnR5IHsnY2FzY2FkZSd8J25vbmUnfSBkZWxldGUgLSBEZXRlcm1pbmVzIHdoZXRoZXIgZGVsZXRlcyBjYXNjYWRlIHRvIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiBAdHlwZURlZiBEZWZhdWx0Q2FzY2FkZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhID0ge1xuICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG59O1xuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhbiB1bnN1cHBvcnRlZCBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyByZXF1ZXN0ZWQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50XG4gKiBwZXJzaXN0ZW5jZSBhZGFwdGVyIG9yIGNvbmZpZ3VyYXRpb24uIEl0IGV4dGVuZHMgdGhlIEJhc2VFcnJvciBjbGFzcyBhbmQgc2V0cyBhIDUwMCBzdGF0dXMgY29kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBhbiBFcnJvciBvYmplY3QgdG8gd3JhcFxuICogQGNsYXNzIFVuc3VwcG9ydGVkRXJyb3JcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBUaHJvd2luZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiBpZiAoIWFkYXB0ZXIuc3VwcG9ydHNUcmFuc2FjdGlvbnMoKSkge1xuICogICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVHJhbnNhY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYWRhcHRlcicpO1xuICogfVxuICpcbiAqIC8vIENhdGNoaW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGFkYXB0ZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgVW5zdXBwb3J0ZWRFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc2VxdWVuY2UgZ2VuZXJhdGlvblxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCB2YWx1ZXMgKGxpa2UgcHJpbWFyeSBrZXlzKSBpbiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuXG4gKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcyBoYW5kbGUgdGhlIHNwZWNpZmljcyBvZiBob3cgc2VxdWVuY2VzIGFyZSBzdG9yZWQgYW5kIGluY3JlbWVudGVkIGluIGRpZmZlcmVudFxuICogZGF0YWJhc2Ugc3lzdGVtcy5cbiAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yXG4gKiBAY2xhc3MgU2VxdWVuY2VcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIGltcGxlbWVudGF0aW9uIGZvciBhIHNwZWNpZmljIGRhdGFiYXNlXG4gKiBjbGFzcyBQb3N0Z3Jlc1NlcXVlbmNlIGV4dGVuZHMgU2VxdWVuY2Uge1xuICogICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpIHtcbiAqICAgICBzdXBlcihvcHRpb25zKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHRvIGdldCBuZXh0IHZhbHVlIGZyb20gUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy5leGVjdXRvci5yYXcoYFNFTEVDVCBuZXh0dmFsKCcke3RoaXMub3B0aW9ucy5uYW1lfScpYCk7XG4gKiAgICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdC5yb3dzWzBdLm5leHR2YWwpO1xuICogICB9XG4gKlxuICogICBhc3luYyBjdXJyZW50KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IGN1cnJlbnQgdmFsdWUgZnJvbSBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLmV4ZWN1dG9yLnJhdyhgU0VMRUNUIGN1cnJ2YWwoJyR7dGhpcy5vcHRpb25zLm5hbWV9JylgKTtcbiAqICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LnJvd3NbMF0uY3VycnZhbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IGEgcmFuZ2Ugb2YgdmFsdWVzXG4gKiAgICAgY29uc3QgdmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuICogICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICogICAgICAgdmFsdWVzLnB1c2goYXdhaXQgdGhpcy5uZXh0KCkpO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gdmFsdWVzO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gVXNhZ2VcbiAqIGNvbnN0IHNlcXVlbmNlID0gbmV3IFBvc3RncmVzU2VxdWVuY2Uoe1xuICogICBuYW1lOiAndXNlcl9pZF9zZXEnLFxuICogICBleGVjdXRvcjogZGJFeGVjdXRvclxuICogfSk7XG4gKlxuICogY29uc3QgbmV4dElkID0gYXdhaXQgc2VxdWVuY2UubmV4dCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZXF1ZW5jZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGlzIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IExhemlseSBpbml0aWFsaXplZCBsb2dnZXIgZm9yIHRoZSBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBY2Nlc3NvciBmb3IgdGhlIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBHZXRzIG9yIGluaXRpYWxpemVzIHRoZSBsb2dnZXIgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5sb2dnZXIpIHRoaXMubG9nZ2VyID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBQcm90ZWN0ZWQgY29uc3RydWN0b3IgdGhhdCBpbml0aWFsaXplcyB0aGUgc2VxdWVuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgb3B0aW9uc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgc2VxdWVuY2UsIGluY3JlbWVudGluZyBpdCBpbiB0aGUgcHJvY2Vzc1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgbmV4dCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIHdpdGhvdXQgaW5jcmVtZW50aW5nIGl0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhYnN0cmFjdCBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSByYW5nZSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgc2VxdWVudGlhbCB2YWx1ZXMgYXQgb25jZSwgd2hpY2ggY2FuIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gY2FsbGluZyBuZXh0KCkgbXVsdGlwbGUgdGltZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBzZXF1ZW50aWFsIHZhbHVlcyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqL1xuICBhYnN0cmFjdCByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHByaW1hcnkga2V5IHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgVXRpbGl0eSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBzdGFuZGFyZGl6ZWQgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbCdzIHByaW1hcnkga2V5XG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzZXF1ZW5jZSBuYW1lIGZvciB0aGUgbW9kZWwncyBwcmltYXJ5IGtleVxuICAgKi9cbiAgc3RhdGljIHBrPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgc2VxdWVuY2UgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGVcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBzZXF1ZW5jZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUgKE51bWJlciBvciBCaWdJbnQpXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcInxcIkJpZ0ludFwifHVuZGVmaW5lZH0gdHlwZSAtIFRoZSB0YXJnZXQgdHlwZSB0byBjb252ZXJ0IHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAgICogQHJldHVybiB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IFRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAgICovXG4gIHN0YXRpYyBwYXJzZVZhbHVlKFxuICAgIHR5cGU6IFwiTnVtYmVyXCIgfCBcIkJpZ0ludFwiIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogQmlnSW50KHZhbHVlKTtcbiAgICAgIGNhc2UgXCJCaWdJbnRcIjpcbiAgICAgICAgcmV0dXJuIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIHNlcXVlbmNlIHR5cGU6ICR7dHlwZX0gZm9yIGFkYXB0ZXIgJHt0aGlzfWBcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4vQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hpY2ggcGVyc2lzdGVuY2UgYWRhcHRlciBmbGF2b3IgYSBtb2RlbCBzaG91bGQgdXNlXG4gKiBAc3VtbWFyeSBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIGEgbW9kZWwgY2xhc3MgdG8gaW5kaWNhdGUgd2hpY2ggcGVyc2lzdGVuY2UgYWRhcHRlciBmbGF2b3JcbiAqIHNob3VsZCBiZSB1c2VkIHdoZW4gcGVyZm9ybWluZyBkYXRhYmFzZSBvcGVyYXRpb25zIG9uIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuIFRoZSBmbGF2b3IgaXMgYSBzdHJpbmdcbiAqIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIHJlZ2lzdGVyZWQgYWRhcHRlciBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgYWRhcHRlciBmbGF2b3IgdG8gdXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIG1vZGVsIGNsYXNzXG4gKiBAZnVuY3Rpb24gdXNlc1xuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXMoZmxhdm91cjogc3RyaW5nKSB7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VzKG9yaWdpbmFsOiBhbnkpIHtcbiAgICByZXR1cm4gYXBwbHkobWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBmbGF2b3VyKSkoXG4gICAgICBvcmlnaW5hbFxuICAgICk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIENvbnRleHQsXG4gIERCS2V5cyxcbiAgRGVmYXVsdFNlcGFyYXRvcixcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIElSZXBvc2l0b3J5LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5IGFzIFJlcCxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHdyYXBNZXRob2RXaXRoQ29udGV4dCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgdHlwZSBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXJpYWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1F1ZXJpYWJsZVwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgV2hlcmVPcHRpb24gfSBmcm9tIFwiLi4vcXVlcnkvb3B0aW9uc1wiO1xuaW1wb3J0IHsgT3JkZXJCeVNlbGVjdG9yLCBTZWxlY3RTZWxlY3RvciB9IGZyb20gXCIuLi9xdWVyeS9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWUsIGdldFRhYmxlTmFtZSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgdXNlcyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7IGZpbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFdmVudElkcyxcbiAgSW5mZXJyZWRBZGFwdGVyQ29uZmlnLFxuICB0eXBlIE9ic2VydmVyRmlsdGVyLFxufSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBhbGlhcyBmb3IgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIHNpbXBsaWZpZWQgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBtb3JlIGNvbmNpc2Ugd2F5IHRvIHJlZmVyZW5jZSB0aGUgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIGl0cyBnZW5lcmljIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUuXG4gKiBAdGVtcGxhdGUgQSAtIFRoZSBhZGFwdGVyIHR5cGUuXG4gKiBAdHlwZWRlZiBSZXBvXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwbzxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gYW55LFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IGFueSxcbiAgUSA9IGFueSxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIFEsIEYsIEM+ID0gYW55LFxuPiA9IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz47XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvcmUgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucyBvbiBtb2RlbHMgb24gYSB0YWJsZSBieSB0YWJsZSB3YXkuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMsIHF1ZXJ5aW5nIGNhcGFiaWxpdGllcywgYW5kIG9ic2VydmVyIHBhdHRlcm4gaW1wbGVtZW50YXRpb24gZm9yIG1vZGVsIHBlcnNpc3RlbmNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgQSAtIFRoZSBhZGFwdGVyIHR5cGUgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZm9yIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0F9IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7Li4uYW55W119IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZXBvc2l0b3J5IGluaXRpYWxpemF0aW9uLlxuICogQGNsYXNzIFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGluZyBhIHJlcG9zaXRvcnkgZm9yIFVzZXIgbW9kZWxcbiAqIGNvbnN0IHVzZXJSZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChVc2VyKTtcbiAqXG4gKiAvLyBVc2luZyB0aGUgcmVwb3NpdG9yeSBmb3IgQ1JVRCBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdXNlclJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nIH0pKTtcbiAqIGNvbnN0IHJldHJpZXZlZFVzZXIgPSBhd2FpdCB1c2VyUmVwby5yZWFkKHVzZXIuaWQpO1xuICogdXNlci5uYW1lID0gJ0phbmUnO1xuICogYXdhaXQgdXNlclJlcG8udXBkYXRlKHVzZXIpO1xuICogYXdhaXQgdXNlclJlcG8uZGVsZXRlKHVzZXIuaWQpO1xuICpcbiAqIC8vIFF1ZXJ5aW5nIHdpdGggY29uZGl0aW9uc1xuICogY29uc3QgdXNlcnMgPSBhd2FpdCB1c2VyUmVwb1xuICogICAuc2VsZWN0KClcbiAqICAgLndoZXJlKHsgbmFtZTogJ0phbmUnIH0pXG4gKiAgIC5vcmRlckJ5KCdjcmVhdGVkQXQnLCBPcmRlckRpcmVjdGlvbi5EU0MpXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnQgQ29kZVxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQSBhcyBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gKlxuICogICBDLT4+K1I6IGNyZWF0ZShtb2RlbClcbiAqICAgUi0+PlI6IGNyZWF0ZVByZWZpeChtb2RlbClcbiAqICAgUi0+PitBOiBwcmVwYXJlKG1vZGVsKVxuICogICBBLS0+Pi1SOiBwcmVwYXJlZCBkYXRhXG4gKiAgIFItPj4rQTogY3JlYXRlKHRhYmxlLCBpZCwgcmVjb3JkKVxuICogICBBLT4+K0RCOiBJbnNlcnQgT3BlcmF0aW9uXG4gKiAgIERCLS0+Pi1BOiBSZXN1bHRcbiAqICAgQS0tPj4tUjogcmVjb3JkXG4gKiAgIFItPj4rQTogcmV2ZXJ0KHJlY29yZClcbiAqICAgQS0tPj4tUjogbW9kZWwgaW5zdGFuY2VcbiAqICAgUi0+PlI6IGNyZWF0ZVN1ZmZpeChtb2RlbClcbiAqICAgUi0+PitPOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgaWQpXG4gKiAgIE8tLT4+LVI6IE5vdGlmaWNhdGlvbiBjb21wbGV0ZVxuICogICBSLS0+Pi1DOiBjcmVhdGVkIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBvc2l0b3J5PFxuICAgIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgICBRLFxuICAgIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBRLCBGLCBDPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPlxuICBleHRlbmRzIFJlcDxNLCBGLCBDPlxuICBpbXBsZW1lbnRzIE9ic2VydmFibGUsIE9ic2VydmVyLCBRdWVyaWFibGU8TT4sIElSZXBvc2l0b3J5PE0sIEYsIEM+XG57XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBDb25zdHJ1Y3RvcjxSZXBvPE1vZGVsPj4gfCBSZXBvPE1vZGVsPlxuICA+ID0ge307XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlckhhbmRsZXI/OiBPYnNlcnZlckhhbmRsZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWRhcHRlciE6IEE7XG4gIHByaXZhdGUgX3RhYmxlTmFtZSE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9vdmVycmlkZXM/OiBQYXJ0aWFsPEY+O1xuXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbG9nZ2VyIGZvciB0aGlzIHJlcG9zaXRvcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKVxuICAgICAgdGhpcy5sb2dnZXIgPSAoXG4gICAgICAgIHRoaXMuYWRhcHRlcltcImxvZ1wiIGFzIGtleW9mIHR5cGVvZiB0aGlzLmFkYXB0ZXJdIGFzIExvZ2dlclxuICAgICAgKS5mb3IodGhpcy50b1N0cmluZygpKTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYWRhcHRlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAdGVtcGxhdGUgQSAtIFRoZSBhZGFwdGVyIHR5cGUuXG4gICAqIEByZXR1cm4ge0F9IFRoZSBhZGFwdGVyIGluc3RhbmNlLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBhZGFwdGVyIGlzIGZvdW5kLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBhZGFwdGVyKCk6IEEge1xuICAgIGlmICghdGhpcy5fYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gYWRhcHRlciBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5LiBkaWQgeW91IHVzZSB0aGUgQHVzZXMgZGVjb3JhdG9yIG9yIHBhc3MgaXQgaW4gdGhlIGNvbnN0cnVjdG9yP2BcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRhYmxlIG5hbWUgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFibGUgbmFtZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl90YWJsZU5hbWUpIHRoaXMuX3RhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgcHJvcGVydGllcyBmb3IgdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIHNlcXVlbmNlIG9wdGlvbnMgY29udGFpbmluZyBwcmltYXJ5IGtleSBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybiB7U2VxdWVuY2VPcHRpb25zfSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgcGtQcm9wcygpOiBTZXF1ZW5jZU9wdGlvbnMge1xuICAgIHJldHVybiBzdXBlci5wa1Byb3BzO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPiwgLi4uYXJnczogYW55W10pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gICAgaWYgKGFkYXB0ZXIpIHRoaXMuX2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIGlmIChjbGF6eikge1xuICAgICAgUmVwb3NpdG9yeS5yZWdpc3RlcihjbGF6eiwgdGhpcywgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGNvbnN0IGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICBjbGF6elxuICAgICAgICApO1xuICAgICAgICBpZiAoZmxhdm91ciAmJiBmbGF2b3VyICE9PSBhZGFwdGVyLmZsYXZvdXIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJbmNvbXBhdGlibGUgZmxhdm91cnNcIik7XG4gICAgICAgIHVzZXMoYWRhcHRlci5mbGF2b3VyKShjbGF6eik7XG4gICAgICB9XG4gICAgfVxuICAgIFt0aGlzLmNyZWF0ZUFsbCwgdGhpcy5yZWFkQWxsLCB0aGlzLnVwZGF0ZUFsbCwgdGhpcy5kZWxldGVBbGxdLmZvckVhY2goXG4gICAgICAobSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gbS5uYW1lO1xuICAgICAgICB3cmFwTWV0aG9kV2l0aENvbnRleHQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlByZWZpeFwiXSxcbiAgICAgICAgICBtLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiU3VmZml4XCJdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHByb3h5IHdpdGggb3ZlcnJpZGRlbiByZXBvc2l0b3J5IGZsYWdzLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgcHJveHkgb2YgdGhpcyByZXBvc2l0b3J5IHdpdGggdGhlIHNwZWNpZmllZCBmbGFncyBvdmVycmlkZGVuLlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IGZsYWdzIC0gVGhlIGZsYWdzIHRvIG92ZXJyaWRlLlxuICAgKiBAcmV0dXJuIHtSZXBvc2l0b3J5fSBBIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIG92ZXJyaWRkZW4gZmxhZ3MuXG4gICAqL1xuICBvdmVycmlkZShmbGFnczogUGFydGlhbDxGPik6IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz4ge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMub3ZlcnJpZGUpXG4gICAgICAuZGVidWcoYE92ZXJyaWRpbmcgcmVwb3NpdG9yeSBmbGFncyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoZmxhZ3MpfWApO1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcywgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICBpZiAocCAhPT0gXCJfb3ZlcnJpZGVzXCIpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZXN1bHQsIGZsYWdzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBhIHNwZWNpZmljIGFkYXB0ZXIgYW5kIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHRlbXBsYXRlIEEgLSBUaGUgdHlwZSBvZiB0aGUgYWRhcHRlci5cbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgdHlwZSBvZiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKiBAdGVtcGxhdGUgQyAtIFRoZSB0eXBlIG9mIHRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8SW5mZXJyZWRBZGFwdGVyQ29uZmlnPEE+Pn0gY29uZiAtIGFkYXB0ZXIgY29uZmlndXJhdGlvbnMgdG8gb3ZlcnJpZGUuXG4gICAqIEBwYXJhbSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIG5ldyBpbnN0YW5jZS5cbiAgICpcbiAgICogQHJldHVybiBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBhbmQgYXJndW1lbnRzLlxuICAgKi9cbiAgZm9yKFxuICAgIGNvbmY6IFBhcnRpYWw8SW5mZXJyZWRBZGFwdGVyQ29uZmlnPEE+PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiYWRhcHRlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5mb3IoY29uZiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBvYnNlcnZlciBoYW5kbGVyLlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7T2JzZXJ2ZXJIYW5kbGVyfSBBIG5ldyBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIGNyZWF0aW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgY3JlYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgdGhlIG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIG1vZGVsIGluc3RhbmNlIHRvIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGNyZWF0ZWQgbW9kZWwgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIGxldCBjOiBDIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxlbmd0aCkgYyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXSBhcyBDO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KFxuICAgICAgcmVjb3JkLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIHRoaXMucGssXG4gICAgICBpZCxcbiAgICAgIGMgJiYgYy5nZXQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSA/IHRyYW5zaWVudCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBvc3QtY3JlYXRpb24gaG9vay5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgYWZ0ZXIgYSBtb2RlbCBpcyBjcmVhdGVkIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIGNyZWF0ZWQgbW9kZWwuXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHByb2Nlc3NlZCBtb2RlbC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVN1ZmZpeChtb2RlbDogTSwgY29udGV4dDogQyk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiBzdXBlci5jcmVhdGVTdWZmaXgobW9kZWwsIGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIG1vZGVscyBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyB0byB0aGUgZGF0YWJhc2UgaW4gYSBiYXRjaCBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBjcmVhdGVkIG1vZGVscyB3aXRoIHVwZGF0ZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGxldCByZWNvcmRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIGlkcyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgcmVjb3JkcyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIGNyZWF0aW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGFuZCBwcmVwYXJlcyB0aGVtIGZvciBjcmVhdGlvbiBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIGFueSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICAgIGNvbnN0IG9wdHMgPSBSZXBvc2l0b3J5LmdldFNlcXVlbmNlT3B0aW9ucyhtb2RlbHNbMF0pO1xuICAgIGxldCBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWQpW10gPSBbXTtcbiAgICBpZiAob3B0cy50eXBlKSB7XG4gICAgICBpZiAoIW9wdHMubmFtZSkgb3B0cy5uYW1lID0gU2VxdWVuY2UucGsobW9kZWxzWzBdKTtcbiAgICAgIGlkcyA9IGF3YWl0IChhd2FpdCB0aGlzLmFkYXB0ZXIuU2VxdWVuY2Uob3B0cykpLnJhbmdlKG1vZGVscy5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgbVt0aGlzLnBrXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBQcmltYXJ5IGtleSBpcyBub3QgZGVmaW5lZCBmb3IgbW9kZWwgaW4gcG9zaXRpb24gJHtpfWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0sIGkpID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAob3B0cy50eXBlKSBtW3RoaXMucGtdID0gaWRzW2ldIGFzIE1ba2V5b2YgTV07XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGlnbm9yZWRQcm9wcyA9XG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBhIG1vZGVsIGJ5IElELlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIGtleSBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVhZFByZWZpeChrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbDogTSA9IG5ldyB0aGlzLmNsYXNzKCk7XG4gICAgbW9kZWxbdGhpcy5wa10gPSBrZXkgYXMgTVtrZXlvZiBNXTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgcmVhZChpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZCh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIHJlYWRpbmcgbXVsdGlwbGUgbW9kZWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbFByZWZpeChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAga2V5cy5tYXAoYXN5bmMgKGspID0+IHtcbiAgICAgICAgY29uc3QgbSA9IG5ldyB0aGlzLmNsYXNzKCk7XG4gICAgICAgIG1bdGhpcy5wa10gPSBrIGFzIE1ba2V5b2YgTV07XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgbXVsdGlwbGUgbW9kZWxzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyB0aGVpciBwcmltYXJ5IGtleXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSB1cGRhdGVkIG1vZGVsIHdpdGggcmVmcmVzaGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBhc3luYyB1cGRhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHVwZGF0ZS5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgcHJlcGFyZXMgaXQgZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG1vZGVsIGhhcyBubyBwcmltYXJ5IGtleSB2YWx1ZS5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYXJnczogYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBwayA9IG1vZGVsW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICBpZiAoIXBrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgKTtcbiAgICBjb25zdCBvbGRNb2RlbCA9IGF3YWl0IHRoaXMucmVhZChwaywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgbW9kZWwgPSB0aGlzLm1lcmdlKG9sZE1vZGVsLCBtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICAgIG9sZE1vZGVsLFxuICAgICAgICAuLi5SZXBvc2l0b3J5LnJlbGF0aW9ucyh0aGlzLmNsYXNzKSxcbiAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG4gICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKSB7XG4gICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobW9kZWwpKVxuICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG1vZGVsLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGNoYW5nZXMgdG8gbXVsdGlwbGUgZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2VzIGluIHRoZSBkYXRhYmFzZSBpbiBhIGJhdGNoIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzIHdpdGggcmVmcmVzaGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5pZCksXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZWQubWFwKCh1LCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydCh1LCB0aGlzLmNsYXNzLCB0aGlzLnBrLCByZWNvcmRzW2ldLmlkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGFuZCBwcmVwYXJlcyB0aGVtIGZvciB1cGRhdGUgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnlbXT59IFRoZSBwcmVwYXJlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhbnkgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIGFueSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbFByZWZpeChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IG1bdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJtaXNzaW5nIGlkIG9uIHVwZGF0ZSBvcGVyYXRpb25cIik7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSk7XG4gICAgY29uc3Qgb2xkTW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGlkcywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgbW9kZWxzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgbSA9IHRoaXMubWVyZ2Uob2xkTW9kZWxzW2ldLCBtKTtcbiAgICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpIHtcbiAgICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG0pKVxuICAgICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobSwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgICAgIG9sZE1vZGVsc1tpXVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGlnbm9yZWRQcm9wcyA9XG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKG9sZE1vZGVsc1tpXSwgbSwgLi4uaWdub3JlZFByb3BzKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGVycm9ycy5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgIGlmIChlKVxuICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgdW5kZWZpbmVkKTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2VzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9yTWVzc2FnZXMpO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG0sIGkpID0+IHtcbiAgICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpIHtcbiAgICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG0pKVxuICAgICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobSwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBhIG1vZGVsIGJ5IElELlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgZGVsZXRpbmcgYSBtb2RlbC5cbiAgICogQHBhcmFtIHthbnl9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIGtleSBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlUHJlZml4KGtleTogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQoa2V5LCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscyBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbFByZWZpeChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGtleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyB0aGVpciBwcmltYXJ5IGtleXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZUFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VsZWN0IHF1ZXJ5IHdpdGhvdXQgc3BlY2lmeWluZyBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IFN0YXJ0cyBidWlsZGluZyBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4gYWxsIGZpZWxkcyBvZiB0aGUgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHNlbGVjdDxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgUyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10sXG4gID4oKTogV2hlcmVPcHRpb248TSwgTVtdPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aCBzcGVjaWZpYyBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IFN0YXJ0cyBidWlsZGluZyBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIGZpZWxkcyBvZiB0aGUgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIGZpZWxkcyB0byBzZWxlY3QuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyIGZvciB0aGUgc2VsZWN0ZWQgZmllbGRzLlxuICAgKi9cbiAgc2VsZWN0PFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdPihcbiAgICBzZWxlY3RvcjogcmVhZG9ubHkgWy4uLlNdXG4gICk6IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWxlY3QgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsIHdpdGggb3B0aW9uYWwgZmllbGQgc2VsZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEBwYXJhbSBbc2VsZWN0b3JdIC0gT3B0aW9uYWwgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yPzogcmVhZG9ubHkgWy4uLlNdXG4gICk6IFdoZXJlT3B0aW9uPE0sIE1bXT4gfCBXaGVyZU9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT4ge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXJcbiAgICAgIC5TdGF0ZW1lbnQ8TT4oKVxuICAgICAgLnNlbGVjdChzZWxlY3RvciBhcyByZWFkb25seSBbLi4uU10pXG4gICAgICAuZnJvbSh0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBxdWVyeSB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9ucyBhbmQgb3B0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzaW1wbGlmaWVkIHdheSB0byBxdWVyeSB0aGUgZGF0YWJhc2Ugd2l0aCBjb21tb24gcXVlcnkgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gZmlsdGVyIHJlY29yZHMuXG4gICAqIEBwYXJhbSBvcmRlckJ5IC0gVGhlIGZpZWxkIHRvIG9yZGVyIHJlc3VsdHMgYnkuXG4gICAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtvcmRlcj1PcmRlckRpcmVjdGlvbi5BU0NdIC0gVGhlIHNvcnQgZGlyZWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSAtIE9wdGlvbmFsIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NraXBdIC0gT3B0aW9uYWwgbnVtYmVyIG9mIHJlc3VsdHMgdG8gc2tpcC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcXVlcnkgcmVzdWx0cyBhcyBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBhc3luYyBxdWVyeShcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICBvcmRlckJ5OiBrZXlvZiBNLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICBsaW1pdD86IG51bWJlcixcbiAgICBza2lwPzogbnVtYmVyXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3Qgc29ydDogT3JkZXJCeVNlbGVjdG9yPE0+ID0gW29yZGVyQnksIG9yZGVyIGFzIE9yZGVyRGlyZWN0aW9uXTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VsZWN0KCkud2hlcmUoY29uZGl0aW9uKS5vcmRlckJ5KHNvcnQpO1xuICAgIGlmIChsaW1pdCkgcXVlcnkubGltaXQobGltaXQpO1xuICAgIGlmIChza2lwKSBxdWVyeS5vZmZzZXQoc2tpcCk7XG4gICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gbW9kZWxzIGluIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXIuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJGaWx0ZXJ9IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZmlsdGVyIHRvIGxpbWl0IHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIEBmaW5hbCgpXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJvYnNlcnZlckhhbmRsZXJcIiwge1xuICAgICAgICB2YWx1ZTogdGhpcy5PYnNlcnZlckhhbmRsZXIoKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMub2JzZXJ2ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICB0aGlzLmFkYXB0ZXIub2JzZXJ2ZSh0aGlzLCAodGFibGU6IHN0cmluZykgPT4gdGFibGVOYW1lID09PSB0YWJsZSk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgbm93IG9ic2VydmluZyAke3RoaXMuYWRhcHRlcn0gZmlsdGVyaW5nIG9uIHRhYmxlID09PSAke3RhYmxlTmFtZX1gXG4gICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlciEub2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKTtcbiAgICBsb2cudmVyYm9zZShgUmVnaXN0ZXJlZCBuZXcgb2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlciBmcm9tIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBzbyBpdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb2YgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG9ic2VydmVyIGhhbmRsZXIgaXMgbm90IGluaXRpYWxpemVkLlxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI3VuT2JzZXJ2ZX1cbiAgICovXG4gIEBmaW5hbCgpXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVuT2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBPYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9IHJlbW92ZWRgKTtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCkpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBtb3JlIG9ic2VydmVycyByZWdpc3RlcmVkIGZvciAke3RoaXMuYWRhcHRlcn0sIHVuc3Vic2NyaWJpbmdgXG4gICAgICApO1xuICAgICAgdGhpcy5hZGFwdGVyLnVuT2JzZXJ2ZSh0aGlzKTtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYE5vIGxvbmdlciBvYnNlcnZpbmcgYWRhcHRlciAke3RoaXMuYWRhcHRlci5mbGF2b3VyfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudXBkYXRlT2JzZXJ2ZXJzKVxuICAgICAgLnZlcmJvc2UoXG4gICAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgJHt0aGlzfWBcbiAgICAgICk7XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGhpcy5sb2csXG4gICAgICB0YWJsZSxcbiAgICAgIGV2ZW50LFxuICAgICAgQXJyYXkuaXNBcnJheShpZClcbiAgICAgICAgPyBpZC5tYXAoKGkpID0+IFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5wa1Byb3BzLnR5cGUsIGkpIGFzIHN0cmluZylcbiAgICAgICAgOiAoU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaWQpIGFzIHN0cmluZyksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWxpYXMgZm9yIHVwZGF0ZU9ic2VydmVycy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudCAoYWxpYXMgZm9yIHVwZGF0ZU9ic2VydmVycykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqL1xuICBhc3luYyByZWZyZXNoKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvciByZXRyaWV2ZXMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IHJldHVybnMgYSByZXBvc2l0b3J5IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIHRoYXQgZXh0ZW5kcyBSZXBvPE0+LlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBkZWZhdWx0IGFkYXB0ZXIgZmxhdm91ciBpZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7Un0gQSByZXBvc2l0b3J5IGluc3RhbmNlIGZvciB0aGUgbW9kZWwuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIGFkYXB0ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIGZsYXZvdXIuXG4gICAqL1xuICBzdGF0aWMgZm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsLCBSIGV4dGVuZHMgUmVwbzxNPj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFIge1xuICAgIGxldCByZXBvOiBSIHwgQ29uc3RydWN0b3I8Uj4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBfYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBhbGlhcyB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91cjtcbiAgICB0cnkge1xuICAgICAgcmVwbyA9IHRoaXMuZ2V0KG1vZGVsLCBfYWxpYXMpIGFzIENvbnN0cnVjdG9yPFI+IHwgUjtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJlcG8gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlcG8gaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSByZXR1cm4gcmVwbyBhcyBSO1xuXG4gICAgY29uc3QgZmxhdm91cjogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICAocmVwbyAmJlxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgcmVwbykpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIGNvbnN0IGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PiB8IHVuZGVmaW5lZCA9IGZsYXZvdXJcbiAgICAgID8gQWRhcHRlci5nZXQoZmxhdm91cilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFhZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZm91bmQgZmxhdm91ciAke2ZsYXZvdXJ9YFxuICAgICAgKTtcblxuICAgIHJlcG8gPSByZXBvIHx8IChhZGFwdGVyLnJlcG9zaXRvcnkoKSBhcyBDb25zdHJ1Y3RvcjxSPik7XG4gICAgcmV0dXJuIG5ldyByZXBvKGFkYXB0ZXIsIG1vZGVsLCAuLi5hcmdzKSBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIGZyb20gdGhlIGNhY2hlLlxuICAgKiBAc3VtbWFyeSBHZXRzIGEgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbCBmcm9tIHRoZSBpbnRlcm5hbCBjYWNoZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIFRoZSBhZGFwdGVyIGFsaWFzLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyByZXBvc2l0b3J5IGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApOiBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT4ge1xuICAgIGxldCBuYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgaWYgKGFsaWFzKSB7XG4gICAgICBuYW1lID0gW25hbWUsIGFsaWFzXS5qb2luKERlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZVtuYW1lXSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPjtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZmluZCByZXBvc2l0b3J5IHJlZ2lzdGVyZWQgdW5kZXIgJHtuYW1lfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIGEgbW9kZWwgaW4gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+fSByZXBvIC0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIHRoZSBhZGFwdGVyIGFsaWFzL2ZsYXZvdXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGEgcmVwb3NpdG9yeSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICByZXBvOiBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYCR7bmFtZX0gYWxyZWFkeSByZWdpc3RlcmVkIGFzIGEgcmVwb3NpdG9yeWApO1xuICAgIHRoaXMuX2NhY2hlW25hbWVdID0gcmVwbyBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgbWV0YWRhdGEgb24gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQXR0YWNoZXMgbWV0YWRhdGEgdG8gYSBtb2RlbCBpbnN0YW5jZSB1c2luZyBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHthbnl9IG1ldGFkYXRhIC0gVGhlIG1ldGFkYXRhIHRvIGF0dGFjaCB0byB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgc2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgbWV0YWRhdGE6IGFueSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBtZXRhZGF0YSBmcm9tIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBwcmV2aW91c2x5IGF0dGFjaGVkIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIG1ldGFkYXRhIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmQuXG4gICAqL1xuICBzdGF0aWMgZ2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgbW9kZWwsXG4gICAgICBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFcbiAgICApO1xuICAgIHJldHVybiBkZXNjcmlwdG9yID8gZGVzY3JpcHRvci52YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBtZXRhZGF0YSBmcm9tIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IERlbGV0ZXMgdGhlIG1ldGFkYXRhIHByb3BlcnR5IGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgbW9kZWwsXG4gICAgICBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFcbiAgICApO1xuICAgIGlmIChkZXNjcmlwdG9yKSBkZWxldGUgKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBzZXF1ZW5jZSBvcHRpb25zIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgc2VxdWVuY2UgY29uZmlndXJhdGlvbiBmb3IgYSBtb2RlbCdzIHByaW1hcnkga2V5IGZyb20gbWV0YWRhdGEuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtTZXF1ZW5jZU9wdGlvbnN9IFRoZSBzZXF1ZW5jZSBvcHRpb25zIGZvciB0aGUgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gc2VxdWVuY2Ugb3B0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGdldFNlcXVlbmNlT3B0aW9uczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShtb2RlbCkuaWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKSxcbiAgICAgIG1vZGVsLFxuICAgICAgcGsgYXMgc3RyaW5nXG4gICAgKTtcbiAgICBpZiAoIW1ldGFkYXRhKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiTm8gc2VxdWVuY2Ugb3B0aW9ucyBkZWZpbmVkIGZvciBtb2RlbC4gZGlkIHlvdSB1c2UgdGhlIEBwayBkZWNvcmF0b3I/XCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIFNlcXVlbmNlT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgaW5kZXhlcyBkZWZpbmVkIG9uIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgaW5kZXggbWV0YWRhdGEgZnJvbSBhIG1vZGVsJ3MgcHJvcGVydHkgZGVjb3JhdG9ycy5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4+fSBBIG5lc3RlZCByZWNvcmQgb2YgcHJvcGVydHkgbmFtZXMgdG8gaW5kZXggbWV0YWRhdGEuXG4gICAqL1xuICBzdGF0aWMgaW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCBpbmRleERlY29yYXRvcnMgPSBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbCA6IG5ldyBtb2RlbCgpLFxuICAgICAgREJLZXlzLlJFRkxFQ1RcbiAgICApO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhpbmRleERlY29yYXRvcnMgfHwge30pLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4+LCBbaywgdmFsXSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNzID0gdmFsLmZpbHRlcigodikgPT4gdi5rZXkuc3RhcnRzV2l0aChQZXJzaXN0ZW5jZUtleXMuSU5ERVgpKTtcbiAgICAgICAgaWYgKGRlY3MgJiYgZGVjcy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiBkZWNzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcHMgfSA9IGRlYztcbiAgICAgICAgICAgIGFjY3VtW2tdID0gYWNjdW1ba10gfHwge307XG4gICAgICAgICAgICBhY2N1bVtrXVtrZXldID0gcHJvcHMgYXMgSW5kZXhNZXRhZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgcmVsYXRpb24gcHJvcGVydGllcyBkZWZpbmVkIG9uIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZXMgb2YgYWxsIHByb3BlcnRpZXMgbWFya2VkIGFzIHJlbGF0aW9ucyBpbiB0aGUgbW9kZWwgaGllcmFyY2h5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdGhhdCBhcmUgcmVsYXRpb25zLlxuICAgKi9cbiAgc3RhdGljIHJlbGF0aW9uczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBwcm90b3R5cGUgPVxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbFxuICAgICAgICA/IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcbiAgICAgICAgOiAobW9kZWwgYXMgYW55KS5wcm90b3R5cGU7XG4gICAgd2hpbGUgKHByb3RvdHlwZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwcm9wczogc3RyaW5nW10gPSBwcm90b3R5cGVbUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OU107XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4ucHJvcHMpO1xuICAgICAgfVxuICAgICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFibGUgbmFtZSBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldFRhYmxlTmFtZShtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIGF0dHJpYnV0ZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZSBmb3IgYSBtb2RlbCBwcm9wZXJ0eS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBUaGUgYXR0cmlidXRlL3Byb3BlcnR5IG5hbWUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbHVtbiBuYW1lIGZvciB0aGUgYXR0cmlidXRlLlxuICAgKi9cbiAgc3RhdGljIGNvbHVtbjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBhdHRyaWJ1dGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENvbHVtbk5hbWUobW9kZWwsIGF0dHJpYnV0ZSk7XG4gIH1cbn1cblxuaWYgKEFkYXB0ZXIpIEFkYXB0ZXJbXCJfYmFzZVJlcG9zaXRvcnlcIl0gPSBSZXBvc2l0b3J5O1xuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSB1bmlxdWUgaW5qZWN0YWJsZSBuYW1lIGZvciBhIHJlcG9zaXRvcnkuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGluamVjdGFibGUgdG9rZW4gZm9yIHJlcG9zaXRvcmllcyB1c2luZyB0aGUgYWRhcHRlciBmbGF2b3VyIGFuZCBtb2RlbCB0YWJsZSBuYW1lLlxuICogVGhpcyBoZWxwcyB0aGUgREkgc3lzdGVtIHJlZ2lzdGVyIGFuZCByZXNvbHZlIHJlcG9zaXRvcnkgaW5zdGFuY2VzIGNvbnNpc3RlbnRseSBhY3Jvc3MgYWRhcHRlcnMuXG4gKiBAdGVtcGxhdGUgVCBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFQ+IHwgVH0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZyb20gd2hpY2ggdG8gZGVyaXZlIHRoZSB0YWJsZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIvYWxpYXMuIElmIG9taXR0ZWQsIGl0IGlzIHJlYWQgZnJvbSBtb2RlbCBtZXRhZGF0YS5cbiAqIEByZXR1cm4ge3N0cmluZ30gQSBuYW1lc3BhY2VkIGluamVjdGFibGUgdG9rZW4gZm9yIHRoZSByZXBvc2l0b3J5IChlLmcuLCBcImRiOnJlcG86cmFtOnVzZXJzXCIpLlxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGZsYXZvdXIgY2Fubm90IGJlIGRldGVybWluZWQgZnJvbSBhcmd1bWVudHMgb3IgbWV0YWRhdGEuXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnlcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgVSBhcyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3QgTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgQSBhcyBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RyaW5nIEZvcm1hdHRlclxuICogICBDLT4+VTogY2FsbChtb2RlbCwgZmxhdm91cj8pXG4gKiAgIGFsdCBmbGF2b3VyIHByb3ZpZGVkXG4gKiAgICAgVS0tPj5VOiB1c2UgcHJvdmlkZWQgZmxhdm91clxuICogICBlbHNlIGZsYXZvdXIgbm90IHByb3ZpZGVkXG4gKiAgICAgVS0+PkE6IEFkYXB0ZXIua2V5KEFEQVBURVIpXG4gKiAgICAgVS0+PlI6IGdldE1ldGFkYXRhKGtleSwgbW9kZWx8bW9kZWwuY3RvcilcbiAqICAgICBhbHQgbWV0YWRhdGEgcHJlc2VudFxuICogICAgICAgUi0tPj5VOiBmbGF2b3VyXG4gKiAgICAgZWxzZSBtaXNzaW5nXG4gKiAgICAgICBVLS0+PkM6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIFUtPj5TOiBzZihJTkpFQ1RBQkxFLCBmbGF2b3VyLCBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKSlcbiAqICAgUy0tPj5DOiB0b2tlbiBzdHJpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+IHwgVCxcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKCFmbGF2b3VyKSB7XG4gICAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgIGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAga2V5LFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWxcbiAgICApO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldHJpZXZlIGZsYXZvdXIgZnJvbSBtb2RlbCAke21vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lIDogbW9kZWwubmFtZX1gXG4gICAgICApO1xuICB9XG4gIHJldHVybiBzZihQZXJzaXN0ZW5jZUtleXMuSU5KRUNUQUJMRSwgZmxhdm91ciwgZ2V0VGFibGVOYW1lKG1vZGVsKSk7XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlUmVnaXN0cnlJbXAsXG4gIEluamVjdGFibGVzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3Rvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnkgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgZm9yIGluamVjdGFibGUgcmVwb3NpdG9yaWVzIHdpdGggYXV0by1yZXNvbHV0aW9uLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYW4gSW5qZWN0YWJsZVJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uIHRoYXQgcmVzb2x2ZXMgcmVwb3NpdG9yaWVzIGJ5IG1vZGVsIG5hbWUgb3IgY29uc3RydWN0b3IuIElmIGEgcmVwb3NpdG9yeVxuICogaXMgbm90IGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCwgaXQgYXR0ZW1wdHMgdG8gaW5mZXIgdGhlIGNvcnJlY3QgcmVwb3NpdG9yeSB1c2luZyBtb2RlbCBtZXRhZGF0YSBhbmQgdGhlIGFjdGl2ZSBvciBzcGVjaWZpZWQgYWRhcHRlciBmbGF2b3VyLlxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgcmVxdWlyZWQ7IHRoZSBzdXBlcmNsYXNzIGhhbmRsZXMgaW50ZXJuYWwgc3RhdGUuXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlOiByZXRyaWV2ZSBhIHJlcG9zaXRvcnkgYnkgbW9kZWwgbmFtZVxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZXNSZWdpc3RyeSgpO1xuICogY29uc3QgdXNlclJlcG8gPSByZWdpc3RyeS5nZXQ8VXNlclJlcG9zaXRvcnk+KCdVc2VyJyk7XG4gKiAvLyBJZiBVc2VyUmVwb3NpdG9yeSBpcyByZWdpc3RlcmVkLCBpdCB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgcmVwb3NpdG9yeSB3aWxsIGJlIGNyZWF0ZWQgaWYgYSBVc2VyIG1vZGVsIGV4aXN0cy5cbiAqXG4gKiAvLyBSZXRyaWV2ZSBieSBjb25zdHJ1Y3RvciBhbmQgc3BlY2lmeSBhZGFwdGVyIGZsYXZvdXJcbiAqIGNvbnN0IHJlcG9CeUN0b3IgPSByZWdpc3RyeS5nZXQ8VXNlclJlcG9zaXRvcnk+KFVzZXJNb2RlbCwgJ3JhbScpO1xuICpcbiAqIC8vIFJldHJpZXZlIGJ5IHN5bWJvbCAoZS5nLiwgaW5qZWN0YWJsZSB0b2tlbilcbiAqIGNvbnN0IHRva2VuID0gU3ltYm9sLmZvcignVXNlclJlcG9zaXRvcnknKTtcbiAqIGNvbnN0IGJ5VG9rZW4gPSByZWdpc3RyeS5nZXQ8VXNlclJlcG9zaXRvcnk+KHRva2VuKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb25zdW1lclxuICogICBwYXJ0aWNpcGFudCBSIGFzIEluamVjdGFibGVzUmVnaXN0cnlcbiAqICAgcGFydGljaXBhbnQgQiBhcyBCYXNlUmVnaXN0cnlcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUlAgYXMgUmVwb3NpdG9yeVxuICogICBDLT4+UjogZ2V0KG5hbWUsIGZsYXZvdXI/KVxuICogICBhY3RpdmF0ZSBSXG4gKiAgIFItPj5COiBzdXBlci5nZXQobmFtZSlcbiAqICAgYWx0IEZvdW5kIGluIGJhc2UgcmVnaXN0cnlcbiAqICAgICBCLS0+PlI6IGluamVjdGFibGVcbiAqICAgICBSLS0+PkM6IGluamVjdGFibGVcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICBSLT4+TTogTW9kZWwuZ2V0KG5hbWUpXG4gKiAgICAgYWx0IE1vZGVsIGZvdW5kXG4gKiAgICAgICBSLT4+QTogcmVzb2x2ZSBmbGF2b3VyIChmcm9tIGFyZy9tZXRhZGF0YS9jdXJyZW50KVxuICogICAgICAgUi0+PlJQOiBSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsQ3RvciwgYWxpYXMpXG4gKiAgICAgICBhbHQgUmVwb3NpdG9yeSBpbnN0YW5jZVxuICogICAgICAgICBSUC0tPj5SOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICAgIFItLT4+QzogcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogICAgICAgZWxzZSBSZXBvc2l0b3J5IGN0b3JcbiAqICAgICAgICAgUi0+PkE6IEFkYXB0ZXIuZ2V0KHJlc29sdmVkRmxhdm91cikgb3IgQWRhcHRlci5jdXJyZW50XG4gKiAgICAgICAgIEEtLT4+UjogYWRhcHRlciBpbnN0YW5jZVxuICogICAgICAgICBSLT4+UlA6IG5ldyByZXBvQ3RvcihhZGFwdGVyLCBtb2RlbEN0b3IpXG4gKiAgICAgICAgIFItLT4+QzogcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogICAgICAgZW5kXG4gKiAgICAgZWxzZSBNb2RlbCBub3QgZm91bmRcbiAqICAgICAgIFItLT4+QzogdW5kZWZpbmVkXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeSBleHRlbmRzIEluamVjdGFibGVSZWdpc3RyeUltcCB7XG4gIHByaXZhdGUgbG9nZ2VyPzogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmUgYW4gaW5qZWN0YWJsZSB3aXRoIHJlcG9zaXRvcnkgYXV0by1yZXNvbHV0aW9uLlxuICAgKiBAc3VtbWFyeSBBdHRlbXB0cyB0byBnZXQgYW4gaW5qZWN0YWJsZSBmcm9tIHRoZSBiYXNlIHJlZ2lzdHJ5OyBpZiBub3QgZm91bmQgYW5kIHRoZSBuYW1lIHJlZmVycyB0byBhIGtub3duIG1vZGVsLCBpdFxuICAgKiByZXNvbHZlcyB0aGUgYXBwcm9wcmlhdGUgcmVwb3NpdG9yeSB1c2luZyB0aGUgc3BlY2lmaWVkIGZsYXZvdXIgb3IgbW9kZWwgbWV0YWRhdGEsIGZhbGxpbmcgYmFjayB0byB0aGUgY3VycmVudCBhZGFwdGVyIHdoZW4gbmVlZGVkLlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgaW5qZWN0YWJsZSB0eXBlIHRvIGJlIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yPFQ+fSBuYW1lIFRva2VuLCBtb2RlbCBuYW1lLCBvciBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGluamVjdGFibGUgb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyIChlLmcuLCBcInJhbVwiKS4gSWYgb21pdHRlZCwgZGVyaXZlcyBmcm9tIG1ldGFkYXRhIG9yIGN1cnJlbnQgYWRhcHRlci5cbiAgICogQHJldHVybiB7VCB8IHVuZGVmaW5lZH0gVGhlIGxvY2F0ZWQgb3IgYXV0by1jcmVhdGVkIGluamVjdGFibGUgaW5zdGFuY2U7IG90aGVyd2lzZSB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIHJlc29sdmVkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBHIGFzIGdldChuYW1lLCBmbGF2b3VyPylcbiAgICogICBwYXJ0aWNpcGFudCBCUiBhcyBCYXNlUmVnaXN0cnlcbiAgICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUlAgYXMgUmVwb3NpdG9yeVxuICAgKiAgIEctPj5CUjogc3VwZXIuZ2V0KG5hbWUpXG4gICAqICAgYWx0IEZvdW5kXG4gICAqICAgICBCUi0tPj5HOiBpbmplY3RhYmxlXG4gICAqICAgZWxzZSBOb3QgZm91bmRcbiAgICogICAgIEctPj5NOiBkZXJpdmUgbW9kZWxDdG9yIGZyb20gbmFtZVxuICAgKiAgICAgYWx0IG1vZGVsQ3RvciByZXNvbHZlZFxuICAgKiAgICAgICBHLT4+QTogcmVzb2x2ZSBmbGF2b3VyIChhcmcgfCBtZXRhZGF0YSB8IGN1cnJlbnQpXG4gICAqICAgICAgIEctPj5SUDogUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbEN0b3IsIGFsaWFzKVxuICAgKiAgICAgICBhbHQgcmV0dXJucyBpbnN0YW5jZVxuICAgKiAgICAgICAgIFJQLS0+Pkc6IFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAgICogICAgICAgZWxzZSByZXR1cm5zIGN0b3JcbiAgICogICAgICAgICBHLT4+QTogQWRhcHRlci5nZXQoZmxhdm91cikgfCBBZGFwdGVyLmN1cnJlbnRcbiAgICogICAgICAgICBBLS0+Pkc6IGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogICAgICAgICBHLT4+UlA6IG5ldyByZXBvQ3RvcihhZGFwdGVyLCBtb2RlbEN0b3IpXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBubyBtb2RlbEN0b3JcbiAgICogICAgICAgRy0tPj5HOiByZXR1cm4gdW5kZWZpbmVkXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBDb25zdHJ1Y3RvcjxUPiB8IHN0cmluZyxcbiAgICBmbGF2b3VyPzogc3RyaW5nXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldCk7XG4gICAgLy8gRmlyc3QsIHRyeSBiYXNlIHJlZ2lzdHJ5LCBidXQgZ3VhcmQgYWdhaW5zdCB0aHJvd24gZXJyb3JzXG4gICAgbGV0IGluamVjdGFibGU6IFQgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGFibGUgPSBzdXBlci5nZXQobmFtZSBhcyBhbnkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZy4gd2UgaGFuZGxlIGl0IGxhdGVyXG4gICAgfVxuXG4gICAgaWYgKCFpbmplY3RhYmxlKSB7XG4gICAgICBsZXQgbW9kZWxDdG9yOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIpIG1vZGVsQ3RvciA9IG5hbWUgYXMgQ29uc3RydWN0b3I8YW55PjtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiIHx8IHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1vZGVsQ3RvciA9IE1vZGVsLmdldChuYW1lLnRvU3RyaW5nKCkpIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFtb2RlbEN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFJlc29sdmUgZmxhdm91ciBmcm9tIG1ldGFkYXRhIGlmIG5vdCBwcm92aWRlZFxuICAgICAgY29uc3QgbWV0YUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmxhdm91ciA9XG4gICAgICAgIGZsYXZvdXIgfHxcbiAgICAgICAgKFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YUtleSwgbW9kZWxDdG9yKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBEZXRlcm1pbmUgYW4gYWxpYXMgdG8gdXNlOiBwcmVmZXIgYSBkaXJlY3RseSByZWdpc3RlcmVkIGFkYXB0ZXI7IG90aGVyd2lzZSwgaWYgdGhlIGN1cnJlbnQgYWRhcHRlclxuICAgICAgICAvLyBoYXMgdGhlIHNhbWUgZmxhdm91ciwgdXNlIGl0cyBhbGlhcyB0byBzYXRpc2Z5IFJlcG9zaXRvcnkuZm9yTW9kZWwvQWRhcHRlci5nZXQgbG9va3Vwcy5cbiAgICAgICAgbGV0IGFsaWFzVG9Vc2UgPSByZXNvbHZlZEZsYXZvdXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJlc29sdmVkRmxhdm91cikgQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IEFkYXB0ZXIuY3VycmVudCBhcyBhbnk7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5mbGF2b3VyID09PSByZXNvbHZlZEZsYXZvdXIpXG4gICAgICAgICAgICBhbGlhc1RvVXNlID0gY3VycmVudC5hbGlhcztcbiAgICAgICAgfVxuXG4gICAgICAgIGluamVjdGFibGUgPSBSZXBvc2l0b3J5LmZvck1vZGVsKFxuICAgICAgICAgIG1vZGVsQ3RvciBhcyBDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgICAgIGFsaWFzVG9Vc2VcbiAgICAgICAgKSBhcyBUO1xuICAgICAgICBpZiAoaW5qZWN0YWJsZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiBpbmplY3RhYmxlIGFzIFQ7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCByZWdpc3RlciB0aGUgcmVzb2x2ZWQgaW5qZWN0YWJsZSBuYW1lIGZvciBsYXRlciByZXRyaWV2YWxcbiAgICAgICAgY29uc3QgZiA9XG4gICAgICAgICAgcmVzb2x2ZWRGbGF2b3VyIHx8XG4gICAgICAgICAgKFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YUtleSwgKGluamVjdGFibGUgYXMgYW55KS5jb25zdHJ1Y3RvcikgYXNcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCkgfHxcbiAgICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCBtb2RlbEN0b3IpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICAgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnkoXG4gICAgICAgICAgICBtb2RlbEN0b3IgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgICAgICAgZiBhcyBzdHJpbmdcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICBgTm8gcmVnaXN0ZXJlZCByZXBvc2l0b3J5IG9yIGFkYXB0ZXIgZm91bmQuIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGFkYXB0ZXIuIEVycm9yOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBKU09OLnN0cmluZ2lmeShlKX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlcG9DdG9yID0gKFJlcG9zaXRvcnkgYXMgYW55KVtcImdldFwiXShtb2RlbEN0b3IsIHJlc29sdmVkRmxhdm91cik7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwb0N0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSByZXNvbHZlZEZsYXZvdXJcbiAgICAgICAgICAgID8gKEFkYXB0ZXIuZ2V0KHJlc29sdmVkRmxhdm91cikgYXMgYW55KVxuICAgICAgICAgICAgOiAoQWRhcHRlci5jdXJyZW50IGFzIGFueSk7XG4gICAgICAgICAgaWYgKCFhZGFwdGVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3Rvcik7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlIGFzIFQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5qZWN0YWJsZSBhcyBUIHwgdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi9BZGFwdGVyXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyRGlzcGF0Y2gsIEV2ZW50SWRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERpc3BhdGNoZXMgZGF0YWJhc2Ugb3BlcmF0aW9uIGV2ZW50cyB0byBvYnNlcnZlcnNcbiAqIEBzdW1tYXJ5IFRoZSBEaXNwYXRjaCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPYnNlcnZhYmxlIGludGVyZmFjZSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGludGVyY2VwdGluZ1xuICogZGF0YWJhc2Ugb3BlcmF0aW9ucyBmcm9tIGFuIEFkYXB0ZXIgYW5kIG5vdGlmeWluZyBvYnNlcnZlcnMgd2hlbiBjaGFuZ2VzIG9jY3VyLiBJdCB1c2VzIHByb3hpZXMgdG9cbiAqIHdyYXAgdGhlIGFkYXB0ZXIncyBDUlVEIG1ldGhvZHMgYW5kIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciBvYnNlcnZlciB1cGRhdGVzIGFmdGVyIG9wZXJhdGlvbnMgY29tcGxldGUuXG4gKiBAdGVtcGxhdGUgWSAtIFRoZSBuYXRpdmUgZGF0YWJhc2UgZHJpdmVyIHR5cGVcbiAqIEBwYXJhbSB7dm9pZH0gLSBObyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzXG4gKiBAY2xhc3MgRGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGluZyBhbmQgdXNpbmcgYSBEaXNwYXRjaCBpbnN0YW5jZVxuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgRGlzcGF0Y2g8UG9zdGdyZXNEcml2ZXI+KCk7XG4gKlxuICogLy8gQ29ubmVjdCBpdCB0byBhbiBhZGFwdGVyXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFBvc3RncmVzQWRhcHRlcihjb25uZWN0aW9uKTtcbiAqIGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlcik7XG4gKlxuICogLy8gTm93IGFueSBDUlVEIG9wZXJhdGlvbnMgb24gdGhlIGFkYXB0ZXIgd2lsbCBhdXRvbWF0aWNhbGx5XG4gKiAvLyB0cmlnZ2VyIG9ic2VydmVyIG5vdGlmaWNhdGlvbnNcbiAqIGF3YWl0IGFkYXB0ZXIuY3JlYXRlKCd1c2VycycsIDEyMywgdXNlck1vZGVsKTtcbiAqIC8vIE9ic2VydmVycyB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjcmVhdGlvblxuICpcbiAqIC8vIFdoZW4gZG9uZSwgeW91IGNhbiBkaXNjb25uZWN0XG4gKiBkaXNwYXRjaC51bk9ic2VydmUoYWRhcHRlcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERpc3BhdGNoIGV4dGVuZHMgTG9nZ2VkQ2xhc3MgaW1wbGVtZW50cyBBZGFwdGVyRGlzcGF0Y2gge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhZGFwdGVyIGJlaW5nIG9ic2VydmVkXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgZGF0YWJhc2UgYWRhcHRlciB3aG9zZSBvcGVyYXRpb25zIGFyZSBiZWluZyBtb25pdG9yZWRcbiAgICovXG4gIHByb3RlY3RlZCBhZGFwdGVyPzogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIG1vZGVsIGNvbnN0cnVjdG9yc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgbW9kZWxzITogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIHdpdGhvdXQgYW55IGFkYXB0ZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaCBieSBwcm94eWluZyBhZGFwdGVyIG1ldGhvZHNcbiAgICogQHN1bW1hcnkgU2V0cyB1cCBwcm94aWVzIG9uIHRoZSBhZGFwdGVyJ3MgQ1JVRCBtZXRob2RzIHRvIGludGVyY2VwdCBvcGVyYXRpb25zIGFuZCBub3RpZnkgb2JzZXJ2ZXJzLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIGFuIGFkYXB0ZXIgaXMgb2JzZXJ2ZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUHJveHlcbiAgICpcbiAgICogICBEaXNwYXRjaC0+PkRpc3BhdGNoOiBpbml0aWFsaXplKClcbiAgICogICBEaXNwYXRjaC0+PkRpc3BhdGNoOiBDaGVjayBpZiBhZGFwdGVyIGV4aXN0c1xuICAgKiAgIGFsdCBObyBhZGFwdGVyXG4gICAqICAgICBEaXNwYXRjaC0tPj5EaXNwYXRjaDogVGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGxvb3AgRm9yIGVhY2ggQ1JVRCBtZXRob2RcbiAgICogICAgIERpc3BhdGNoLT4+QWRhcHRlcjogQ2hlY2sgaWYgbWV0aG9kIGV4aXN0c1xuICAgKiAgICAgYWx0IE1ldGhvZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgIERpc3BhdGNoLS0+PkRpc3BhdGNoOiBUaHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgICBlbmRcbiAgICpcbiAgICogICAgIERpc3BhdGNoLT4+QWRhcHRlcjogR2V0IHByb3BlcnR5IGRlc2NyaXB0b3JcbiAgICogICAgIGxvb3AgV2hpbGUgZGVzY3JpcHRvciBub3QgZm91bmRcbiAgICogICAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBDaGVjayBwcm90b3R5cGUgY2hhaW5cbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgYWx0IERlc2NyaXB0b3Igbm90IGZvdW5kIG9yIG5vdCB3cml0YWJsZVxuICAgKiAgICAgICBEaXNwYXRjaC0+PkRpc3BhdGNoOiBMb2cgZXJyb3IgYW5kIGNvbnRpbnVlXG4gICAqICAgICBlbHNlIERlc2NyaXB0b3IgZm91bmQgYW5kIHdyaXRhYmxlXG4gICAqICAgICAgIERpc3BhdGNoLT4+UHJveHk6IENyZWF0ZSBwcm94eSBmb3IgbWV0aG9kXG4gICAqICAgICAgIERpc3BhdGNoLT4+QWRhcHRlcjogUmVwbGFjZSBtZXRob2Qgd2l0aCBwcm94eVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgLy8gR3JhY2VmdWxseSBza2lwIGluaXRpYWxpemF0aW9uIHdoZW4gbm8gYWRhcHRlciBpcyBvYnNlcnZlZCB5ZXQuXG4gICAgICAvLyBTb21lIHRlc3RzIG9yIHNldHVwcyBtYXkgY29uc3RydWN0IGEgRGlzcGF0Y2ggYmVmb3JlIGNhbGxpbmcgb2JzZXJ2ZSgpLlxuICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZywgd2Ugbm8tb3Agc28gdGhhdCBsYXRlciBvYnNlcnZlKCkgY2FuIHByb2NlZWQuXG4gICAgICB0aGlzLmxvZy53YXJuKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb25gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYWRhcHRlciBhcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT47XG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KVtdXG4gICAgKS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgIGlmICghYWRhcHRlclttZXRob2RdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7bWV0aG9kfSBub3QgZm91bmQgaW4gJHthZGFwdGVyLmFsaWFzfSBhZGFwdGVyIHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG5cbiAgICAgIGxldCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhZGFwdGVyLCBtZXRob2QpO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSBhZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG1ldGhvZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7bWV0aG9kfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGFyZSByZWFkIG9ubHkgcHJvcGVydGllc1xuICAgICAgYWRhcHRlclttZXRob2RdID0gbmV3IFByb3h5KGFkYXB0ZXJbbWV0aG9kXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKHRhcmdldDogYW55LCB0aGlzQXJnLCBhcmdBcnJheTogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBbdGFibGVOYW1lLCBpZHNdID0gYXJnQXJyYXk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ0FycmF5KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZU5hbWUsIGJ1bGtUb1NpbmdsZShtZXRob2QpLCBpZHMgYXMgRXZlbnRJZHMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgICAgICAgICAgYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke21ldGhvZH0gZm9yICR7dGFibGVOYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7bWV0aG9kfSBvbiAke3RhYmxlTmFtZX06ICR7ZX1gXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGRpc3BhdGNoXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGFueSBuZWNlc3NhcnkgY2xlYW51cCB3aGVuIHRoZSBkaXNwYXRjaCBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2xvc2luZyBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gdG8gbm90aGluZyBpbiB0aGlzIGluc3RhbmNlIGJ1dCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNsb3NpbmcgY29ubmVjdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggdG8gYW4gYWRhcHRlciB0byBtb25pdG9yIGl0cyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIG9ic2VydmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pik6IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgQWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIk9ubHkgQWRhcHRlcnMgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCIpO1xuICAgIHRoaXMuYWRhcHRlciA9IG9ic2VydmVyO1xuICAgIHRoaXMubW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKS50aGVuKCgpID0+XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICBgRGlzcGF0Y2ggaW5pdGlhbGl6ZWQgZm9yICR7dGhpcy5hZGFwdGVyIS5hbGlhc30gYWRhcHRlcmBcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdG9wcyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBEaXNjb25uZWN0cyB0aGlzIGRpc3BhdGNoIGZyb20gYW4gYWRhcHRlclxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWRhcHRlciAhPT0gb2JzZXJ2ZXIpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IHRoZSBhZGFwdGVyIHRoYXQgd2FzIHVzZWQgdG8gb2JzZXJ2ZSBjYW4gYmUgdW5vYnNlcnZlZFwiXG4gICAgICApO1xuICAgIHRoaXMuYWRhcHRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHNcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dGFibGV9OiR7ZXZlbnR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuaWYgKEFkYXB0ZXIpIEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdID0gRGlzcGF0Y2g7XG4iLCJpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGRlY29yYXRvciBmb3IgbW9kZWwgY2xhc3Nlcy5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgY2xhc3MuIENhbiBiZSB1c2VkIGFzIGJvdGggYSBwcm9wZXJ0eSBkZWNvcmF0b3IgYW5kIGEgY2xhc3MgZGVjb3JhdG9yLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFQ+fSBtb2RlbCAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIC0gdGhlIHJlcXVpcmVkIGFkYXB0ZXIncyBmbGF2b3VyL2FsaWFzLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIG1vZGVsIG1ldGFkYXRhLi5cbiAqIEByZXR1cm4ge2FueX0gLSBUaGUgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uIHJlcG9zaXRvcnlcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnQgQ29kZVxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNZXRhZGF0YVxuICpcbiAqICAgQy0+PkQ6IEFwcGx5IEByZXBvc2l0b3J5KE1vZGVsKVxuICogICBhbHQgUHJvcGVydHkgRGVjb3JhdG9yXG4gKiAgICAgRC0+PkQ6IENoZWNrIGlmIHByb3BlcnR5S2V5IGV4aXN0c1xuICogICAgIEQtPj4rQzogUmV0dXJuIGluamVjdChuYW1lKSBkZWNvcmF0b3JcbiAqICAgZWxzZSBDbGFzcyBEZWNvcmF0b3JcbiAqICAgICBELT4+TTogU2V0IHJlcG9zaXRvcnkgbWV0YWRhdGEgb24gbW9kZWxcbiAqICAgICBELT4+UjogUmVnaXN0ZXIgbW9kZWwgd2l0aCBSZXBvc2l0b3J5XG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0YWJsZSBkZWNvcmF0b3Igd2l0aCBjb25maWdcbiAqICAgICBDLT4+QzogRGVmaW5lIERCS2V5cy5DTEFTUyBwcm9wZXJ0eVxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogYW55IHtcbiAgcmV0dXJuICgob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBpZiAocHJvcGVydHlLZXkpIHtcbiAgICAgIHJldHVybiBpbmplY3QobW9kZWxbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsKShcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIG1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5SRVBPU0lUT1JZKSwgb3JpZ2luYWwubmFtZSkobW9kZWwpO1xuICAgIGZsYXZvdXIgPVxuICAgICAgZmxhdm91ciB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG9yaWdpbmFsKTtcbiAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKFxuICAgICAgbW9kZWxbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsLFxuICAgICAgb3JpZ2luYWwsXG4gICAgICBmbGF2b3VyXG4gICAgKTtcbiAgICByZXR1cm4gaW5qZWN0YWJsZShtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsIHtcbiAgICAgIGNhbGxiYWNrOiAoaW5zdGFuY2U6IElSZXBvc2l0b3J5PFQ+KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgREJLZXlzLkNMQVNTLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfSxcbiAgICB9KShvcmlnaW5hbCk7XG4gIH0pIGFzIGFueTtcbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBmYWlscy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIG9ic2VydmVyIGNvbW11bmljYXRpb24gYmV0d2VlbiByZXBvc2l0b3JpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzIE9ic2VydmVyRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiB0cnkge1xuICogICAvLyBTb21lIHJlcG9zaXRvcnkgb2JzZXJ2ZXIgb3BlcmF0aW9uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBPYnNlcnZlckVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVyRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT2JzZXJ2ZXJFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc2VxdWVuY2VzXG4gKiBAaW50ZXJmYWNlIFNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zPFxuICBUWVBFID0gXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25hbCBuYW1lIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNlcXVlbmNlXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xuXG4gIGdlbmVyYXRlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGF0YSB0eXBlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hldGhlciB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVzIE51bWJlciBvciBCaWdJbnQgdmFsdWVzXG4gICAqL1xuICB0eXBlOiBUWVBFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBzdGFydHMgd2l0aFxuICAgKi9cbiAgc3RhcnRXaXRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5jcmVtZW50IHZhbHVlIGZvciBlYWNoIHN0ZXAgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHNlcXVlbmNlIGluY3JlYXNlcyB3aXRoIGVhY2ggY2FsbFxuICAgKi9cbiAgaW5jcmVtZW50Qnk6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgbG93ZXN0IHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIGNhbiBnZW5lcmF0ZVxuICAgKi9cbiAgbWluVmFsdWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25hbCBtYXhpbXVtIHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGhpZ2hlc3QgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2UgY2FuIGdlbmVyYXRlXG4gICAqL1xuICBtYXhWYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIHNlcXVlbmNlIHNob3VsZCBjeWNsZSB3aGVuIHJlYWNoaW5nIGl0cyBsaW1pdHNcbiAgICogQHN1bW1hcnkgSWYgdHJ1ZSwgdGhlIHNlcXVlbmNlIHdpbGwgcmVzdGFydCBmcm9tIG1pblZhbHVlIHdoZW4gcmVhY2hpbmcgbWF4VmFsdWVcbiAgICovXG4gIGN5Y2xlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG9wdGlvbnMgZm9yIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgTm9uZVNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBOb25lU2VxdWVuY2VPcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMgPSB7XG4gIHR5cGU6IHVuZGVmaW5lZCxcbiAgZ2VuZXJhdGVkOiBmYWxzZSxcbiAgc3RhcnRXaXRoOiAwLFxuICBpbmNyZW1lbnRCeTogMSxcbiAgY3ljbGU6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBvcHRpb25zIGZvciBzZXF1ZW5jZXNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmb3IgbnVtYmVyIHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uczogU2VxdWVuY2VPcHRpb25zID0gTm9uZVNlcXVlbmNlT3B0aW9ucztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJlZGVmaW5lZCBvcHRpb25zIGZvciBudW1lcmljIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBmb3Igc3RhbmRhcmQgbnVtYmVyIHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IE51bWVyaWNTZXF1ZW5jZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1lcmljU2VxdWVuY2U6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogXCJOdW1iZXJcIixcbiAgZ2VuZXJhdGVkOiB0cnVlLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmVkZWZpbmVkIG9wdGlvbnMgZm9yIEJpZ0ludCBzZXF1ZW5jZXNcbiAqIEBzdW1tYXJ5IENvbmZpZ3VyYXRpb24gZm9yIEJpZ0ludCBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBCaWdJbnRTZXF1ZW5jZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBCaWdJbnRTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAge30sXG4gIE51bWVyaWNTZXF1ZW5jZSxcbiAge1xuICAgIHR5cGU6IFwiQmlnSW50XCIsXG4gIH1cbik7XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgcXVlcnkgY29uZGl0aW9uc1xuICogQHN1bW1hcnkgRW51bSBkZWZpbmluZyB0aGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBmb3IgY29tcGFyaW5nIHZhbHVlcyBpbiBkYXRhYmFzZSBxdWVyaWVzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gT3BlcmF0b3Ige1xuICAvKiogRXF1YWwgY29tcGFyaXNvbiAoPSkgKi9cbiAgRVFVQUwgPSBcIkVRVUFMXCIsXG4gIC8qKiBOb3QgZXF1YWwgY29tcGFyaXNvbiAoIT0pICovXG4gIERJRkZFUkVOVCA9IFwiRElGRkVSRU5UXCIsXG4gIC8qKiBHcmVhdGVyIHRoYW4gY29tcGFyaXNvbiAoPikgKi9cbiAgQklHR0VSID0gXCJCSUdHRVJcIixcbiAgLyoqIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uICg+PSkgKi9cbiAgQklHR0VSX0VRID0gXCJCSUdHRVJfRVFcIixcbiAgLyoqIExlc3MgdGhhbiBjb21wYXJpc29uICg8KSAqL1xuICBTTUFMTEVSID0gXCJTTUFMTEVSXCIsXG4gIC8qKiBMZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPD0pICovXG4gIFNNQUxMRVJfRVEgPSBcIlNNQUxMRVJfRVFcIixcbiAgLy8gQkVUV0VFTiA9IFwiQkVUV0VFTlwiLFxuICAvKiogTmVnYXRpb24gb3BlcmF0b3IgKE5PVCkgKi9cbiAgTk9UID0gXCJOT1RcIixcbiAgLyoqIEluY2x1c2lvbiBvcGVyYXRvciAoSU4pICovXG4gIElOID0gXCJJTlwiLFxuICAvLyBJUyA9IFwiSVNcIixcbiAgLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyAqL1xuICBSRUdFWFAgPSBcIlJFR0VYUFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2dpY2FsIG9wZXJhdG9ycyBmb3IgY29tYmluaW5nIHF1ZXJ5IGNvbmRpdGlvbnNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGNvbmRpdGlvbnMgaW4gZGF0YWJhc2UgcXVlcmllc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIEdyb3VwT3BlcmF0b3Ige1xuICAvKiogTG9naWNhbCBBTkQgb3BlcmF0b3IgLSBhbGwgY29uZGl0aW9ucyBtdXN0IGJlIHRydWUgKi9cbiAgQU5EID0gXCJBTkRcIixcbiAgLyoqIExvZ2ljYWwgT1Igb3BlcmF0b3IgLSBhdCBsZWFzdCBvbmUgY29uZGl0aW9uIG11c3QgYmUgdHJ1ZSAqL1xuICBPUiA9IFwiT1JcIixcbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGR1cmluZyBxdWVyeSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBxdWVyeSBidWlsZGluZyBvciBleGVjdXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIFF1ZXJ5RXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXJ5RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUXVlcnlFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biBkdXJpbmcgcGFnaW5hdGlvbiBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBwYWdpbmF0aW9uIHNldHVwIG9yIGV4ZWN1dGlvblxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAY2xhc3MgUGFnaW5nRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2luZ0Vycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFBhZ2luZ0Vycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEF0dHJpYnV0ZU9wdGlvbiwgQ29uZGl0aW9uQnVpbGRlck9wdGlvbiB9IGZyb20gXCIuL29wdGlvbnNcIjtcbmltcG9ydCB7XG4gIENvbmRpdGlvbmFsQXN5bmMsXG4gIE1vZGVsLFxuICBNb2RlbEVycm9yRGVmaW5pdGlvbixcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEdyb3VwT3BlcmF0b3IsIE9wZXJhdG9yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbnR5cGUgSW5mZXJBc3luYzxNPiA9IE0gZXh0ZW5kcyBNb2RlbDxpbmZlciBBPiA/IEEgOiBmYWxzZTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIGxvZ2ljYWwgY29uZGl0aW9uIGZvciBkYXRhYmFzZSBxdWVyaWVzXG4gKiBAc3VtbWFyeSBBIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHF1ZXJ5IGNvbmRpdGlvbnMgd2l0aCBzdXBwb3J0IGZvciBjb21wbGV4IGxvZ2ljYWwgb3BlcmF0aW9ucy5cbiAqIFRoaXMgY2xhc3MgYWxsb3dzIGZvciBidWlsZGluZyBhbmQgY29tYmluaW5nIHF1ZXJ5IGNvbmRpdGlvbnMgdXNpbmcgbG9naWNhbCBvcGVyYXRvcnMgKEFORCwgT1IsIE5PVClcbiAqIGFuZCBjb21wYXJpc29uIG9wZXJhdG9ycyAoZXF1YWxzLCBub3QgZXF1YWxzLCBncmVhdGVyIHRoYW4sIGV0Yy4pLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25kaXRpb248TT59IGF0dHIxIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIGEgbmVzdGVkIGNvbmRpdGlvblxuICogQHBhcmFtIHtPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3J9IG9wZXJhdG9yIC0gVGhlIG9wZXJhdG9yIHRvIHVzZSBmb3IgdGhlIGNvbmRpdGlvblxuICogQHBhcmFtIHthbnl9IGNvbXBhcmlzb24gLSBUaGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0IG9yIGFub3RoZXIgY29uZGl0aW9uXG4gKiBAY2xhc3MgQ29uZGl0aW9uXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIGNvbmRpdGlvblxuICogY29uc3QgbmFtZUNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJuYW1lXCIpLmVxKFwiSm9oblwiKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBjb21wbGV4IGNvbmRpdGlvblxuICogY29uc3QgY29tcGxleENvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJhZ2VcIikuZ3QoMTgpXG4gKiAgIC5hbmQoQ29uZGl0aW9uLmF0dHJpYnV0ZShcInN0YXR1c1wiKS5lcShcImFjdGl2ZVwiKSk7XG4gKlxuICogLy8gVXNlIHRoZSBidWlsZGVyIHBhdHRlcm5cbiAqIGNvbnN0IHVzZXJRdWVyeSA9IENvbmRpdGlvbi5idWlsZGVyKClcbiAqICAgLmF0dHJpYnV0ZShcImVtYWlsXCIpLnJlZ2V4cChcIi4qQGV4YW1wbGUuY29tXCIpXG4gKiAgIC5hbmQoQ29uZGl0aW9uLmF0dHJpYnV0ZShcImxhc3RMb2dpblwiKS5ndChuZXcgRGF0ZShcIjIwMjMtMDEtMDFcIikpKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2XG4gKiAgIHBhcnRpY2lwYW50IENvbmRpdGlvblxuICogICBEZXYtPj5Db25kaXRpb246IGJ1aWxkZXIoKS5hdHRyaWJ1dGUoXCJhZ2VcIikuZ3QoMTgpXG4gKiAgIENvbmRpdGlvbi0tPj5EZXY6IENvbmRpdGlvbihhZ2UgPiAxOClcbiAqICAgRGV2LT4+Q29uZGl0aW9uOiAuYW5kKGF0dHJpYnV0ZShcInN0YXR1c1wiKS5lcShcImFjdGl2ZVwiKSlcbiAqICAgQ29uZGl0aW9uLS0+PkRldjogQ29uZGl0aW9uKChhZ2UgPiAxOCkgQU5EIChzdGF0dXMgPSBcImFjdGl2ZVwiKSlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbjxNIGV4dGVuZHMgTW9kZWw8YW55Pj4gZXh0ZW5kcyBNb2RlbDxJbmZlckFzeW5jPE0+PiB7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBhdHRyMT86IHN0cmluZyB8IENvbmRpdGlvbjxNPiA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgY29tcGFyaXNvbj86IGFueSA9IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT4sXG4gICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcixcbiAgICBjb21wYXJpc29uOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmF0dHIxID0gYXR0cjE7XG4gICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgIHRoaXMuY29tcGFyaXNvbiA9IGNvbXBhcmlzb247XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbWJpbmVzIHRoaXMgY29uZGl0aW9uIHdpdGggYW5vdGhlciB1c2luZyBsb2dpY2FsIEFORFxuICAgKiBAc3VtbWFyeSBKb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIEFORCBvcGVyYXRvciwgcmVxdWlyaW5nIGJvdGggdG8gYmUgdHJ1ZVxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBjb21iaW5lIHdpdGggdGhpcyBvbmVcbiAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBBTkQgb3BlcmF0aW9uXG4gICAqL1xuICBhbmQoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24uYW5kKHRoaXMsIGNvbmRpdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbWJpbmVzIHRoaXMgY29uZGl0aW9uIHdpdGggYW5vdGhlciB1c2luZyBsb2dpY2FsIE9SXG4gICAqIEBzdW1tYXJ5IEpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gT1Igb3BlcmF0b3IsIHJlcXVpcmluZyBhdCBsZWFzdCBvbmUgdG8gYmUgdHJ1ZVxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBjb21iaW5lIHdpdGggdGhpcyBvbmVcbiAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBPUiBvcGVyYXRpb25cbiAgICovXG4gIG9yKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLm9yKHRoaXMsIGNvbmRpdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZWdhdGlvbiBjb25kaXRpb25cbiAgICogQHN1bW1hcnkgRXhjbHVkZXMgYSB2YWx1ZSBmcm9tIHRoZSByZXN1bHQgYnkgYXBwbHlpbmcgYSBOT1Qgb3BlcmF0b3JcbiAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBuZWdhdGVcbiAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBOT1Qgb3BlcmF0aW9uXG4gICAqL1xuICBub3QodmFsOiBhbnkpOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKHRoaXMsIE9wZXJhdG9yLk5PVCwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoZSBjb25kaXRpb24gYW5kIGNoZWNrcyBmb3IgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgdmFsaWRhdGlvbiB0byBlbnN1cmUgdGhlIGNvbmRpdGlvbiBpcyBwcm9wZXJseSBmb3JtZWRcbiAgICogQHBhcmFtIHsuLi5zdHJpbmdbXX0gZXhjZXB0aW9ucyAtIEZpZWxkcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICAgKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZH0gRXJyb3IgZGVmaW5pdGlvbiBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBvdmVycmlkZSBoYXNFcnJvcnMoXG4gICAgLi4uZXhjZXB0aW9uczogc3RyaW5nW11cbiAgKTogQ29uZGl0aW9uYWxBc3luYzxJbmZlckFzeW5jPE0+LCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbkNoZWNrID0gKCk6IE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRPcE1lc3NhZ2UgPSBgSW52YWxpZCBvcGVyYXRvciAke3RoaXMub3BlcmF0b3J9fWA7XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRyMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAodGhpcy5jb21wYXJpc29uIGluc3RhbmNlb2YgQ29uZGl0aW9uKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wYXJpc29uOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICBcIkJvdGggc2lkZXMgb2YgdGhlIGNvbXBhcmlzb24gbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICAgIGlmIChPYmplY3QudmFsdWVzKE9wZXJhdG9yKS5pbmRleE9mKHRoaXMub3BlcmF0b3IgYXMgT3BlcmF0b3IpID09PSAtMSlcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BlcmF0b3I6IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBpbnZhbGlkT3BNZXNzYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hdHRyMSBpbnN0YW5jZW9mIENvbmRpdGlvbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgISh0aGlzLmNvbXBhcmlzb24gaW5zdGFuY2VvZiBDb25kaXRpb24pICYmXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciAhPT0gT3BlcmF0b3IuTk9UXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tcGFyaXNvbjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGludmFsaWRPcE1lc3NhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3QudmFsdWVzKEdyb3VwT3BlcmF0b3IpLmluZGV4T2YoXG4gICAgICAgICAgICB0aGlzLm9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICAgICApID09PSAtMSAmJlxuICAgICAgICAgIHRoaXMub3BlcmF0b3IgIT09IE9wZXJhdG9yLk5PVFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZXJhdG9yOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogaW52YWxpZE9wTWVzc2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3JzID0gc3VwZXIuaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnMpO1xuICAgIGlmICghdGhpcy5pc0FzeW5jKCkpXG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZXJyb3JzIGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgICAoY29uZGl0aW9uQ2hlY2soKSBhcyBhbnkpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgZXJyb3JzIGFzIHVua25vd24gYXMgUHJvbWlzZTxNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD5cbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQgPz8gY29uZGl0aW9uQ2hlY2soKTtcbiAgICB9KSgpIGFzIENvbmRpdGlvbmFsQXN5bmM8SW5mZXJBc3luYzxNPiwgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGNvbmRpdGlvbiB0aGF0IGNvbWJpbmVzIHR3byBjb25kaXRpb25zIHdpdGggbG9naWNhbCBBTkRcbiAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0aGF0IGpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gQU5EIG9wZXJhdG9yLCByZXF1aXJpbmcgYm90aCB0byBiZSB0cnVlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjEgLSBUaGUgZmlyc3QgY29uZGl0aW9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24yIC0gVGhlIHNlY29uZCBjb25kaXRpb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBBTkQgb3BlcmF0aW9uXG4gICAqL1xuICBzdGF0aWMgYW5kPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uPE0+LFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvbjxNPlxuICApOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24uZ3JvdXAoY29uZGl0aW9uMSwgR3JvdXBPcGVyYXRvci5BTkQsIGNvbmRpdGlvbjIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGNvbmRpdGlvbiB0aGF0IGNvbWJpbmVzIHR3byBjb25kaXRpb25zIHdpdGggbG9naWNhbCBPUlxuICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRoYXQgam9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBPUiBvcGVyYXRvciwgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSB0byBiZSB0cnVlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjEgLSBUaGUgZmlyc3QgY29uZGl0aW9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24yIC0gVGhlIHNlY29uZCBjb25kaXRpb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBPUiBvcGVyYXRpb25cbiAgICovXG4gIHN0YXRpYyBvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbmRpdGlvbjE6IENvbmRpdGlvbjxNPixcbiAgICBjb25kaXRpb24yOiBDb25kaXRpb248TT5cbiAgKTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmdyb3VwKGNvbmRpdGlvbjEsIEdyb3VwT3BlcmF0b3IuT1IsIGNvbmRpdGlvbjIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGNvbmRpdGlvbiB0aGF0IGdyb3VwcyB0d28gY29uZGl0aW9ucyB3aXRoIGEgc3BlY2lmaWVkIG9wZXJhdG9yXG4gICAqIEBzdW1tYXJ5IFByaXZhdGUgc3RhdGljIG1ldGhvZCB0aGF0IGNvbWJpbmVzIHR3byBjb25kaXRpb25zIHVzaW5nIHRoZSBzcGVjaWZpZWQgZ3JvdXAgb3BlcmF0b3JcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtHcm91cE9wZXJhdG9yfSBvcGVyYXRvciAtIFRoZSBncm91cCBvcGVyYXRvciB0byB1c2UgKEFORCwgT1IpXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24yIC0gVGhlIHNlY29uZCBjb25kaXRpb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBncm91cGVkIG9wZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXA8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjb25kaXRpb24xOiBDb25kaXRpb248TT4sXG4gICAgb3BlcmF0b3I6IEdyb3VwT3BlcmF0b3IsXG4gICAgY29uZGl0aW9uMjogQ29uZGl0aW9uPE0+XG4gICk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24oY29uZGl0aW9uMSwgb3BlcmF0b3IsIGNvbmRpdGlvbjIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgZm9yIGEgc3BlY2lmaWMgbW9kZWwgYXR0cmlidXRlXG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdGhhdCBpbml0aWFsaXplcyBhIGNvbmRpdGlvbiBidWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0gYXR0ciAtIFRoZSBtb2RlbCBhdHRyaWJ1dGUgdG8gYnVpbGQgYSBjb25kaXRpb24gZm9yXG4gICAqIEByZXR1cm4ge0F0dHJpYnV0ZU9wdGlvbjxNPn0gQSBjb25kaXRpb24gYnVpbGRlciBpbml0aWFsaXplZCB3aXRoIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIHN0YXRpYyBhdHRyaWJ1dGU8TSBleHRlbmRzIE1vZGVsPihhdHRyOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcjxNPigpLmF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWxpYXMgZm9yIHRoZSBhdHRyaWJ1dGUgbWV0aG9kXG4gICAqIEBzdW1tYXJ5IFNob3J0aGFuZCBtZXRob2QgdGhhdCBpbml0aWFsaXplcyBhIGNvbmRpdGlvbiBidWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0gYXR0ciAtIFRoZSBtb2RlbCBhdHRyaWJ1dGUgdG8gYnVpbGQgYSBjb25kaXRpb24gZm9yXG4gICAqIEByZXR1cm4ge0F0dHJpYnV0ZU9wdGlvbjxNPn0gQSBjb25kaXRpb24gYnVpbGRlciBpbml0aWFsaXplZCB3aXRoIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIHN0YXRpYyBhdHRyPE0gZXh0ZW5kcyBNb2RlbD4oYXR0cjoga2V5b2YgTSkge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYSBmbHVlbnQgQVBJIHRvIGJ1aWxkIHF1ZXJ5IGNvbmRpdGlvbnNcbiAgICogQHN1bW1hcnkgQSBidWlsZGVyIGNsYXNzIHRoYXQgc2ltcGxpZmllcyB0aGUgY3JlYXRpb24gb2YgZGF0YWJhc2UgcXVlcnkgY29uZGl0aW9uc1xuICAgKiB3aXRoIGEgY2hhaW5hYmxlIGludGVyZmFjZSBmb3Igc2V0dGluZyBhdHRyaWJ1dGVzIGFuZCBvcGVyYXRvcnNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBidWlsZGVyIG9wZXJhdGVzIG9uXG4gICAqIEBjbGFzcyBDb25kaXRpb25CdWlsZGVyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBCdWlsZGVyID0gY2xhc3MgQ29uZGl0aW9uQnVpbGRlcjxNIGV4dGVuZHMgTW9kZWw+XG4gICAgaW1wbGVtZW50cyBDb25kaXRpb25CdWlsZGVyT3B0aW9uPE0+LCBBdHRyaWJ1dGVPcHRpb248TT5cbiAge1xuICAgIGF0dHIxPzoga2V5b2YgTSB8IENvbmRpdGlvbjxNPiA9IHVuZGVmaW5lZDtcbiAgICBvcGVyYXRvcj86IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICBjb21wYXJpc29uPzogYW55ID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGF0dHJpYnV0ZSBmb3IgdGhlIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBtb2RlbCBhdHRyaWJ1dGUgdGhlIGNvbmRpdGlvbiB3aWxsIG9wZXJhdGUgb25cbiAgICAgKiBAcGFyYW0gYXR0ciAtIFRoZSBtb2RlbCBhdHRyaWJ1dGUgdG8gdXNlIGluIHRoZSBjb25kaXRpb25cbiAgICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IFRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAgICovXG4gICAgYXR0cmlidXRlKGF0dHI6IGtleW9mIE0pOiBBdHRyaWJ1dGVPcHRpb248TT4ge1xuICAgICAgdGhpcy5hdHRyMSA9IGF0dHI7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWxpYXMgZm9yIHRoZSBhdHRyaWJ1dGUgbWV0aG9kXG4gICAgICogQHN1bW1hcnkgU2hvcnRoYW5kIG1ldGhvZCB0byBzcGVjaWZ5IHdoaWNoIG1vZGVsIGF0dHJpYnV0ZSB0aGUgY29uZGl0aW9uIHdpbGwgb3BlcmF0ZSBvblxuICAgICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byB1c2UgaW4gdGhlIGNvbmRpdGlvblxuICAgICAqIEByZXR1cm4ge0F0dHJpYnV0ZU9wdGlvbjxNPn0gVGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBhdHRyKGF0dHI6IGtleW9mIE0pIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBlcXVhbGl0eSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBlcSh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuRVFVQUwsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5lcXVhbGl0eSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgaW5lcXVhbGl0eSBjb21wYXJpc29uXG4gICAgICovXG4gICAgZGlmKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5ESUZGRVJFTlQsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBncmVhdGVyIHRoYW4gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBncmVhdGVyIHRoYW4gY29tcGFyaXNvblxuICAgICAqL1xuICAgIGd0KHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5CSUdHRVIsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsZXNzIHRoYW4gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBsZXNzIHRoYW4gY29tcGFyaXNvblxuICAgICAqL1xuICAgIGx0KHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5TTUFMTEVSLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBndGUodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkJJR0dFUl9FUSwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxlc3MgdGhhbiBvciBlcXVhbCB0byBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGxlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gICAgICovXG4gICAgbHRlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5TTUFMTEVSX0VRLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluY2x1c2lvbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIC0gVGhlIGFycmF5IG9mIHZhbHVlcyB0byBjaGVjayBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBpbmNsdXNpb24gY29tcGFyaXNvblxuICAgICAqL1xuICAgIGluKGFycjogYW55W10pIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLklOLCBhcnIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcmVndWxhciBleHByZXNzaW9uIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVyblxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICByZWdleHAodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlJFR0VYUCwgbmV3IFJlZ0V4cCh2YWwpLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9wZXJhdG9yIGFuZCBjb21wYXJpc29uIHZhbHVlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgUHJpdmF0ZSBtZXRob2QgdGhhdCBjb25maWd1cmVzIHRoZSBjb25kaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7T3BlcmF0b3J9IG9wIC0gVGhlIG9wZXJhdG9yIHRvIHVzZSBmb3IgdGhlIGNvbmRpdGlvblxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0T3Aob3A6IE9wZXJhdG9yLCB2YWw6IGFueSkge1xuICAgICAgdGhpcy5vcGVyYXRvciA9IG9wO1xuICAgICAgdGhpcy5jb21wYXJpc29uID0gdmFsO1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0cyBhIENvbmRpdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSBidWlsZGVyJ3Mgc3RhdGVcbiAgICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgdGhlIGNvbmRpdGlvbiBidWlsZGluZyBwcm9jZXNzIGJ5IGNyZWF0aW5nIGEgbmV3IENvbmRpdGlvbiBpbnN0YW5jZVxuICAgICAqIEB0aHJvd3Mge1F1ZXJ5RXJyb3J9IElmIHRoZSBjb25kaXRpb24gY2Fubm90IGJlIGJ1aWx0IGR1ZSB0byBpbnZhbGlkIHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiBpbnN0YW5jZSB3aXRoIHRoZSBjb25maWd1cmVkIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkKCk6IENvbmRpdGlvbjxNPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICB0aGlzLmF0dHIxIGFzIHN0cmluZyB8IENvbmRpdGlvbjxNPixcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yLFxuICAgICAgICAgIHRoaXMuY29tcGFyaXNvbiBhcyBhbnlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGNvbmRpdGlvbiBidWlsZGVyXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29uZGl0aW9uIGJ1aWxkZXJcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBidWlsZGVyIHdpbGwgb3BlcmF0ZSBvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb25CdWlsZGVyT3B0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkZXI8TSBleHRlbmRzIE1vZGVsPigpOiBDb25kaXRpb25CdWlsZGVyT3B0aW9uPE0+IHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbi5CdWlsZGVyPE0+KCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGUgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvciB1cGRhdGVzIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciB0byBjcmVhdGUgYSBuZXcgbW9kZWwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBwcmltYXJ5IGtleVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjcmVhdGUgb3IgdXBkYXRlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtSZXBvPE0sIEYsIENvbnRleHQ8Rj4+fSBbcmVwb3NpdG9yeV0gLSBPcHRpb25hbCByZXBvc2l0b3J5IHRvIHVzZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgb3IgdXBkYXRlZCBtb2RlbFxuICogQGZ1bmN0aW9uIGNyZWF0ZU9yVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqXG4gKiAgIENhbGxlci0+PmNyZWF0ZU9yVXBkYXRlOiBtb2RlbCwgY29udGV4dCwgcmVwb3NpdG9yeT9cbiAqICAgYWx0IHJlcG9zaXRvcnkgbm90IHByb3ZpZGVkXG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtPj5Nb2RlbDogZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpXG4gKiAgICAgTW9kZWwtLT4+Y3JlYXRlT3JVcGRhdGU6IGNvbnN0cnVjdG9yXG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgICBSZXBvc2l0b3J5LS0+PmNyZWF0ZU9yVXBkYXRlOiByZXBvc2l0b3J5XG4gKiAgIGVuZFxuICpcbiAqICAgYWx0IHByaW1hcnkga2V5IHVuZGVmaW5lZFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsLCBjb250ZXh0KVxuICogICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IGNyZWF0ZWQgbW9kZWxcbiAqICAgZWxzZSBwcmltYXJ5IGtleSBkZWZpbmVkXG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiB1cGRhdGUobW9kZWwsIGNvbnRleHQpXG4gKiAgICAgYWx0IHVwZGF0ZSBzdWNjZXNzZnVsXG4gKiAgICAgICBSZXBvc2l0b3J5LS0+PmNyZWF0ZU9yVXBkYXRlOiB1cGRhdGVkIG1vZGVsXG4gKiAgICAgZWxzZSBOb3RGb3VuZEVycm9yXG4gKiAgICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbCwgY29udGV4dClcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IGNyZWF0ZWQgbW9kZWxcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogICBjcmVhdGVPclVwZGF0ZS0tPj5DYWxsZXI6IG1vZGVsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVPclVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuPihcbiAgbW9kZWw6IE0sXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGFsaWFzPzogc3RyaW5nLFxuICByZXBvc2l0b3J5PzogUmVwbzxNLCBGLCBDb250ZXh0PEY+PlxuKTogUHJvbWlzZTxNPiB7XG4gIGlmICghcmVwb3NpdG9yeSkge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgQ291bGQgbm90IGZpbmQgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJlcG9zaXRvcnkgPSBSZXBvc2l0b3J5LmZvck1vZGVsPE0sIFJlcG88TT4+KFxuICAgICAgY29uc3RydWN0b3IgYXMgdW5rbm93biBhcyBNb2RlbENvbnN0cnVjdG9yPE0+LFxuICAgICAgYWxpYXNcbiAgICApO1xuICB9XG4gIGlmICh0eXBlb2YgbW9kZWxbcmVwb3NpdG9yeS5wa10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgcmV0dXJuIHJlcG9zaXRvcnkuY3JlYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiByZXBvc2l0b3J5LnVwZGF0ZShtb2RlbCwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHRocm93IGU7XG4gICAgICByZXR1cm4gcmVwb3NpdG9yeS5jcmVhdGUobW9kZWwsIGNvbnRleHQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIGNyZWF0aW5nIGEgbW9kZWwsIGVpdGhlciBieSByZWZlcmVuY2luZyBhbiBleGlzdGluZyBtb2RlbCBvciBjcmVhdGluZyBhIG5ldyBvbmVcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9PbmVPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb09uZU9uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uQ3JlYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25DcmVhdGU6IGlubmVyUmVwb1xuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5pbm5lclJlcG86IHJlYWQocHJvcGVydHlWYWx1ZSlcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkNyZWF0ZTogcmVhZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBwcm9wZXJ0eVZhbHVlXG4gKiAgIGVsc2UgcHJvcGVydHlWYWx1ZSBpcyBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+TW9kZWw6IGdldChkYXRhLmNsYXNzKVxuICogICAgIE1vZGVsLS0+Pm9uZVRvT25lT25DcmVhdGU6IGNvbnN0cnVjdG9yXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PlJlcG9zaXRvcnk6IGZvck1vZGVsKGNvbnN0cnVjdG9yKVxuICogICAgIFJlcG9zaXRvcnktLT4+b25lVG9PbmVPbkNyZWF0ZTogcmVwb1xuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5yZXBvOiBjcmVhdGUocHJvcGVydHlWYWx1ZSlcbiAqICAgICByZXBvLS0+Pm9uZVRvT25lT25DcmVhdGU6IGNyZWF0ZWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+ZmluZFByaW1hcnlLZXk6IGNyZWF0ZWRcbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb09uZU9uQ3JlYXRlOiBwa1xuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGNyZWF0ZWRbcGtdLCBjcmVhdGVkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gY3JlYXRlZFtwa11cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uQ3JlYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9PbmVPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICAgKTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGRhdGEuY2xhc3MgPVxuICAgIHR5cGVvZiBkYXRhLmNsYXNzID09PSBcInN0cmluZ1wiID8gZGF0YS5jbGFzcyA6IChkYXRhLmNsYXNzIGFzIGFueSkoKS5uYW1lO1xuXG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGRhdGEuY2xhc3MgYXMgc3RyaW5nKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgQ291bGQgbm90IGZpbmQgbW9kZWwgJHtkYXRhLmNsYXNzfWApO1xuICBjb25zdCByZXBvOiBSZXBvPGFueT4gPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUocHJvcGVydHlWYWx1ZSk7XG4gIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkoY3JlYXRlZCkuaWQ7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZCk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjcmVhdGVkW3BrXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB1cGRhdGVzXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIHVwZGF0aW5nIGEgbW9kZWwsIGVpdGhlciBieSByZWZlcmVuY2luZyBhbiBleGlzdGluZyBtb2RlbCBvciB1cGRhdGluZyB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25VcGRhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uVXBkYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25VcGRhdGU6IGlubmVyUmVwb1xuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5pbm5lclJlcG86IHJlYWQocHJvcGVydHlWYWx1ZSlcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPblVwZGF0ZTogcmVhZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogc2V0IG1vZGVsW2tleV0gPSBwcm9wZXJ0eVZhbHVlXG4gKiAgIGVsc2UgcHJvcGVydHlWYWx1ZSBpcyBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG1vZGVsW2tleV0sIGNvbnRleHRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0tPj5vbmVUb09uZU9uVXBkYXRlOiB1cGRhdGVkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmZpbmRQcmltYXJ5S2V5OiB1cGRhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPblVwZGF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCB1cGRhdGVkW3BrXSwgdXBkYXRlZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBzZXQgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICAgKTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBjcmVhdGVPclVwZGF0ZShcbiAgICBtb2RlbFtrZXldIGFzIE0sXG4gICAgY29udGV4dCxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleSh1cGRhdGVkKS5pZDtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHVwZGF0ZWRbcGtdIGFzIHN0cmluZyxcbiAgICB1cGRhdGVkXG4gICk7XG4gIG1vZGVsW2tleV0gPSB1cGRhdGVkW3BrXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBkZWxldGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiBkZWxldGluZyBhIG1vZGVsLCBkZWxldGluZyB0aGUgcmVsYXRlZCBtb2RlbCBpZiBjYXNjYWRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9PbmVPbkRlbGV0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb09uZU9uRGVsZXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPbkRlbGV0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+b25lVG9PbmVPbkRlbGV0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+Pm9uZVRvT25lT25EZWxldGU6IGNoZWNrIGlmIGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uRGVsZXRlOiBpbm5lclJlcG9cbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhIE1vZGVsIGluc3RhbmNlXG4gKiAgICAgb25lVG9PbmVPbkRlbGV0ZS0+PmlubmVyUmVwbzogZGVsZXRlKG1vZGVsW2tleV0sIGNvbnRleHQpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25EZWxldGU6IGRlbGV0ZWRcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGEgTW9kZWwgaW5zdGFuY2VcbiAqICAgICBvbmVUb09uZU9uRGVsZXRlLT4+aW5uZXJSZXBvOiBkZWxldGUobW9kZWxba2V5XVtpbm5lclJlcG8ucGtdLCBjb250ZXh0KVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgZGVsZXRlZFtpbm5lclJlcG8ucGtdLCBkZWxldGVkXG4gKiAgIG9uZVRvT25lT25EZWxldGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IGlubmVyUmVwbzogUmVwbzxNPiA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgbGV0IGRlbGV0ZWQ6IE07XG4gIGlmICghKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNb2RlbCkpXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUobW9kZWxba2V5XSBhcyBzdHJpbmcsIGNvbnRleHQpO1xuICBlbHNlXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUoXG4gICAgICAobW9kZWxba2V5XSBhcyBNKVtpbm5lclJlcG8ucGsgYXMga2V5b2YgTV0gYXMgc3RyaW5nLFxuICAgICAgY29udGV4dFxuICAgICk7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICBkZWxldGVkW2lubmVyUmVwby5wa10gYXMgc3RyaW5nLFxuICAgIGRlbGV0ZWRcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgY3JlYXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aGVuIGNyZWF0aW5nIGEgbW9kZWwsIGVpdGhlciBieSByZWZlcmVuY2luZyBleGlzdGluZyBtb2RlbHMgb3IgY3JlYXRpbmcgbmV3IG9uZXNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25DcmVhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPbkNyZWF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlcyBleGlzdHMgYW5kIGhhcyBsZW5ndGhcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY2hlY2sgaWYgYWxsIGVsZW1lbnRzIGhhdmUgc2FtZSB0eXBlXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNyZWF0ZSB1bmlxdWVWYWx1ZXMgc2V0XG4gKlxuICogICBhbHQgYXJyYXlUeXBlIGlzIG5vdCBcIm9iamVjdFwiXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZXBvXG4gKiAgICAgbG9vcCBmb3IgZWFjaCBpZCBpbiB1bmlxdWVWYWx1ZXNcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+cmVwbzogcmVhZChpZClcbiAqICAgICAgIHJlcG8tLT4+b25lVG9NYW55T25DcmVhdGU6IHJlYWRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgcmVhZFxuICogICAgIGVuZFxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc11cbiAqICAgZWxzZSBhcnJheVR5cGUgaXMgXCJvYmplY3RcIlxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+ZmluZFByaW1hcnlLZXk6IHByb3BlcnR5VmFsdWVzWzBdXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9NYW55T25DcmVhdGU6IHBrTmFtZVxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNyZWF0ZSByZXN1bHQgc2V0XG4gKiAgICAgbG9vcCBmb3IgZWFjaCBtIGluIHByb3BlcnR5VmFsdWVzXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNyZWF0ZU9yVXBkYXRlOiBtLCBjb250ZXh0XG4gKiAgICAgICBjcmVhdGVPclVwZGF0ZS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVjb3JkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcmVjb3JkW3BrTmFtZV0sIHJlY29yZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogYWRkIHJlY29yZFtwa05hbWVdIHRvIHJlc3VsdFxuICogICAgIGVuZFxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gWy4uLnJlc3VsdF1cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWVzOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWVzIHx8ICFwcm9wZXJ0eVZhbHVlcy5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgYXJyYXlUeXBlID0gdHlwZW9mIHByb3BlcnR5VmFsdWVzWzBdO1xuICBpZiAoIXByb3BlcnR5VmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoWy4uLnByb3BlcnR5VmFsdWVzXSk7XG4gIGlmIChhcnJheVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHVuaXF1ZVZhbHVlcykge1xuICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHJlcG8ucmVhZChpZCk7XG4gICAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIHJlYWQpO1xuICAgIH1cbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc107XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGtOYW1lID0gZmluZFByaW1hcnlLZXkocHJvcGVydHlWYWx1ZXNbMF0pLmlkO1xuXG4gIGNvbnN0IHJlc3VsdDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChjb25zdCBtIG9mIHByb3BlcnR5VmFsdWVzKSB7XG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgY3JlYXRlT3JVcGRhdGUobSwgY29udGV4dCwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcmVjb3JkW3BrTmFtZV0sIHJlY29yZCk7XG4gICAgcmVzdWx0LmFkZChyZWNvcmRbcGtOYW1lXSk7XG4gIH1cblxuICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnJlc3VsdF07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHVwZGF0ZXNcbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aGVuIHVwZGF0aW5nIGEgbW9kZWwsIGRlbGVnYXRpbmcgdG8gb25lVG9NYW55T25DcmVhdGUgaWYgY2FzY2FkZSB1cGRhdGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlPblVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPblVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPbkNyZWF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25VcGRhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25VcGRhdGUtPj5vbmVUb01hbnlPblVwZGF0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgYWx0IGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqICAgICBvbmVUb01hbnlPblVwZGF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBhcHBseSh0aGlzLCBbY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbF0pXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtLT4+b25lVG9NYW55T25VcGRhdGU6IHZvaWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPblVwZGF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgY2FzY2FkZSB9ID0gZGF0YTtcbiAgaWYgKGNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgcmV0dXJuIG9uZVRvTWFueU9uQ3JlYXRlLmFwcGx5KHRoaXMgYXMgYW55LCBbXG4gICAgY29udGV4dCxcbiAgICBkYXRhLFxuICAgIGtleSBhcyBrZXlvZiBNb2RlbCxcbiAgICBtb2RlbCxcbiAgXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGRlbGV0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiBkZWxldGluZyBhIG1vZGVsLCBkZWxldGluZyBhbGwgcmVsYXRlZCBtb2RlbHMgaWYgY2FzY2FkZSBkZWxldGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlPbkRlbGV0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPbkRlbGV0ZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25EZWxldGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgY2FzY2FkZS5kZWxldGUgaXMgQ0FTQ0FERVxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiB2YWx1ZXMgZXhpc3RzIGFuZCBoYXMgbGVuZ3RoXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIGFsbCBlbGVtZW50cyBoYXZlIHNhbWUgdHlwZVxuICpcbiAqICAgYWx0IGlzSW5zdGFudGlhdGVkIChhcnJheVR5cGUgaXMgXCJvYmplY3RcIilcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PlJlcG9zaXRvcnk6IGZvck1vZGVsKHZhbHVlc1swXSlcbiAqICAgICBSZXBvc2l0b3J5LS0+Pm9uZVRvTWFueU9uRGVsZXRlOiByZXBvXG4gKiAgIGVsc2Ugbm90IGluc3RhbnRpYXRlZFxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb01hbnlPbkRlbGV0ZTogcmVwb1xuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNyZWF0ZSB1bmlxdWVWYWx1ZXMgc2V0XG4gKlxuICogICBsb29wIGZvciBlYWNoIGlkIGluIHVuaXF1ZVZhbHVlc1xuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+cmVwbzogZGVsZXRlKGlkLCBjb250ZXh0KVxuICogICAgIHJlcG8tLT4+b25lVG9NYW55T25EZWxldGU6IGRlbGV0ZWRcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIGRlbGV0ZWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGRhdGEuY2FzY2FkZS5kZWxldGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICBjb25zdCB2YWx1ZXMgPSBtb2RlbFtrZXldIGFzIGFueTtcbiAgaWYgKCF2YWx1ZXMgfHwgIXZhbHVlcy5sZW5ndGgpIHJldHVybjtcbiAgY29uc3QgYXJyYXlUeXBlID0gdHlwZW9mIHZhbHVlc1swXTtcbiAgY29uc3QgYXJlQWxsU2FtZVR5cGUgPSB2YWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gdHlwZW9mIGl0ZW0gPT09IGFycmF5VHlwZSk7XG4gIGlmICghYXJlQWxsU2FtZVR5cGUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRpb24uIEFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IG11c3QgbWF0Y2ggdGhlIHNhbWUgdHlwZS5gXG4gICAgKTtcbiAgY29uc3QgaXNJbnN0YW50aWF0ZWQgPSBhcnJheVR5cGUgPT09IFwib2JqZWN0XCI7XG4gIGNvbnN0IHJlcG8gPSBpc0luc3RhbnRpYXRlZFxuICAgID8gUmVwb3NpdG9yeS5mb3JNb2RlbCh2YWx1ZXNbMF0sIHRoaXMuYWRhcHRlci5hbGlhcylcbiAgICA6IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXksIHRoaXMuYWRhcHRlci5hbGlhcyk7XG5cbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbXG4gICAgLi4uKGlzSW5zdGFudGlhdGVkXG4gICAgICA/IHZhbHVlcy5tYXAoKHY6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZbcmVwby5wayBhcyBzdHJpbmddKVxuICAgICAgOiB2YWx1ZXMpLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IGlkIG9mIHVuaXF1ZVZhbHVlcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCwgY29udGV4dCk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkKTtcbiAgfVxuICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGtleSBmb3IgY2FjaGluZyBwb3B1bGF0ZWQgbW9kZWwgcmVsYXRpb25zaGlwc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHVuaXF1ZSBrZXkgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgcG9wdWxhdGVkIG1vZGVsIHJlbGF0aW9uc2hpcHMgaW4gdGhlIGNhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9yIG1vZGVsXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlbGF0ZWQgbW9kZWxcbiAqIEByZXR1cm4ge3N0cmluZ30gQSBkb3Qtc2VwYXJhdGVkIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlbGF0aW9uc2hpcFxuICogQGZ1bmN0aW9uIGdldFBvcHVsYXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvcHVsYXRlS2V5KFxuICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbikge1xuICByZXR1cm4gW1BlcnNpc3RlbmNlS2V5cy5QT1BVTEFURSwgdGFibGVOYW1lLCBmaWVsZE5hbWUsIGlkXS5qb2luKFwiLlwiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FjaGVzIGEgbW9kZWwgZm9yIGxhdGVyIHBvcHVsYXRpb25cbiAqIEBzdW1tYXJ5IFN0b3JlcyBhIG1vZGVsIGluIHRoZSBjb250ZXh0IGNhY2hlIGZvciBlZmZpY2llbnQgcmV0cmlldmFsIGR1cmluZyByZWxhdGlvbnNoaXAgcG9wdWxhdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7TX0gcGFyZW50TW9kZWwgLSBUaGUgcGFyZW50IG1vZGVsIHRoYXQgY29udGFpbnMgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gcGtWYWx1ZSAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHBhcmFtIHthbnl9IGNhY2hlVmFsdWUgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY2FjaGVcbiAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBjYWNoZSBvcGVyYXRpb25cbiAqIEBmdW5jdGlvbiBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FjaGVNb2RlbEZvclBvcHVsYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4+KFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBwYXJlbnRNb2RlbDogTSxcbiAgcHJvcGVydHlLZXk6IGtleW9mIE0gfCBzdHJpbmcsXG4gIHBrVmFsdWU6IHN0cmluZyB8IG51bWJlcixcbiAgY2FjaGVWYWx1ZTogYW55XG4pIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShcbiAgICBwYXJlbnRNb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZyxcbiAgICBwa1ZhbHVlXG4gICk7XG4gIHJldHVybiBjb250ZXh0LmFjY3VtdWxhdGUoeyBbY2FjaGVLZXldOiBjYWNoZVZhbHVlIH0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQb3B1bGF0ZXMgYSBtb2RlbCdzIHJlbGF0aW9uc2hpcFxuICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCBhdHRhY2hlcyByZWxhdGVkIG1vZGVscyB0byBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwIHByb3BlcnR5XG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIHBvcHVsYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBvcHVsYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZldGNoUG9wdWxhdGVWYWx1ZXNcbiAqICAgcGFydGljaXBhbnQgZ2V0UG9wdWxhdGVLZXlcbiAqICAgcGFydGljaXBhbnQgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICpcbiAqICAgQ2FsbGVyLT4+cG9wdWxhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogY2hlY2sgaWYgZGF0YS5wb3B1bGF0ZSBpcyB0cnVlXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IGdldCBuZXN0ZWQgdmFsdWUgYW5kIGNoZWNrIGlmIGl0IGV4aXN0c1xuICpcbiAqICAgcG9wdWxhdGUtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjb250ZXh0LCBtb2RlbCwga2V5LCBpc0FyciA/IG5lc3RlZCA6IFtuZXN0ZWRdXG4gKlxuICogICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogaW5pdGlhbGl6ZSB2YXJpYWJsZXNcbiAqXG4gKiAgIGxvb3AgZm9yIGVhY2ggcHJvS2V5VmFsdWUgaW4gcHJvcEtleVZhbHVlc1xuICogICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5nZXRQb3B1bGF0ZUtleTogbW9kZWwuY29uc3RydWN0b3IubmFtZSwgcHJvcE5hbWUsIHByb0tleVZhbHVlXG4gKiAgICAgZ2V0UG9wdWxhdGVLZXktLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogY2FjaGVLZXlcbiAqXG4gKiAgICAgYWx0IHRyeSB0byBnZXQgZnJvbSBjYWNoZVxuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PkNvbnRleHQ6IGdldChjYWNoZUtleSlcbiAqICAgICAgIENvbnRleHQtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogdmFsXG4gKiAgICAgZWxzZSBjYXRjaCBlcnJvclxuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwgcHJvcE5hbWVcbiAqICAgICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHJlcG9cbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5yZXBvOiByZWFkKHByb0tleVZhbHVlKVxuICogICAgICAgcmVwby0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbmRcbiAqXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGFkZCB2YWwgdG8gcmVzdWx0c1xuICogICBlbmRcbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtLT4+cG9wdWxhdGU6IHJlc3VsdHNcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogc2V0IG1vZGVsW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXVxuICogICBwb3B1bGF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvcHVsYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZGF0YS5wb3B1bGF0ZSkgcmV0dXJuO1xuICBjb25zdCBuZXN0ZWQ6IGFueSA9IG1vZGVsW2tleV07XG4gIGNvbnN0IGlzQXJyID0gQXJyYXkuaXNBcnJheShuZXN0ZWQpO1xuICBpZiAodHlwZW9mIG5lc3RlZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAoaXNBcnIgJiYgbmVzdGVkLmxlbmd0aCA9PT0gMCkpIHJldHVybjtcblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFBvcHVsYXRlVmFsdWVzKFxuICAgIGM6IENvbnRleHQ8Rj4sXG4gICAgbW9kZWw6IE0sXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBwcm9wS2V5VmFsdWVzOiBhbnlbXSxcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgY2FjaGVLZXk6IHN0cmluZztcbiAgICBsZXQgdmFsOiBhbnk7XG4gICAgY29uc3QgcmVzdWx0czogTVtdID0gW107XG4gICAgZm9yIChjb25zdCBwcm9LZXlWYWx1ZSBvZiBwcm9wS2V5VmFsdWVzKSB7XG4gICAgICBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsIHByb3BOYW1lLCBwcm9LZXlWYWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWwgPSBhd2FpdCBjLmdldChjYWNoZUtleSBhcyBhbnkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBwcm9wTmFtZSwgYWxpYXMpO1xuICAgICAgICBpZiAoIXJlcG8pIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiQ291bGQgbm90IGZpbmQgcmVwb1wiKTtcbiAgICAgICAgdmFsID0gYXdhaXQgcmVwby5yZWFkKHByb0tleVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaCh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFBvcHVsYXRlVmFsdWVzKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5IGFzIHN0cmluZyxcbiAgICBpc0FyciA/IG5lc3RlZCA6IFtuZXN0ZWRdLFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gaXNBcnIgPyByZXMgOiByZXNbMF07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgY29tbW9uIEphdmFTY3JpcHQgdHlwZXNcbiAqIEBzdW1tYXJ5IEFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIGNvbW1vbiBKYXZhU2NyaXB0IHR5cGVzIHRoYXQgYXJlIG5vdCBjdXN0b20gbW9kZWwgdHlwZXNcbiAqIEBjb25zdCBjb21tb21UeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmNvbnN0IGNvbW1vbVR5cGVzID0gW1xuICBcImFycmF5XCIsXG4gIFwic3RyaW5nXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiYm9vbGVhblwiLFxuICBcInN5bWJvbFwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwib2JqZWN0XCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwibnVsbFwiLFxuICBcImJpZ2ludFwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBwcm9wZXJ0eSBiYXNlZCBvbiBpdHMgdHlwZSBtZXRhZGF0YVxuICogQHN1bW1hcnkgRXhhbWluZXMgYSBtb2RlbCBwcm9wZXJ0eSdzIHR5cGUgbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSByZXBvc2l0b3J5IGZvciByZWxhdGVkIG1vZGVsc1xuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7YW55fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBleGFtaW5lXG4gKiBAcmV0dXJuIHtSZXBvPE0+fSBBIHJlcG9zaXRvcnkgZm9yIHRoZSBtb2RlbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBSZWZsZWN0XG4gKiAgIHBhcnRpY2lwYW50IFZhbGlkYXRpb25cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wZXJ0eUtleVxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5WYWxpZGF0aW9uOiBrZXkoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pID8gVmFsaWRhdGlvbktleXMuTElTVCA6IFZhbGlkYXRpb25LZXlzLlRZUEUpXG4gKiAgIFZhbGlkYXRpb24tLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHZhbGlkYXRpb25LZXlcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+UmVmbGVjdDogZ2V0TWV0YWRhdGEodmFsaWRhdGlvbktleSwgbW9kZWwsIHByb3BlcnR5S2V5KVxuICogICBSZWZsZWN0LS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiB0eXBlc1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogZGV0ZXJtaW5lIGN1c3RvbVR5cGVzIGJhc2VkIG9uIHByb3BlcnR5IHR5cGVcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY2hlY2sgaWYgdHlwZXMgYW5kIGN1c3RvbVR5cGVzIGV4aXN0XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjcmVhdGUgYWxsb3dlZFR5cGVzIGFycmF5XG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGZpbmQgY29uc3RydWN0b3JOYW1lIG5vdCBpbiBjb21tb21UeXBlc1xuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiBjb25zdHJ1Y3Rvck5hbWUgZXhpc3RzXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+Pk1vZGVsOiBnZXQoY29uc3RydWN0b3JOYW1lKVxuICogICBNb2RlbC0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY29uc3RydWN0b3JcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY2hlY2sgaWYgY29uc3RydWN0b3IgZXhpc3RzXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlJlcG9zaXRvcnk6IGZvck1vZGVsKGNvbnN0cnVjdG9yKVxuICogICBSZXBvc2l0b3J5LS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiByZXBvXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5DYWxsZXI6IHJlcG9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBrZXlvZiBNLFxuICBhbGlhcz86IHN0cmluZ1xuKTogUmVwbzxNPiB7XG4gIGNvbnN0IHR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBWYWxpZGF0aW9uLmtleShcbiAgICAgIEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHlLZXldKVxuICAgICAgICA/IFZhbGlkYXRpb25LZXlzLkxJU1RcbiAgICAgICAgOiBWYWxpZGF0aW9uS2V5cy5UWVBFXG4gICAgKSxcbiAgICBtb2RlbCxcbiAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmdcbiAgKTtcbiAgY29uc3QgY3VzdG9tVHlwZXM6IGFueSA9IEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHlLZXldKVxuICAgID8gdHlwZXMuY2xhenpcbiAgICA6IHR5cGVzLmN1c3RvbVR5cGVzO1xuICBpZiAoIXR5cGVzIHx8ICFjdXN0b21UeXBlcylcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gZmluZCB0eXBlcyBkZWNvcmF0b3JzIGZvciBwcm9wZXJ0eSAke3Byb3BlcnR5S2V5IGFzIHN0cmluZ31gXG4gICAgKTtcblxuICBjb25zdCBhbGxvd2VkVHlwZXM6IHN0cmluZ1tdID0gKFxuICAgIEFycmF5LmlzQXJyYXkoY3VzdG9tVHlwZXMpID8gWy4uLmN1c3RvbVR5cGVzXSA6IFtjdXN0b21UeXBlc11cbiAgKS5tYXAoKHQpID0+ICh0eXBlb2YgdCA9PT0gXCJmdW5jdGlvblwiID8gdCgpIDogdCkpO1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSBhbGxvd2VkVHlwZXMuZmluZChcbiAgICAodCkgPT4gIWNvbW1vbVR5cGVzLmluY2x1ZGVzKGAke3R9YC50b0xvd2VyQ2FzZSgpKVxuICApO1xuICBpZiAoIWNvbnN0cnVjdG9yTmFtZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBQcm9wZXJ0eSBrZXkgJHtwcm9wZXJ0eUtleSBhcyBzdHJpbmd9IGRvZXMgbm90IGhhdmUgYSB2YWxpZCBjb25zdHJ1Y3RvciB0eXBlYFxuICAgICk7XG4gIGNvbnN0IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxNPiB8IHVuZGVmaW5lZCA9IE1vZGVsLmdldChjb25zdHJ1Y3Rvck5hbWUpO1xuICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2NvbnN0cnVjdG9yTmFtZX1gKTtcblxuICByZXR1cm4gUmVwb3NpdG9yeS5mb3JNb2RlbChjb25zdHJ1Y3RvciwgYWxpYXMpO1xufVxuXG4iLCJpbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvblVwZGF0ZSxcbiAgYWZ0ZXJBbnksXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dCxcbiAgdGltZXN0YW1wLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhLCBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRDYXNjYWRlLCBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGxpc3QsXG4gIE1vZGVsLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7XG4gIEpvaW5Db2x1bW5PcHRpb25zLFxuICBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICBKb2luVGFibGVPcHRpb25zLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIG9uZVRvTWFueU9uQ3JlYXRlLFxuICBvbmVUb01hbnlPbkRlbGV0ZSxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIG9uZVRvT25lT25DcmVhdGUsXG4gIG9uZVRvT25lT25EZWxldGUsXG4gIG9uZVRvT25lT25VcGRhdGUsXG4gIHBvcHVsYXRlIGFzIHBvcCxcbn0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzIGluIHRoZSBkYXRhYmFzZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzXG4gKiBAZnVuY3Rpb24gdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZTxPUFRTID0gc3RyaW5nPihvcHRzOiBPUFRTKSB7XG4gIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5UQUJMRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1ldGFkYXRhLFxuICAgICAgYXJnczogW2tleSwgb3B0c10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZSBmb3IgYSBtb2RlbCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgY29sdW1uIG5hbWUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY29sdW1uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sdW1uPE9QVFMgPSBzdHJpbmc+KGNvbHVtbk5hbWU/OiBPUFRTKSB7XG4gIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW4oaywgYykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29sdW1uKG9iajogYW55LCBhdHRyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhKGssIGMgfHwgYXR0cikob2JqLCBhdHRyKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBhcmdzOiBba2V5LCBjb2x1bW5OYW1lXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluZGV4IG9uIGEgbW9kZWwgcHJvcGVydHkgZm9yIGltcHJvdmVkIHF1ZXJ5IHBlcmZvcm1hbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIGJlIGluZGV4ZWQgaW4gdGhlIGRhdGFiYXNlLCBvcHRpb25hbGx5IHdpdGggc3BlY2lmaWMgZGlyZWN0aW9ucyBhbmQgY29tcG9zaXRpb25zXG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9uW119IFtkaXJlY3Rpb25zXSAtIE9wdGlvbmFsIGFycmF5IG9mIHNvcnQgZGlyZWN0aW9ucyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXSAtIE9wdGlvbmFsIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRvIGNyZWF0ZSBhIGNvbXBvc2l0ZSBpbmRleFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGluZGV4XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChuYW1lOiBzdHJpbmcpOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBkaXJlY3Rpb25zOiBPcmRlckRpcmVjdGlvbltdXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBkaXJlY3Rpb25zOiBPcmRlckRpcmVjdGlvbltdLFxuICBuYW1lOiBzdHJpbmdcbik6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoY29tcG9zaXRpb25zOiBzdHJpbmdbXSk6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGNvbXBvc2l0aW9uczogc3RyaW5nW10sXG4gIG5hbWU6IHN0cmluZ1xuKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10gfCBzdHJpbmdbXSB8IHN0cmluZyxcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10gfCBzdHJpbmcsXG4gIG5hbWU/OiBzdHJpbmdcbikge1xuICBmdW5jdGlvbiBpbmRleChcbiAgICBkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSB8IHN0cmluZ1tdIHwgc3RyaW5nLFxuICAgIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdIHwgc3RyaW5nLFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gZGlyZWN0aW9ucztcbiAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29tcG9zaXRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gY29tcG9zaXRpb25zO1xuICAgICAgY29tcG9zaXRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIWNvbXBvc2l0aW9ucyAmJiBkaXJlY3Rpb25zKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRpcmVjdGlvbnMuZmluZChcbiAgICAgICAgICAoZCkgPT4gIVtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10uaW5jbHVkZXMoZCBhcyBhbnkpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBjb21wb3NpdGlvbnMgPSBkaXJlY3Rpb25zIGFzIHN0cmluZ1tdO1xuICAgICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShcbiAgICAgICAgYCR7UGVyc2lzdGVuY2VLZXlzLklOREVYfSR7Y29tcG9zaXRpb25zICYmIGNvbXBvc2l0aW9ucy5sZW5ndGggPyBgLiR7Y29tcG9zaXRpb25zLmpvaW4oXCIuXCIpfWAgOiBcIlwifWBcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGRpcmVjdGlvbnM6IGRpcmVjdGlvbnMsXG4gICAgICAgIGNvbXBvc2l0aW9uczogY29tcG9zaXRpb25zLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgfSBhcyBJbmRleE1ldGFkYXRhXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuSU5ERVgpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGluZGV4LFxuICAgICAgYXJnczogW2RpcmVjdGlvbnMsIGNvbXBvc2l0aW9ucywgbmFtZV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW5mb3JjZXMgdW5pcXVlbmVzcyBjb25zdHJhaW50IGR1cmluZyBtb2RlbCBjcmVhdGlvbiBhbmQgdXBkYXRlXG4gKiBAc3VtbWFyeSBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSB1bmlxdWUgZGVjb3JhdG9yIHRvIGNoZWNrIGlmIGEgcHJvcGVydHkgdmFsdWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBtZXRhZGF0YSB0eXBlXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gY2hlY2sgZm9yIHVuaXF1ZW5lc3NcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGVjayBpcyBjb21wbGV0ZSBvciByZWplY3RzIHdpdGggYSBDb25mbGljdEVycm9yXG4gKiBAZnVuY3Rpb24gdW5pcXVlT25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pcXVlT25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKG1vZGVsIGFzIGFueSlba2V5XSkgcmV0dXJuO1xuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuc2VsZWN0KClcbiAgICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZShrZXkpLmVxKG1vZGVsW2tleV0pKVxuICAgIC5leGVjdXRlKCk7XG4gIGlmIChleGlzdGluZy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICBgbW9kZWwgYWxyZWFkeSBleGlzdHMgd2l0aCBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IGVxdWFsIHRvICR7SlNPTi5zdHJpbmdpZnkoKG1vZGVsIGFzIGFueSlba2V5XSwgdW5kZWZpbmVkLCAyKX1gXG4gICAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGFncyBhIHByb3BlcnR5IGFzIHVuaXF1ZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZW5zdXJlcyBhIHByb3BlcnR5IHZhbHVlIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGluc3RhbmNlcyBvZiBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHVuaXF1ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVuaXF1ZSgpXG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUodW5pcXVlT25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdXNlciBpZGVudGlmaWNhdGlvbiBmb3Igb3duZXJzaGlwIHRyYWNraW5nXG4gKiBAc3VtbWFyeSBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBkZWNvcmF0b3JzIHRvIHNldCBvd25lcnNoaXAgaW5mb3JtYXRpb25cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIG1ldGFkYXRhIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHN0b3JlIHRoZSB1c2VyIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZWplY3RzIHdpdGggYW4gQXV0aG9yaXphdGlvbkVycm9yIGlmIHVzZXIgaWRlbnRpZmljYXRpb24gaXMgbm90IHN1cHBvcnRlZFxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGRhdGE6IFYsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICBcIlRoaXMgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgaWRlbnRpZmljYXRpb25cIlxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGNyZWF0b3Igb2YgYSBtb2RlbCBpbnN0YW5jZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSB0byBzdG9yZSB0aGUgaWRlbnRpZmllciBvZiB0aGUgdXNlciB3aG8gY3JlYXRlZCB0aGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgRG9jdW1lbnQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAY3JlYXRlZEJ5KClcbiAqICAgY3JlYXRvciE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhY2tzIHRoZSBsYXN0IHVwZGF0ZXIgb2YgYSBtb2RlbCBpbnN0YW5jZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSB0byBzdG9yZSB0aGUgaWRlbnRpZmllciBvZiB0aGUgdXNlciB3aG8gbGFzdCB1cGRhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHVwZGF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEB1cGRhdGVkQnkoKVxuICogICBsYXN0RWRpdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlZEF0KCkge1xuICByZXR1cm4gdGltZXN0YW1wKFtPcGVyYXRpb25LZXlzLkNSRUFURV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlZEF0KCkge1xuICByZXR1cm4gdGltZXN0YW1wKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBvbmVUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQG9uZVRvT25lKFByb2ZpbGUpXG4gKiAgIHByb2ZpbGUhOiBzdHJpbmcgfCBQcm9maWxlO1xuICogfVxuICpcbiAqIGNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBiaW8hOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZTogYm9vbGVhbiA9IHRydWUsXG4gIGpvaW5Db2x1bW5PcHRzPzogSm9pbkNvbHVtbk9wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgZnVuY3Rpb24gb25lVG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pbkNvbHVtbk9wdHM/OiBKb2luQ29sdW1uT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBtZXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luQ29sdW1uT3B0cykgbWV0YS5qb2luVGFibGUgPSBqb2luQ29sdW1uT3B0cztcbiAgICBpZiAoZmspIG1ldGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSwgbWV0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb09uZU9uVXBkYXRlLCBtZXRhKSxcbiAgICAgIG9uRGVsZXRlKG9uZVRvT25lT25EZWxldGUsIG1ldGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5Db2x1bW5PcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY3VycmVudCBtb2RlbCBhbmQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICpcbiAqICAgQG9uZVRvTWFueShCb29rKVxuICogICBib29rcyE6IHN0cmluZ1tdIHwgQm9va1tdO1xuICogfVxuICpcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb09uZVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvTWFueTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbiAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICBmaz86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG5cbiAgZnVuY3Rpb24gb25lVG9NYW55RGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgbGlzdChbXG4gICAgICAgIGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+LFxuICAgICAgICBTdHJpbmcsXG4gICAgICAgIE51bWJlcixcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBCaWdpbnQgaXMgbm90IGEgY29uc3RydWN0b3JcbiAgICAgICAgQmlnSW50LFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvbmVUb01hbnlEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pblRhYmxlT3B0cywgZmtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICpcbiAqICAgQG1hbnlUb09uZShBdXRob3IpXG4gKiAgIGF1dGhvciE6IHN0cmluZyB8IEF1dGhvcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBvbmVUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFueVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuXG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG5cbiAgZnVuY3Rpb24gbWFueVRvT25lRGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIWNsYXp6Lm5hbWUpXG4gICAgICBjbGF6eiA9IChjbGF6eiBhcyAoKSA9PiBDb25zdHJ1Y3RvcjxNPikoKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIC8vIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1hbnlUb09uZURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICpcbiAqICAgQG1hbnlUb09uZShBdXRob3IpXG4gKiAgIGF1dGhvciE6IHN0cmluZyB8IEF1dGhvcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBvbmVUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFueVRvTWFueTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlID0gdHJ1ZSxcbiAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICBmaz86IHN0cmluZ1xuKSB7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fTUFOWSk7XG5cbiAgZnVuY3Rpb24gbWFueVRvTWFueURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgZms/OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIGxpc3QoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICAvLyBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBhZnRlckFsbChwb3B1bGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtYW55VG9NYW55RGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5UYWJsZU9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICByZWFkb25seSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gXCIuLi9tb2RlbC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByaW1hcnkga2V5IGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwcmltYXJ5IGtleSB2YWx1ZXMgZm9yIG1vZGVscyB1c2luZyBzZXF1ZW5jZXNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSB0aGF0IGV4dGVuZHMgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUeXBlIHRoYXQgZXh0ZW5kcyBTZXF1ZW5jZU9wdGlvbnNcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSB0aGF0IGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgdGhhdCBleHRlbmRzIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHNlcXVlbmNlIG9wdGlvbnNcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCBhcyBwcmltYXJ5IGtleVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHJpbWFyeSBrZXkgaXMgc2V0XG4gKiBAZnVuY3Rpb24gcGtPbkNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgcGtPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFNlcXVlbmNlXG4gKlxuICogICBNb2RlbC0+PnBrT25DcmVhdGU6IENhbGwgd2l0aCBtb2RlbCBpbnN0YW5jZVxuICogICBOb3RlIG92ZXIgcGtPbkNyZWF0ZTogQ2hlY2sgaWYga2V5IGFscmVhZHkgZXhpc3RzXG4gKiAgIGFsdCBLZXkgZXhpc3RzIG9yIG5vIHR5cGUgc3BlY2lmaWVkXG4gKiAgICAgcGtPbkNyZWF0ZS0tPj5Nb2RlbDogUmV0dXJuIGVhcmx5XG4gKiAgIGVsc2UgS2V5IG5lZWRzIHRvIGJlIGNyZWF0ZWRcbiAqICAgICBwa09uQ3JlYXRlLT4+cGtPbkNyZWF0ZTogR2VuZXJhdGUgc2VxdWVuY2UgbmFtZSBpZiBub3QgcHJvdmlkZWRcbiAqICAgICBwa09uQ3JlYXRlLT4+QWRhcHRlcjogUmVxdWVzdCBTZXF1ZW5jZShkYXRhKVxuICogICAgIEFkYXB0ZXItPj5TZXF1ZW5jZTogQ3JlYXRlIHNlcXVlbmNlXG4gKiAgICAgU2VxdWVuY2UtLT4+cGtPbkNyZWF0ZTogUmV0dXJuIHNlcXVlbmNlXG4gKiAgICAgcGtPbkNyZWF0ZS0+PlNlcXVlbmNlOiBDYWxsIG5leHQoKVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBuZXh0IHZhbHVlXG4gKiAgICAgcGtPbkNyZWF0ZS0+Pk1vZGVsOiBTZXQgcHJpbWFyeSBrZXkgdmFsdWVcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwa09uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEudHlwZSB8fCAhZGF0YS5nZW5lcmF0ZWQgfHwgbW9kZWxba2V5XSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldFByaW1hcnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgaWYgKCFkYXRhLm5hbWUpIGRhdGEubmFtZSA9IHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICBsZXQgc2VxdWVuY2U6IFNlcXVlbmNlO1xuICB0cnkge1xuICAgIHNlcXVlbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKGRhdGEpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gaW5zdGFudGlhdGUgU2VxdWVuY2UgJHtkYXRhLm5hbWV9OiAke2V9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBuZXh0ID0gYXdhaXQgc2VxdWVuY2UubmV4dCgpO1xuICBzZXRQcmltYXJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG5leHQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IEtleSBEZWNvcmF0b3JcbiAqIEBzdW1tYXJ5IE1hcmtzIGEgcHJvcGVydHkgYXMgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXkgd2l0aCBhdXRvbWF0aWMgc2VxdWVuY2UgZ2VuZXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY29tYmluZXMgbXVsdGlwbGUgYmVoYXZpb3JzOiBpdCBtYXJrcyB0aGUgcHJvcGVydHkgYXMgdW5pcXVlLCByZXF1aXJlZCxcbiAqIGFuZCBlbnN1cmVzIHRoZSBpbmRleCBpcyBjcmVhdGVkIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgc2VxdWVuY2Ugb3B0aW9ucy5cbiAqIEBwYXJhbSB7T21pdDxTZXF1ZW5jZU9wdGlvbnMsIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCI+fSBvcHRzIC0gT3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG1vZGVsIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBwa1xuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHBrKClcbiAqICAgaWQhOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGsoXG4gIG9wdHM6IE9taXQ8XG4gICAgU2VxdWVuY2VPcHRpb25zLFxuICAgIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCJcbiAgPiA9IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnNcbikge1xuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucywgb3B0cywge1xuICAgIGdlbmVyYXRlZDpcbiAgICAgIG9wdHMudHlwZSAmJiB0eXBlb2Ygb3B0cy5nZW5lcmF0ZWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogb3B0cy5nZW5lcmF0ZWQgfHwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucy5nZW5lcmF0ZWQsXG4gIH0pIGFzIFNlcXVlbmNlT3B0aW9ucztcblxuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpO1xuICBmdW5jdGlvbiBwa0RlYyhvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBpbmRleChbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdKSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGtleSwgb3B0aW9ucyksXG4gICAgICAgIG9uQ3JlYXRlKHBrT25DcmVhdGUsIG9wdGlvbnMpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoREJLZXlzLklELCBhdHRyKVxuICAgICAgKShvYmosIGF0dHIpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICBhcmdzOiBbb3B0c10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsImltcG9ydCB7IE1vZGVsQXJnLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIG1vZGVsIGNsYXNzIGZvciBhbGwgZG9tYWluIG1vZGVsc1xuICogQHN1bW1hcnkgQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIE1vZGVsIGNsYXNzIGZyb20gZGVjb3JhdG9yLXZhbGlkYXRpb24gYW5kIGFkZHMgdGltZXN0YW1wIGZ1bmN0aW9uYWxpdHkuXG4gKiBBbGwgZG9tYWluIG1vZGVscyBpbiB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGluaGVyaXQgY29tbW9uIHByb3BlcnRpZXMgYW5kIGJlaGF2aW9ycy5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8QmFzZU1vZGVsPn0gYXJnIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gZGF0YSBmb3IgdGhlIG1vZGVsXG4gKiBAY2xhc3MgQmFzZU1vZGVsXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lITogc3RyaW5nO1xuICogICBcbiAqICAgQGVtYWlsKClcbiAqICAgZW1haWwhOiBzdHJpbmc7XG4gKiAgIFxuICogICBjb25zdHJ1Y3RvcihkYXRhPzogTW9kZWxBcmc8VXNlcj4pIHtcbiAqICAgICBzdXBlcihkYXRhKTtcbiAqICAgfVxuICogfVxuICogXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoeyB1c2VybmFtZTogJ2pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRpb24gdGltZXN0YW1wIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgQXV0b21hdGljYWxseSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBtb2RlbCBpcyBjcmVhdGVkXG4gICAqL1xuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZE9uITogRGF0ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExhc3QgdXBkYXRlIHRpbWVzdGFtcCBmb3IgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IEF1dG9tYXRpY2FsbHkgdXBkYXRlZCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW5ldmVyIHRoZSBtb2RlbCBpcyBtb2RpZmllZFxuICAgKi9cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRPbiE6IERhdGU7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEJhc2VNb2RlbD4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYWdpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBhZ2luYXRpb24gZm9yIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG5hdmlnYXRpbmcgdGhyb3VnaCBwYWdpbmF0ZWQgcXVlcnkgcmVzdWx0c1xuICpcbiAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgbWFuYWdlcyB0aGUgc3RhdGUgYW5kIG5hdmlnYXRpb24gb2YgcGFnaW5hdGVkIGRhdGFiYXNlIHF1ZXJ5IHJlc3VsdHMuXG4gKiBJdCB0cmFja3MgdGhlIGN1cnJlbnQgcGFnZSwgdG90YWwgcGFnZXMsIGFuZCByZWNvcmQgY291bnQsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvclxuICogbW92aW5nIGJldHdlZW4gcGFnZXMuXG4gKlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIHBhZ2luYXRvciBvcGVyYXRlcyBvblxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHBhZ2luYXRlZCBxdWVyeSAoZGVmYXVsdHMgdG8gTVtdKVxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSAoZGVmYXVsdHMgdG8gYW55KVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+fSBhZGFwdGVyIC0gVGhlIGRhdGFiYXNlIGFkYXB0ZXIgdG8gdXNlIGZvciBleGVjdXRpbmcgcXVlcmllc1xuICogQHBhcmFtIHtRfSBxdWVyeSAtIFRoZSBxdWVyeSB0byBwYWdpbmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIHJlY29yZHMgcGVyIHBhZ2VcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgdHlwZVxuICogQGNsYXNzIFBhZ2luYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHBhZ2luYXRvciBmb3IgYSB1c2VyIHF1ZXJ5XG4gKiBjb25zdCB1c2VyUXVlcnkgPSBkYi5zZWxlY3QoKS5mcm9tKFVzZXIpO1xuICogY29uc3QgcGFnaW5hdG9yID0gYXdhaXQgdXNlclF1ZXJ5LnBhZ2luYXRlKDEwKTsgLy8gMTAgdXNlcnMgcGVyIHBhZ2VcbiAqXG4gKiAvLyBHZXQgdGhlIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0c1xuICogY29uc3QgZmlyc3RQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKlxuICogLy8gTmF2aWdhdGUgdG8gdGhlIG5leHQgcGFnZVxuICogY29uc3Qgc2Vjb25kUGFnZSA9IGF3YWl0IHBhZ2luYXRvci5uZXh0KCk7XG4gKlxuICogLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWdpbmF0aW9uXG4gKiBjb25zb2xlLmxvZyhgUGFnZSAke3BhZ2luYXRvci5jdXJyZW50fSBvZiAke3BhZ2luYXRvci50b3RhbH0sICR7cGFnaW5hdG9yLmNvdW50fSB0b3RhbCByZWNvcmRzYCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUGFnaW5hdG9yXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgRGF0YWJhc2VcbiAqXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogbmV3IFBhZ2luYXRvcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogcGFnZSgxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHZhbGlkYXRlUGFnZSgxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHByZXBhcmUocXVlcnkpXG4gKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IGV4ZWN1dGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgUGFnaW5hdG9yLS0+PkNsaWVudDogcmV0dXJuIHBhZ2UgcmVzdWx0c1xuICpcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBuZXh0KClcbiAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBwYWdlKGN1cnJlbnQgKyAxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHZhbGlkYXRlUGFnZShjdXJyZW50ICsgMSlcbiAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogZXhlY3V0ZSBxdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByZXR1cm4gcmVzdWx0c1xuICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcGFnZSByZXN1bHRzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSID0gTVtdLCBRID0gYW55PiB7XG4gIHByb3RlY3RlZCBfY3VycmVudFBhZ2UhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdG90YWxQYWdlcyE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9yZWNvcmRDb3VudCE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxpbWl0ITogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3N0YXRlbWVudD86IFE7XG5cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG5cbiAgZ2V0IHRvdGFsKCkge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBzdGF0ZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZW1lbnQpIHRoaXMuX3N0YXRlbWVudCA9IHRoaXMucHJlcGFyZSh0aGlzLnF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBRLCBhbnksIGFueT4sXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHF1ZXJ5OiBRLFxuICAgIHJlYWRvbmx5IHNpemU6IG51bWJlcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge31cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IFEpOiBRO1xuXG4gIGFzeW5jIG5leHQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSh0aGlzLmN1cnJlbnQgKyAxKTtcbiAgfVxuXG4gIGFzeW5jIHByZXZpb3VzKCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2UodGhpcy5jdXJyZW50IC0gMSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIGlmIChwYWdlIDwgMSB8fCAhTnVtYmVyLmlzSW50ZWdlcihwYWdlKSlcbiAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcbiAgICAgICAgXCJQYWdlIG51bWJlciBjYW5ub3QgYmUgdW5kZXIgMSBhbmQgbXVzdCBiZSBhbiBpbnRlZ2VyXCJcbiAgICAgICk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl90b3RhbFBhZ2VzICE9PSBcInVuZGVmaW5lZFwiICYmIHBhZ2UgPiB0aGlzLl90b3RhbFBhZ2VzKVxuICAgICAgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFxuICAgICAgICBgT25seSAke3RoaXMuX3RvdGFsUGFnZXN9IGFyZSBhdmFpbGFibGUuIENhbm5vdCBnbyB0byBwYWdlICR7cGFnZX1gXG4gICAgICApO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG5cbiAgYWJzdHJhY3QgcGFnZShwYWdlPzogbnVtYmVyKTogUHJvbWlzZTxSW10+O1xufVxuIiwiaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dG9yLCBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZyb21TZWxlY3RvcixcbiAgR3JvdXBCeVNlbGVjdG9yLFxuICBPcmRlckJ5U2VsZWN0b3IsXG4gIFNlbGVjdFNlbGVjdG9yLFxufSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGZpbmFsIH0gZnJvbSBcIi4uL3V0aWxzL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ291bnRPcHRpb24sXG4gIERpc3RpbmN0T3B0aW9uLFxuICBMaW1pdE9wdGlvbixcbiAgTWF4T3B0aW9uLFxuICBNaW5PcHRpb24sXG4gIE9mZnNldE9wdGlvbixcbiAgT3JkZXJBbmRHcm91cE9wdGlvbixcbiAgU2VsZWN0T3B0aW9uLFxuICBXaGVyZU9wdGlvbixcbn0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHsgUGFnaW5hdGFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9QYWdpbmF0YWJsZVwiO1xuaW1wb3J0IHsgUGFnaW5hdG9yIH0gZnJvbSBcIi4vUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY2xhc3MgZm9yIGRhdGFiYXNlIHF1ZXJ5IHN0YXRlbWVudHNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgYnVpbGRpbmcgYW5kIGV4ZWN1dGluZyBkYXRhYmFzZSBxdWVyaWVzXG4gKlxuICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBxdWVyeSBidWlsZGVyIHBhdHRlcm4gZm9yIGNvbnN0cnVjdGluZ1xuICogZGF0YWJhc2UgcXVlcmllcy4gSXQgc3VwcG9ydHMgdmFyaW91cyBxdWVyeSBvcGVyYXRpb25zIGxpa2Ugc2VsZWN0LCBmcm9tLFxuICogd2hlcmUsIG9yZGVyQnksIGdyb3VwQnksIGxpbWl0LCBhbmQgb2Zmc2V0LiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBleGVjdXRpbmcgcXVlcmllcyBhbmQgaGFuZGxpbmcgcGFnaW5hdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHNwZWNpZmljIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgc3RhdGVtZW50IG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcXVlcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIFEsIGFueSwgYW55Pn0gYWRhcHRlciAtIFRoZSBkYXRhYmFzZSBhZGFwdGVyIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBjbGFzcyBTdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzdGF0ZW1lbnQgdG8gcXVlcnkgdXNlcnNcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBTUUxTdGF0ZW1lbnQoYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuc2VsZWN0KClcbiAqICAgLmZyb20oVXNlcilcbiAqICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJzdGF0dXNcIikuZXEoXCJhY3RpdmVcIikpXG4gKiAgIC5vcmRlckJ5KFtcImNyZWF0ZWRBdFwiLCBcIkRFU0NcIl0pXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqXG4gKiAvLyBVc2UgcGFnaW5hdGlvblxuICogY29uc3QgcGFnaW5hdG9yID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5zZWxlY3QoKVxuICogICAuZnJvbShVc2VyKVxuICogICAucGFnaW5hdGUoMjApOyAvLyAyMCB1c2VycyBwZXIgcGFnZVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERhdGFiYXNlXG4gKlxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IHNlbGVjdCgpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogZnJvbShNb2RlbClcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiB3aGVyZShjb25kaXRpb24pXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogb3JkZXJCeShbZmllbGQsIGRpcmVjdGlvbl0pXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogbGltaXQodmFsdWUpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogZXhlY3V0ZSgpXG4gKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogYnVpbGQoKVxuICogICBTdGF0ZW1lbnQtPj5BZGFwdGVyOiByYXcocXVlcnkpXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlN0YXRlbWVudDogcmV0dXJuIHByb2Nlc3NlZCByZXN1bHRzXG4gKiAgIFN0YXRlbWVudC0tPj5DbGllbnQ6IHJldHVybiBmaW5hbCByZXN1bHRzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQ8USwgTSBleHRlbmRzIE1vZGVsLCBSPlxuICBleHRlbmRzIExvZ2dlZENsYXNzXG4gIGltcGxlbWVudHMgRXhlY3V0b3I8Uj4sIFJhd0V4ZWN1dG9yPFE+LCBQYWdpbmF0YWJsZTxNLCBSLCBRPlxue1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPltdO1xuICBwcm90ZWN0ZWQgZGlzdGluY3RTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgbWF4U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIG1pblNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBjb3VudFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBmcm9tU2VsZWN0b3IhOiBDb25zdHJ1Y3RvcjxNPjtcbiAgcHJvdGVjdGVkIHdoZXJlQ29uZGl0aW9uPzogQ29uZGl0aW9uPE0+O1xuICBwcm90ZWN0ZWQgb3JkZXJCeVNlbGVjdG9yPzogT3JkZXJCeVNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgZ3JvdXBCeVNlbGVjdG9yPzogR3JvdXBCeVNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgbGltaXRTZWxlY3Rvcj86IG51bWJlcjtcbiAgcHJvdGVjdGVkIG9mZnNldFNlbGVjdG9yPzogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgUSwgYW55LCBhbnk+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuICh0aGlzLmFkYXB0ZXIgYXMgYW55KS5sb2cuZm9yKFN0YXRlbWVudCk7XG4gIH1cblxuICBzZWxlY3Q8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdLFxuICA+KCk6IFNlbGVjdE9wdGlvbjxNLCBNW10+O1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogU2VsZWN0T3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPjtcblxuICBAZmluYWwoKVxuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yPzogcmVhZG9ubHkgWy4uLlNdXG4gICk6IFNlbGVjdE9wdGlvbjxNLCBNW10+IHwgU2VsZWN0T3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwic2VsZWN0U2VsZWN0b3JcIiwge1xuICAgICAgdmFsdWU6IHNlbGVjdG9yLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzIGFzIFNlbGVjdE9wdGlvbjxNLCBNW10+IHwgU2VsZWN0T3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGRpc3RpbmN0PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oXG4gICAgc2VsZWN0b3I6IFNcbiAgKTogRGlzdGluY3RPcHRpb248TSwgTVtTXVtdPiB7XG4gICAgdGhpcy5kaXN0aW5jdFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgRGlzdGluY3RPcHRpb248TSwgTVtTXVtdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIG1heDxTIGV4dGVuZHMgU2VsZWN0U2VsZWN0b3I8TT4+KHNlbGVjdG9yOiBTKTogTWF4T3B0aW9uPE0sIE1bU10+IHtcbiAgICB0aGlzLm1heFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgTWF4T3B0aW9uPE0sIE1bU10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgbWluPFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I6IFMpOiBNaW5PcHRpb248TSwgTVtTXT4ge1xuICAgIHRoaXMubWluU2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBNaW5PcHRpb248TSwgTVtTXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBjb3VudDxTIGV4dGVuZHMgU2VsZWN0U2VsZWN0b3I8TT4+KHNlbGVjdG9yPzogUyk6IENvdW50T3B0aW9uPE0sIG51bWJlcj4ge1xuICAgIHRoaXMuY291bnRTZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIENvdW50T3B0aW9uPE0sIG51bWJlcj47XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgZnJvbShzZWxlY3RvcjogRnJvbVNlbGVjdG9yPE0+KTogV2hlcmVPcHRpb248TSwgUj4ge1xuICAgIHRoaXMuZnJvbVNlbGVjdG9yID0gKFxuICAgICAgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHNlbGVjdG9yKSA6IHNlbGVjdG9yXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYENvdWxkIG5vdCBmaW5kIHNlbGVjdG9yIG1vZGVsOiAke3NlbGVjdG9yfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIHdoZXJlKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogT3JkZXJBbmRHcm91cE9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy53aGVyZUNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBvcmRlckJ5KFxuICAgIHNlbGVjdG9yOiBPcmRlckJ5U2VsZWN0b3I8TT5cbiAgKTogTGltaXRPcHRpb248TSwgUj4gJiBPZmZzZXRPcHRpb248Uj4ge1xuICAgIHRoaXMub3JkZXJCeVNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgZ3JvdXBCeShzZWxlY3RvcjogR3JvdXBCeVNlbGVjdG9yPE0+KTogTGltaXRPcHRpb248TSwgUj4ge1xuICAgIHRoaXMuZ3JvdXBCeVNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgbGltaXQodmFsdWU6IG51bWJlcik6IE9mZnNldE9wdGlvbjxSPiB7XG4gICAgdGhpcy5saW1pdFNlbGVjdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgb2Zmc2V0KHZhbHVlOiBudW1iZXIpOiBFeGVjdXRvcjxSPiB7XG4gICAgdGhpcy5vZmZzZXRTZWxlY3RvciA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPFI+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFEgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMucmF3KHF1ZXJ5KSkgYXMgUjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFEpOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdzxSPihyYXdJbnB1dCk7XG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSByZXR1cm4gcmVzdWx0cztcbiAgICBjb25zdCBwa0F0dHIgPSBmaW5kUHJpbWFyeUtleShcbiAgICAgIG5ldyAodGhpcy5mcm9tU2VsZWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pKClcbiAgICApLmlkO1xuXG4gICAgY29uc3QgcHJvY2Vzc29yID0gZnVuY3Rpb24gcmVjb3JkUHJvY2Vzc29yKFxuICAgICAgdGhpczogU3RhdGVtZW50PFEsIE0sIFI+LFxuICAgICAgcjogYW55XG4gICAgKSB7XG4gICAgICBjb25zdCBpZCA9IHJbcGtBdHRyXTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvciBhcyBDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgICBwa0F0dHIsXG4gICAgICAgIGlkXG4gICAgICApIGFzIGFueTtcbiAgICB9LmJpbmQodGhpcyBhcyBhbnkpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0cykpIHJldHVybiByZXN1bHRzLm1hcChwcm9jZXNzb3IpIGFzIFI7XG4gICAgcmV0dXJuIHByb2Nlc3NvcihyZXN1bHRzKSBhcyBSO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkKCk6IFE7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPiwgLi4uYXJnczogYW55W10pOiBRO1xuICBhYnN0cmFjdCBwYWdpbmF0ZShzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBRPj47XG59XG4iLCJpbXBvcnQgeyBSYXdSYW1RdWVyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHBhZ2luYXRvciBpbXBsZW1lbnRhdGlvblxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBQYWdpbmF0b3IgY2xhc3MgdG8gcHJvdmlkZSBwYWdpbmF0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIFJBTSBhZGFwdGVyIHF1ZXJpZXMuXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIHBhZ2luYXRpb24gb2YgcXVlcnkgcmVzdWx0cyBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZSwgYWxsb3dpbmdcbiAqIGZvciBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGxhcmdlIHJlc3VsdCBzZXRzIGluIHNtYWxsZXIgY2h1bmtzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBwYWdpbmF0ZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IHRoZSBwYWdpbmF0b3JcbiAqIEBjbGFzcyBSYW1QYWdpbmF0b3JcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBxdWVyeSBmb3IgVXNlciBtb2RlbFxuICogY29uc3QgcXVlcnk6IFJhd1JhbVF1ZXJ5PFVzZXI+ID0ge1xuICogICBzZWxlY3Q6IHVuZGVmaW5lZCwgLy8gU2VsZWN0IGFsbCBmaWVsZHNcbiAqICAgZnJvbTogVXNlcixcbiAqICAgd2hlcmU6ICh1c2VyKSA9PiB1c2VyLmFjdGl2ZSA9PT0gdHJ1ZVxuICogfTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBwYWdpbmF0b3Igd2l0aCBwYWdlIHNpemUgb2YgMTBcbiAqIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBSYW1QYWdpbmF0b3I8VXNlciwgVXNlcj4oYWRhcHRlciwgcXVlcnksIDEwLCBVc2VyKTtcbiAqXG4gKiAvLyBHZXQgdGhlIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0c1xuICogY29uc3QgZmlyc3RQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKlxuICogLy8gR2V0IHRoZSBuZXh0IHBhZ2VcbiAqIGNvbnN0IHNlY29uZFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFJhd1JhbVF1ZXJ5PE0+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogQWRhcHRlcjxhbnksIFJhd1JhbVF1ZXJ5PE0+LCBhbnksIGFueT4sXG4gICAgcXVlcnk6IFJhd1JhbVF1ZXJ5PE0+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBSQU0gcXVlcnkgZm9yIHBhZ2luYXRpb25cbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgdGhlIHJhdyBxdWVyeSBzdGF0ZW1lbnQgdG8gaW5jbHVkZSBwYWdpbmF0aW9uIHBhcmFtZXRlcnMuXG4gICAqIFRoaXMgcHJvdGVjdGVkIG1ldGhvZCBzZXRzIHRoZSBsaW1pdCBwYXJhbWV0ZXIgb24gdGhlIHF1ZXJ5IHRvIG1hdGNoIHRoZSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8TT59IHJhd1N0YXRlbWVudCAtIFRoZSBvcmlnaW5hbCBxdWVyeSBzdGF0ZW1lbnRcbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IFRoZSBtb2RpZmllZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBSYXdSYW1RdWVyeTxNPik6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICBjb25zdCBxdWVyeTogUmF3UmFtUXVlcnk8YW55PiA9IE9iamVjdC5hc3NpZ24oe30sIHJhd1N0YXRlbWVudCk7XG4gICAgcXVlcnkubGltaXQgPSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBwYWdlIG9mIHJlc3VsdHNcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBza2lwIHZhbHVlIGJhc2VkIG9uIHRoZSBwYWdlIG51bWJlciBhbmQgcGFnZSBzaXplLFxuICAgKiBleGVjdXRlcyB0aGUgcXVlcnksIGFuZCB1cGRhdGVzIHRoZSBjdXJyZW50IHBhZ2UgdHJhY2tpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSAtIFRoZSBwYWdlIG51bWJlciB0byByZXRyaWV2ZSAoMS1iYXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxSW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXN1bHRzIGZvciB0aGUgcmVxdWVzdGVkIHBhZ2VcbiAgICovXG4gIGFzeW5jIHBhZ2UocGFnZTogbnVtYmVyID0gMSk6IFByb21pc2U8UltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMuc3RhdGVtZW50KTtcbiAgICBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoeyAuLi5zdGF0ZW1lbnQsIGxpbWl0OiB1bmRlZmluZWQgfSkgfHwgW107XG4gICAgICAgIHRoaXMuX3JlY29yZENvdW50ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmRDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzdGF0ZW1lbnQ/LmxpbWl0IHx8IHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5fcmVjb3JkQ291bnQgLyBzaXplKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhZ2UgPSB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcbiAgICBzdGF0ZW1lbnQuc2tpcCA9IChwYWdlIC0gMSkgKiB0aGlzLnNpemU7XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHN0YXRlbWVudCk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBQYWdpbmF0b3IsXG4gIFF1ZXJ5RXJyb3IsXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgUmF3UmFtUXVlcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSYW1QYWdpbmF0b3IgfSBmcm9tIFwiLi9SYW1QYWdpbmF0b3JcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJhbUFkYXB0ZXIgfSBmcm9tIFwiLi9SYW1BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTS1zcGVjaWZpYyBxdWVyeSBzdGF0ZW1lbnQgYnVpbGRlclxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBTdGF0ZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBxdWVyeSBidWlsZGluZyBmdW5jdGlvbmFsaXR5IGZvciB0aGUgUkFNIGFkYXB0ZXIuXG4gKiBUaGlzIGNsYXNzIHRyYW5zbGF0ZXMgaGlnaC1sZXZlbCBxdWVyeSBvcGVyYXRpb25zIGludG8gcHJlZGljYXRlcyB0aGF0IGNhbiBmaWx0ZXIgYW5kIHNvcnRcbiAqIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZXMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHF1ZXJpZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IHRoZSBxdWVyeVxuICogQHBhcmFtIHtSYW1BZGFwdGVyfSBhZGFwdGVyIC0gVGhlIFJBTSBhZGFwdGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBjbGFzcyBSYW1TdGF0ZW1lbnRcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBzdGF0ZW1lbnQgZm9yIHF1ZXJ5aW5nIFVzZXIgbW9kZWxzXG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgUmFtU3RhdGVtZW50PFVzZXIsIFVzZXI+KHJhbUFkYXB0ZXIpO1xuICpcbiAqIC8vIEJ1aWxkIGEgcXVlcnkgdG8gZmluZCBhY3RpdmUgdXNlcnMgd2l0aCBhZ2UgPiAxOFxuICogY29uc3QgcmVzdWx0cyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmFuZChcbiAqICAgICBDb25kaXRpb24uZXEoJ2FjdGl2ZScsIHRydWUpLFxuICogICAgIENvbmRpdGlvbi5ndCgnYWdlJywgMTgpXG4gKiAgICkpXG4gKiAgIC5vcmRlckJ5KCdsYXN0TmFtZScsICdhc2MnKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBSYXdSYW1RdWVyeTxNPixcbiAgTSxcbiAgUlxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFJhbUFkYXB0ZXIpIHtcbiAgICBzdXBlcihhZGFwdGVyIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzb3J0IGNvbXBhcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gbW9kZWwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBvcmRlckJ5IGNyaXRlcmlhLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGRpZmZlcmVudCBkYXRhIHR5cGVzIChzdHJpbmcsIG51bWJlciwgZGF0ZSkgYW5kIHNvcnQgZGlyZWN0aW9ucyAoYXNjLCBkZXNjKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb24oTW9kZWwsIE1vZGVsKTogbnVtYmVyfSBBIGNvbXBhcmF0b3IgZnVuY3Rpb24gZm9yIHNvcnRpbmcgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcml2YXRlIGdldFNvcnQoKSB7XG4gICAgcmV0dXJuIChlbDE6IE1vZGVsLCBlbDI6IE1vZGVsKSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBcIm9yZGVyQnlTZWxlY3RvciBub3Qgc2V0LiBTaG91bGQgYmUgaW1wb3NzaWJsZVwiXG4gICAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMub3JkZXJCeVNlbGVjdG9yO1xuICAgICAgY29uc3QgW2tleSwgZGlyZWN0aW9uXSA9IHNlbGVjdG9yO1xuICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoZWwxLCBrZXkgYXMgc3RyaW5nKTtcbiAgICAgIGlmICghdHlwZSlcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBzb3J0aW5nOiAke3R5cGV9YCk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIGNhc2UgXCJTdHJpbmdcIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IDEgOiAtMSkgKlxuICAgICAgICAgICAgKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nKS5sb2NhbGVDb21wYXJlKFxuICAgICAgICAgICAgICBlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAoKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgbnVtYmVyKSAtXG4gICAgICAgICAgICAgIChlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIG51bWJlcikpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gaW5zdGFuY2VvZiBEYXRlICYmXG4gICAgICAgICAgICBlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBpbnN0YW5jZW9mIERhdGVcbiAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAgICgoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBEYXRlKS52YWx1ZU9mKCkgLVxuICAgICAgICAgICAgICAgIChlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIERhdGUpLnZhbHVlT2YoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYFNvcnRpbmcgbm90IHN1cHBvcnRlZCBmb3Igbm90IGRhdGUgY2xhc3Nlc2ApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGBzb3J0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFJBTSBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIHNlbGVjdG9ycyBhbmQgY29uZGl0aW9ucyBpbnRvIGEgUmF3UmFtUXVlcnkgb2JqZWN0XG4gICAqIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRoZSBSQU0gYWRhcHRlci4gVGhpcyBtZXRob2QgYXNzZW1ibGVzIGFsbCBxdWVyeSBjb21wb25lbnRzXG4gICAqIChzZWxlY3QsIGZyb20sIHdoZXJlLCBsaW1pdCwgb2Zmc2V0LCBzb3J0KSBpbnRvIHRoZSBmaW5hbCBxdWVyeSBzdHJ1Y3R1cmUuXG4gICAqIEByZXR1cm4ge1Jhd1JhbVF1ZXJ5PE0+fSBUaGUgY29uc3RydWN0ZWQgUkFNIHF1ZXJ5IG9iamVjdFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkKCk6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJhd1JhbVF1ZXJ5PE0+ID0ge1xuICAgICAgc2VsZWN0OiB0aGlzLnNlbGVjdFNlbGVjdG9yLFxuICAgICAgZnJvbTogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICB3aGVyZTogdGhpcy53aGVyZUNvbmRpdGlvblxuICAgICAgICA/IHRoaXMucGFyc2VDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbikud2hlcmVcbiAgICAgICAgOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgKGVsOiBNKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgbGltaXQ6IHRoaXMubGltaXRTZWxlY3RvcixcbiAgICAgIHNraXA6IHRoaXMub2Zmc2V0U2VsZWN0b3IsXG4gICAgfTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpIHJlc3VsdC5zb3J0ID0gdGhpcy5nZXRTb3J0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHBhZ2luYXRvciBmb3IgdGhlIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgcXVlcnkgYW5kIHdyYXBzIGl0IGluIGEgUmFtUGFnaW5hdG9yIHRvIGVuYWJsZSBwYWdpbmF0aW9uIG9mIHJlc3VsdHMuXG4gICAqIFRoaXMgYWxsb3dzIHJldHJpZXZpbmcgbGFyZ2UgcmVzdWx0IHNldHMgaW4gc21hbGxlciBjaHVua3MuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIHBhZ2Ugc2l6ZSAobnVtYmVyIG9mIHJlc3VsdHMgcGVyIHBhZ2UpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UGFnaW5hdG9yPE0sIFIsIFJhd1JhbVF1ZXJ5PE0+Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yIGZvciB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFJhd1JhbVF1ZXJ5PE0+Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiBuZXcgUmFtUGFnaW5hdG9yPE0sIFI+KFxuICAgICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBzaXplLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBSQU0gcXVlcnkgcHJlZGljYXRlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWRcbiAgICogdG8gZmlsdGVyIG1vZGVsIGluc3RhbmNlcyBpbiBtZW1vcnkuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBzaW1wbGUgY29uZGl0aW9uc1xuICAgKiAoZXF1YWxzLCBncmVhdGVyIHRoYW4sIGV0Yy4pIGFuZCBjb21wbGV4IGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIG9wZXJhdG9ycyAoQU5ELCBPUikuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IEEgUkFNIHF1ZXJ5IG9iamVjdCB3aXRoIGEgd2hlcmUgcHJlZGljYXRlIGZ1bmN0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbVN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFNpbXBsZUNvbmRpdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IENvbXBsZXhDb25kaXRpb25cbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICogICBhbHQgU2ltcGxlIGNvbmRpdGlvbiAoZXEsIGd0LCBsdCwgZXRjLilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlNpbXBsZUNvbmRpdGlvbjogRXh0cmFjdCBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb25cbiAgICogICAgIFNpbXBsZUNvbmRpdGlvbi0tPj5SYW1TdGF0ZW1lbnQ6IFJldHVybiBwcmVkaWNhdGUgZnVuY3Rpb25cbiAgICogICBlbHNlIExvZ2ljYWwgb3BlcmF0b3IgKEFORCwgT1IpXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5Db21wbGV4Q29uZGl0aW9uOiBFeHRyYWN0IG5lc3RlZCBjb25kaXRpb25zXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGxlZnRDb25kaXRpb24pXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKHJpZ2h0Q29uZGl0aW9uKVxuICAgKiAgICAgQ29tcGxleENvbmRpdGlvbi0tPj5SYW1TdGF0ZW1lbnQ6IENvbWJpbmUgcHJlZGljYXRlcyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JcbiAgICogICBlbmRcbiAgICogICBSYW1TdGF0ZW1lbnQtLT4+Q2FsbGVyOiBSZXR1cm4gcXVlcnkgd2l0aCB3aGVyZSBwcmVkaWNhdGVcbiAgICovXG4gIHBhcnNlQ29uZGl0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBSYXdSYW1RdWVyeTxNPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiAobTogTW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICAgICApID09PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkJJR0dFUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID4gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQklHR0VSX0VROlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPj0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuRElGRkVSRU5UOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gIT09IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkVRVUFMOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPT09IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlJFR0VYUDpcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBJbnZhbGlkIHJlZ2V4cCBjb21wYXJpc29uIG9uIGEgbm9uIHN0cmluZyBhdHRyaWJ1dGU6ICR7bVthdHRyMSBhcyBrZXlvZiBNb2RlbF19YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiAhIShtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZykubWF0Y2goXG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChjb21wYXJpc29uLCBcImdcIilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU01BTExFUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIDwgY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU01BTExFUl9FUTpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIDw9IGNvbXBhcmlzb247XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3Igc3RhbmRhcmQgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb3AxOiBSYXdSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGF0dHIxIGFzIENvbmRpdGlvbjxNPlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb3AyOiBSYXdSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pICYmIG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG9wMS53aGVyZShtKSB8fCBvcDIud2hlcmUobSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3IgQW5kL09yIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSBhcyBSYXdSYW1RdWVyeTxhbnk+O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgY2xhc3MgZm9yIFJBTSBhZGFwdGVyIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgY29udGV4dCBmb3IgUkFNIGFkYXB0ZXIgb3BlcmF0aW9ucywgZXh0ZW5kaW5nIHRoZSBiYXNlIENvbnRleHQgd2l0aCBSQU0tc3BlY2lmaWMgZmxhZ3MuIFRoaXMgY29udGV4dCBpcyB1c2VkIHRvIHBhc3Mgb3BlcmF0aW9uIHBhcmFtZXRlcnMgYW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gKiBAY2xhc3MgUmFtQ29udGV4dFxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBSQU0gY29udGV4dFxuICogY29uc3QgY29udGV4dCA9IG5ldyBSYW1Db250ZXh0KCk7XG4gKiAvLyBPcHRpb25hbGx5IHNldCBhIGZsYWdcbiAqIGNvbnRleHQuc2V0KCdVVUlEJywgJzEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCcpO1xuICogLy8gQWNjZXNzIGEgZmxhZyBmcm9tIHRoZSBjb250ZXh0XG4gKiBjb25zdCB1dWlkID0gY29udGV4dC5nZXQoJ1VVSUQnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUmFtQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBCYXNlQ29udGV4dCBhcyBDb250ZXh0XG4gKiAgIENhbGxlci0+PlJhbUNvbnRleHQ6IG5ldyBSYW1Db250ZXh0KClcbiAqICAgUmFtQ29udGV4dC0+PkJhc2VDb250ZXh0OiBzdXBlcigpXG4gKiAgIFJhbUNvbnRleHQtLT4+Q2FsbGVyOiBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgUmFtQ29udGV4dCBleHRlbmRzIENvbnRleHQ8UmFtRmxhZ3M+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEJhc2VNb2RlbCwgaW5kZXgsIHRhYmxlIH0gZnJvbSBcIi4uLy4uL21vZGVsXCI7XG5pbXBvcnQgeyBwayB9IGZyb20gXCIuLi8uLi9pZGVudGl0eVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0gc2VxdWVuY2UgbW9kZWwgZm9yIGF1dG8taW5jcmVtZW50aW5nIHZhbHVlc1xuICogQHN1bW1hcnkgQSBtb2RlbCBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBpbiB0aGUgUkFNIGFkYXB0ZXIuIEl0IHN0b3JlcyB0aGUgY3VycmVudCB2YWx1ZVxuICogb2YgYSBzZXF1ZW5jZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgaWRlbnRpZmllcnMgZm9yIGVudGl0aWVzLlxuICogVGhlIHNlcXVlbmNlIGlzIGlkZW50aWZpZWQgYnkgaXRzIElEIGFuZCBtYWludGFpbnMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gKiBAcGFyYW0ge01vZGVsQXJnPFNlcXVlbmNlPn0gc2VxIC0gSW5pdGlhbCBzZXF1ZW5jZSBkYXRhXG4gKiBAY2xhc3MgU2VxdWVuY2VcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgc2VxdWVuY2VcbiAqIGNvbnN0IG9yZGVyU2VxdWVuY2UgPSBuZXcgU2VxdWVuY2UoeyBpZDogJ29yZGVyX3NlcScsIGN1cnJlbnQ6IDEgfSk7XG4gKlxuICogLy8gVXNlIHRoZSBzZXF1ZW5jZSB0byBnZXQgdGhlIG5leHQgdmFsdWVcbiAqIGNvbnN0IG5leHRPcmRlcklkID0gcGFyc2VJbnQob3JkZXJTZXF1ZW5jZS5jdXJyZW50LnRvU3RyaW5nKCkpICsgMTtcbiAqIG9yZGVyU2VxdWVuY2UuY3VycmVudCA9IG5leHRPcmRlcklkO1xuICogYGBgXG4gKi9cbkB0YWJsZShcIl9fUmFtU2VxdWVuY2VcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUmFtU2VxdWVuY2VNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgaWRlbnRpZmllciBmb3IgdGhlIHNlcXVlbmNlXG4gICAqL1xuICBAcGsoKVxuICBpZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIFVzZWQgdG8gZ2VuZXJhdGUgdGhlIG5leHQgc2VxdWVudGlhbCB2YWx1ZVxuICAgKi9cbiAgQHJlcXVpcmVkKClcbiAgQGluZGV4KClcbiAgY3VycmVudCE6IHN0cmluZyB8IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZXE/OiBNb2RlbEFyZzxSYW1TZXF1ZW5jZU1vZGVsPikge1xuICAgIHN1cGVyKHNlcSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJhbVNlcXVlbmNlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC9SYW1TZXF1ZW5jZU1vZGVsXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IFJhbUFkYXB0ZXIgfSBmcm9tIFwiLi9SYW1BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHNlcXVlbmNlIGltcGxlbWVudGF0aW9uXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIFNlcXVlbmNlIGNsYXNzIHRvIHByb3ZpZGUgYXV0by1pbmNyZW1lbnRpbmcgc2VxdWVuY2UgZnVuY3Rpb25hbGl0eVxuICogZm9yIHRoZSBSQU0gYWRhcHRlci4gVGhpcyBjbGFzcyBtYW5hZ2VzIHNlcXVlbmNlcyBzdG9yZWQgaW4gbWVtb3J5LCBhbGxvd2luZyBmb3IgdGhlIGdlbmVyYXRpb25cbiAqIG9mIHNlcXVlbnRpYWwgaWRlbnRpZmllcnMgZm9yIGVudGl0aWVzLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIHtSYW1BZGFwdGVyfSBhZGFwdGVyIC0gVGhlIFJBTSBhZGFwdGVyIGluc3RhbmNlIHRvIHVzZSBmb3Igc3RvcmFnZVxuICogQGNsYXNzIFJhbVNlcXVlbmNlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IG51bWVyaWMgc2VxdWVuY2Ugc3RhcnRpbmcgYXQgMVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUmFtU2VxdWVuY2Uoe1xuICogICBuYW1lOiAnb3JkZXJfc2VxdWVuY2UnLFxuICogICB0eXBlOiAnTnVtYmVyJyxcbiAqICAgc3RhcnRXaXRoOiAxLFxuICogICBpbmNyZW1lbnRCeTogMVxuICogfSwgcmFtQWRhcHRlcik7XG4gKlxuICogLy8gR2V0IHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICogY29uc3QgbmV4dElkID0gYXdhaXQgc2VxdWVuY2UubmV4dCgpO1xuICpcbiAqIC8vIEdldCBhIHJhbmdlIG9mIHZhbHVlc1xuICogY29uc3QgaWRSYW5nZSA9IGF3YWl0IHNlcXVlbmNlLnJhbmdlKDUpOyAvLyBSZXR1cm5zIDUgc2VxdWVudGlhbCB2YWx1ZXNcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIHByb3RlY3RlZCByZXBvOiBSZXBvPFJhbVNlcXVlbmNlTW9kZWw+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucywgYWRhcHRlcjogUmFtQWRhcHRlcikge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoUmFtU2VxdWVuY2VNb2RlbCwgYWRhcHRlci5hbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UgZnJvbSBzdG9yYWdlLiBJZiB0aGUgc2VxdWVuY2VcbiAgICogZG9lc24ndCBleGlzdCB5ZXQsIGl0IHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgc3RhcnRpbmcgdmFsdWUuXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgc2VxdWVuY2UgdmFsdWVcbiAgICovXG4gIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IG5hbWUsIHN0YXJ0V2l0aCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXF1ZW5jZTogUmFtU2VxdWVuY2VNb2RlbCA9IGF3YWl0IHRoaXMucmVwby5yZWFkKG5hbWUgYXMgc3RyaW5nKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKHNlcXVlbmNlLmN1cnJlbnQgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgICBpZiAodHlwZW9mIHN0YXJ0V2l0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIFwiU3RhcnRpbmcgdmFsdWUgaXMgbm90IGRlZmluZWQgZm9yIGEgbm9uIGV4aXN0aW5nIHNlcXVlbmNlXCJcbiAgICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKHN0YXJ0V2l0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBpbml0aWFsIHZhbHVlIGZvciBzZXF1ZW5jZSAke3N0YXJ0V2l0aH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmV0cmlldmUgY3VycmVudCB2YWx1ZSBmb3Igc2VxdWVuY2UgJHtuYW1lfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHNlcXVlbmNlIHR5cGVcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIHNlcXVlbmNlIChzdHJpbmcsIG51bWJlciwgb3IgYmlnaW50KVxuICAgKiB1c2luZyB0aGUgYmFzZSBTZXF1ZW5jZSBjbGFzcydzIHBhcnNlVmFsdWUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcGFyc2VcbiAgICogQHJldHVybiB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBUaGUgcGFyc2VkIHZhbHVlIGluIHRoZSBjb3JyZWN0IHR5cGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2UodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gICAgcmV0dXJuIFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5vcHRpb25zLnR5cGUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgdmFsdWVcbiAgICogQHN1bW1hcnkgSW5jcmVhc2VzIHRoZSBjdXJyZW50IHNlcXVlbmNlIHZhbHVlIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50IGFuZCBwZXJzaXN0c1xuICAgKiB0aGUgbmV3IHZhbHVlIHRvIHN0b3JhZ2UuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBudW1lcmljIGFuZCBCaWdJbnQgc2VxdWVuY2UgdHlwZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50IC0gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRdIC0gT3B0aW9uYWwgYW1vdW50IHRvIGluY3JlbWVudCBieSwgZGVmYXVsdHMgdG8gdGhlIHNlcXVlbmNlJ3MgaW5jcmVtZW50QnkgdmFsdWVcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHNlcXVlbmNlIHZhbHVlIGFmdGVyIGluY3JlbWVudGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbmNyZW1lbnQoXG4gICAgY3VycmVudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIGNvdW50PzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyB0eXBlLCBpbmNyZW1lbnRCeSwgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGxldCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gICAgY29uc3QgdG9JbmNyZW1lbnRCeSA9IGNvdW50IHx8IGluY3JlbWVudEJ5O1xuICAgIGlmICh0b0luY3JlbWVudEJ5ICUgaW5jcmVtZW50QnkgIT09IDApXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFZhbHVlIHRvIGluY3JlbWVudCBkb2VzIG5vdCBjb25zaWRlciB0aGUgaW5jcmVtZW50Qnkgc2V0dGluZzogJHtpbmNyZW1lbnRCeX1gXG4gICAgICApO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICBuZXh0ID0gKHRoaXMucGFyc2UoY3VycmVudCkgYXMgbnVtYmVyKSArIHRvSW5jcmVtZW50Qnk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICBuZXh0ID0gKHRoaXMucGFyc2UoY3VycmVudCkgYXMgYmlnaW50KSArIEJpZ0ludCh0b0luY3JlbWVudEJ5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gICAgfVxuICAgIGxldCBzZXE6IFJhbVNlcXVlbmNlTW9kZWw7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMucmVwby5vdmVycmlkZSh7XG4gICAgICBpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXM6IFtcInVwZGF0ZWRPblwiXSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgc2VxID0gYXdhaXQgcmVwby51cGRhdGUobmV3IFJhbVNlcXVlbmNlTW9kZWwoeyBpZDogbmFtZSwgY3VycmVudDogbmV4dCB9KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHNlcSA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBSYW1TZXF1ZW5jZU1vZGVsKHsgaWQ6IG5hbWUsIGN1cnJlbnQ6IG5leHQgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXEuY3VycmVudCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UgYW5kIGluY3JlbWVudHMgaXQgYnkgdGhlXG4gICAqIGNvbmZpZ3VyZWQgaW5jcmVtZW50IGFtb3VudC4gVGhpcyBpcyB0aGUgbWFpbiBtZXRob2QgdXNlZCB0byBnZXQgYSBuZXcgc2VxdWVudGlhbCB2YWx1ZS5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5jdXJyZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50KGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSByYW5nZSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIGZyb20gdGhlIHNlcXVlbmNlLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGFsbG9jYXRlIG11bHRpcGxlIElEcyBhdCBvbmNlLlxuICAgKiBUaGUgbWV0aG9kIGluY3JlbWVudHMgdGhlIHNlcXVlbmNlIGJ5IHRoZSB0b3RhbCBhbW91bnQgbmVlZGVkIGFuZCByZXR1cm5zIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIGdlbmVyYXRlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gKGF3YWl0IHRoaXMuY3VycmVudCgpKSBhcyBudW1iZXI7XG4gICAgY29uc3QgaW5jcmVtZW50QnkgPSB0aGlzLnBhcnNlKFxuICAgICAgdGhpcy5vcHRpb25zLmluY3JlbWVudEJ5IGFzIG51bWJlclxuICAgICkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IGF3YWl0IHRoaXMuaW5jcmVtZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgICh0aGlzLnBhcnNlKGNvdW50KSBhcyBudW1iZXIpICogaW5jcmVtZW50QnlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlOiAobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICByYW5nZS5wdXNoKGN1cnJlbnQgKyBpbmNyZW1lbnRCeSAqICh0aGlzLnBhcnNlKGkpIGFzIG51bWJlcikpO1xuICAgIH1cbiAgICBpZiAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT09IG5leHQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc2NhbGN1bGF0aW9uIG9mIHJhbmdlXCIpO1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsXCI7XG5pbXBvcnQgeyBSYW1GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNyZWF0ZWQgYnkgZmllbGQgb24gYSBtb2RlbCBkdXJpbmcgUkFNIGNyZWF0ZS91cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQXV0b21hdGljYWxseSBwb3B1bGF0ZXMgYSBtb2RlbCBmaWVsZCB3aXRoIHRoZSBVVUlEIGZyb20gdGhlIGNvbnRleHQgZHVyaW5nIGNyZWF0ZSBvciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGhhbmRsZXIgZm9yIFJBTSBvcGVyYXRpb25zIHRvIHRyYWNrIGVudGl0eSBjcmVhdGlvbi5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBvZiB0aGUgbW9kZWwgYmVpbmcgY3JlYXRlZC91cGRhdGVkXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgb2YgdGhlIHJlcG9zaXRvcnkgaGFuZGxpbmcgdGhlIG1vZGVsXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUeXBlIG9mIHRoZSBSQU0gZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIHVzZXIgaWRlbnRpZmljYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSBVVUlEXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQvdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmllbGQgaGFzIGJlZW4gc2V0XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQGNhdGVnb3J5IFJhbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJhbUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gIGlmICghdXVpZClcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICAgKTtcbiAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIHRoZSBSQU0gYWRhcHRlclxuICogQHN1bW1hcnkgQSBjb25zdGFudCBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBSQU0gYWRhcHRlciBpbiB0aGUgc3lzdGVtLiBVc2VkIGZvciBhZGFwdGVyIHR5cGUgaWRlbnRpZmljYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gYWNyb3NzIHRoZSBjb3JlIG1vZHVsZS5cbiAqIEBjb25zdCBSYW1GbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IGNvbnN0IFJhbUZsYXZvdXIgPSBcInJhbVwiO1xuIiwiaW1wb3J0IHtcbiAgUmFtRmxhZ3MsXG4gIFJhd1JhbVF1ZXJ5LFxuICBSYW1TdG9yYWdlLFxuICBSYW1SZXBvc2l0b3J5LFxuICBSYW1Db25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSYW1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9SYW1TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJhbUNvbnRleHQgfSBmcm9tIFwiLi9SYW1Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzLCBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvY2sgfSBmcm9tIFwiQGRlY2FmLXRzL3RyYW5zYWN0aW9uYWwtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGhhc2hPYmosXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1TZXF1ZW5jZSB9IGZyb20gXCIuL1JhbVNlcXVlbmNlXCI7XG5pbXBvcnQgeyBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuL2hhbmRsZXJzXCI7XG5pbXBvcnQgeyBSYW1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChSYW1GbGF2b3VyKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IGFkYXB0ZXIgZm9yIGRhdGEgcGVyc2lzdGVuY2VcbiAqIEBzdW1tYXJ5IFRoZSBSYW1BZGFwdGVyIHByb3ZpZGVzIGFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuXG4gKiBJdCBzdG9yZXMgZGF0YSBpbiBKYXZhU2NyaXB0IE1hcHMgYW5kIHByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgcXVlcnkgY2FwYWJpbGl0aWVzLlxuICogVGhpcyBhZGFwdGVyIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgcHJvdG90eXBpbmcsIGFuZCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCByZXF1aXJlXG4gKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWNyb3NzIGFwcGxpY2F0aW9uIHJlc3RhcnRzLlxuICogQGNsYXNzIFJhbUFkYXB0ZXJcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgUkFNIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUmFtQWRhcHRlcignbXlSYW1BZGFwdGVyJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShVc2VyLCBhZGFwdGVyKTtcbiAqXG4gKiAvLyBQZXJmb3JtIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYXdhaXQgdXNlclJlcG8uY3JlYXRlKHVzZXIpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLmZpbmRCeUlkKHVzZXIuaWQpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICogICBSYW1BZGFwdGVyLS0+PlJlcG9zaXRvcnk6IG1vZGVsXG4gKiAgIFJlcG9zaXRvcnktLT4+Q2xpZW50OiBtb2RlbFxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogZmluZEJ5SWQoaWQpXG4gKiAgIFJlcG9zaXRvcnktPj5SYW1BZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogbW9kZWxcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBSYW1Db25maWcsXG4gIFJhbVN0b3JhZ2UsXG4gIFJhd1JhbVF1ZXJ5PGFueT4sXG4gIFJhbUZsYWdzLFxuICBSYW1Db250ZXh0XG4+IHtcbiAgY29uc3RydWN0b3IoY29uZjogUmFtQ29uZmlnID0ge30gYXMgYW55LCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKGNvbmYsIFJhbUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGUgc3BlY2lmaWVkIG1vZGVsIHR5cGUuXG4gICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIFJBTS1zcGVjaWZpYyByZXBvc2l0b3J5IGZ1bmN0aW9uYWxpdHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSByZXBvc2l0b3J5XG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+fSBBIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBSQU0gcmVwb3NpdG9yaWVzXG4gICAqL1xuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oKTogQ29uc3RydWN0b3I8XG4gICAgUmFtUmVwb3NpdG9yeTxNPlxuICA+IHtcbiAgICByZXR1cm4gc3VwZXIucmVwb3NpdG9yeTxNPigpIGFzIENvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9wZXJhdGlvbiBmbGFncyB3aXRoIFVVSURcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBmbGFncyB3aXRoIGEgVVVJRCBmb3IgdXNlciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IGFsbCBvcGVyYXRpb25zIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxSYW1GbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBiZSBleHRlbmRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJhbUZsYWdzPn0gQ29tcGxldGUgZmxhZ3Mgd2l0aCBVVUlEXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UmFtRmxhZ3M+XG4gICk6IFByb21pc2U8UmFtRmxhZ3M+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IHRoaXMuY29uZmlnLnVzZXIgfHwgXCJcIiArIERhdGUubm93KCksXG4gICAgfSkgYXMgUmFtRmxhZ3M7XG4gIH1cblxuICBvdmVycmlkZSBDb250ZXh0ID0gUmFtQ29udGV4dDtcblxuICBwcml2YXRlIGluZGV4ZXM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgYW55Pj5cbiAgPiA9IHt9O1xuXG4gIHByaXZhdGUgbG9jayA9IG5ldyBMb2NrKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRleGVzIG1vZGVscyBpbiB0aGUgUkFNIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQSBuby1vcCBpbmRleGluZyBtZXRob2QgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAgICogU2luY2UgUkFNIGFkYXB0ZXIgZG9lc24ndCByZXF1aXJlIGV4cGxpY2l0IGluZGV4aW5nLCB0aGlzIG1ldGhvZCBzaW1wbHkgcmVzb2x2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBNb2RlbHMgdG8gYmUgaW5kZXhlZCAodW51c2VkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5kZXhpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5kZXgoLi4ubW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3Igc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIHRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBzdG9yYWdlIGluIHRoZSBSQU0gYWRhcHRlci5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHByaW1hcnkga2V5IGFuZCBjcmVhdGVzIGEgcmVjb3JkIHdpdGhvdXQgdGhlIHByaW1hcnkga2V5IGZpZWxkLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHByZXBhcmVkXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIE9iamVjdCBjb250YWluaW5nIHRoZSByZWNvcmQgYW5kIElEXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKTogeyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47IGlkOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG4gICAgZGVsZXRlIHByZXBhcmVkLnJlY29yZFtwayBhcyBzdHJpbmddO1xuICAgIHJldHVybiBwcmVwYXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdG9yZWQgcmVjb3JkIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZWNvbnN0cnVjdHMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgc3RvcmVkIHJlY29yZCBieSBhZGRpbmcgYmFjayB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBwcmVwYXJlIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0byByZXZlcnQgdG9cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc3RvcmVkIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjbGFzcyBvciBuYW1lXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IE0ge1xuICAgIGNvbnN0IHJlcyA9IHN1cGVyLnJldmVydChvYmosIGNsYXp6LCBwaywgaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBzcGVjaWZpZWQgdGFibGUgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIGEgbG9jayB0byBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgY3JlYXRlcyB0aGUgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCxcbiAgICogY2hlY2tzIGZvciBjb25mbGljdHMsIGFuZCBzdG9yZXMgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZWNvcmQgaW5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGEgdG8gc3RvcmVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHN0b3JlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQodGFibGVOYW1lLCBuZXcgTWFwKCkpXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGV4aXN0c1xuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IENvbmZsaWN0RXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSkgdGhpcy5jbGllbnQuc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKTtcbiAgICBpZiAodGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSkgJiYgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0YWJsZSBhbmQgcmVjb3JkIGV4aXN0IGFuZCB0aHJvd3MgYXBwcm9wcmlhdGUgZXJyb3JzIGlmIG5vdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZXRyaWV2ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogYW5kIHVwZGF0ZXMgdGhlIHJlY29yZCB3aXRoIHRoZSBuZXcgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbmV3IHJlY29yZCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogcmV0cmlldmVzIHRoZSByZWNvcmQgYmVmb3JlIGRlbGV0aW9uLCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gc3RvcmFnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IGRlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZGVsZXRlKGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgbmF0aXZlZCA9IHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICAgIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5kZWxldGUoaWQpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG5hdGl2ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIHRhYmxlIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIE1hcCByZXByZXNlbnRpbmcgYSB0YWJsZSBmb3IgYSBnaXZlbiBtb2RlbCBvciB0YWJsZSBuYW1lLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lc24ndCBleGlzdCwgaXQgY3JlYXRlcyBhIG5ldyBvbmUuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHVzZWRcbiAgICogYnkgb3RoZXIgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIGNvcnJlY3Qgc3RvcmFnZSBsb2NhdGlvbi5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3I8TT59IGZyb20gLSBUaGUgbW9kZWwgY2xhc3Mgb3IgdGFibGUgbmFtZVxuICAgKiBAcmV0dXJuIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBhbnk+IHwgdW5kZWZpbmVkfSBUaGUgdGFibGUgTWFwIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJvdGVjdGVkIHRhYmxlRm9yPE0gZXh0ZW5kcyBNb2RlbD4oZnJvbTogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09IFwic3RyaW5nXCIpIGZyb20gPSBNb2RlbC5nZXQoZnJvbSkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgY29uc3QgdGFibGUgPSBSZXBvc2l0b3J5LnRhYmxlKGZyb20pO1xuICAgIGlmICghdGhpcy5jbGllbnQuaGFzKHRhYmxlKSkgdGhpcy5jbGllbnQuc2V0KHRhYmxlLCBuZXcgTWFwKCkpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQodGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIHF1ZXJ5IG9wZXJhdGlvbiBvbiB0aGUgaW4tbWVtb3J5IGRhdGEgc3RvcmUgdXNpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5IHNwZWNpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGZpbHRlcmluZywgc29ydGluZywgcGFnaW5hdGlvbiwgYW5kIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8YW55Pn0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgc3BlY2lmaWNhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJhdyhyYXdJbnB1dClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogdGFibGVGb3IoZnJvbSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSlcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZW50cmllcygpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiBlbnRyaWVzXG4gICAqICAgbG9vcCBGb3IgZWFjaCBlbnRyeVxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJldmVydChyLCBmcm9tLCBpZCwgcGspXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFdoZXJlIGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuZmlsdGVyKHdoZXJlKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTb3J0IGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc29ydChzb3J0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTa2lwIHNwZWNpZmllZFxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5zbGljZShza2lwKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBMaW1pdCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2UoMCwgbGltaXQpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFNlbGVjdCBmaWVsZHMgc3BlY2lmaWVkXG4gICAqICAgICBsb29wIEZvciBlYWNoIHJlc3VsdFxuICAgKiAgICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogRmlsdGVyIHRvIHNlbGVjdGVkIGZpZWxkc1xuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBSYXdSYW1RdWVyeTxhbnk+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyB3aGVyZSwgc29ydCwgbGltaXQsIHNraXAsIGZyb20gfSA9IHJhd0lucHV0O1xuICAgIGxldCB7IHNlbGVjdCB9ID0gcmF3SW5wdXQ7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHRoaXMudGFibGVGb3IoZnJvbSk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFRhYmxlICR7ZnJvbX0gbm90IGZvdW5kIGluIFJhbUFkYXB0ZXJgKTtcbiAgICBjb25zdCB7IGlkLCBwcm9wcyB9ID0gZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSk7XG5cbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IEFycmF5LmZyb20oY29sbGVjdGlvbi5lbnRyaWVzKCkpLm1hcCgoW3BrLCByXSkgPT5cbiAgICAgIHRoaXMucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICBmcm9tLFxuICAgICAgICBpZCBhcyBhbnksXG4gICAgICAgIFNlcXVlbmNlLnBhcnNlVmFsdWUocHJvcHMudHlwZSBhcyBhbnksIHBrIGFzIHN0cmluZykgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcblxuICAgIHJlc3VsdCA9IHdoZXJlID8gcmVzdWx0LmZpbHRlcih3aGVyZSkgOiByZXN1bHQ7XG5cbiAgICBpZiAoc29ydCkgcmVzdWx0ID0gcmVzdWx0LnNvcnQoc29ydCk7XG5cbiAgICBpZiAoc2tpcCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKHNraXApO1xuICAgIGlmIChsaW1pdCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGxpbWl0KTtcblxuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIHNlbGVjdCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0KSA/IHNlbGVjdCA6IFtzZWxlY3RdO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocikgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocikucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoKHNlbGVjdCBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoa2V5KSkgYWNjW2tleV0gPSB2YWw7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGNvbnZlcnRzIGVycm9ycyB0byBhcHByb3ByaWF0ZSB0eXBlc1xuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgZXJyb3JzIGFyZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nLlxuICAgKiBJZiB0aGUgZXJyb3IgaXMgYWxyZWFkeSBhIEJhc2VFcnJvciwgaXQncyByZXR1cm5lZCBhcyBpczsgb3RoZXJ3aXNlLCBpdCdzIHdyYXBwZWQgaW4gYW4gSW50ZXJuYWxFcnJvci5cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgZXhwZWN0ZWQgZXJyb3IgdHlwZSwgZXh0ZW5kaW5nIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHJldHVybiB7Vn0gVGhlIHBhcnNlZCBlcnJvciBvZiB0aGUgZXhwZWN0ZWQgdHlwZVxuICAgKi9cbiAgcGFyc2VFcnJvcjxWIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yKTogViB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBWO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIHF1ZXJpZXNcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFJhbVN0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllcy5cbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIGZvciBmbHVlbnQgcXVlcnkgY29uc3RydWN0aW9uIGFnYWluc3QgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgc3RhdGVtZW50XG4gICAqIEByZXR1cm4ge1JhbVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oKTogUmFtU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgUmFtU3RhdGVtZW50PE0sIGFueT4odGhpcyBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgSURzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TZXF1ZW5jZSBpbnN0YW5jZSBmb3IgSUQgZ2VuZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIGF1dG8taW5jcmVtZW50aW5nIHNlcXVlbmNlcyBmb3IgZW50aXR5IElEcy5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG92ZXJyaWRlIGZvcihjb25maWc6IFBhcnRpYWw8UmFtQ29uZmlnPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcywgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcIl9jb25maWdcIikge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ29uZjogUmFtQ29uZmlnID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsQ29uZiwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucHJveGllc1trZXldID0gcHJveHk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHVwIFJBTS1zcGVjaWZpYyBkZWNvcmF0aW9ucyBmb3IgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRpb25zIGZvciBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBmaWVsZHMgaW4gdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBzZXQgdXAgaGFuZGxlcnMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gICAqIHBvcHVsYXRlIHRoZXNlIGZpZWxkcyB3aXRoIHRoZSBjdXJyZW50IHVzZXIncyBVVUlEIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAgICpcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogY3JlYXRlZEJ5S2V5XG4gICAqICAgUmFtQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlJhbUFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IodXBkYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKTogdm9pZCB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IFJhbVN0b3JhZ2Uge1xuICAgIHJldHVybiBuZXcgTWFwKCk7XG4gIH1cbn1cblxuUmFtQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoUmFtRmxhdm91cik7XG4iLCIvKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGRlc2NyaXB0aW9uIENvcmUgbW9kdWxlIGZvciB0aGUgRGVjYWYgVHlwZVNjcmlwdCBmcmFtZXdvcmtcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50cyBvZiB0aGUgRGVjYWYgZnJhbWV3b3JrLCBpbmNsdWRpbmcgaWRlbnRpdHkgbWFuYWdlbWVudCxcbiAqIG1vZGVsIGRlZmluaXRpb25zLCByZXBvc2l0b3J5IHBhdHRlcm5zLCBwZXJzaXN0ZW5jZSBsYXllciwgcXVlcnkgYnVpbGRpbmcsIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqIEl0IGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgc2V0cyB1cCB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeSBmb3IgcmVwb3NpdG9yeSBkZWNvcmF0b3JzLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5L2luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8vIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgSW5qZWN0YWJsZXMgcmVnaXN0cnkgdG8gZW5hYmxlIHRoZSBAcmVwb3NpdG9yeSBkZWNvcmF0b3JcbkluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCkpO1xuXG4vLyBpbXBvcnRlZCBmaXJzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYW0vUmFtQWRhcHRlclwiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJSZXBvc2l0b3J5IiwiUmVwbyIsIlJlcCIsInBvcHVsYXRlIiwicG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOzs7Ozs7QUFNRztJQUNTO0FBQVosQ0FBQSxVQUFZLGVBQWUsRUFBQTs7QUFFekIsSUFBQSxlQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFHZixJQUFBLGVBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjs7QUFHakIsSUFBQSxlQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7O0FBR25CLElBQUEsZUFBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLDJCQUF3Qzs7QUFHeEMs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O0FBREMsSUFBQSxLQUFLLEVBQUU7Ozs7QUFTUCxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxRQUFBLEVBQUEsSUFBQSxDQUFBO0FBR0QsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7O0FBRUksSUFBQSxVQUFBLENBQUEsbUJBQUEsRUFBQSxDQUFBLFFBQUEsRUFBQSxHQUFBLE9BQUEsQ0FBQyxvQkFBRCxDQUFDLENBQUEsS0FBQSxVQUFBLEdBQUEsRUFBQSxHQUFBLE1BQUEsQ0FBQSxDQUFBOztBQUlaLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLENBQUE7QUFHRCxVQUFBLENBQUE7QUFEQyxJQUFBLEtBQUssRUFBRTs7QUFDbUMsSUFBQSxVQUFBLENBQUEsbUJBQUEsRUFBQSxDQUFBLFFBQUEsRUFBQSxHQUFBLE9BQUEsQ0FBQyxvQkFBRCxDQUFDLENBQUEsS0FBQSxVQUFBLEdBQUEsRUFBQSxHQUFBLE1BQUEsQ0FBQSxDQUFBOztBQUczQyxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxLQUFBLEVBQUEsSUFBQSxDQUFBO0FBR0QsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7O0FBQ21DLElBQUEsVUFBQSxDQUFBLG1CQUFBLEVBQUEsQ0FBQSxRQUFBLEVBQUEsR0FBQSxPQUFBLENBQUMsb0JBQUQsQ0FBQyxDQUFBLEtBQUEsVUFBQSxHQUFBLEVBQUEsR0FBQSxNQUFBLENBQUEsQ0FBQTs7QUFHM0MsQ0FBQSxFQUFBLFNBQUEsQ0FBQSxTQUFBLEVBQUEsS0FBQSxFQUFBLElBQUEsQ0FBQTtBQUdELFVBQUEsQ0FBQTtBQURDLElBQUEsS0FBSyxFQUFFOztBQUNzQyxJQUFBLFVBQUEsQ0FBQSxtQkFBQSxFQUFBLENBQUEsUUFBQSxFQUFBLEdBQUEsT0FBQSxDQUFDLG9CQUFELENBQUMsQ0FBQSxLQUFBLFVBQUEsR0FBQSxFQUFBLEdBQUEsTUFBQSxDQUFBLENBQUE7O0FBRzlDLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFB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