@decaf-ts/core 0.5.37 → 0.5.39

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
@@ -3801,10 +3801,9 @@ function manyToOne(clazz, cascadeOptions = DefaultCascade, populate = true, join
3801
3801
  // Model.register(clazz as Constructor<M>);
3802
3802
  const key = Repository.key(PersistenceKeys.MANY_TO_ONE);
3803
3803
  function manyToOneDec(clazz, cascade, populate, joinTableOpts, fk) {
3804
- if (!clazz.name)
3805
- clazz = clazz();
3804
+ const clazzName = () => (clazz?.name ? clazz : clazz()).name;
3806
3805
  const metadata = {
3807
- class: clazz.name ? clazz.name : clazz,
3806
+ class: clazz?.name ? clazz.name : clazz,
3808
3807
  cascade: cascade,
3809
3808
  populate: populate,
3810
3809
  };
@@ -3812,12 +3811,7 @@ function manyToOne(clazz, cascadeOptions = DefaultCascade, populate = true, join
3812
3811
  metadata.joinTable = joinTableOpts;
3813
3812
  if (fk)
3814
3813
  metadata.name = fk;
3815
- return apply(prop(PersistenceKeys.RELATIONS), type([
3816
- clazz.name ? clazz.name : clazz,
3817
- String.name,
3818
- Number.name,
3819
- BigInt.name,
3820
- ]),
3814
+ return apply(prop(PersistenceKeys.RELATIONS), type([clazzName, String.name, Number.name, BigInt.name]),
3821
3815
  // onCreate(oneToManyOnCreate, metadata),
3822
3816
  // onUpdate(oneToManyOnUpdate, metadata),
3823
3817
  // onDelete(oneToManyOnDelete, metadata),
@@ -5653,8 +5647,6 @@ class RamAdapter extends Adapter {
5653
5647
  return new Map();
5654
5648
  }
5655
5649
  }
5656
- RamAdapter.decoration();
5657
- Adapter.setCurrent(RamFlavour);
5658
5650
 
5659
5651
  /**
5660
5652
  * @module core
@@ -5671,7 +5663,7 @@ Injectables.setRegistry(new InjectablesRegistry());
5671
5663
  * @const VERSION
5672
5664
  * @memberOf module:core
5673
5665
  */
5674
- const VERSION = "0.5.37";
5666
+ const VERSION = "0.5.38";
5675
5667
 
5676
5668
  export { Adapter, AuthorizationError, BaseModel, BigIntSequence, Cascade, Condition, ConnectionError, DefaultCascade, DefaultSequenceOptions, Dispatch, ForbiddenError, GroupOperator, InjectablesRegistry, MethodQueryBuilder, NoneSequenceOptions, NumericSequence, ObserverError, ObserverHandler, Operator, OperatorsMap, OrderDirection, Paginator, PagingError, PersistenceKeys, QueryClause, 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, query, repository, repositoryFromTypeMetadata, sequenceNameForModel, table, unique, uniqueOnCreateUpdate, updatedAt, updatedBy, uses };
5677
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvcGVyc2lzdGVuY2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2Vycm9ycy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9TZXF1ZW5jZS50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvZXJyb3JzLnRzIiwiLi4vc3JjL3F1ZXJ5L0NvbmRpdGlvbi50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvRGlzcGF0Y2gudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIiwiLi4vc3JjL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2lkZW50aXR5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvcXVlcnkvdHlwZXMudHMiLCIuLi9zcmMvcXVlcnkvdXRpbHMudHMiLCIuLi9zcmMvcXVlcnkvTWV0aG9kUXVlcnlCdWlsZGVyLnRzIiwiLi4vc3JjL3F1ZXJ5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmFtL1JhbVBhZ2luYXRvci50cyIsIi4uL3NyYy9yYW0vUmFtU3RhdGVtZW50LnRzIiwiLi4vc3JjL3JhbS9SYW1Db250ZXh0LnRzIiwiLi4vc3JjL3JhbS9tb2RlbC9SYW1TZXF1ZW5jZU1vZGVsLnRzIiwiLi4vc3JjL3JhbS9SYW1TZXF1ZW5jZS50cyIsIi4uL3NyYy9yYW0vaGFuZGxlcnMudHMiLCIuLi9zcmMvcmFtL2NvbnN0YW50cy50cyIsIi4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBQZXJzaXN0ZW5jZS1yZWxhdGVkIGNvbnN0YW50IGtleXNcbiAqIEBzdW1tYXJ5IEVudW0gY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIG1ldGFkYXRhLCByZWxhdGlvbnMsIGFuZCBvdGhlciBwZXJzaXN0ZW5jZS1yZWxhdGVkIG9wZXJhdGlvbnNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBQZXJzaXN0ZW5jZUtleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgaW5kZXggbWV0YWRhdGEgKi9cbiAgSU5ERVggPSBcImluZGV4XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVuaXF1ZSBjb25zdHJhaW50IG1ldGFkYXRhICovXG4gIFVOSVFVRSA9IFwidW5pcXVlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGFkYXB0ZXIgbWV0YWRhdGEgKi9cbiAgQURBUFRFUiA9IFwiYWRhcHRlclwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVGVtcGxhdGUgZm9yIGluamVjdGFibGUgYWRhcHRlciBuYW1lcyAqL1xuICBJTkpFQ1RBQkxFID0gXCJkZWNhZl97MH1fYWRhcHRlcl9mb3JfezF9XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRhYmxlIG5hbWUgbWV0YWRhdGEgKi9cbiAgVEFCTEUgPSBcInRhYmxlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNvbHVtbiBuYW1lIG1ldGFkYXRhICovXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGdlbmVyYWwgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBNRVRBREFUQSA9IFwiX19tZXRhZGF0YVwiLFxuXG4gIC8vIE93bmVyc2hpcFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgT1dORVJTSElQID0gXCJvd25lcnNoaXBcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgQ1JFQVRFRF9CWSA9IGAke09XTkVSU0hJUH0uY3JlYXRlZC1ieWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVwZGF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIFVQREFURURfQlkgPSBgJHtPV05FUlNISVB9LnVwZGF0ZWQtYnlgLFxuXG4gIC8vIFJlbGF0aW9uc1xuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciByZWxhdGlvbnMgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBSRUxBVElPTlMgPSBcIl9fcmVsYXRpb25zXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OID0gXCJyZWxhdGlvblwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBvbmUtdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19PTkUgPSBgJHtSRUxBVElPTn0ub25lLXRvLW9uZWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1tYW55IHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm9uZS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19PTkUgPSBgJHtSRUxBVElPTn0ubWFueS10by1vbmVgLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm1hbnktdG8tbWFueWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHBvcHVsYXRlIG1ldGFkYXRhICovXG4gIFBPUFVMQVRFID0gXCJwb3B1bGF0ZVwiLFxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1ha2VzIGEgbWV0aG9kIG5vbi1jb25maWd1cmFibGVcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIHByZXZlbnRzIGEgbWV0aG9kIGZyb20gYmVpbmcgb3ZlcnJpZGRlbiBieSBtYWtpbmcgaXQgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEl0IHRocm93cyBhbiBlcnJvciBpZiB1c2VkIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtZXRob2RzXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbCBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBtZXRob2RzXCIpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5jb25maWd1cmFibGUpIHtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQmFkUmVxdWVzdEVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIGFuIGFjdGlvblxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gd2l0aG91dCBwcm9wZXIgYXV0aGVudGljYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGFuIEF1dGhvcml6YXRpb25FcnJvclxuICogaWYgKCF1c2VyLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gKiAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoJ1VzZXIgbm90IGF1dGhlbnRpY2F0ZWQnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgQmFkUmVxdWVzdEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciwgbmFtZSA9IEF1dGhvcml6YXRpb25FcnJvci5uYW1lLCBjb2RlID0gNDAxKSB7XG4gICAgc3VwZXIobXNnLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHVzZXIgaXMgZm9yYmlkZGVuIGZyb20gYWNjZXNzaW5nIGEgcmVzb3VyY2VcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gYXV0aGVudGljYXRlZCB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHJlc291cmNlIG9yIHBlcmZvcm0gYW4gYWN0aW9uIHRoZXkgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGZvclxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGb3JiaWRkZW5FcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgdGhyb3dpbmcgYSBGb3JiaWRkZW5FcnJvclxuICogaWYgKCF1c2VyLmhhc1Blcm1pc3Npb24oJ2FkbWluJykpIHtcbiAqICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdVc2VyIGRvZXMgbm90IGhhdmUgYWRtaW4gcGVybWlzc2lvbnMnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBBdXRob3JpemF0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yLCBuYW1lID0gRm9yYmlkZGVuRXJyb3IubmFtZSkge1xuICAgIHN1cGVyKG1zZywgbmFtZSwgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2aWNlIGZhaWxzXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBhcHBsaWNhdGlvbiBmYWlscyB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVxdWlyZWQgc2VydmljZSBvciByZXNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBDb25uZWN0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgQ29ubmVjdGlvbkVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBkYXRhYmFzZS5jb25uZWN0KCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byBkYXRhYmFzZScpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29ubmVjdGlvbkVycm9yLm5hbWUsIDUwMyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBPYnNlcnZlckZpbHRlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIG9ic2VydmVycyBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gKiBAc3VtbWFyeSBUaGUgT2JzZXJ2ZXJIYW5kbGVyIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGNlbnRyYWxpemVkXG4gKiB3YXkgdG8gbWFuYWdlIG11bHRpcGxlIG9ic2VydmVycy4gSXQgYWxsb3dzIHJlZ2lzdGVyaW5nIG9ic2VydmVycyB3aXRoIG9wdGlvbmFsIGZpbHRlcnMgdG8gY29udHJvbFxuICogd2hpY2ggZXZlbnRzIHRoZXkgcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvciwgYW5kIGhhbmRsZXMgdGhlIHByb2Nlc3Mgb2Ygbm90aWZ5aW5nIGFsbCByZWxldmFudFxuICogb2JzZXJ2ZXJzIHdoZW4gZGF0YWJhc2UgZXZlbnRzIG9jY3VyLlxuICogQGNsYXNzIE9ic2VydmVySGFuZGxlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhbiBvYnNlcnZlciBoYW5kbGVyXG4gKiBjb25zdCBoYW5kbGVyID0gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyXG4gKiBjb25zdCBteU9ic2VydmVyID0ge1xuICogICByZWZyZXNoOiBhc3luYyAodGFibGUsIGV2ZW50LCBpZCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGBDaGFuZ2UgaW4gJHt0YWJsZX06ICR7ZXZlbnR9IGZvciBJRCAke2lkfWApO1xuICogICB9XG4gKiB9O1xuICpcbiAqIC8vIEFkZCBvYnNlcnZlciB3aXRoIGEgZmlsdGVyIGZvciBvbmx5IHVzZXIgdGFibGUgZXZlbnRzXG4gKiBoYW5kbGVyLm9ic2VydmUobXlPYnNlcnZlciwgKHRhYmxlLCBldmVudCwgaWQpID0+IHRhYmxlID09PSAndXNlcnMnKTtcbiAqXG4gKiAvLyBOb3RpZnkgb2JzZXJ2ZXJzIGFib3V0IGFuIGV2ZW50XG4gKiBhd2FpdCBoYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhsb2dnZXIsICd1c2VycycsICdDUkVBVEUnLCAxMjMpO1xuICpcbiAqIC8vIFJlbW92ZSBhbiBvYnNlcnZlciB3aGVuIG5vIGxvbmdlciBuZWVkZWRcbiAqIGhhbmRsZXIudW5PYnNlcnZlKG15T2JzZXJ2ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNlcnZlckhhbmRsZXIgaW1wbGVtZW50cyBPYnNlcnZhYmxlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG9ic2VydmVyIG9iamVjdHMgYWxvbmcgd2l0aCB0aGVpciBvcHRpb25hbCBmaWx0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJzOiB7XG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyO1xuICAgIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyO1xuICB9W10gPSBbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjb3VudCBvZiBvYnNlcnZlcnMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGhhbmRsZXJcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqL1xuICBjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBuZXcgb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byB0aGUgY29sbGVjdGlvbiB3aXRoIGFuIG9wdGlvbmFsIGZpbHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5tYXAoKG8pID0+IG8ub2JzZXJ2ZXIpLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiT2JzZXJ2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goeyBvYnNlcnZlcjogb2JzZXJ2ZXIsIGZpbHRlcjogZmlsdGVyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIGZyb20gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byBmaW5kIE9ic2VydmVyXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCByZWxldmFudCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG9ic2VydmVycyBiYXNlZCBvbiB0aGVpciBmaWx0ZXIgZnVuY3Rpb25zIGFuZCBjYWxscyByZWZyZXNoIG9uIGVhY2ggbWF0Y2hpbmcgb2JzZXJ2ZXJcbiAgICogQHBhcmFtIHtMb2dnZXJ9IGxvZyAtIExvZ2dlciBmb3IgcmVjb3JkaW5nIG5vdGlmaWNhdGlvbiBhY3Rpdml0aWVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlckhhbmRsZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlclxuICAgKlxuICAgKiAgIENsaWVudC0+Pk9ic2VydmVySGFuZGxlcjogdXBkYXRlT2JzZXJ2ZXJzKGxvZywgdGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IEZpbHRlciBvYnNlcnZlcnNcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIG9ic2VydmVyIHdpdGggbWF0Y2hpbmcgZmlsdGVyXG4gICAqICAgICBhbHQgT2JzZXJ2ZXIgaGFzIGZpbHRlclxuICAgKiAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogQXBwbHkgZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpXG4gICAqICAgICAgIGFsdCBGaWx0ZXIgdGhyb3dzIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgdHJ1ZVxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgZmFsc2VcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBObyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IHJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVySGFuZGxlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgIGFsdCBSZXN1bHQgaXMgcmVqZWN0ZWRcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0tPj5DbGllbnQ6IFJldHVyblxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIGxvZzogTG9nZ2VyLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aGlzLm9ic2VydmVyc1xuICAgICAgICAuZmlsdGVyKChvKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXIgfSA9IG87XG4gICAgICAgICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBmaWx0ZXIgb2JzZXJ2ZXIgJHtvLm9ic2VydmVyLnRvU3RyaW5nKCl9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKG8pID0+IHtcbiAgICAgICAgICBvLm9ic2VydmVyLnJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXS50b1N0cmluZygpfTogJHtyZXN1bHQucmVhc29ufWBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbCBieSBjaGVja2luZyBtZXRhZGF0YSBvciBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbnN0cnVjdG9yIG5hbWVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3RvciB0byBnZXQgdGhlIHRhYmxlIG5hbWUgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWxcbiAqIEBmdW5jdGlvbiBnZXRUYWJsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZyB7XG4gIGNvbnN0IG9iaiA9IG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsO1xuXG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLFxuICAgIG9ialtNb2RlbEtleXMuQU5DSE9SIGFzIHVua25vd24gYXMga2V5b2YgdHlwZW9mIG9ial0gfHwgb2JqXG4gICk7XG4gIGlmIChtZXRhZGF0YSkge1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgIHJldHVybiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIHJldHVybiBtb2RlbC5uYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgYXR0cmlidXRlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICBtb2RlbCxcbiAgICBhdHRyaWJ1dGVcbiAgKTtcbiAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEgOiBhdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgc2VxdWVuY2UgbmFtZSBieSBjb21iaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBuYW1lIGZvclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFyZ3MgLSBBZGRpdGlvbmFsIHN0cmluZyBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRoZSBzZXF1ZW5jZSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgbmFtZVxuICogQGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgcmV0dXJuIFtnZXRUYWJsZU5hbWUobW9kZWwpLCAuLi5hcmdzXS5qb2luKFwiX1wiKTtcbn1cbiIsImltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBDb250ZXh0LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHR1YWwsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWxUb1RyYW5zaWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBoYXNoT2JqLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgTW9kZWxSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1Jhd0V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBFcnJvclBhcnNlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50SWRzLCB0eXBlIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWUsIGdldFRhYmxlTmFtZSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSBhcyBSZXBvIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyRGlzcGF0Y2ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5EZWNvcmF0aW9uLnNldEZsYXZvdXJSZXNvbHZlcigob2JqOiBvYmplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgQWRhcHRlci5mbGF2b3VyT2YoTW9kZWwuaXNNb2RlbChvYmopID8gb2JqLmNvbnN0cnVjdG9yIDogKG9iaiBhcyBhbnkpKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fFxuICAgICAgRGVmYXVsdEZsYXZvdXJcbiAgICApO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyIHx8IERlZmF1bHRGbGF2b3VyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxufSk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEZhY2FkZSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UgYWRhcHRlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgZGF0YWJhc2UgYWRhcHRlcnMgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLiBUaGlzIGNsYXNzXG4gKiBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBwcm92aWRlIGEgY29uc2lzdGVudCBBUEkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMsIG9ic2VydmVyXG4gKiBwYXR0ZXJuIHN1cHBvcnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSXQgbWFuYWdlcyBhZGFwdGVyIHJlZ2lzdHJhdGlvbiwgQ1JVRCBvcGVyYXRpb25zLCBhbmRcbiAqIG9ic2VydmVyIG5vdGlmaWNhdGlvbnMuXG4gKiBAdGVtcGxhdGUgQ09ORklHIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHRlbXBsYXRlIFFVRVJZIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDT05URVhUIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDT05GSUd9IF9jb25maWcgLSBUaGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtfYWxpYXNdIC0gT3B0aW9uYWwgYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhpcyBhZGFwdGVyXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEltcGxlbWVudGluZyBhIGNvbmNyZXRlIGFkYXB0ZXJcbiAqIGNsYXNzIFBvc3RncmVzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8cGcuUG9vbENvbmZpZywgcGcuUXVlcnksIFBvc3RncmVzRmxhZ3MsIFBvc3RncmVzQ29udGV4dD4ge1xuICogICBjb25zdHJ1Y3RvcihjbGllbnQ6IHBnLlBvb2xDb25maWcpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBDT05GLFxuICAgIENPTk4sXG4gICAgUVVFUlksXG4gICAgRkxBR1MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQ09OVEVYVCBleHRlbmRzIENvbnRleHQ8RkxBR1M+ID0gQ29udGV4dDxGTEFHUz4sXG4gID5cbiAgZXh0ZW5kcyBMb2dnZWRDbGFzc1xuICBpbXBsZW1lbnRzXG4gICAgUmF3RXhlY3V0b3I8UVVFUlk+LFxuICAgIENvbnRleHR1YWw8RkxBR1MsIENPTlRFWFQ+LFxuICAgIE9ic2VydmFibGUsXG4gICAgT2JzZXJ2ZXIsXG4gICAgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+ID0ge307XG4gIHByaXZhdGUgc3RhdGljIF9iYXNlUmVwb3NpdG9yeTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxhbnksIGFueSwgYW55LCBhbnksIGFueT5cbiAgPjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VEaXNwYXRjaDogQ29uc3RydWN0b3I8RGlzcGF0Y2g+O1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IEFkYXB0ZXJEaXNwYXRjaDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByb3RlY3RlZCBfY2xpZW50PzogQ09OTjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBjb25maWdcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTkZcbiAgICogQHJldHVybiB7Q09ORn0gVGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gICAqL1xuICBnZXQgY29uZmlnKCk6IENPTkYge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIncyBhbGlhcyBvciBmbGF2b3IgbmFtZVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBhbGlhcyBpZiBzZXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBmbGF2b3IgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyJ3MgaWRlbnRpZmllclxuICAgKi9cbiAgZ2V0IGFsaWFzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWFzIHx8IHRoaXMuZmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBhZGFwdGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBRVUVSWSwgQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+LCBGTEFHUywgQ09OVEVYVD4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8XG4gICAgICBNLFxuICAgICAgUVVFUlksXG4gICAgICBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4sXG4gICAgICBGTEFHUyxcbiAgICAgIENPTlRFWFRcbiAgICA+XG4gID4ge1xuICAgIGlmICghQWRhcHRlci5fYmFzZVJlcG9zaXRvcnkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2hlbiBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlcGxhY2VkIGxhemlseWBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2Jhc2VSZXBvc2l0b3J5O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIHNodXRkb3duUHJveGllcyhrPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHJldHVybjtcbiAgICBpZiAoayAmJiAhKGsgaW4gdGhpcy5wcm94aWVzKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBwcm94eSBmb3VuZCBmb3IgJHtrfWApO1xuICAgIGlmICghaykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wcm94aWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tleV0uc2h1dGRvd24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a2V5fTogJHtlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tdLnNodXRkb3duKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba107XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a306ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHRhc2tzLCBzdWNoIGFzIGNsb3NpbmcgY29ubmVjdGlvbnNcbiAgICogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBlbnN1cmUgdG8gY2FsbCB0aGUgYmFzZSBtZXRob2QgZmlyc3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzaHV0ZG93biBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zaHV0ZG93blByb3hpZXMoKTtcbiAgICBpZiAodGhpcy5kaXNwYXRjaCkgYXdhaXQgdGhpcy5kaXNwYXRjaC5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgd2l0aCB0aGUgbmF0aXZlIGRyaXZlciBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBhZGFwdGVyIGNhY2hlXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDT05GLFxuICAgIHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh0aGlzLmFsaWFzIGluIEFkYXB0ZXIuX2NhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgJHt0aGlzLl9hbGlhcyA/IGAoJHt0aGlzLmZsYXZvdXJ9KSBgIDogXCJcIn0gYWxyZWFkeSByZWdpc3RlcmVkYFxuICAgICAgKTtcbiAgICBBZGFwdGVyLl9jYWNoZVt0aGlzLmFsaWFzXSA9IHRoaXM7XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBDcmVhdGVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBwZXJzaXN0ZW5jZSBhZGFwdGVyYFxuICAgICk7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgRGVmaW5lZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgYXMgY3VycmVudGApO1xuICAgICAgQWRhcHRlci5fY3VycmVudEZsYXZvdXIgPSB0aGlzLmFsaWFzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgc3RhdGVtZW50IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgcXVlcmllcyBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1N0YXRlbWVudH0gQSBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgdGhlIG1vZGVsXG4gICAqL1xuICBhYnN0cmFjdCBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBTdGF0ZW1lbnQ8UVVFUlksIE0sIGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGRpc3BhdGNoIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7RGlzcGF0Y2h9IEEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgRGlzcGF0Y2goKTogRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgQWRhcHRlci5fYmFzZURpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gb2JzZXJ2ZXIgaGFuZGxlciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhYXR0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgZGF0YWJhc2UgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBkYXRhYmFzZS1zcGVjaWZpYyBlcnJvcnMgaW50byBzdGFuZGFyZGl6ZWQgYXBwbGljYXRpb24gZXJyb3JzXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBvcmlnaW5hbCBkYXRhYmFzZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IEEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqL1xuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgYWRhcHRlciwgc3VjaCBhcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvciBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHJlcG9zaXRvcnkgZmxhZ3MgZm9yIGFuIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBzZXQgb2YgZmxhZ3MgdGhhdCBkZXNjcmliZSBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgY29tYmluaW5nIGRlZmF1bHQgZmxhZ3Mgd2l0aCBvdmVycmlkZXNcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBGbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Rj59IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8RkxBR1M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZMQUdTPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogZ2V0VGFibGVOYW1lKG1vZGVsKSxcbiAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgIH0pIGFzIEZMQUdTO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIENvbnRleHQgPSBDb250ZXh0PEZMQUdTPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb250ZXh0IGZvciBhIGRhdGFiYXNlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBjb250ZXh0IG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgdXNlZCBmb3IgdHJhY2tpbmcgYW5kIGF1ZGl0aW5nXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5DUkVBVEV8T3BlcmF0aW9uS2V5cy5SRUFEfE9wZXJhdGlvbktleXMuVVBEQVRFfE9wZXJhdGlvbktleXMuREVMRVRFfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBvdmVycmlkZXMgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZXh0IG9iamVjdFxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGTEFHUz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Q09OVEVYVD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsLm5hbWV9IG1vZGVsIHdpdGggZmxhZyBvdmVycmlkZXM6ICR7SlNPTi5zdHJpbmdpZnkob3ZlcnJpZGVzKX1gXG4gICAgKTtcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgb3ZlcnJpZGVzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoZmxhZ3MpIGFzIHVua25vd24gYXMgQ09OVEVYVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gbW9kZWxUb1RyYW5zaWVudChtb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoc3BsaXQubW9kZWwpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGFjY3VtO1xuICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gZ2V0Q29sdW1uTmFtZShtb2RlbCwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IG1vZGVsW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBkYXRhYmFzZSBkYXRhIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gZGF0YWJhc2UgZGF0YSwgaGFuZGxpbmcgY29sdW1uIG1hcHBpbmdcbiAgICogYW5kIHJlYXR0YWNoaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIG9iaiAtIFRoZSBkYXRhYmFzZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNsYXNzIG9yIG5hbWVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHBhcmFtIFt0cmFuc2llbnRdIC0gVHJhbnNpZW50IHByb3BlcnRpZXMgdG8gcmVhdHRhY2hcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IE0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG9ialtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gcGspIHJldHVybiBhY2N1bTtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gb2JqW2dldENvbHVtbk5hbWUoYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuXG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHJlc3VsdClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfTogJHttZXRhZGF0YX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIGZvciB0aGUgbmV3IHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0IGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMucmVhZCh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIGFuIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgbXVsdGlwbGUgZXhpc3RpbmcgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBbGxvd3MgZXhlY3V0aW5nIGRhdGFiYXNlLXNwZWNpZmljIHF1ZXJpZXMgZGlyZWN0bHlcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcmF3IHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UX0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRVUVSWSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciBkYXRhYmFzZSBldmVudHNcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byBiZSBub3RpZmllZCBhYm91dCBkYXRhYmFzZSBjaGFuZ2VzLiBUaGUgb2JzZXJ2ZXIgY2FuIG9wdGlvbmFsbHlcbiAgICogcHJvdmlkZSBhIGZpbHRlciBmdW5jdGlvbiB0byByZWNlaXZlIG9ubHkgc3BlY2lmaWMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlciEub2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm9ic2VydmUpXG4gICAgICAudmVyYm9zZShgUmVnaXN0ZXJpbmcgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgICBpZiAoIXRoaXMuZGlzcGF0Y2gpIHtcbiAgICAgIHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpLmluZm8oYENyZWF0aW5nIGRpc3BhdGNoIGZvciAke3RoaXMuYWxpYXN9YCk7XG4gICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5EaXNwYXRjaCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaC5vYnNlcnZlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvYnNlcnZlciBzbyBpdCBubyBsb25nZXIgcmVjZWl2ZXMgZGF0YWJhc2UgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBTZW5kcyBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2UsXG4gICAqIGZpbHRlcmluZyBiYXNlZCBvbiBlYWNoIG9ic2VydmVyJ3MgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgYWRhcHRlciAke3RoaXMuYWxpYXN9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGhpcy5sb2csXG4gICAgICB0YWJsZSxcbiAgICAgIGV2ZW50LFxuICAgICAgaWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIGRhdGEgYmFzZWQgb24gYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byB1cGRhdGVPYnNlcnZlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyByZWxhdGVkIHRvIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyByZWZyZXNoKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqL1xuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBBZGFwdGVyYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBmbGF2b3IgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIGZsYXZvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNsYXNzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlciBmbGF2b3IgbmFtZVxuICAgKi9cbiAgc3RhdGljIGZsYXZvdXJPZjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEodGhpcy5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIHRoaXMuY3VycmVudD8uZmxhdm91clxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGN1cnJlbnRGbGF2b3VyKCkge1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudEZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHBlcnNpc3RlbmNlIGZsYXZvdXIgc2V0LiBQbGVhc2UgaW5pdGlhbGl6ZSB5b3VyIGFkYXB0ZXJgXG4gICAgICApO1xuICAgIHJldHVybiBBZGFwdGVyLl9jdXJyZW50Rmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIHRoYXQgaXMgY3VycmVudGx5IHNldCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJuIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IFRoZSBjdXJyZW50IGFkYXB0ZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgY3VycmVudCgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLmN1cnJlbnRGbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBhZGFwdGVyIGJ5IGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIGFkYXB0ZXIgYnkgaXRzIGZsYXZvciBuYW1lXG4gICAqIEB0ZW1wbGF0ZSBDT05GIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTk4gLSBUaGUgZGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlXG4gICAqIEB0ZW1wbGF0ZSBRVUVSWSAtIFRoZSBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBDQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHRlbXBsYXRlIEZMQUdTIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBDT05URVhULCBGTEFHUz4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8XG4gICAgQ09ORixcbiAgICBDT05OLFxuICAgIFFVRVJZLFxuICAgIENPTlRFWFQgZXh0ZW5kcyBDb250ZXh0PEZMQUdTPixcbiAgICBGTEFHUyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihmbGF2b3VyPzogYW55KTogQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZsYXZvdXIpIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLl9jdXJyZW50Rmxhdm91cik7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXTtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gQWRhcHRlciByZWdpc3RlcmVkIHVuZGVyICR7Zmxhdm91cn0uYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENoYW5nZXMgd2hpY2ggYWRhcHRlciBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHNldCBhcyBjdXJyZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50Rmxhdm91ciA9IGZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc3RhbmRhcmRpemVkIG1ldGFkYXRhIGtleSBmb3IgcGVyc2lzdGVuY2UtcmVsYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBSZXBvLmtleShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBtb2RlbHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gdXNlIGEgc3BlY2lmaWMgYWRhcHRlciBmbGF2b3JcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBhZGFwdGVyIGZsYXZvciB0byBmaW5kIG1vZGVscyBmb3JcbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHN0YXRpYyBtb2RlbHM8TSBleHRlbmRzIE1vZGVsPihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSAoTW9kZWwgYXMgYW55KS5nZXRSZWdpc3RyeSgpIGFzIE1vZGVsUmVnaXN0cnk8YW55PjtcbiAgICAgIGNvbnN0IGNhY2hlID0gKFxuICAgICAgICByZWdpc3RyeSBhcyB1bmtub3duIGFzIHsgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8YW55Pj4gfVxuICAgICAgKS5jYWNoZTtcbiAgICAgIGNvbnN0IG1hbmFnZWRNb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gT2JqZWN0LnZhbHVlcyhjYWNoZSlcbiAgICAgICAgLm1hcCgobTogTW9kZWxDb25zdHJ1Y3RvcjxNPikgPT4ge1xuICAgICAgICAgIGxldCBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZiAmJiBmID09PSBmbGF2b3VyKSByZXR1cm4gbTtcbiAgICAgICAgICBpZiAoIWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG8gPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBSZXBvLmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXBvKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gKHRoaXMuX2Jhc2VSZXBvc2l0b3J5IGFzIGFueSkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgcHJveGllcz86IFJlY29yZDxzdHJpbmcsIHR5cGVvZiB0aGlzPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byByZXR1cm4gdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDT04gLSBUaGUgdHlwZSBvZiB0aGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0NPTn0gVGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBmdW5jdGlvbiBnZXRDbGllbnRcbiAgICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q2xpZW50KCk6IENPTk47XG5cbiAgQGZpbmFsKClcbiAgZ2V0IGNsaWVudCgpOiBDT05OIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxDT05GPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgbGV0IGNsaWVudDogYW55O1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IENPTkYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnksIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgY2xpZW50ID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm94aWVzW2tleV0gPSBwcm94eTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHNvcnQgZGlyZWN0aW9ucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBzb3J0IGRpcmVjdGlvbnMgZm9yIG9yZGVyaW5nIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gT3JkZXJEaXJlY3Rpb24ge1xuICAvKiogQXNjZW5kaW5nIG9yZGVyIChBIHRvIFosIDAgdG8gOSkgKi9cbiAgQVNDID0gXCJhc2NcIixcblxuICAvKiogRGVzY2VuZGluZyBvcmRlciAoWiB0byBBLCA5IHRvIDApICovXG4gIERTQyA9IFwiZGVzY1wiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBjYXNjYWRlIG9wZXJhdGlvbiB0eXBlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBjYXNjYWRlIGJlaGF2aW9ycyBmb3IgZW50aXR5IHJlbGF0aW9uc2hpcHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gQ2FzY2FkZSB7XG4gIC8qKiBQZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgQ0FTQ0FERSA9IFwiY2FzY2FkZVwiLFxuICAvKiogRG8gbm90IHBlcmZvcm0gY2FzY2FkZSBvcGVyYXRpb24gb24gcmVsYXRlZCBlbnRpdGllcyAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBkZWZhdWx0IGNhc2NhZGUgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBpbiByZXBvc2l0b3JpZXMuXG4gKiBAc3VtbWFyeSBEb2N1bWVudHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FzY2FkZSBjb25maWd1cmF0aW9uIHdpdGggZXhwbGljaXQgdXBkYXRlIGFuZCBkZWxldGUgYmVoYXZpb3JzLlxuICogQHByb3BlcnR5IHsnY2FzY2FkZSd8J25vbmUnfSB1cGRhdGUgLSBEZXRlcm1pbmVzIHdoZXRoZXIgdXBkYXRlcyBjYXNjYWRlIHRvIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiBAcHJvcGVydHkgeydjYXNjYWRlJ3wnbm9uZSd9IGRlbGV0ZSAtIERldGVybWluZXMgd2hldGhlciBkZWxldGVzIGNhc2NhZGUgdG8gcmVsYXRlZCBlbnRpdGllcy5cbiAqIEB0eXBlRGVmIERlZmF1bHRDYXNjYWRlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgYWRhcHRlci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBVbnN1cHBvcnRlZEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlcyAobGlrZSBwcmltYXJ5IGtleXMpIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci5cbiAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhbmRsZSB0aGUgc3BlY2lmaWNzIG9mIGhvdyBzZXF1ZW5jZXMgYXJlIHN0b3JlZCBhbmQgaW5jcmVtZW50ZWQgaW4gZGlmZmVyZW50XG4gKiBkYXRhYmFzZSBzeXN0ZW1zLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2VcbiAqIGNsYXNzIFBvc3RncmVzU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICogICAgIHN1cGVyKG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IG5leHQgdmFsdWUgZnJvbSBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLmV4ZWN1dG9yLnJhdyhgU0VMRUNUIG5leHR2YWwoJyR7dGhpcy5vcHRpb25zLm5hbWV9JylgKTtcbiAqICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LnJvd3NbMF0ubmV4dHZhbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgY3VycmVudCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgY3VycnZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5jdXJydmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgYSByYW5nZSBvZiB2YWx1ZXNcbiAqICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gKiAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gKiAgICAgICB2YWx1ZXMucHVzaChhd2FpdCB0aGlzLm5leHQoKSk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB2YWx1ZXM7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2FnZVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUG9zdGdyZXNTZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICd1c2VyX2lkX3NlcScsXG4gKiAgIGV4ZWN1dG9yOiBkYkV4ZWN1dG9yXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgTGF6aWx5IGluaXRpYWxpemVkIGxvZ2dlciBmb3IgdGhlIHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFjY2Vzc29yIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgb3IgaW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3RlY3RlZCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBzZXF1ZW5jZSwgaW5jcmVtZW50aW5nIGl0IGluIHRoZSBwcm9jZXNzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhYnN0cmFjdCBuZXh0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2Ugd2l0aG91dCBpbmNyZW1lbnRpbmcgaXRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBzZXF1ZW50aWFsIHZhbHVlcyBhdCBvbmNlLCB3aGljaCBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIG5leHQoKSBtdWx0aXBsZSB0aW1lc1xuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFic3RyYWN0IHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge018Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5XG4gICAqL1xuICBzdGF0aWMgcGs8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBzZXF1ZW5jZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSAoTnVtYmVyIG9yIEJpZ0ludClcbiAgICogQHBhcmFtIHtcIk51bWJlclwifFwiQmlnSW50XCJ8dW5kZWZpbmVkfSB0eXBlIC0gVGhlIHRhcmdldCB0eXBlIHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsdWUoXG4gICAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgc2VxdWVuY2UgdHlwZTogJHt0eXBlfSBmb3IgYWRhcHRlciAke3RoaXN9YFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIHF1ZXJ5IGNvbmRpdGlvbnNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgZm9yIGNvbXBhcmluZyB2YWx1ZXMgaW4gZGF0YWJhc2UgcXVlcmllc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9wZXJhdG9yIHtcbiAgLyoqIEVxdWFsIGNvbXBhcmlzb24gKD0pICovXG4gIEVRVUFMID0gXCJFUVVBTFwiLFxuICAvKiogTm90IGVxdWFsIGNvbXBhcmlzb24gKCE9KSAqL1xuICBESUZGRVJFTlQgPSBcIkRJRkZFUkVOVFwiLFxuICAvKiogR3JlYXRlciB0aGFuIGNvbXBhcmlzb24gKD4pICovXG4gIEJJR0dFUiA9IFwiQklHR0VSXCIsXG4gIC8qKiBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPj0pICovXG4gIEJJR0dFUl9FUSA9IFwiQklHR0VSX0VRXCIsXG4gIC8qKiBMZXNzIHRoYW4gY29tcGFyaXNvbiAoPCkgKi9cbiAgU01BTExFUiA9IFwiU01BTExFUlwiLFxuICAvKiogTGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKDw9KSAqL1xuICBTTUFMTEVSX0VRID0gXCJTTUFMTEVSX0VRXCIsXG4gIC8vIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgLyoqIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpICovXG4gIE5PVCA9IFwiTk9UXCIsXG4gIC8qKiBJbmNsdXNpb24gb3BlcmF0b3IgKElOKSAqL1xuICBJTiA9IFwiSU5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIC8qKiBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgKi9cbiAgUkVHRVhQID0gXCJSRUdFWFBcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9naWNhbCBvcGVyYXRvcnMgZm9yIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBncm91cGluZyBtdWx0aXBsZSBjb25kaXRpb25zIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBHcm91cE9wZXJhdG9yIHtcbiAgLyoqIExvZ2ljYWwgQU5EIG9wZXJhdG9yIC0gYWxsIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlICovXG4gIEFORCA9IFwiQU5EXCIsXG4gIC8qKiBMb2dpY2FsIE9SIG9wZXJhdG9yIC0gYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUgKi9cbiAgT1IgPSBcIk9SXCIsXG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biBkdXJpbmcgcXVlcnkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcXVlcnkgYnVpbGRpbmcgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBRdWVyeUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFF1ZXJ5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gZHVyaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcGFnaW5hdGlvbiBzZXR1cCBvciBleGVjdXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIFBhZ2luZ0Vycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdpbmdFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBQYWdpbmdFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGVPcHRpb24sIENvbmRpdGlvbkJ1aWxkZXJPcHRpb24gfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQge1xuICBDb25kaXRpb25hbEFzeW5jLFxuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG50eXBlIEluZmVyQXN5bmM8TT4gPSBNIGV4dGVuZHMgTW9kZWw8aW5mZXIgQT4gPyBBIDogZmFsc2U7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbmRpdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgQSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBxdWVyeSBjb25kaXRpb25zIHdpdGggc3VwcG9ydCBmb3IgY29tcGxleCBsb2dpY2FsIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGNsYXNzIGFsbG93cyBmb3IgYnVpbGRpbmcgYW5kIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zIHVzaW5nIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQsIE9SLCBOT1QpXG4gKiBhbmQgY29tcGFyaXNvbiBvcGVyYXRvcnMgKGVxdWFscywgbm90IGVxdWFscywgZ3JlYXRlciB0aGFuLCBldGMuKS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uZGl0aW9uPE0+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+fSBBIG5ldyBjb25kaXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgY29uZmlndXJlZCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZCgpOiBDb25kaXRpb248TT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5hdHRyMSBhcyBzdHJpbmcgfCBDb25kaXRpb248TT4sXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcixcbiAgICAgICAgICB0aGlzLmNvbXBhcmlzb24gYXMgYW55XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbmRpdGlvbiBidWlsZGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gYnVpbGRlciB3aWxsIG9wZXJhdGUgb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBidWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcjxNPigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yIGEgbW9kZWwgc2hvdWxkIHVzZVxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byBhIG1vZGVsIGNsYXNzIHRvIGluZGljYXRlIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yXG4gKiBzaG91bGQgYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGF0YWJhc2Ugb3BlcmF0aW9ucyBvbiBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiBUaGUgZmxhdm9yIGlzIGEgc3RyaW5nXG4gKiBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSByZWdpc3RlcmVkIGFkYXB0ZXIgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFkYXB0ZXIgZmxhdm9yIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBtb2RlbCBjbGFzc1xuICogQGZ1bmN0aW9uIHVzZXNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzKGZsYXZvdXI6IHN0cmluZykge1xuICByZXR1cm4gZnVuY3Rpb24gdXNlcyhvcmlnaW5hbDogYW55KSB7XG4gICAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgZmxhdm91cikpKFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBDb250ZXh0LFxuICBEQktleXMsXG4gIERlZmF1bHRTZXBhcmF0b3IsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB3cmFwTWV0aG9kV2l0aENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFdoZXJlT3B0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L29wdGlvbnNcIjtcbmltcG9ydCB7IE9yZGVyQnlTZWxlY3RvciwgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnkvc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lLCBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXZlbnRJZHMsXG4gIEluZmVycmVkQWRhcHRlckNvbmZpZyxcbiAgdHlwZSBPYnNlcnZlckZpbHRlcixcbn0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgYWxpYXMgZm9yIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBzaW1wbGlmaWVkIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbW9yZSBjb25jaXNlIHdheSB0byByZWZlcmVuY2UgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICogQHR5cGVkZWYgUmVwb1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcG88XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IGFueSxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBhbnksXG4gIFEgPSBhbnksXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBRLCBGLCBDPiA9IGFueSxcbj4gPSBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gbW9kZWxzIG9uIGEgdGFibGUgYnkgdGFibGUgd2F5LlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeWluZyBjYXBhYmlsaXRpZXMsIGFuZCBvYnNlcnZlciBwYXR0ZXJuIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbCBwZXJzaXN0ZW5jZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGZvciBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtBfSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVwb3NpdG9yeSBpbml0aWFsaXphdGlvbi5cbiAqIEBjbGFzcyBSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCB1c2VyUmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoVXNlcik7XG4gKlxuICogLy8gVXNpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdKb2huJyB9KSk7XG4gKiBjb25zdCByZXRyaWV2ZWRVc2VyID0gYXdhaXQgdXNlclJlcG8ucmVhZCh1c2VyLmlkKTtcbiAqIHVzZXIubmFtZSA9ICdKYW5lJztcbiAqIGF3YWl0IHVzZXJSZXBvLnVwZGF0ZSh1c2VyKTtcbiAqIGF3YWl0IHVzZXJSZXBvLmRlbGV0ZSh1c2VyLmlkKTtcbiAqXG4gKiAvLyBRdWVyeWluZyB3aXRoIGNvbmRpdGlvbnNcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgdXNlclJlcG9cbiAqICAgLnNlbGVjdCgpXG4gKiAgIC53aGVyZSh7IG5hbWU6ICdKYW5lJyB9KVxuICogICAub3JkZXJCeSgnY3JlYXRlZEF0JywgT3JkZXJEaXJlY3Rpb24uRFNDKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICpcbiAqICAgQy0+PitSOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5SOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFItPj4rQTogcHJlcGFyZShtb2RlbClcbiAqICAgQS0tPj4tUjogcHJlcGFyZWQgZGF0YVxuICogICBSLT4+K0E6IGNyZWF0ZSh0YWJsZSwgaWQsIHJlY29yZClcbiAqICAgQS0+PitEQjogSW5zZXJ0IE9wZXJhdGlvblxuICogICBEQi0tPj4tQTogUmVzdWx0XG4gKiAgIEEtLT4+LVI6IHJlY29yZFxuICogICBSLT4+K0E6IHJldmVydChyZWNvcmQpXG4gKiAgIEEtLT4+LVI6IG1vZGVsIGluc3RhbmNlXG4gKiAgIFItPj5SOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFItPj4rTzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBDUkVBVEUsIGlkKVxuICogICBPLS0+Pi1SOiBOb3RpZmljYXRpb24gY29tcGxldGVcbiAqICAgUi0tPj4tQzogY3JlYXRlZCBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeTxcbiAgICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gICAgUSxcbiAgICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgZXh0ZW5kcyBSZXA8TSwgRiwgQz5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUXVlcmlhYmxlPE0+LCBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQ29uc3RydWN0b3I8UmVwbzxNb2RlbD4+IHwgUmVwbzxNb2RlbD5cbiAgPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfb3ZlcnJpZGVzPzogUGFydGlhbDxGPjtcblxuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvZ2dlciBmb3IgdGhpcyByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcilcbiAgICAgIHRoaXMubG9nZ2VyID0gKFxuICAgICAgICB0aGlzLmFkYXB0ZXJbXCJsb2dcIiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5hZGFwdGVyXSBhcyBMb2dnZXJcbiAgICAgICkuZm9yKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICAgKiBAcmV0dXJuIHtBfSBUaGUgYWRhcHRlciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyBmb3VuZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUYWJsZSBuYW1lIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHByb3BlcnRpZXMgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBzZXF1ZW5jZSBvcHRpb25zIGNvbnRhaW5pbmcgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IHBrUHJvcHMoKTogU2VxdWVuY2VPcHRpb25zIHtcbiAgICByZXR1cm4gc3VwZXIucGtQcm9wcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHtcbiAgICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoY2xhenosIHRoaXMsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgY2xhenpcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZsYXZvdXIgJiYgZmxhdm91ciAhPT0gYWRhcHRlci5mbGF2b3VyKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSW5jb21wYXRpYmxlIGZsYXZvdXJzXCIpO1xuICAgICAgICB1c2VzKGFkYXB0ZXIuZmxhdm91cikoY2xhenopO1xuICAgICAgfVxuICAgIH1cbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgICAgbSxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm94eSB3aXRoIG92ZXJyaWRkZW4gcmVwb3NpdG9yeSBmbGFncy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgZmxhZ3Mgb3ZlcnJpZGRlbi5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIFRoZSBmbGFncyB0byBvdmVycmlkZS5cbiAgICogQHJldHVybiB7UmVwb3NpdG9yeX0gQSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBvdmVycmlkZGVuIGZsYWdzLlxuICAgKi9cbiAgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8Rj4pOiBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm92ZXJyaWRlKVxuICAgICAgLmRlYnVnKGBPdmVycmlkaW5nIHJlcG9zaXRvcnkgZmxhZ3Mgd2l0aCAke0pTT04uc3RyaW5naWZ5KGZsYWdzKX1gKTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKHAgIT09IFwiX292ZXJyaWRlc1wiKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0LCBmbGFncyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggYSBzcGVjaWZpYyBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHR5cGUgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHRlbXBsYXRlIEMgLSBUaGUgdHlwZSBvZiB0aGUgY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj59IGNvbmYgLSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25zIHRvIG92ZXJyaWRlLlxuICAgKiBAcGFyYW0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYW5kIGFyZ3VtZW50cy5cbiAgICovXG4gIGZvcihcbiAgICBjb25mOiBQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcImFkYXB0ZXJcIikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZm9yKGNvbmYsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlci5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgcHJlcGFyZXMgaXQgZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZSB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICBsZXQgYzogQyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQztcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQb3N0LWNyZWF0aW9uIGhvb2suXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGFmdGVyIGEgbW9kZWwgaXMgY3JlYXRlZCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBjcmVhdGVkIG1vZGVsLlxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBwcm9jZXNzZWQgbW9kZWwuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlU3VmZml4KG1vZGVsLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgY3JlYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgICBjb25zdCBvcHRzID0gUmVwb3NpdG9yeS5nZXRTZXF1ZW5jZU9wdGlvbnMobW9kZWxzWzBdKTtcbiAgICBsZXQgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgaWYgKCFvcHRzLm5hbWUpIG9wdHMubmFtZSA9IFNlcXVlbmNlLnBrKG1vZGVsc1swXSk7XG4gICAgICBpZHMgPSBhd2FpdCAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKG9wdHMpKS5yYW5nZShtb2RlbHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bdGhpcy5wa10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgUHJpbWFyeSBrZXkgaXMgbm90IGRlZmluZWQgZm9yIG1vZGVsIGluIHBvc2l0aW9uICR7aX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1bdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgICAgIG1bdGhpcy5wa10gPSAob3B0cy50eXBlICE9PSAnU3RyaW5nJyA/IFxuICAgICAgICAgICAgaWRzW2ldIDogb3B0cy5nZW5lcmF0ZWQgPyBcbiAgICAgICAgICAgICAgaWRzW2ldIDogYCR7bVt0aGlzLnBrXX1gLnRvU3RyaW5nKCkpIGFzIE1ba2V5b2YgTV07XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBNW2tleW9mIE1dO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHVwZGF0ZWQgbW9kZWwgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBtdWx0aXBsZSBleGlzdGluZyBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIm1pc3NpbmcgaWQgb24gdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICBtID0gdGhpcy5tZXJnZShvbGRNb2RlbHNbaV0sIG0pO1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtLCAuLi5pZ25vcmVkUHJvcHMpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aG91dCBzcGVjaWZ5aW5nIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbGwgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBXaGVyZU9wdGlvbjxNLCBNW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRoIHNwZWNpZmljIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZHMuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNlbGVjdCBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwgd2l0aCBvcHRpb25hbCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIFtzZWxlY3Rvcl0gLSBPcHRpb25hbCBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgTVtdPiB8IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlclxuICAgICAgLlN0YXRlbWVudDxNPigpXG4gICAgICAuc2VsZWN0KHNlbGVjdG9yIGFzIHJlYWRvbmx5IFsuLi5TXSlcbiAgICAgIC5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb25zIGFuZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSB3aXRoIGNvbW1vbiBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBmaWx0ZXIgcmVjb3Jkcy5cbiAgICogQHBhcmFtIG9yZGVyQnkgLSBUaGUgZmllbGQgdG8gb3JkZXIgcmVzdWx0cyBieS5cbiAgICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyPU9yZGVyRGlyZWN0aW9uLkFTQ10gLSBUaGUgc29ydCBkaXJlY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gT3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBxdWVyeSByZXN1bHRzIGFzIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIG9yZGVyQnk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3I8TT4gPSBbb3JkZXJCeSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9XG5cbiAgYXR0cihwcm9wOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5hdHRyPE0+KHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBtb2RlbHMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgdG8gbGltaXQgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHRoaXMuYWRhcHRlci5vYnNlcnZlKHRoaXMsICh0YWJsZTogc3RyaW5nKSA9PiB0YWJsZU5hbWUgPT09IHRhYmxlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBub3cgb2JzZXJ2aW5nICR7dGhpcy5hZGFwdGVyfSBmaWx0ZXJpbmcgb24gdGFibGUgPT09ICR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIGxvZy52ZXJib3NlKGBSZWdpc3RlcmVkIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZyb20gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIHNvIGl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIG1vcmUgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgZm9yICR7dGhpcy5hZGFwdGVyfSwgdW5zdWJzY3JpYmluZ2BcbiAgICAgICk7XG4gICAgICB0aGlzLmFkYXB0ZXIudW5PYnNlcnZlKHRoaXMpO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgTm8gbG9uZ2VyIG9ic2VydmluZyBhZGFwdGVyICR7dGhpcy5hZGFwdGVyLmZsYXZvdXJ9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciAke3RoaXN9YFxuICAgICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBBcnJheS5pc0FycmF5KGlkKVxuICAgICAgICA/IGlkLm1hcCgoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaSkgYXMgc3RyaW5nKVxuICAgICAgICA6IChTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpZCkgYXMgc3RyaW5nKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50IChhbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFJlcG88TT4uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGRlZmF1bHQgYWRhcHRlciBmbGF2b3VyIGlmIG5vdCBzcGVjaWZpZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSfSBBIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmxhdm91ci5cbiAgICovXG4gIHN0YXRpYyBmb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWwsIFIgZXh0ZW5kcyBSZXBvPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFIgfCBDb25zdHJ1Y3RvcjxSPiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IF9hbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwsIF9hbGlhcykgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgZnJvbSB0aGUgY2FjaGUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsIGZyb20gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gVGhlIGFkYXB0ZXIgYWxpYXMuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPiB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggYSBtb2RlbCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IHJlcG8gLSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gdGhlIGFkYXB0ZXIgYWxpYXMvZmxhdm91ci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYSByZXBvc2l0b3J5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZShtb2RlbCwgYXR0cmlidXRlKTtcbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlUmVwb3NpdG9yeVwiXSA9IFJlcG9zaXRvcnk7XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHVuaXF1ZSBpbmplY3RhYmxlIG5hbWUgZm9yIGEgcmVwb3NpdG9yeS5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgcmVwb3NpdG9yaWVzIHVzaW5nIHRoZSBhZGFwdGVyIGZsYXZvdXIgYW5kIG1vZGVsIHRhYmxlIG5hbWUuXG4gKiBUaGlzIGhlbHBzIHRoZSBESSBzeXN0ZW0gcmVnaXN0ZXIgYW5kIHJlc29sdmUgcmVwb3NpdG9yeSBpbnN0YW5jZXMgY29uc2lzdGVudGx5IGFjcm9zcyBhZGFwdGVycy5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD4gfCBUfSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcy4gSWYgb21pdHRlZCwgaXQgaXMgcmVhZCBmcm9tIG1vZGVsIG1ldGFkYXRhLlxuICogQHJldHVybiB7c3RyaW5nfSBBIG5hbWVzcGFjZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgdGhlIHJlcG9zaXRvcnkgKGUuZy4sIFwiZGI6cmVwbzpyYW06dXNlcnNcIikuXG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgZmxhdm91ciBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGFyZ3VtZW50cyBvciBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBVIGFzIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdCBNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTdHJpbmcgRm9ybWF0dGVyXG4gKiAgIEMtPj5VOiBjYWxsKG1vZGVsLCBmbGF2b3VyPylcbiAqICAgYWx0IGZsYXZvdXIgcHJvdmlkZWRcbiAqICAgICBVLS0+PlU6IHVzZSBwcm92aWRlZCBmbGF2b3VyXG4gKiAgIGVsc2UgZmxhdm91ciBub3QgcHJvdmlkZWRcbiAqICAgICBVLT4+QTogQWRhcHRlci5rZXkoQURBUFRFUilcbiAqICAgICBVLT4+UjogZ2V0TWV0YWRhdGEoa2V5LCBtb2RlbHxtb2RlbC5jdG9yKVxuICogICAgIGFsdCBtZXRhZGF0YSBwcmVzZW50XG4gKiAgICAgICBSLS0+PlU6IGZsYXZvdXJcbiAqICAgICBlbHNlIG1pc3NpbmdcbiAqICAgICAgIFUtLT4+QzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgVS0+PlM6IHNmKElOSkVDVEFCTEUsIGZsYXZvdXIsIFJlcG9zaXRvcnkudGFibGUobW9kZWwpKVxuICogICBTLS0+PkM6IHRva2VuIHN0cmluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4gfCBULFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoIWZsYXZvdXIpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBrZXksXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICAgICk7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV0cmlldmUgZmxhdm91ciBmcm9tIG1vZGVsICR7bW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgOiBtb2RlbC5uYW1lfWBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuIHNmKFBlcnNpc3RlbmNlS2V5cy5JTkpFQ1RBQkxFLCBmbGF2b3VyLCBnZXRUYWJsZU5hbWUobW9kZWwpKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgaW5qZWN0YWJsZSByZXBvc2l0b3JpZXMgd2l0aCBhdXRvLXJlc29sdXRpb24uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhbiBJbmplY3RhYmxlUmVnaXN0cnkgaW1wbGVtZW50YXRpb24gdGhhdCByZXNvbHZlcyByZXBvc2l0b3JpZXMgYnkgbW9kZWwgbmFtZSBvciBjb25zdHJ1Y3Rvci4gSWYgYSByZXBvc2l0b3J5XG4gKiBpcyBub3QgZXhwbGljaXRseSByZWdpc3RlcmVkLCBpdCBhdHRlbXB0cyB0byBpbmZlciB0aGUgY29ycmVjdCByZXBvc2l0b3J5IHVzaW5nIG1vZGVsIG1ldGFkYXRhIGFuZCB0aGUgYWN0aXZlIG9yIHNwZWNpZmllZCBhZGFwdGVyIGZsYXZvdXIuXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVycyByZXF1aXJlZDsgdGhlIHN1cGVyY2xhc3MgaGFuZGxlcyBpbnRlcm5hbCBzdGF0ZS5cbiAqIEBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2U6IHJldHJpZXZlIGEgcmVwb3NpdG9yeSBieSBtb2RlbCBuYW1lXG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCk7XG4gKiBjb25zdCB1c2VyUmVwbyA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oJ1VzZXInKTtcbiAqIC8vIElmIFVzZXJSZXBvc2l0b3J5IGlzIHJlZ2lzdGVyZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZCBpZiBhIFVzZXIgbW9kZWwgZXhpc3RzLlxuICpcbiAqIC8vIFJldHJpZXZlIGJ5IGNvbnN0cnVjdG9yIGFuZCBzcGVjaWZ5IGFkYXB0ZXIgZmxhdm91clxuICogY29uc3QgcmVwb0J5Q3RvciA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oVXNlck1vZGVsLCAncmFtJyk7XG4gKlxuICogLy8gUmV0cmlldmUgYnkgc3ltYm9sIChlLmcuLCBpbmplY3RhYmxlIHRva2VuKVxuICogY29uc3QgdG9rZW4gPSBTeW1ib2wuZm9yKCdVc2VyUmVwb3NpdG9yeScpO1xuICogY29uc3QgYnlUb2tlbiA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4odG9rZW4pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnN1bWVyXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBCIGFzIEJhc2VSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gKiAgIEMtPj5SOiBnZXQobmFtZSwgZmxhdm91cj8pXG4gKiAgIGFjdGl2YXRlIFJcbiAqICAgUi0+PkI6IHN1cGVyLmdldChuYW1lKVxuICogICBhbHQgRm91bmQgaW4gYmFzZSByZWdpc3RyeVxuICogICAgIEItLT4+UjogaW5qZWN0YWJsZVxuICogICAgIFItLT4+QzogaW5qZWN0YWJsZVxuICogICBlbHNlIE5vdCBmb3VuZFxuICogICAgIFItPj5NOiBNb2RlbC5nZXQobmFtZSlcbiAqICAgICBhbHQgTW9kZWwgZm91bmRcbiAqICAgICAgIFItPj5BOiByZXNvbHZlIGZsYXZvdXIgKGZyb20gYXJnL21ldGFkYXRhL2N1cnJlbnQpXG4gKiAgICAgICBSLT4+UlA6IFJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWxDdG9yLCBhbGlhcylcbiAqICAgICAgIGFsdCBSZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICAgIFJQLS0+PlI6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbHNlIFJlcG9zaXRvcnkgY3RvclxuICogICAgICAgICBSLT4+QTogQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBvciBBZGFwdGVyLmN1cnJlbnRcbiAqICAgICAgICAgQS0tPj5SOiBhZGFwdGVyIGluc3RhbmNlXG4gKiAgICAgICAgIFItPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbmRcbiAqICAgICBlbHNlIE1vZGVsIG5vdCBmb3VuZFxuICogICAgICAgUi0tPj5DOiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5IGV4dGVuZHMgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIHtcbiAgcHJpdmF0ZSBsb2dnZXI/OiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhbiBpbmplY3RhYmxlIHdpdGggcmVwb3NpdG9yeSBhdXRvLXJlc29sdXRpb24uXG4gICAqIEBzdW1tYXJ5IEF0dGVtcHRzIHRvIGdldCBhbiBpbmplY3RhYmxlIGZyb20gdGhlIGJhc2UgcmVnaXN0cnk7IGlmIG5vdCBmb3VuZCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEga25vd24gbW9kZWwsIGl0XG4gICAqIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSByZXBvc2l0b3J5IHVzaW5nIHRoZSBzcGVjaWZpZWQgZmxhdm91ciBvciBtb2RlbCBtZXRhZGF0YSwgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50IGFkYXB0ZXIgd2hlbiBuZWVkZWQuXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSBpbmplY3RhYmxlIHR5cGUgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3I8VD59IG5hbWUgVG9rZW4sIG1vZGVsIG5hbWUsIG9yIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5qZWN0YWJsZSBvciBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIgKGUuZy4sIFwicmFtXCIpLiBJZiBvbWl0dGVkLCBkZXJpdmVzIGZyb20gbWV0YWRhdGEgb3IgY3VycmVudCBhZGFwdGVyLlxuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfSBUaGUgbG9jYXRlZCBvciBhdXRvLWNyZWF0ZWQgaW5qZWN0YWJsZSBpbnN0YW5jZTsgb3RoZXJ3aXNlIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgZ2V0KG5hbWUsIGZsYXZvdXI/KVxuICAgKiAgIHBhcnRpY2lwYW50IEJSIGFzIEJhc2VSZWdpc3RyeVxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gICAqICAgRy0+PkJSOiBzdXBlci5nZXQobmFtZSlcbiAgICogICBhbHQgRm91bmRcbiAgICogICAgIEJSLS0+Pkc6IGluamVjdGFibGVcbiAgICogICBlbHNlIE5vdCBmb3VuZFxuICAgKiAgICAgRy0+Pk06IGRlcml2ZSBtb2RlbEN0b3IgZnJvbSBuYW1lXG4gICAqICAgICBhbHQgbW9kZWxDdG9yIHJlc29sdmVkXG4gICAqICAgICAgIEctPj5BOiByZXNvbHZlIGZsYXZvdXIgKGFyZyB8IG1ldGFkYXRhIHwgY3VycmVudClcbiAgICogICAgICAgRy0+PlJQOiBSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsQ3RvciwgYWxpYXMpXG4gICAqICAgICAgIGFsdCByZXR1cm5zIGluc3RhbmNlXG4gICAqICAgICAgICAgUlAtLT4+RzogUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgKiAgICAgICBlbHNlIHJldHVybnMgY3RvclxuICAgKiAgICAgICAgIEctPj5BOiBBZGFwdGVyLmdldChmbGF2b3VyKSB8IEFkYXB0ZXIuY3VycmVudFxuICAgKiAgICAgICAgIEEtLT4+RzogYWRhcHRlciBpbnN0YW5jZVxuICAgKiAgICAgICAgIEctPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIG5vIG1vZGVsQ3RvclxuICAgKiAgICAgICBHLS0+Pkc6IHJldHVybiB1bmRlZmluZWRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IENvbnN0cnVjdG9yPFQ+IHwgc3RyaW5nLFxuICAgIGZsYXZvdXI/OiBzdHJpbmdcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0KTtcbiAgICAvLyBGaXJzdCwgdHJ5IGJhc2UgcmVnaXN0cnksIGJ1dCBndWFyZCBhZ2FpbnN0IHRocm93biBlcnJvcnNcbiAgICBsZXQgaW5qZWN0YWJsZTogVCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lIGFzIGFueSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYW5kbGUgaXQgbGF0ZXJcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIGxldCBtb2RlbEN0b3I6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIikgbW9kZWxDdG9yID0gbmFtZSBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIgfHwgdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbW9kZWxDdG9yID0gTW9kZWwuZ2V0KG5hbWUudG9TdHJpbmcoKSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vZGVsQ3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgLy8gUmVzb2x2ZSBmbGF2b3VyIGZyb20gbWV0YWRhdGEgaWYgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBtZXRhS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRGbGF2b3VyID1cbiAgICAgICAgZmxhdm91ciB8fFxuICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCBtb2RlbEN0b3IpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIERldGVybWluZSBhbiBhbGlhcyB0byB1c2U6IHByZWZlciBhIGRpcmVjdGx5IHJlZ2lzdGVyZWQgYWRhcHRlcjsgb3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBhZGFwdGVyXG4gICAgICAgIC8vIGhhcyB0aGUgc2FtZSBmbGF2b3VyLCB1c2UgaXRzIGFsaWFzIHRvIHNhdGlzZnkgUmVwb3NpdG9yeS5mb3JNb2RlbC9BZGFwdGVyLmdldCBsb29rdXBzLlxuICAgICAgICBsZXQgYWxpYXNUb1VzZSA9IHJlc29sdmVkRmxhdm91cjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRGbGF2b3VyKSBBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gQWRhcHRlci5jdXJyZW50IGFzIGFueTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LmZsYXZvdXIgPT09IHJlc29sdmVkRmxhdm91cilcbiAgICAgICAgICAgIGFsaWFzVG9Vc2UgPSBjdXJyZW50LmFsaWFzO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICAgICAgbW9kZWxDdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgYWxpYXNUb1VzZVxuICAgICAgICApIGFzIFQ7XG4gICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlZ2lzdGVyIHRoZSByZXNvbHZlZCBpbmplY3RhYmxlIG5hbWUgZm9yIGxhdGVyIHJldHJpZXZhbFxuICAgICAgICBjb25zdCBmID1cbiAgICAgICAgICByZXNvbHZlZEZsYXZvdXIgfHxcbiAgICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCAoaW5qZWN0YWJsZSBhcyBhbnkpLmNvbnN0cnVjdG9yKSBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIG1vZGVsQ3RvcikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgIG1vZGVsQ3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICBmIGFzIHN0cmluZ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgIGBObyByZWdpc3RlcmVkIHJlcG9zaXRvcnkgb3IgYWRhcHRlciBmb3VuZC4gZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYWRhcHRlci4gRXJyb3I6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVwb0N0b3IgPSAoUmVwb3NpdG9yeSBhcyBhbnkpW1wiZ2V0XCJdKG1vZGVsQ3RvciwgcmVzb2x2ZWRGbGF2b3VyKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBvQ3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlciA9IHJlc29sdmVkRmxhdm91clxuICAgICAgICAgICAgPyAoQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBhcyBhbnkpXG4gICAgICAgICAgICA6IChBZGFwdGVyLmN1cnJlbnQgYXMgYW55KTtcbiAgICAgICAgICBpZiAoIWFkYXB0ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKTtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXJEaXNwYXRjaCwgRXZlbnRJZHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlcyBkYXRhYmFzZSBvcGVyYXRpb24gZXZlbnRzIHRvIG9ic2VydmVyc1xuICogQHN1bW1hcnkgVGhlIERpc3BhdGNoIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJjZXB0aW5nXG4gKiBkYXRhYmFzZSBvcGVyYXRpb25zIGZyb20gYW4gQWRhcHRlciBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyB3aGVuIGNoYW5nZXMgb2NjdXIuIEl0IHVzZXMgcHJveGllcyB0b1xuICogd3JhcCB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyBhbmQgYXV0b21hdGljYWxseSB0cmlnZ2VyIG9ic2VydmVyIHVwZGF0ZXMgYWZ0ZXIgb3BlcmF0aW9ucyBjb21wbGV0ZS5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIG5hdGl2ZSBkYXRhYmFzZSBkcml2ZXIgdHlwZVxuICogQHBhcmFtIHt2b2lkfSAtIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnNcbiAqIEBjbGFzcyBEaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0aW5nIGFuZCB1c2luZyBhIERpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBEaXNwYXRjaDxQb3N0Z3Jlc0RyaXZlcj4oKTtcbiAqXG4gKiAvLyBDb25uZWN0IGl0IHRvIGFuIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKGNvbm5lY3Rpb24pO1xuICogZGlzcGF0Y2gub2JzZXJ2ZShhZGFwdGVyKTtcbiAqXG4gKiAvLyBOb3cgYW55IENSVUQgb3BlcmF0aW9ucyBvbiB0aGUgYWRhcHRlciB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIC8vIHRyaWdnZXIgb2JzZXJ2ZXIgbm90aWZpY2F0aW9uc1xuICogYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMTIzLCB1c2VyTW9kZWwpO1xuICogLy8gT2JzZXJ2ZXJzIHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlIGNyZWF0aW9uXG4gKlxuICogLy8gV2hlbiBkb25lLCB5b3UgY2FuIGRpc2Nvbm5lY3RcbiAqIGRpc3BhdGNoLnVuT2JzZXJ2ZShhZGFwdGVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2ggZXh0ZW5kcyBMb2dnZWRDbGFzcyBpbXBsZW1lbnRzIEFkYXB0ZXJEaXNwYXRjaCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGFkYXB0ZXIgYmVpbmcgb2JzZXJ2ZWRcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHdob3NlIG9wZXJhdGlvbnMgYXJlIGJlaW5nIG1vbml0b3JlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFkYXB0ZXI/OiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGFkYXB0ZXJcbiAgICovXG4gIHByb3RlY3RlZCBtb2RlbHMhOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2Ugd2l0aG91dCBhbnkgYWRhcHRlclxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoIGJ5IHByb3h5aW5nIGFkYXB0ZXIgbWV0aG9kc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHByb3hpZXMgb24gdGhlIGFkYXB0ZXIncyBDUlVEIG1ldGhvZHMgdG8gaW50ZXJjZXB0IG9wZXJhdGlvbnMgYW5kIG5vdGlmeSBvYnNlcnZlcnMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gYWRhcHRlciBpcyBvYnNlcnZlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQcm94eVxuICAgKlxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IENoZWNrIGlmIGFkYXB0ZXIgZXhpc3RzXG4gICAqICAgYWx0IE5vIGFkYXB0ZXJcbiAgICogICAgIERpc3BhdGNoLS0+PkRpc3BhdGNoOiBUaHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBDUlVEIG1ldGhvZFxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBDaGVjayBpZiBtZXRob2QgZXhpc3RzXG4gICAqICAgICBhbHQgTWV0aG9kIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBHZXQgcHJvcGVydHkgZGVzY3JpcHRvclxuICAgKiAgICAgbG9vcCBXaGlsZSBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIHByb3RvdHlwZSBjaGFpblxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBhbHQgRGVzY3JpcHRvciBub3QgZm91bmQgb3Igbm90IHdyaXRhYmxlXG4gICAqICAgICAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IExvZyBlcnJvciBhbmQgY29udGludWVcbiAgICogICAgIGVsc2UgRGVzY3JpcHRvciBmb3VuZCBhbmQgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5Qcm94eTogQ3JlYXRlIHByb3h5IGZvciBtZXRob2RcbiAgICogICAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBSZXBsYWNlIG1ldGhvZCB3aXRoIHByb3h5XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAvLyBHcmFjZWZ1bGx5IHNraXAgaW5pdGlhbGl6YXRpb24gd2hlbiBubyBhZGFwdGVyIGlzIG9ic2VydmVkIHlldC5cbiAgICAgIC8vIFNvbWUgdGVzdHMgb3Igc2V0dXBzIG1heSBjb25zdHJ1Y3QgYSBEaXNwYXRjaCBiZWZvcmUgY2FsbGluZyBvYnNlcnZlKCkuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHRocm93aW5nLCB3ZSBuby1vcCBzbyB0aGF0IGxhdGVyIG9ic2VydmUoKSBjYW4gcHJvY2VlZC5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb25gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PjtcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgaWYgKCFhZGFwdGVyW21ldGhvZF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHttZXRob2R9IG5vdCBmb3VuZCBpbiAke2FkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFkYXB0ZXIsIG1ldGhvZCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IGFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHttZXRob2R9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICBhZGFwdGVyW21ldGhvZF0gPSBuZXcgUHJveHkoYWRhcHRlclttZXRob2RdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAodGFyZ2V0OiBhbnksIHRoaXNBcmcsIGFyZ0FycmF5OiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFt0YWJsZU5hbWUsIGlkc10gPSBhcmdBcnJheTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlTmFtZSwgYnVsa1RvU2luZ2xlKG1ldGhvZCksIGlkcyBhcyBFdmVudElkcylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgICAgICAgICBgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7bWV0aG9kfSBmb3IgJHt0YWJsZU5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHttZXRob2R9IG9uICR7dGFibGVOYW1lfTogJHtlfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZGlzcGF0Y2hcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHdoZW4gdGhlIGRpc3BhdGNoIGlzIG5vIGxvbmdlciBuZWVkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjbG9zaW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB0byBub3RoaW5nIGluIHRoaXMgaW5zdGFuY2UgYnV0IG1heSBiZSByZXF1aXJlZCBmb3IgY2xvc2luZyBjb25uZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiT25seSBBZGFwdGVycyBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIik7XG4gICAgdGhpcy5hZGFwdGVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5tb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBEaXNwYXRjaCBpbml0aWFsaXplZCBmb3IgJHt0aGlzLmFkYXB0ZXIhLmFsaWFzfSBhZGFwdGVyYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0b3BzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IERpc2Nvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggZnJvbSBhbiBhZGFwdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gc3RvcCBvYnNlcnZpbmdcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZGFwdGVyICE9PSBvYnNlcnZlcilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgdGhlIGFkYXB0ZXIgdGhhdCB3YXMgdXNlZCB0byBvYnNlcnZlIGNhbiBiZSB1bm9ic2VydmVkXCJcbiAgICAgICk7XG4gICAgdGhpcy5hZGFwdGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dGFibGV9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBEaXNwYXRjaDtcbiIsImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEQktleXMsIElSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZGVjb3JhdG9yIGZvciBtb2RlbCBjbGFzc2VzLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FuIGJlIHVzZWQgYXMgYm90aCBhIHByb3BlcnR5IGRlY29yYXRvciBhbmQgYSBjbGFzcyBkZWNvcmF0b3IuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD59IG1vZGVsIC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSB0aGUgcmVxdWlyZWQgYWRhcHRlcidzIGZsYXZvdXIvYWxpYXMuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwgbWV0YWRhdGEuLlxuICogQHJldHVybiB7YW55fSAtIFRoZSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKlxuICogICBDLT4+RDogQXBwbHkgQHJlcG9zaXRvcnkoTW9kZWwpXG4gKiAgIGFsdCBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAqICAgICBELT4+RDogQ2hlY2sgaWYgcHJvcGVydHlLZXkgZXhpc3RzXG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0KG5hbWUpIGRlY29yYXRvclxuICogICBlbHNlIENsYXNzIERlY29yYXRvclxuICogICAgIEQtPj5NOiBTZXQgcmVwb3NpdG9yeSBtZXRhZGF0YSBvbiBtb2RlbFxuICogICAgIEQtPj5SOiBSZWdpc3RlciBtb2RlbCB3aXRoIFJlcG9zaXRvcnlcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3RhYmxlIGRlY29yYXRvciB3aXRoIGNvbmZpZ1xuICogICAgIEMtPj5DOiBEZWZpbmUgREJLZXlzLkNMQVNTIHByb3BlcnR5XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwpKFxuICAgICAgICBvcmlnaW5hbCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLCBvcmlnaW5hbC5uYW1lKShtb2RlbCk7XG4gICAgZmxhdm91ciA9XG4gICAgICBmbGF2b3VyIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgb3JpZ2luYWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoXG4gICAgICBtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIGZsYXZvdXJcbiAgICApO1xuICAgIHJldHVybiBpbmplY3RhYmxlKG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCwge1xuICAgICAgY2FsbGJhY2s6IChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9LFxuICAgIH0pKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3MgT2JzZXJ2ZXJFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgcmVwb3NpdG9yeSBvYnNlcnZlciBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9ic2VydmVyRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPYnNlcnZlckVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3Igc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnM8XG4gIFRZUEUgPSBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgZ2VuZXJhdGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZXMgTnVtYmVyIG9yIEJpZ0ludCB2YWx1ZXNcbiAgICovXG4gIHR5cGU6IFRZUEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIHN0YXJ0cyB3aXRoXG4gICAqL1xuICBzdGFydFdpdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIGVhY2ggc3RlcCBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VxdWVuY2UgaW5jcmVhc2VzIHdpdGggZWFjaCBjYWxsXG4gICAqL1xuICBpbmNyZW1lbnRCeTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWluaW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2UgY2FuIGdlbmVyYXRlXG4gICAqL1xuICBtaW5WYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgc2VxdWVuY2Ugc2hvdWxkIGN5Y2xlIHdoZW4gcmVhY2hpbmcgaXRzIGxpbWl0c1xuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCB0aGUgc2VxdWVuY2Ugd2lsbCByZXN0YXJ0IGZyb20gbWluVmFsdWUgd2hlbiByZWFjaGluZyBtYXhWYWx1ZVxuICAgKi9cbiAgY3ljbGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOb25lU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogdW5kZWZpbmVkLFxuICBnZW5lcmF0ZWQ6IGZhbHNlLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG9wdGlvbnMgZm9yIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMgPSBOb25lU2VxdWVuY2VPcHRpb25zO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmVkZWZpbmVkIG9wdGlvbnMgZm9yIG51bWVyaWMgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBzdGFuZGFyZCBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgTnVtZXJpY1NlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBnZW5lcmF0ZWQ6IHRydWUsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgQmlnSW50IHNlcXVlbmNlc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBmb3IgQmlnSW50IHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IEJpZ0ludFNlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IEJpZ0ludFNlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICB7fSxcbiAgTnVtZXJpY1NlcXVlbmNlLFxuICB7XG4gICAgdHlwZTogXCJCaWdJbnRcIixcbiAgfVxuKTtcbiIsImltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGUgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvciB1cGRhdGVzIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciB0byBjcmVhdGUgYSBuZXcgbW9kZWwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBwcmltYXJ5IGtleVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjcmVhdGUgb3IgdXBkYXRlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtSZXBvPE0sIEYsIENvbnRleHQ8Rj4+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+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IGlubmVyUmVwbzogUmVwbzxNPiA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgbGV0IGRlbGV0ZWQ6IE07XG4gIGlmICghKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNb2RlbCkpXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUobW9kZWxba2V5XSBhcyBzdHJpbmcpO1xuICBlbHNlXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUoXG4gICAgICAobW9kZWxba2V5XSBhcyBNKVtpbm5lclJlcG8ucGsgYXMga2V5b2YgTV0gYXMgc3RyaW5nXG4gICAgKTtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSBhcyBzdHJpbmcsXG4gICAgZGVsZXRlZFxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGV4aXN0aW5nIG1vZGVscyBvciBjcmVhdGluZyBuZXcgb25lc1xuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uQ3JlYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGFsdCBhcnJheVR5cGUgaXMgbm90IFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlcG9cbiAqICAgICBsb29wIGZvciBlYWNoIGlkIGluIHVuaXF1ZVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5yZXBvOiByZWFkKGlkKVxuICogICAgICAgcmVwby0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVhZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkXG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBlbHNlIGFycmF5VHlwZSBpcyBcIm9iamVjdFwiXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogcHJvcGVydHlWYWx1ZXNbMF1cbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcGtOYW1lXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHJlc3VsdCBzZXRcbiAqICAgICBsb29wIGZvciBlYWNoIG0gaW4gcHJvcGVydHlWYWx1ZXNcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG0sIGNvbnRleHRcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBhZGQgcmVjb3JkW3BrTmFtZV0gdG8gcmVzdWx0XG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4ucmVzdWx0XVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMgfHwgIXByb3BlcnR5VmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZXNbMF07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gdHlwZW9mIGl0ZW0gPT09IGFycmF5VHlwZSkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRpb24uIEFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IG11c3QgbWF0Y2ggdGhlIHNhbWUgdHlwZS5gXG4gICAgKTtcbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbLi4ucHJvcGVydHlWYWx1ZXNdKTtcbiAgaWYgKGFycmF5VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzKSB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGlkKTtcbiAgICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgcmVhZCk7XG4gICAgfVxuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa05hbWUgPSBmaW5kUHJpbWFyeUtleShwcm9wZXJ0eVZhbHVlc1swXSkuaWQ7XG5cbiAgY29uc3QgcmVzdWx0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IG0gb2YgcHJvcGVydHlWYWx1ZXMpIHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBjcmVhdGVPclVwZGF0ZShtLCBjb250ZXh0LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkKTtcbiAgICByZXN1bHQuYWRkKHJlY29yZFtwa05hbWVdKTtcbiAgfVxuXG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4ucmVzdWx0XTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgdXBkYXRlc1xuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZGVsZWdhdGluZyB0byBvbmVUb01hbnlPbkNyZWF0ZSBpZiBjYXNjYWRlIHVwZGF0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPblVwZGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPblVwZGF0ZS0+Pm9uZVRvTWFueU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICogICAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFwcGx5KHRoaXMsIFtjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXSlcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0tPj5vbmVUb01hbnlPblVwZGF0ZTogdm9pZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjYXNjYWRlIH0gPSBkYXRhO1xuICBpZiAoY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICByZXR1cm4gb25lVG9NYW55T25DcmVhdGUuYXBwbHkodGhpcyBhcyBhbnksIFtcbiAgICBjb250ZXh0LFxuICAgIGRhdGEsXG4gICAga2V5IGFzIGtleW9mIE1vZGVsLFxuICAgIG1vZGVsLFxuICBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgZGVsZXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIGFsbCByZWxhdGVkIG1vZGVscyBpZiBjYXNjYWRlIGRlbGV0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uRGVsZXRlXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPbkRlbGV0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBjYXNjYWRlLmRlbGV0ZSBpcyBDQVNDQURFXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIHZhbHVlcyBleGlzdHMgYW5kIGhhcyBsZW5ndGhcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgYWxsIGVsZW1lbnRzIGhhdmUgc2FtZSB0eXBlXG4gKlxuICogICBhbHQgaXNJbnN0YW50aWF0ZWQgKGFycmF5VHlwZSBpcyBcIm9iamVjdFwiKVxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwodmFsdWVzWzBdKVxuICogICAgIFJlcG9zaXRvcnktLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZWxzZSBub3QgaW5zdGFudGlhdGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiByZXBvXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvOiBkZWxldGUoaWQsIGNvbnRleHQpXG4gKiAgICAgcmVwby0tPj5vbmVUb01hbnlPbkRlbGV0ZTogZGVsZXRlZFxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IHNldCBtb2RlbFtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc11cbiAqICAgb25lVG9NYW55T25EZWxldGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGF0YS5jYXNjYWRlLmRlbGV0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IHZhbHVlcyA9IG1vZGVsW2tleV0gYXMgYW55O1xuICBpZiAoIXZhbHVlcyB8fCAhdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICBjb25zdCBhcmVBbGxTYW1lVHlwZSA9IHZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKTtcbiAgaWYgKCFhcmVBbGxTYW1lVHlwZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCBpc0luc3RhbnRpYXRlZCA9IGFycmF5VHlwZSA9PT0gXCJvYmplY3RcIjtcbiAgY29uc3QgcmVwbyA9IGlzSW5zdGFudGlhdGVkXG4gICAgPyBSZXBvc2l0b3J5LmZvck1vZGVsKHZhbHVlc1swXSwgdGhpcy5hZGFwdGVyLmFsaWFzKVxuICAgIDogcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcblxuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oaXNJbnN0YW50aWF0ZWRcbiAgICAgID8gdmFsdWVzLm1hcCgodjogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdltyZXBvLnBrIGFzIHN0cmluZ10pXG4gICAgICA6IHZhbHVlcyksXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIGRlbGV0ZWQpO1xuICB9XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciBjYWNoaW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgdW5pcXVlIGtleSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBwb3B1bGF0ZWQgbW9kZWwgcmVsYXRpb25zaGlwcyBpbiB0aGUgY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHJldHVybiB7c3RyaW5nfSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXkoXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuKSB7XG4gIHJldHVybiBbUGVyc2lzdGVuY2VLZXlzLlBPUFVMQVRFLCB0YWJsZU5hbWUsIGZpZWxkTmFtZSwgaWRdLmpvaW4oXCIuXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYWNoZXMgYSBtb2RlbCBmb3IgbGF0ZXIgcG9wdWxhdGlvblxuICogQHN1bW1hcnkgU3RvcmVzIGEgbW9kZWwgaW4gdGhlIGNvbnRleHQgY2FjaGUgZm9yIGVmZmljaWVudCByZXRyaWV2YWwgZHVyaW5nIHJlbGF0aW9uc2hpcCBwb3B1bGF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtNfSBwYXJlbnRNb2RlbCAtIFRoZSBwYXJlbnQgbW9kZWwgdGhhdCBjb250YWlucyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBwa1ZhbHVlIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcGFyYW0ge2FueX0gY2FjaGVWYWx1ZSAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjYWNoZVxuICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNhY2hlIG9wZXJhdGlvblxuICogQGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsRm9yUG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIHBhcmVudE1vZGVsOiBNLFxuICBwcm9wZXJ0eUtleToga2V5b2YgTSB8IHN0cmluZyxcbiAgcGtWYWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBjYWNoZVZhbHVlOiBhbnlcbikge1xuICBjb25zdCBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KFxuICAgIHBhcmVudE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nLFxuICAgIHBrVmFsdWVcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQuYWNjdW11bGF0ZSh7IFtjYWNoZUtleV06IGNhY2hlVmFsdWUgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvcHVsYXRlcyBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGF0dGFjaGVzIHJlbGF0ZWQgbW9kZWxzIHRvIGEgbW9kZWwncyByZWxhdGlvbnNoaXAgcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gcG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcG9wdWxhdGVcbiAqICAgcGFydGljaXBhbnQgZmV0Y2hQb3B1bGF0ZVZhbHVlc1xuICogICBwYXJ0aWNpcGFudCBnZXRQb3B1bGF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKlxuICogICBDYWxsZXItPj5wb3B1bGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBjaGVjayBpZiBkYXRhLnBvcHVsYXRlIGlzIHRydWVcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogZ2V0IG5lc3RlZCB2YWx1ZSBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzXG4gKlxuICogICBwb3B1bGF0ZS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF1cbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBpbml0aWFsaXplIHZhcmlhYmxlc1xuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBwcm9LZXlWYWx1ZSBpbiBwcm9wS2V5VmFsdWVzXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmdldFBvcHVsYXRlS2V5OiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWVcbiAqICAgICBnZXRQb3B1bGF0ZUtleS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjYWNoZUtleVxuICpcbiAqICAgICBhbHQgdHJ5IHRvIGdldCBmcm9tIGNhY2hlXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Q29udGV4dDogZ2V0KGNhY2hlS2V5KVxuICogICAgICAgQ29udGV4dC0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbHNlIGNhdGNoIGVycm9yXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wTmFtZVxuICogICAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogcmVwb1xuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG86IHJlYWQocHJvS2V5VmFsdWUpXG4gKiAgICAgICByZXBvLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVuZFxuICpcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogYWRkIHZhbCB0byByZXN1bHRzXG4gKiAgIGVuZFxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0tPj5wb3B1bGF0ZTogcmVzdWx0c1xuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBzZXQgbW9kZWxba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdXG4gKiAgIHBvcHVsYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnBvcHVsYXRlKSByZXR1cm47XG4gIGNvbnN0IG5lc3RlZDogYW55ID0gbW9kZWxba2V5XTtcbiAgY29uc3QgaXNBcnIgPSBBcnJheS5pc0FycmF5KG5lc3RlZCk7XG4gIGlmICh0eXBlb2YgbmVzdGVkID09PSBcInVuZGVmaW5lZFwiIHx8IChpc0FyciAmJiBuZXN0ZWQubGVuZ3RoID09PSAwKSkgcmV0dXJuO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgYzogQ29udGV4dDxGPixcbiAgICBtb2RlbDogTSxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIHByb3BLZXlWYWx1ZXM6IGFueVtdLFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBjYWNoZUtleTogc3RyaW5nO1xuICAgIGxldCB2YWw6IGFueTtcbiAgICBjb25zdCByZXN1bHRzOiBNW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb0tleVZhbHVlIG9mIHByb3BLZXlWYWx1ZXMpIHtcbiAgICAgIGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkobW9kZWwuY29uc3RydWN0b3IubmFtZSwgcHJvcE5hbWUsIHByb0tleVZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbCA9IGF3YWl0IGMuZ2V0KGNhY2hlS2V5IGFzIGFueSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIHByb3BOYW1lLCBhbGlhcyk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXkgYXMgc3RyaW5nLFxuICAgIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF0sXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTGlzdCBvZiBjb21tb24gSmF2YVNjcmlwdCB0eXBlc1xuICogQHN1bW1hcnkgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgY29tbW9uIEphdmFTY3JpcHQgdHlwZXMgdGhhdCBhcmUgbm90IGN1c3RvbSBtb2RlbCB0eXBlc1xuICogQGNvbnN0IGNvbW1vbVR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuY29uc3QgY29tbW9tVHlwZXMgPSBbXG4gIFwiYXJyYXlcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJudW1iZXJcIixcbiAgXCJib29sZWFuXCIsXG4gIFwic3ltYm9sXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJvYmplY3RcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJudWxsXCIsXG4gIFwiYmlnaW50XCIsXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIHByb3BlcnR5IGJhc2VkIG9uIGl0cyB0eXBlIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFeGFtaW5lcyBhIG1vZGVsIHByb3BlcnR5J3MgdHlwZSBtZXRhZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHJlcG9zaXRvcnkgZm9yIHJlbGF0ZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHthbnl9IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGV4YW1pbmVcbiAqIEByZXR1cm4ge1JlcG88TT59IEEgcmVwb3NpdG9yeSBmb3IgdGhlIG1vZGVsIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IFJlZmxlY3RcbiAqICAgcGFydGljaXBhbnQgVmFsaWRhdGlvblxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BlcnR5S2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlZhbGlkYXRpb246IGtleShBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSkgPyBWYWxpZGF0aW9uS2V5cy5MSVNUIDogVmFsaWRhdGlvbktleXMuVFlQRSlcbiAqICAgVmFsaWRhdGlvbi0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdmFsaWRhdGlvbktleVxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZWZsZWN0OiBnZXRNZXRhZGF0YSh2YWxpZGF0aW9uS2V5LCBtb2RlbCwgcHJvcGVydHlLZXkpXG4gKiAgIFJlZmxlY3QtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHR5cGVzXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBkZXRlcm1pbmUgY3VzdG9tVHlwZXMgYmFzZWQgb24gcHJvcGVydHkgdHlwZVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiB0eXBlcyBhbmQgY3VzdG9tVHlwZXMgZXhpc3RcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNyZWF0ZSBhbGxvd2VkVHlwZXMgYXJyYXlcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogZmluZCBjb25zdHJ1Y3Rvck5hbWUgbm90IGluIGNvbW1vbVR5cGVzXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yTmFtZSBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+TW9kZWw6IGdldChjb25zdHJ1Y3Rvck5hbWUpXG4gKiAgIE1vZGVsLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjb25zdHJ1Y3RvclxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiBjb25zdHJ1Y3RvciBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgIFJlcG9zaXRvcnktLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHJlcG9cbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+PkNhbGxlcjogcmVwb1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyB8IGtleW9mIE0sXG4gIGFsaWFzPzogc3RyaW5nXG4pOiBSZXBvPE0+IHtcbiAgY29uc3QgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFZhbGlkYXRpb24ua2V5KFxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEVcbiAgICApLFxuICAgIG1vZGVsLFxuICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZ1xuICApO1xuICBjb25zdCBjdXN0b21UeXBlczogYW55ID0gQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgPyB0eXBlcy5jbGF6elxuICAgIDogdHlwZXMuY3VzdG9tVHlwZXM7XG4gIGlmICghdHlwZXMgfHwgIWN1c3RvbVR5cGVzKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmaW5kIHR5cGVzIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfWBcbiAgICApO1xuXG4gIGNvbnN0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSAoXG4gICAgQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcykgPyBbLi4uY3VzdG9tVHlwZXNdIDogW2N1c3RvbVR5cGVzXVxuICApLm1hcCgodCkgPT4gKHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgPyB0KCkgOiB0KSk7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGFsbG93ZWRUeXBlcy5maW5kKFxuICAgICh0KSA9PiAhY29tbW9tVHlwZXMuaW5jbHVkZXMoYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIGlmICghY29uc3RydWN0b3JOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFByb3BlcnR5IGtleSAke3Byb3BlcnR5S2V5IGFzIHN0cmluZ30gZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGNvbnN0cnVjdG9yIHR5cGVgXG4gICAgKTtcbiAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KGNvbnN0cnVjdG9yTmFtZSk7XG4gIGlmICghY29uc3RydWN0b3IpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7Y29uc3RydWN0b3JOYW1lfWApO1xuXG4gIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCBhbGlhcyk7XG59XG4iLCJpbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvblVwZGF0ZSxcbiAgYWZ0ZXJBbnksXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dCxcbiAgdGltZXN0YW1wLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhLCBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRDYXNjYWRlLCBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGxpc3QsXG4gIE1vZGVsLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7XG4gIEpvaW5Db2x1bW5PcHRpb25zLFxuICBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICBKb2luVGFibGVPcHRpb25zLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIG9uZVRvTWFueU9uQ3JlYXRlLFxuICBvbmVUb01hbnlPbkRlbGV0ZSxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIG9uZVRvT25lT25DcmVhdGUsXG4gIG9uZVRvT25lT25EZWxldGUsXG4gIG9uZVRvT25lT25VcGRhdGUsXG4gIHBvcHVsYXRlIGFzIHBvcCxcbn0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzIGluIHRoZSBkYXRhYmFzZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzXG4gKiBAZnVuY3Rpb24gdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZTxPUFRTID0gc3RyaW5nPihvcHRzPzogT1BUUykge1xuICByZXR1cm4gZnVuY3Rpb24gdGFibGUodGFyZ2V0OiBhbnkpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpO1xuICAgIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBtZXRhZGF0YSxcbiAgICAgICAgYXJnczogW2tleSwgb3B0cyB8fCB0YXJnZXQubmFtZS50b0xvd2VyQ2FzZSgpXSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKSh0YXJnZXQpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KG5hbWU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW11cbik6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW10sXG4gIG5hbWU6IHN0cmluZ1xuKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChjb21wb3NpdGlvbnM6IHN0cmluZ1tdKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgY29tcG9zaXRpb25zOiBzdHJpbmdbXSxcbiAgbmFtZTogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSB8IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbmFtZT86IHN0cmluZ1xuKSB7XG4gIGZ1bmN0aW9uIGluZGV4KFxuICAgIGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdIHwgc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgY29tcG9zaXRpb25zPzogc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb21wb3NpdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBjb21wb3NpdGlvbnM7XG4gICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghY29tcG9zaXRpb25zICYmIGRpcmVjdGlvbnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGlyZWN0aW9ucy5maW5kKFxuICAgICAgICAgIChkKSA9PiAhW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXS5pbmNsdWRlcyhkIGFzIGFueSlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvc2l0aW9ucyA9IGRpcmVjdGlvbnMgYXMgc3RyaW5nW107XG4gICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KFxuICAgICAgICBgJHtQZXJzaXN0ZW5jZUtleXMuSU5ERVh9JHtjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCA/IGAuJHtjb21wb3NpdGlvbnMuam9pbihcIi5cIil9YCA6IFwiXCJ9YFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgZGlyZWN0aW9uczogZGlyZWN0aW9ucyxcbiAgICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB9IGFzIEluZGV4TWV0YWRhdGFcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5JTkRFWClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5kZXgsXG4gICAgICBhcmdzOiBbZGlyZWN0aW9ucywgY29tcG9zaXRpb25zLCBuYW1lXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmZvcmNlcyB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgZHVyaW5nIG1vZGVsIGNyZWF0aW9uIGFuZCB1cGRhdGVcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIHVuaXF1ZSBkZWNvcmF0b3IgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2VcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIG1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlIG9yIHJlamVjdHMgd2l0aCBhIENvbmZsaWN0RXJyb3JcbiAqIEBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEobW9kZWwgYXMgYW55KVtrZXldKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zZWxlY3QoKVxuICAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKGtleSkuZXEobW9kZWxba2V5XSkpXG4gICAgLmV4ZWN1dGUoKTtcbiAgaWYgKGV4aXN0aW5nLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgIGBtb2RlbCBhbHJlYWR5IGV4aXN0cyB3aXRoIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlbnN1cmVzIGEgcHJvcGVydHkgdmFsdWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdW5pcXVlKClcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB1c2VyIGlkZW50aWZpY2F0aW9uIGZvciBvd25lcnNoaXAgdHJhY2tpbmdcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGRlY29yYXRvcnMgdG8gc2V0IG93bmVyc2hpcCBpbmZvcm1hdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc3RvcmUgdGhlIHVzZXIgaWRlbnRpZmllclxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiBBdXRob3JpemF0aW9uRXJyb3IgaWYgdXNlciBpZGVudGlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZGF0YTogVixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgY3JlYXRvciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBjcmVhdGVkQnkoKVxuICogICBjcmVhdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGxhc3QgdXBkYXRlciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdXBkYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVwZGF0ZWRCeSgpXG4gKiAgIGxhc3RFZGl0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoW09wZXJhdGlvbktleXMuQ1JFQVRFXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAb25lVG9PbmUoUHJvZmlsZSlcbiAqICAgcHJvZmlsZSE6IHN0cmluZyB8IFByb2ZpbGU7XG4gKiB9XG4gKlxuICogY2xhc3MgUHJvZmlsZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIGJpbyE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbiAgam9pbkNvbHVtbk9wdHM/OiBKb2luQ29sdW1uT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBmdW5jdGlvbiBvbmVUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhLmpvaW5UYWJsZSA9IGpvaW5Db2x1bW5PcHRzO1xuICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb09uZU9uQ3JlYXRlLCBtZXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvT25lT25VcGRhdGUsIG1ldGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pbkNvbHVtbk9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKlxuICogICBAb25lVG9NYW55KEJvb2spXG4gKiAgIGJvb2tzITogc3RyaW5nW10gfCBCb29rW107XG4gKiB9XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvT25lXG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBvbmVUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenogYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgIFN0cmluZyxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEJpZ2ludCBpcyBub3QgYSBjb25zdHJ1Y3RvclxuICAgICAgICBCaWdJbnQsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKTtcblxuICBmdW5jdGlvbiBtYW55VG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGlmICghY2xhenoubmFtZSlcbiAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yPE0+KSgpIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5UYWJsZU9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBtYW55VG9NYW55RGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgbGlzdChbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIC8vIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIGFmdGVyQWxsKHBvcHVsYXRlLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1hbnlUb01hbnlEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pblRhYmxlT3B0cywgZmtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucyxcbiAgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7XG4gIERCS2V5cyxcbiAgR3JvdXBTb3J0LFxuICBJbnRlcm5hbEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgcmVhZG9ubHksXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tIFwiLi4vbW9kZWwvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgc2VxdWVuY2VOYW1lRm9yTW9kZWwgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbmNvbnN0IGRlZmF1bHRQa1ByaW9yaXR5ID0gNjA7IC8vIERlZmF1bHQgcHJpb3JpdHkgZm9yIHByaW1hcnkga2V5IHRvIHJ1biBsYXR0ZXIgdGhhbiBvdGhlciBwcm9wZXJ0aWVzXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcmltYXJ5IGtleSBjcmVhdGlvblxuICogQHN1bW1hcnkgSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcHJpbWFyeSBrZXkgdmFsdWVzIGZvciBtb2RlbHMgdXNpbmcgc2VxdWVuY2VzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSB0aGF0IGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIHRoYXQgZXh0ZW5kcyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgZXhlY3V0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBzZXF1ZW5jZSBvcHRpb25zXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgYXMgcHJpbWFyeSBrZXlcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByaW1hcnkga2V5IGlzIHNldFxuICogQGZ1bmN0aW9uIHBrT25DcmVhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHBrT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTZXF1ZW5jZVxuICpcbiAqICAgTW9kZWwtPj5wa09uQ3JlYXRlOiBDYWxsIHdpdGggbW9kZWwgaW5zdGFuY2VcbiAqICAgTm90ZSBvdmVyIHBrT25DcmVhdGU6IENoZWNrIGlmIGtleSBhbHJlYWR5IGV4aXN0c1xuICogICBhbHQgS2V5IGV4aXN0cyBvciBubyB0eXBlIHNwZWNpZmllZFxuICogICAgIHBrT25DcmVhdGUtLT4+TW9kZWw6IFJldHVybiBlYXJseVxuICogICBlbHNlIEtleSBuZWVkcyB0byBiZSBjcmVhdGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PnBrT25DcmVhdGU6IEdlbmVyYXRlIHNlcXVlbmNlIG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PkFkYXB0ZXI6IFJlcXVlc3QgU2VxdWVuY2UoZGF0YSlcbiAqICAgICBBZGFwdGVyLT4+U2VxdWVuY2U6IENyZWF0ZSBzZXF1ZW5jZVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBzZXF1ZW5jZVxuICogICAgIHBrT25DcmVhdGUtPj5TZXF1ZW5jZTogQ2FsbCBuZXh0KClcbiAqICAgICBTZXF1ZW5jZS0tPj5wa09uQ3JlYXRlOiBSZXR1cm4gbmV4dCB2YWx1ZVxuICogICAgIHBrT25DcmVhdGUtPj5Nb2RlbDogU2V0IHByaW1hcnkga2V5IHZhbHVlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGtPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFNlcXVlbmNlT3B0aW9ucyxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnR5cGUgfHwgIWRhdGEuZ2VuZXJhdGVkIHx8IG1vZGVsW2tleV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXRQcmltYXJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgbGV0IHNlcXVlbmNlOiBTZXF1ZW5jZTtcbiAgdHJ5IHtcbiAgICBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShkYXRhKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAgc2V0UHJpbWFyeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBLZXkgRGVjb3JhdG9yXG4gKiBAc3VtbWFyeSBNYXJrcyBhIHByb3BlcnR5IGFzIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5IHdpdGggYXV0b21hdGljIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGNvbWJpbmVzIG11bHRpcGxlIGJlaGF2aW9yczogaXQgbWFya3MgdGhlIHByb3BlcnR5IGFzIHVuaXF1ZSwgcmVxdWlyZWQsXG4gKiBhbmQgZW5zdXJlcyB0aGUgaW5kZXggaXMgY3JlYXRlZCBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHNlcXVlbmNlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09taXQ8U2VxdWVuY2VPcHRpb25zLCBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiPn0gb3B0cyAtIE9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtb2RlbCBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gcGtcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBwaygpXG4gKiAgIGlkITogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBrKFxuICBvcHRzOiBPbWl0PFxuICAgIFNlcXVlbmNlT3B0aW9ucyxcbiAgICBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiXG4gID4gPSBEZWZhdWx0U2VxdWVuY2VPcHRpb25zXG4pIHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsIG9wdHMsIHtcbiAgICBnZW5lcmF0ZWQ6XG4gICAgICBvcHRzLnR5cGUgJiYgdHlwZW9mIG9wdHMuZ2VuZXJhdGVkID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IG9wdHMuZ2VuZXJhdGVkIHx8IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMuZ2VuZXJhdGVkLFxuICB9KSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcbiAgZnVuY3Rpb24gcGtEZWMob3B0aW9uczogU2VxdWVuY2VPcHRpb25zLCBncm91cHNvcnQ/OiBHcm91cFNvcnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBpbmRleChbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdKSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGtleSwgb3B0aW9ucyksXG4gICAgICAgIG9uQ3JlYXRlKHBrT25DcmVhdGUsIG9wdGlvbnMsIGdyb3Vwc29ydCksXG4gICAgICAgIHByb3BNZXRhZGF0YShEQktleXMuSUQsIGF0dHIpXG4gICAgICApKG9iaiwgYXR0cik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIGFyZ3M6IFtvcHRzLCB7IHByaW9yaXR5OiBkZWZhdWx0UGtQcmlvcml0eSB9XSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgY3JlYXRlZEF0LCB1cGRhdGVkQXQgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgbW9kZWwgY2xhc3MgZm9yIGFsbCBkb21haW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgY2xhc3MgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBhbmQgYWRkcyB0aW1lc3RhbXAgZnVuY3Rpb25hbGl0eS5cbiAqIEFsbCBkb21haW4gbW9kZWxzIGluIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gaW5oZXJpdCBjb21tb24gcHJvcGVydGllcyBhbmQgYmVoYXZpb3JzLlxuICogQHBhcmFtIHtNb2RlbEFyZzxCYXNlTW9kZWw+fSBhcmcgLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgbW9kZWxcbiAqIEBjbGFzcyBCYXNlTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiAgIFxuICogICBAZW1haWwoKVxuICogICBlbWFpbCE6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGRhdGE/OiBNb2RlbEFyZzxVc2VyPikge1xuICogICAgIHN1cGVyKGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IHVzZXJuYW1lOiAnam9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWRcbiAgICovXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkT24hOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGFzdCB1cGRhdGUgdGltZXN0YW1wIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgQXV0b21hdGljYWxseSB1cGRhdGVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzIG1vZGlmaWVkXG4gICAqL1xuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZE9uITogRGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8QmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhZ2luZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcGFnaW5hdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgbmF2aWdhdGluZyB0aHJvdWdoIHBhZ2luYXRlZCBxdWVyeSByZXN1bHRzXG4gKlxuICogVGhpcyBhYnN0cmFjdCBjbGFzcyBtYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgbmF2aWdhdGlvbiBvZiBwYWdpbmF0ZWQgZGF0YWJhc2UgcXVlcnkgcmVzdWx0cy5cbiAqIEl0IHRyYWNrcyB0aGUgY3VycmVudCBwYWdlLCB0b3RhbCBwYWdlcywgYW5kIHJlY29yZCBjb3VudCwgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBtb3ZpbmcgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgcGFnaW5hdG9yIG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcGFnaW5hdGVkIHF1ZXJ5IChkZWZhdWx0cyB0byBNW10pXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIChkZWZhdWx0cyB0byBhbnkpXG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBRLCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgZGF0YWJhc2UgYWRhcHRlciB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAcGFyYW0ge1F9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRvIHBhZ2luYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBwZXIgcGFnZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCB0eXBlXG4gKiBAY2xhc3MgUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGFnaW5hdG9yIGZvciBhIHVzZXIgcXVlcnlcbiAqIGNvbnN0IHVzZXJRdWVyeSA9IGRiLnNlbGVjdCgpLmZyb20oVXNlcik7XG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCB1c2VyUXVlcnkucGFnaW5hdGUoMTApOyAvLyAxMCB1c2VycyBwZXIgcGFnZVxuICpcbiAqIC8vIEdldCB0aGUgZmlyc3QgcGFnZSBvZiByZXN1bHRzXG4gKiBjb25zdCBmaXJzdFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqXG4gKiAvLyBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBwYWdlXG4gKiBjb25zdCBzZWNvbmRQYWdlID0gYXdhaXQgcGFnaW5hdG9yLm5leHQoKTtcbiAqXG4gKiAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhZ2luYXRpb25cbiAqIGNvbnNvbGUubG9nKGBQYWdlICR7cGFnaW5hdG9yLmN1cnJlbnR9IG9mICR7cGFnaW5hdG9yLnRvdGFsfSwgJHtwYWdpbmF0b3IuY291bnR9IHRvdGFsIHJlY29yZHNgKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBQYWdpbmF0b3JcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEYXRhYmFzZVxuICpcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBuZXcgUGFnaW5hdG9yKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eilcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogcHJlcGFyZShxdWVyeSlcbiAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogZXhlY3V0ZSBxdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByZXR1cm4gcmVzdWx0c1xuICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcGFnZSByZXN1bHRzXG4gKlxuICogICBDbGllbnQtPj5QYWdpbmF0b3I6IG5leHQoKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHBhZ2UoY3VycmVudCArIDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKGN1cnJlbnQgKyAxKVxuICogICBQYWdpbmF0b3ItPj5BZGFwdGVyOiBleGVjdXRlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvblxuICogICBBZGFwdGVyLT4+RGF0YWJhc2U6IGV4ZWN1dGUgcXVlcnlcbiAqICAgRGF0YWJhc2UtLT4+QWRhcHRlcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJldHVybiByZXN1bHRzXG4gKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJldHVybiBwYWdlIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWwsIFIgPSBNW10sIFEgPSBhbnk+IHtcbiAgcHJvdGVjdGVkIF9jdXJyZW50UGFnZSE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF90b3RhbFBhZ2VzITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3JlY29yZENvdW50ITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGltaXQhOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfc3RhdGVtZW50PzogUTtcblxuICBnZXQgY3VycmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBnZXQgdG90YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7XG4gIH1cblxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3JkQ291bnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHN0YXRlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX3N0YXRlbWVudCkgdGhpcy5fc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMucXVlcnkpO1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnksIFEsIGFueSwgYW55PixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcXVlcnk6IFEsXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwcmVwYXJlKHJhd1N0YXRlbWVudDogUSk6IFE7XG5cbiAgYXN5bmMgbmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCArIDEpO1xuICB9XG5cbiAgYXN5bmMgcHJldmlvdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSh0aGlzLmN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgaWYgKHBhZ2UgPCAxIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpKVxuICAgICAgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFxuICAgICAgICBcIlBhZ2UgbnVtYmVyIGNhbm5vdCBiZSB1bmRlciAxIGFuZCBtdXN0IGJlIGFuIGludGVnZXJcIlxuICAgICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3RvdGFsUGFnZXMgIT09IFwidW5kZWZpbmVkXCIgJiYgcGFnZSA+IHRoaXMuX3RvdGFsUGFnZXMpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIGBPbmx5ICR7dGhpcy5fdG90YWxQYWdlc30gYXJlIGF2YWlsYWJsZS4gQ2Fubm90IGdvIHRvIHBhZ2UgJHtwYWdlfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cblxuICBhYnN0cmFjdCBwYWdlKHBhZ2U/OiBudW1iZXIpOiBQcm9taXNlPFJbXT47XG59XG4iLCJpbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRnJvbVNlbGVjdG9yLFxuICBHcm91cEJ5U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3RvcixcbiAgU2VsZWN0U2VsZWN0b3IsXG59IGZyb20gXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIExpbWl0T3B0aW9uLFxuICBNYXhPcHRpb24sXG4gIE1pbk9wdGlvbixcbiAgT2Zmc2V0T3B0aW9uLFxuICBPcmRlckFuZEdyb3VwT3B0aW9uLFxuICBTZWxlY3RPcHRpb24sXG4gIFdoZXJlT3B0aW9uLFxufSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBQYWdpbmF0YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1BhZ2luYXRhYmxlXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyBmb3IgZGF0YWJhc2UgcXVlcnkgc3RhdGVtZW50c1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBhbmQgZXhlY3V0aW5nIGRhdGFiYXNlIHF1ZXJpZXNcbiAqXG4gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIHF1ZXJ5IGJ1aWxkZXIgcGF0dGVybiBmb3IgY29uc3RydWN0aW5nXG4gKiBkYXRhYmFzZSBxdWVyaWVzLiBJdCBzdXBwb3J0cyB2YXJpb3VzIHF1ZXJ5IG9wZXJhdGlvbnMgbGlrZSBzZWxlY3QsIGZyb20sXG4gKiB3aGVyZSwgb3JkZXJCeSwgZ3JvdXBCeSwgbGltaXQsIGFuZCBvZmZzZXQuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIGV4ZWN1dGluZyBxdWVyaWVzIGFuZCBoYW5kbGluZyBwYWdpbmF0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgc3BlY2lmaWMgdG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBzdGF0ZW1lbnQgb3BlcmF0ZXMgb25cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+fSBhZGFwdGVyIC0gVGhlIGRhdGFiYXNlIGFkYXB0ZXIgdG8gdXNlIGZvciBleGVjdXRpbmcgcXVlcmllc1xuICogQGNsYXNzIFN0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHN0YXRlbWVudCB0byBxdWVyeSB1c2Vyc1xuICogY29uc3Qgc3RhdGVtZW50ID0gbmV3IFNRTFN0YXRlbWVudChhZGFwdGVyKTtcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5zZWxlY3QoKVxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZShcInN0YXR1c1wiKS5lcShcImFjdGl2ZVwiKSlcbiAqICAgLm9yZGVyQnkoW1wiY3JlYXRlZEF0XCIsIFwiREVTQ1wiXSlcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICpcbiAqIC8vIFVzZSBwYWdpbmF0aW9uXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCBzdGF0ZW1lbnRcbiAqICAgLnNlbGVjdCgpXG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC5wYWdpbmF0ZSgyMCk7IC8vIDIwIHVzZXJzIHBlciBwYWdlXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgRGF0YWJhc2VcbiAqXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogc2VsZWN0KClcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBmcm9tKE1vZGVsKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IHdoZXJlKGNvbmRpdGlvbilcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBvcmRlckJ5KFtmaWVsZCwgZGlyZWN0aW9uXSlcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBsaW1pdCh2YWx1ZSlcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBleGVjdXRlKClcbiAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBidWlsZCgpXG4gKiAgIFN0YXRlbWVudC0+PkFkYXB0ZXI6IHJhdyhxdWVyeSlcbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+U3RhdGVtZW50OiByZXR1cm4gcHJvY2Vzc2VkIHJlc3VsdHNcbiAqICAgU3RhdGVtZW50LS0+PkNsaWVudDogcmV0dXJuIGZpbmFsIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudDxRLCBNIGV4dGVuZHMgTW9kZWwsIFI+XG4gIGV4dGVuZHMgTG9nZ2VkQ2xhc3NcbiAgaW1wbGVtZW50cyBFeGVjdXRvcjxSPiwgUmF3RXhlY3V0b3I8UT4sIFBhZ2luYXRhYmxlPE0sIFIsIFE+XG57XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+W107XG4gIHByb3RlY3RlZCBkaXN0aW5jdFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBtYXhTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgbWluU2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGNvdW50U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGZyb21TZWxlY3RvciE6IENvbnN0cnVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgd2hlcmVDb25kaXRpb24/OiBDb25kaXRpb248TT47XG4gIHByb3RlY3RlZCBvcmRlckJ5U2VsZWN0b3I/OiBPcmRlckJ5U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBncm91cEJ5U2VsZWN0b3I/OiBHcm91cEJ5U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBsaW1pdFNlbGVjdG9yPzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb2Zmc2V0U2VsZWN0b3I/OiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBRLCBhbnksIGFueT4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmxvZy5mb3IoU3RhdGVtZW50KTtcbiAgfVxuXG4gIHNlbGVjdDxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgUyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10sXG4gID4oKTogU2VsZWN0T3B0aW9uPE0sIE1bXT47XG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIEBmaW5hbCgpXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZWxlY3RTZWxlY3RvclwiLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0b3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgZGlzdGluY3Q8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihcbiAgICBzZWxlY3RvcjogU1xuICApOiBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+IHtcbiAgICB0aGlzLmRpc3RpbmN0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgbWF4PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I6IFMpOiBNYXhPcHRpb248TSwgTVtTXT4ge1xuICAgIHRoaXMubWF4U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBNYXhPcHRpb248TSwgTVtTXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBtaW48UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3RvcjogUyk6IE1pbk9wdGlvbjxNLCBNW1NdPiB7XG4gICAgdGhpcy5taW5TZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIE1pbk9wdGlvbjxNLCBNW1NdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGNvdW50PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I/OiBTKTogQ291bnRPcHRpb248TSwgbnVtYmVyPiB7XG4gICAgdGhpcy5jb3VudFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgQ291bnRPcHRpb248TSwgbnVtYmVyPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBmcm9tKHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT4pOiBXaGVyZU9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5mcm9tU2VsZWN0b3IgPSAoXG4gICAgICB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQoc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgQ291bGQgbm90IGZpbmQgc2VsZWN0b3IgbW9kZWw6ICR7c2VsZWN0b3J9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgd2hlcmUoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBPcmRlckFuZEdyb3VwT3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLndoZXJlQ29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIG9yZGVyQnkoXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcjxNPlxuICApOiBMaW1pdE9wdGlvbjxNLCBSPiAmIE9mZnNldE9wdGlvbjxSPiB7XG4gICAgdGhpcy5vcmRlckJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBncm91cEJ5KHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3I8TT4pOiBMaW1pdE9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5ncm91cEJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBsaW1pdCh2YWx1ZTogbnVtYmVyKTogT2Zmc2V0T3B0aW9uPFI+IHtcbiAgICB0aGlzLmxpbWl0U2VsZWN0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBvZmZzZXQodmFsdWU6IG51bWJlcik6IEV4ZWN1dG9yPFI+IHtcbiAgICB0aGlzLm9mZnNldFNlbGVjdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogUSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5yYXcocXVlcnkpKSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3PFI+KHJhd0lucHV0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHJldHVybiByZXN1bHRzO1xuICAgIGNvbnN0IHBrQXR0ciA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgbmV3ICh0aGlzLmZyb21TZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPikoKVxuICAgICkuaWQ7XG5cbiAgICBjb25zdCBwcm9jZXNzb3IgPSBmdW5jdGlvbiByZWNvcmRQcm9jZXNzb3IoXG4gICAgICB0aGlzOiBTdGF0ZW1lbnQ8USwgTSwgUj4sXG4gICAgICByOiBhbnlcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkID0gcltwa0F0dHJdO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgIHBrQXR0cixcbiAgICAgICAgaWRcbiAgICAgICkgYXMgYW55O1xuICAgIH0uYmluZCh0aGlzIGFzIGFueSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHMubWFwKHByb2Nlc3NvcikgYXMgUjtcbiAgICByZXR1cm4gcHJvY2Vzc29yKHJlc3VsdHMpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGQoKTogUTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFE7XG4gIGFic3RyYWN0IHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFE+Pjtcbn1cbiIsImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgT3JkZXJCeVNlbGVjdG9yIH0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBxdWVyeSBidWlsZGluZyBiZWhhdmlvci5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBRdWVyeU9wdGlvbnNgIHR5cGUgZGVmaW5lcyBmbGFncyB0aGF0IGRldGVybWluZSB3aGV0aGVyIGNlcnRhaW4gY2xhdXNlc1xuICogKGxpbWl0LCBvZmZzZXQsIG9yZGVyIGJ5KSBhcmUgcGVybWl0dGVkLCBhcyB3ZWxsIGFzIHdoZXRoZXIgdmlvbGF0aW9uc1xuICogc2hvdWxkIHRocm93IGFuIGVycm9yIGR1cmluZyBxdWVyeSBjb25zdHJ1Y3Rpb24uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgdHlwZSBRdWVyeU9wdGlvbnMgPSB7XG4gIGFsbG93TGltaXQ/OiBib29sZWFuO1xuICBhbGxvd09mZnNldD86IGJvb2xlYW47XG4gIGFsbG93T3JkZXJCeT86IGJvb2xlYW47XG4gIHRocm93cz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogU3RydWN0dXJlZCBxdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHBhcnNlZCBxdWVyeSBjbGF1c2VzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5QXNzaXN0YCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RhbmRhcmQgc3RydWN0dXJlIHJldHVybmVkXG4gKiBieSBxdWVyeSBidWlsZGVycy4gSXQgaW5jbHVkZXMgYWN0aW9ucyBzdWNoIGFzIGZpbmQsIG9wdGlvbmFsIGNsYXVzZXNcbiAqIGxpa2Ugc2VsZWN0LCBncm91cEJ5LCBhbmQgb3JkZXJCeSwgYW5kIHBhZ2luYXRpb24gY29udHJvbHMgKGxpbWl0LCBvZmZzZXQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSBlbnRpdHkgb3IgcmVjb3JkIHR5cGUgdGhhdCBjb25kaXRpb25zIG1heSBhcHBseSB0by5cbiAqXG4gKiBAaW50ZXJmYWNlIFF1ZXJ5QXNzaXN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3Npc3Qge1xuICBhY3Rpb246IFwiZmluZFwiO1xuICBzZWxlY3Q6IHVuZGVmaW5lZCB8IHN0cmluZ1tdO1xuICB3aGVyZTogQ29uZGl0aW9uPGFueT47XG4gIGdyb3VwQnk/OiBzdHJpbmdbXTtcbiAgb3JkZXJCeT86IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG4gIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHF1ZXJ5IGNsYXVzZXMgZm9yIGJ1aWxkaW5nIG1ldGhvZC1iYXNlZCBxdWVyaWVzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5Q2xhdXNlYCBlbnVtIGRlZmluZXMgc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50XG4gKiBkaWZmZXJlbnQgc2VnbWVudHMgb2YgYSBxdWVyeSAoZS5nLiwgYGZpbmRCeWAsIGBTZWxlY3RgLCBgQW5kYCwgYE9yYCkuXG4gKlxuICogQGVudW0gUXVlcnlDbGF1c2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IGVudW0gUXVlcnlDbGF1c2Uge1xuICBGSU5EX0JZID0gXCJmaW5kQnlcIixcbiAgU0VMRUNUID0gXCJTZWxlY3RcIixcbiAgQU5EID0gXCJBbmRcIixcbiAgT1IgPSBcIk9yXCIsXG4gIEdST1VQX0JZID0gXCJHcm91cEJ5XCIsXG4gIE9SREVSX0JZID0gXCJPcmRlckJ5XCIsXG4gIFRIRU4gPSBcIlRoZW5cIixcbiAgVEhFTl9CWSA9IFwiVGhlbkJ5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGdW5jdGlvbiBzaWduYXR1cmUgZm9yIHBhcnNpbmcgb3BlcmF0b3JzIGluIHF1ZXJ5IGJ1aWxkaW5nLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE9wZXJhdG9yUGFyc2VyYCB0eXBlIHJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgZmllbGQgbmFtZVxuICogYW5kIGFyZ3VtZW50cywgdGhlbiBwcm9kdWNlcyBhIGBDb25kaXRpb25gIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcXVlcnkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGNvbmRpdGlvbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZpZWxkIHtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHBhcnNlZC5cbiAqIEBwYXJhbSBhcmdzIHthbnlbXX0gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3Igb3BlcmF0b3IgZXZhbHVhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtDb25kaXRpb248YW55Pn0gQSBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIG9wZXJhdG9yLlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0b3JQYXJzZXIgPSAoZmllbGQ6IHN0cmluZywgLi4uYXJnczogYW55KSA9PiBDb25kaXRpb248YW55PjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlc2NyaXB0b3IgZm9yIGZpZWxkcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvcGVyYXRvcnMgaW4gcXVlcnkgcGFyc2luZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBGaWx0ZXJEZXNjcmlwdG9yYCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RydWN0dXJlIHVzZWQgd2hlbiBwYXJzaW5nXG4gKiBtZXRob2Qgc2VnbWVudHMgaW50byBmaWx0ZXJhYmxlIGZpZWxkcyBhbmQgYXNzb2NpYXRlZCBvcGVyYXRvcnMuXG4gKlxuICogQGludGVyZmFjZSBGaWx0ZXJEZXNjcmlwdG9yXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRGVzY3JpcHRvciB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRvclBhcnNlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBNYXAgb2Ygc3VwcG9ydGVkIG9wZXJhdG9ycyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHBhcnNlciBmdW5jdGlvbnMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgT3BlcmF0b3JzTWFwYCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRvciBuYW1lcyBhcyBrZXlzXG4gKiAoc3VjaCBhcyBgRXF1YWxzYCwgYExlc3NUaGFuYCwgYEJldHdlZW5gLCBldGMuKSwgZWFjaCBtYXBwZWQgdG8gYVxuICogZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGEgYENvbmRpdGlvbmAgb2JqZWN0IGZvciB0aGF0IG9wZXJhdG9yLlxuICogVGhlc2UgZnVuY3Rpb25zIHRyYW5zbGF0ZSBxdWVyeSBjbGF1c2VzIGludG8gY29uY3JldGUgY29uZGl0aW9uXG4gKiBidWlsZGVycywgZW5hYmxpbmcgZHluYW1pYyBxdWVyeSBjb25zdHJ1Y3Rpb24gZnJvbSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIHZhbHVlcyB1c2VkIGluIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIGYge3N0cmluZ30gLSBUaGUgZmllbGQgbmFtZSB0aGUgY29uZGl0aW9uIGFwcGxpZXMgdG8uXG4gKiBAcGFyYW0gdjEge2FueX0gLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgZmllbGQgYWdhaW5zdCBvciB0aGUgbG93ZXIgYm91bmQgdmFsdWUgZm9yIHJhbmdlLWJhc2VkIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB2MiB7YW55fSAtIFRoZSB1cHBlciBib3VuZCB2YWx1ZSBmb3IgcmFuZ2UtYmFzZWQgb3BlcmF0b3JzLlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbjxhbnk+fSBBIGNvbmRpdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvciBhcHBsaWVkIHRvIHRoZSBmaWVsZC5cbiAqXG4gKiBAZnVuY3Rpb24gT3BlcmF0b3JzTWFwXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnQgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IE1hcCBhcyBPcGVyYXRvcnNNYXBcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIE9wZXJhdG9yUGFyc2VyXG4gKiAgIHBhcnRpY2lwYW50IENvbmQgYXMgQ29uZGl0aW9uXG4gKlxuICogICBDbGllbnQtPj5NYXA6IFJlcXVlc3Qgb3BlcmF0b3IgcGFyc2VyIChcIkJldHdlZW5cIiwgZmllbGQsIHYxLCB2MilcbiAqICAgTWFwLT4+UGFyc2VyOiBDYWxsIGNvcnJlc3BvbmRpbmcgb3BlcmF0b3IgZnVuY3Rpb25cbiAqICAgUGFyc2VyLT4+Q29uZDogQ29uZGl0aW9uLmF0dHJpYnV0ZShmaWVsZClcbiAqICAgQ29uZC0tPj5QYXJzZXI6IENvbmRpdGlvbiBpbnN0YW5jZVxuICogICBQYXJzZXItPj5Db25kOiBBcHBseSBndGUodjEpXG4gKiAgIFBhcnNlci0+PkNvbmQ6IEFwcGx5IGFuZChsdGUodjIpKVxuICogICBQYXJzZXItLT4+Q2xpZW50OiBSZXR1cm4gYnVpbHQgQ29uZGl0aW9uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JzTWFwOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRvclBhcnNlcj4gPSB7XG4gIEVxdWFsczogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmVxKHYpLFxuICBEaWZmOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkuZGlmKHYpLFxuICBMZXNzVGhhbjogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmx0KHYpLFxuICBMZXNzVGhhbkVxdWFsOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkubHRlKHYpLFxuICBHcmVhdGVyVGhhbjogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmd0KHYpLFxuICBHcmVhdGVyVGhhbkVxdWFsOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkuZ3RlKHYpLFxuICBCZXR3ZWVuOiAoZiwgdjEsIHYyKSA9PlxuICAgIENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpXG4gICAgICAuZ3RlKHYxKVxuICAgICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5sdGUodjIpKSxcbiAgSW46IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5pbih2KSxcbiAgTWF0Y2hlczogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLnJlZ2V4cCh2KSxcbn07XG4iLCJpbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyQnlTZWxlY3RvciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgRmlsdGVyRGVzY3JpcHRvciwgUXVlcnlBc3Npc3QsIFF1ZXJ5Q2xhdXNlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdG9yc01hcCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGxvd2VyRmlyc3QgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgdHlwZSBPcmRlckxpbWl0T2Zmc2V0RXh0cmFjdCA9IHtcbiAgb3JkZXJCeT86IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVXRpbGl0eSBjbGFzcyB0byBidWlsZCBxdWVyeSBvYmplY3RzIGZyb20gcmVwb3NpdG9yeSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTWV0aG9kUXVlcnlCdWlsZGVyYCBjbGFzcyBwYXJzZXMgbWV0aG9kIG5hbWVzIHRoYXQgZm9sbG93IGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb25cbiAqIChlLmcuLCBgZmluZEJ5TmFtZUFuZEFnZU9yZGVyQnlDb3VudHJ5QXNjYCkgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBzdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdHNcbiAqIChgUXVlcnlBc3Npc3RgKS4gSXQgZXh0cmFjdHMgY2xhdXNlcyBzdWNoIGFzIGBzZWxlY3RgLCBgd2hlcmVgLCBgZ3JvdXBCeWAsIGBvcmRlckJ5YCwgYGxpbWl0YCxcbiAqIGFuZCBgb2Zmc2V0YCwgZW5zdXJpbmcgdGhhdCBkZXZlbG9wZXJzIGNhbiBkZWNsYXJlIHJlcG9zaXRvcnkgcXVlcmllcyB1c2luZyBleHByZXNzaXZlIG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGludG8gYSBxdWVyeS5cbiAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBtZXRob2QgcGFyYW1ldGVycyB1c2VkIGZvciBxdWVyeSBjb25kaXRpb25zLlxuICpcbiAqIEByZXR1cm4ge1F1ZXJ5QXNzaXN0fSBBIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHBhcnNlZCBhY3Rpb24sIHNlbGVjdCwgd2hlcmUsXG4gKiBncm91cEJ5LCBvcmRlckJ5LCBsaW1pdCwgYW5kIG9mZnNldCBjbGF1c2VzLlxuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcXVlcnkgPSBNZXRob2RRdWVyeUJ1aWxkZXIuYnVpbGQoXG4gKiAgIFwiZmluZEJ5TmFtZUFuZEFnZU9yZGVyQnlDb3VudHJ5QXNjXCIsXG4gKiAgIFwiSm9oblwiLFxuICogICAyNSxcbiAqICAgW1tcImNvdW50cnlcIiwgXCJBU0NcIl1dXG4gKiApO1xuICpcbiAqIGNvbnNvbGUubG9nKHF1ZXJ5KTtcbiAqIC8vIHtcbiAqIC8vICAgYWN0aW9uOiBcImZpbmRcIixcbiAqIC8vICAgc2VsZWN0OiB1bmRlZmluZWQsXG4gKiAvLyAgIHdoZXJlOiB7IC4uLiB9LFxuICogLy8gICBncm91cEJ5OiB1bmRlZmluZWQsXG4gKiAvLyAgIG9yZGVyQnk6IFtbXCJjb3VudHJ5XCIsIFwiQVNDXCJdXSxcbiAqIC8vICAgbGltaXQ6IHVuZGVmaW5lZCxcbiAqIC8vICAgb2Zmc2V0OiB1bmRlZmluZWRcbiAqIC8vIH1cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBSZXBvc2l0b3J5IE1ldGhvZFxuICogICBwYXJ0aWNpcGFudCBNUUIgYXMgTWV0aG9kUXVlcnlCdWlsZGVyXG4gKiAgIHBhcnRpY2lwYW50IFF1ZXJ5IGFzIFF1ZXJ5QXNzaXN0XG4gKlxuICogICBSZXBvLT4+TVFCOiBidWlsZChtZXRob2ROYW1lLCAuLi52YWx1ZXMpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdENvcmUobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0U2VsZWN0KG1ldGhvZE5hbWUpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBidWlsZFdoZXJlKGNvcmUsIHZhbHVlcylcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0T3JkZXJMaW1pdE9mZnNldChjb3JlLCB2YWx1ZXMpXG4gKiAgIE1RQi0+PlF1ZXJ5OiByZXR1cm4gc3RydWN0dXJlZCBRdWVyeUFzc2lzdCBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGhvZFF1ZXJ5QnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQnVpbGRzIGEgYFF1ZXJ5QXNzaXN0YCBvYmplY3QgYnkgcGFyc2luZyBhIHJlcG9zaXRvcnkgbWV0aG9kIG5hbWUgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVGhlIG1ldGhvZCB2YWxpZGF0ZXMgdGhlIG1ldGhvZCBuYW1lLCBleHRyYWN0cyBjbGF1c2VzIChjb3JlLCBzZWxlY3QsIGdyb3VwQnksIHdoZXJlLFxuICAgKiBvcmRlckJ5LCBsaW1pdCwgYW5kIG9mZnNldCksIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgc3RydWN0dXJlZCBxdWVyeSBvYmplY3RcbiAgICogdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYWdhaW5zdCBhIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIHRoYXQgZW5jb2RlcyBxdWVyeSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHZhbHVlcyB7YW55W119IC0gVGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGNvbmRpdGlvbnMgYW5kIGV4dHJhIGNsYXVzZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge1F1ZXJ5QXNzaXN0fSBBIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkKG1ldGhvZE5hbWU6IHN0cmluZywgLi4udmFsdWVzOiBhbnlbXSk6IFF1ZXJ5QXNzaXN0IHtcbiAgICBpZiAoIW1ldGhvZE5hbWUuc3RhcnRzV2l0aChRdWVyeUNsYXVzZS5GSU5EX0JZKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2ROYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcmUgPSB0aGlzLmV4dHJhY3RDb3JlKG1ldGhvZE5hbWUpO1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuZXh0cmFjdFNlbGVjdChtZXRob2ROYW1lKTtcbiAgICBjb25zdCBncm91cEJ5ID0gdGhpcy5leHRyYWN0R3JvdXBCeShtZXRob2ROYW1lKTtcbiAgICAvLyBjb25zdCBvcmRlckJ5ID0gdGhpcy5leHRyYWN0T3JkZXJCeShtZXRob2ROYW1lKTtcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMuYnVpbGRXaGVyZShjb3JlLCB2YWx1ZXMpO1xuICAgIGNvbnN0IHsgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9ID0gdGhpcy5leHRyYWN0T3JkZXJMaW1pdE9mZnNldChcbiAgICAgIGNvcmUsXG4gICAgICB2YWx1ZXNcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmaW5kXCIsXG4gICAgICBzZWxlY3Q6IHNlbGVjdCxcbiAgICAgIHdoZXJlLFxuICAgICAgZ3JvdXBCeSxcbiAgICAgIG9yZGVyQnksXG4gICAgICBsaW1pdCxcbiAgICAgIG9mZnNldCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgY29yZSBwYXJ0IG9mIHRoZSBtZXRob2QgbmFtZSBhZnRlciBgZmluZEJ5YCBhbmQgYmVmb3JlIGFueSBzcGVjaWFsIGNsYXVzZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFJlbW92ZXMgcHJlZml4ZXMgYW5kIGRldGVjdHMgZGVsaW1pdGVycyAoYFRoZW5gLCBgT3JkZXJCeWAsIGBHcm91cEJ5YCwgYExpbWl0YCwgYE9mZnNldGApXG4gICAqIHRvIGlzb2xhdGUgdGhlIG1haW4gY29uZGl0aW9uYWwgcGFydCBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgdXNlZCBmb3IgYnVpbGRpbmcgY29uZGl0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RDb3JlKG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgYWZ0ZXJGaW5kQnkgPSBtZXRob2ROYW1lLnN1YnN0cmluZyhRdWVyeUNsYXVzZS5GSU5EX0JZLmxlbmd0aCk7XG4gICAgY29uc3QgcmVnZXggPSAvKFRoZW5bQS1aXXxPcmRlckJ5fEdyb3VwQnl8TGltaXR8T2Zmc2V0KS87XG4gICAgY29uc3QgbWF0Y2ggPSBhZnRlckZpbmRCeS5tYXRjaChyZWdleCk7XG4gICAgcmV0dXJuIG1hdGNoID8gYWZ0ZXJGaW5kQnkuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KSA6IGFmdGVyRmluZEJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgc2VsZWN0IGNsYXVzZSBmcm9tIGEgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVjdHMgdGhlIGBTZWxlY3RgIGtleXdvcmQgaW4gdGhlIG1ldGhvZCBuYW1lLCBpc29sYXRlcyB0aGUgZmllbGRzIGZvbGxvd2luZyBpdCxcbiAgICogYW5kIHJldHVybnMgdGhlbSBhcyBhbiBhcnJheSBvZiBsb3dlcmNhc2UtZmlyc3Qgc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgbWV0aG9kIG5hbWUgdG8gcGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBBbiBhcnJheSBvZiBzZWxlY3RlZCBmaWVsZHMgb3IgYHVuZGVmaW5lZGAgaWYgbm8gc2VsZWN0IGNsYXVzZSBleGlzdHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0U2VsZWN0KG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWxlY3RJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5TRUxFQ1QpO1xuICAgIGlmIChzZWxlY3RJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhZnRlclNlbGVjdCA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAgICAgc2VsZWN0SW5kZXggKyBRdWVyeUNsYXVzZS5TRUxFQ1QubGVuZ3RoXG4gICAgKTtcblxuICAgIC8vIFNlYXJjaCBmb3IgbmV4dCBUaGVuLCBHcm91cEJ5LCBPcmRlckJ5Li4uXG4gICAgY29uc3QgbWF0Y2ggPSBhZnRlclNlbGVjdC5tYXRjaCgvKFRoZW5bQS1aXXxPcmRlckJ5fEdyb3VwQnl8TGltaXR8T2Zmc2V0KS8pO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFydCA9IG1hdGNoXG4gICAgICA/IGFmdGVyU2VsZWN0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleClcbiAgICAgIDogYWZ0ZXJTZWxlY3Q7XG5cbiAgICByZXR1cm4gc2VsZWN0UGFydC5zcGxpdChRdWVyeUNsYXVzZS5BTkQpLm1hcChsb3dlckZpcnN0KS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEV4dHJhY3RzIHRoZSBncm91cCBieSBjbGF1c2UgZnJvbSBhIG1ldGhvZCBuYW1lLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEZXRlY3RzIHRoZSBgR3JvdXBCeWAga2V5d29yZCBpbiB0aGUgbWV0aG9kIG5hbWUsIGlzb2xhdGVzIHRoZSBmaWVsZHMgZm9sbG93aW5nIGl0LFxuICAgKiBhbmQgcmV0dXJucyB0aGVtIGFzIGFuIGFycmF5IG9mIGxvd2VyY2FzZS1maXJzdCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXJzZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nW10gfCB1bmRlZmluZWR9IEFuIGFycmF5IG9mIGdyb3VwIGJ5IGZpZWxkcyBvciBgdW5kZWZpbmVkYCBpZiBubyBncm91cCBieSBjbGF1c2UgZXhpc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZTogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGdyb3VwQnlJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5HUk9VUF9CWSk7XG4gICAgaWYgKGdyb3VwQnlJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhZnRlciA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAgICAgZ3JvdXBCeUluZGV4ICsgUXVlcnlDbGF1c2UuR1JPVVBfQlkubGVuZ3RoXG4gICAgKTtcbiAgICBjb25zdCBncm91cEJ5UGFydCA9IGFmdGVyLnNwbGl0KFF1ZXJ5Q2xhdXNlLk9SREVSX0JZKVswXTtcbiAgICByZXR1cm4gZ3JvdXBCeVBhcnRcbiAgICAgIC5zcGxpdChRdWVyeUNsYXVzZS5USEVOX0JZKVxuICAgICAgLm1hcChsb3dlckZpcnN0KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgc3RhdGljIGV4dHJhY3RPcmRlckJ5KFxuICAvLyAgIG1ldGhvZE5hbWU6IHN0cmluZ1xuICAvLyApOiBPcmRlckJ5U2VsZWN0b3I8YW55PltdIHwgdW5kZWZpbmVkIHtcbiAgLy8gICBjb25zdCBvcmRlckJ5SW5kZXggPSBtZXRob2ROYW1lLmluZGV4T2YoUXVlcnlDbGF1c2UuT1JERVJfQlkpO1xuICAvLyAgIGlmIChvcmRlckJ5SW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvL1xuICAvLyAgIGNvbnN0IGFmdGVyID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoXG4gIC8vICAgICBvcmRlckJ5SW5kZXggKyBRdWVyeUNsYXVzZS5PUkRFUl9CWS5sZW5ndGhcbiAgLy8gICApO1xuICAvLyAgIGNvbnN0IG9yZGVyUGFydHMgPSBhZnRlci5zcGxpdChcIlRoZW5CeVwiKTtcbiAgLy9cbiAgLy8gICByZXR1cm4gb3JkZXJQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgLy8gICAgIGNvbnN0IG1hdGNoID0gcGFydC5tYXRjaCgvKC4qPykoQXNjfERlc2N8RHNjKSQvKTtcbiAgLy8gICAgIGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBPcmRlckJ5IHBhcnQ6ICR7cGFydH1gKTtcbiAgLy8gICAgIGNvbnN0IFssIGZpZWxkLCBkaXJdID0gbWF0Y2g7XG4gIC8vICAgICByZXR1cm4gW1xuICAvLyAgICAgICBsb3dlckZpcnN0KGZpZWxkKSxcbiAgLy8gICAgICAgZGlyLnRvTG93ZXJDYXNlKCkgPT09IFwiZHNjXCJcbiAgLy8gICAgICAgICA/IE9yZGVyRGlyZWN0aW9uLkRTQ1xuICAvLyAgICAgICAgIDogKGRpci50b0xvd2VyQ2FzZSgpIGFzIE9yZGVyRGlyZWN0aW9uKSxcbiAgLy8gICAgIF07XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJ1aWxkcyB0aGUgYHdoZXJlYCBjb25kaXRpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBwYXJzZWQgY29yZSBzdHJpbmcgYW5kIHBhcmFtZXRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFNwbGl0cyB0aGUgY29yZSBzdHJpbmcgYnkgbG9naWNhbCBvcGVyYXRvcnMgKGBBbmRgLCBgT3JgKSwgcGFyc2VzIGVhY2ggdG9rZW4gaW50byBhIGZpZWxkXG4gICAqIGFuZCBvcGVyYXRvciwgYW5kIGNvbWJpbmVzIHRoZW0gaW50byBhIGBDb25kaXRpb25gIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29yZSB7c3RyaW5nfSAtIFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgZnJvbSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHJldHVybiB7Q29uZGl0aW9uPGFueT59IEEgc3RydWN0dXJlZCBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcXVlcnkncyB3aGVyZSBjbGF1c2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZFdoZXJlKGNvcmU6IHN0cmluZywgdmFsdWVzOiBhbnlbXSk6IENvbmRpdGlvbjxhbnk+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGNvcmUuc3BsaXQoL09yZGVyQnl8R3JvdXBCeS8pWzBdIHx8IFwiXCI7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHBhcnRzLnNwbGl0KC9BbmR8T3IvKTtcblxuICAgIGNvbnN0IG9wZXJhdG9ycyA9IGNvcmUubWF0Y2goL0FuZHxPci9nKSB8fCBbXTtcblxuICAgIGxldCB3aGVyZTogQ29uZGl0aW9uPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25kaXRpb25zLmZvckVhY2goKHRva2VuLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIG9wZXJhdG9yIH0gPSB0aGlzLnBhcnNlRmllbGRBbmRPcGVyYXRvcih0b2tlbik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBvcGVyYXRvciA/IE9wZXJhdG9yc01hcFtvcGVyYXRvcl0gOiBPcGVyYXRvcnNNYXAuRXF1YWxzO1xuICAgICAgaWYgKCFwYXJzZXIpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgb3BlcmF0b3IgJHtvcGVyYXRvcn1gKTtcblxuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSB2YWx1ZXNbaWR4XTtcbiAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uVmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBmaWVsZCAke2ZpZWxkfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBwYXJzZXIoZmllbGQsIGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIHdoZXJlID1cbiAgICAgICAgaWR4ID09PSAwXG4gICAgICAgICAgPyBjb25kaXRpb25cbiAgICAgICAgICA6IG9wZXJhdG9yc1tpZHggLSAxXSA9PT0gUXVlcnlDbGF1c2UuQU5EXG4gICAgICAgICAgICA/IHdoZXJlIS5hbmQoY29uZGl0aW9uKVxuICAgICAgICAgICAgOiB3aGVyZSEub3IoY29uZGl0aW9uKTtcbiAgICB9KTtcblxuICAgIGlmICghd2hlcmUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmRpdGlvbnMgZm91bmQgaW4gbWV0aG9kIG5hbWVcIik7XG4gICAgcmV0dXJuIHdoZXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQYXJzZXMgYSBmaWVsZCBuYW1lIGFuZCBvcGVyYXRvciBmcm9tIGEgc3RyaW5nIHRva2VuLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZGVudGlmaWVzIHRoZSBvcGVyYXRvciBzdWZmaXggKGlmIHByZXNlbnQpIGFuZCByZXR1cm5zIGEgZGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBuYW1lIGluIGxvd2VyY2FzZS1maXJzdCBmb3JtYXQgYWxvbmcgd2l0aCB0aGUgb3BlcmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBzdHIge3N0cmluZ30gLSBUaGUgdG9rZW4gc3RyaW5nIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGaWx0ZXJEZXNjcmlwdG9yfSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmllbGQgbmFtZSBhbmQgb3BlcmF0b3IuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZUZpZWxkQW5kT3BlcmF0b3Ioc3RyOiBzdHJpbmcpOiBGaWx0ZXJEZXNjcmlwdG9yIHtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdG9yIG9mIE9iamVjdC5rZXlzKE9wZXJhdG9yc01hcCkpIHtcbiAgICAgIGlmIChzdHIuZW5kc1dpdGgob3BlcmF0b3IpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3RyLnNsaWNlKDAsIC1vcGVyYXRvci5sZW5ndGgpO1xuICAgICAgICByZXR1cm4geyBmaWVsZDogbG93ZXJGaXJzdChmaWVsZCksIG9wZXJhdG9yIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGZpZWxkOiBsb3dlckZpcnN0KHN0cikgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXh0cmFjdHMgYG9yZGVyQnlgLCBgbGltaXRgLCBhbmQgYG9mZnNldGAgY2xhdXNlcyBmcm9tIG1ldGhvZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiBjb25kaXRpb24gYXJndW1lbnRzLCB0aGVuIGNoZWNrcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50c1xuICAgKiB0byByZXNvbHZlIHNvcnRpbmcsIGxpbWl0aW5nLCBhbmQgcGFnaW5hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvcmUge3N0cmluZ30gLSBUaGUgZXh0cmFjdGVkIGNvcmUgc3RyaW5nIGZyb20gdGhlIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWVzIHthbnlbXX0gLSBUaGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gbWV0aG9kIGFyZ3VtZW50cywgaW5jbHVkaW5nIGNvbmRpdGlvbnMgYW5kIGV4dHJhcy5cbiAgICpcbiAgICogQHJldHVybiB7T3JkZXJMaW1pdE9mZnNldEV4dHJhY3R9IEFuIG9iamVjdCBjb250YWluaW5nIG9yZGVyQnksIGxpbWl0LCBhbmQgb2Zmc2V0IHZhbHVlcyBpZiBwcmVzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdE9yZGVyTGltaXRPZmZzZXQoXG4gICAgY29yZTogc3RyaW5nLFxuICAgIHZhbHVlczogYW55W11cbiAgKTogT3JkZXJMaW1pdE9mZnNldEV4dHJhY3Qge1xuICAgIGNvbnN0IGNvbmRpdGlvbkNvdW50ID0gY29yZS5zcGxpdCgvQW5kfE9yLykubGVuZ3RoO1xuICAgIGNvbnN0IGV4dHJhQXJncyA9IHZhbHVlcy5zbGljZShjb25kaXRpb25Db3VudCk7XG5cbiAgICBsZXQgb3JkZXJCeTogT3JkZXJCeVNlbGVjdG9yPGFueT5bXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZXh0cmFBcmdzLmxlbmd0aCA+PSAxICYmIEFycmF5LmlzQXJyYXkoZXh0cmFBcmdzWzBdKSlcbiAgICAgIG9yZGVyQnkgPSBleHRyYUFyZ3NbMF0gYXMgT3JkZXJCeVNlbGVjdG9yPGFueT5bXTtcblxuICAgIGlmIChleHRyYUFyZ3MubGVuZ3RoID49IDIgJiYgdHlwZW9mIGV4dHJhQXJnc1sxXSA9PT0gXCJudW1iZXJcIilcbiAgICAgIGxpbWl0ID0gZXh0cmFBcmdzWzFdO1xuXG4gICAgaWYgKGV4dHJhQXJncy5sZW5ndGggPj0gMyAmJiB0eXBlb2YgZXh0cmFBcmdzWzJdID09PSBcIm51bWJlclwiKVxuICAgICAgb2Zmc2V0ID0gZXh0cmFBcmdzWzJdO1xuXG4gICAgcmV0dXJuIHsgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTWV0aG9kUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vTWV0aG9kUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeShvcHRpb25zOiBRdWVyeU9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgLy8gY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleS50b1N0cmluZygpO1xuICAgIChkZXNjcmlwdG9yIGFzIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT4pLnZhbHVlID0gZnVuY3Rpb24gKFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0LCB3aGVyZSwgZ3JvdXBCeSwgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9ID1cbiAgICAgICAgTWV0aG9kUXVlcnlCdWlsZGVyLmJ1aWxkKG1ldGhvZE5hbWUsIC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc3RtdCA9ICh0aGlzIGFzIGFueSkuc2VsZWN0KHNlbGVjdCkgYXMgYW55O1xuICAgICAgaWYgKHdoZXJlKSBzdG10ID0gc3RtdC53aGVyZSh3aGVyZSk7XG4gICAgICAvLyBpZiAob3JkZXJCeSkgc3RtdCA9IHN0bXQub3JkZXJCeShvcmRlckJ5WzBdKTtcbiAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgIC8vIGdyb3VwIGJ5IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgICAgICAgLyogc3RtdCA9IHN0bXQuZ3JvdXBCeShncm91cEJ5KTsgKi9cbiAgICAgIH1cblxuICAgICAgLy8gYWxsb3cgbGltaXQgYW5kIG9mZnNldCBieSBkZWZhdWx0XG4gICAgICBjb25zdCB7IGFsbG93TGltaXQsIGFsbG93T2Zmc2V0LCBhbGxvd09yZGVyQnksIHRocm93cyB9ID0ge1xuICAgICAgICBhbGxvd0xpbWl0OiB0cnVlLFxuICAgICAgICBhbGxvd09yZGVyQnk6IHRydWUsXG4gICAgICAgIGFsbG93T2Zmc2V0OiB0cnVlLFxuICAgICAgICB0aHJvd3M6IHRydWUsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9IGFzIFF1ZXJ5T3B0aW9ucztcblxuICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAvLyBrZWVwIHRoZSBvcmRlciB0byBlbnN1cmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yXG4gICAgICAgIHsga2V5OiBcIm9yZGVyQnlcIiwgdmFsdWU6IChvcmRlckJ5IHx8IFtdKVswXSwgYWxsb3dlZDogYWxsb3dPcmRlckJ5IH0sIC8vIG9yZGVyQnkgb25seSBzdXBwb3J0cyBvbmUgc2VudGVuY2VcbiAgICAgICAgeyBrZXk6IFwibGltaXRcIiwgdmFsdWU6IGxpbWl0LCBhbGxvd2VkOiBhbGxvd0xpbWl0IH0sXG4gICAgICAgIHsga2V5OiBcIm9mZnNldFwiLCB2YWx1ZTogb2Zmc2V0LCBhbGxvd2VkOiBhbGxvd09mZnNldCB9LFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtLmFsbG93ZWQgJiYgdGhyb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICAgICAgYCR7cGFyYW0ua2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBwYXJhbS5rZXkuc2xpY2UoMSl9IGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIHF1ZXJ5YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHN0bXQgPSBzdG10W3BhcmFtLmtleV0ocGFyYW0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RtdC5leGVjdXRlKCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFJhd1JhbVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0tc3BlY2lmaWMgcGFnaW5hdG9yIGltcGxlbWVudGF0aW9uXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIFBhZ2luYXRvciBjbGFzcyB0byBwcm92aWRlIHBhZ2luYXRpb24gZnVuY3Rpb25hbGl0eSBmb3IgUkFNIGFkYXB0ZXIgcXVlcmllcy5cbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgcGFnaW5hdGlvbiBvZiBxdWVyeSByZXN1bHRzIGZyb20gdGhlIGluLW1lbW9yeSBzdG9yYWdlLCBhbGxvd2luZ1xuICogZm9yIGVmZmljaWVudCByZXRyaWV2YWwgb2YgbGFyZ2UgcmVzdWx0IHNldHMgaW4gc21hbGxlciBjaHVua3MuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHBhZ2luYXRlZFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGUgcmV0dXJuZWQgYnkgdGhlIHBhZ2luYXRvclxuICogQGNsYXNzIFJhbVBhZ2luYXRvclxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHF1ZXJ5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCBxdWVyeTogUmF3UmFtUXVlcnk8VXNlcj4gPSB7XG4gKiAgIHNlbGVjdDogdW5kZWZpbmVkLCAvLyBTZWxlY3QgYWxsIGZpZWxkc1xuICogICBmcm9tOiBVc2VyLFxuICogICB3aGVyZTogKHVzZXIpID0+IHVzZXIuYWN0aXZlID09PSB0cnVlXG4gKiB9O1xuICpcbiAqIC8vIENyZWF0ZSBhIHBhZ2luYXRvciB3aXRoIHBhZ2Ugc2l6ZSBvZiAxMFxuICogY29uc3QgcGFnaW5hdG9yID0gbmV3IFJhbVBhZ2luYXRvcjxVc2VyLCBVc2VyPihhZGFwdGVyLCBxdWVyeSwgMTAsIFVzZXIpO1xuICpcbiAqIC8vIEdldCB0aGUgZmlyc3QgcGFnZSBvZiByZXN1bHRzXG4gKiBjb25zdCBmaXJzdFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqXG4gKiAvLyBHZXQgdGhlIG5leHQgcGFnZVxuICogY29uc3Qgc2Vjb25kUGFnZSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgUmF3UmFtUXVlcnk8TT5cbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBBZGFwdGVyPGFueSwgUmF3UmFtUXVlcnk8TT4sIGFueSwgYW55PixcbiAgICBxdWVyeTogUmF3UmFtUXVlcnk8TT4sXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIFJBTSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHN0YXRlbWVudCB0byBpbmNsdWRlIHBhZ2luYXRpb24gcGFyYW1ldGVycy5cbiAgICogVGhpcyBwcm90ZWN0ZWQgbWV0aG9kIHNldHMgdGhlIGxpbWl0IHBhcmFtZXRlciBvbiB0aGUgcXVlcnkgdG8gbWF0Y2ggdGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtSYXdSYW1RdWVyeTxNPn0gcmF3U3RhdGVtZW50IC0gVGhlIG9yaWdpbmFsIHF1ZXJ5IHN0YXRlbWVudFxuICAgKiBAcmV0dXJuIHtSYXdSYW1RdWVyeTxNPn0gVGhlIG1vZGlmaWVkIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IFJhd1JhbVF1ZXJ5PE0+KTogUmF3UmFtUXVlcnk8TT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSYXdSYW1RdWVyeTxhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3U3RhdGVtZW50KTtcbiAgICBxdWVyeS5saW1pdCA9IHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0c1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBwYWdlIG9mIHJlc3VsdHMuXG4gICAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGFwcHJvcHJpYXRlIHNraXAgdmFsdWUgYmFzZWQgb24gdGhlIHBhZ2UgbnVtYmVyIGFuZCBwYWdlIHNpemUsXG4gICAqIGV4ZWN1dGVzIHRoZSBxdWVyeSwgYW5kIHVwZGF0ZXMgdGhlIGN1cnJlbnQgcGFnZSB0cmFja2luZy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYWdlPTFdIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIHJldHJpZXZlICgxLWJhc2VkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJlc3VsdHMgZm9yIHRoZSByZXF1ZXN0ZWQgcGFnZVxuICAgKi9cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLnByZXBhcmUodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgICAgdGhpcy5fdG90YWxQYWdlcyA9IHRoaXMuX3JlY29yZENvdW50ID0gMDtcbiAgICAgICAgY29uc3QgcmVzdWx0czogUltdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7IC4uLnN0YXRlbWVudCwgbGltaXQ6IHVuZGVmaW5lZCB9KSB8fCBbXTtcbiAgICAgICAgdGhpcy5fcmVjb3JkQ291bnQgPSByZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX3JlY29yZENvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHN0YXRlbWVudD8ubGltaXQgfHwgdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLl9yZWNvcmRDb3VudCAvIHNpemUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFnZSA9IHRoaXMudmFsaWRhdGVQYWdlKHBhZ2UpO1xuICAgIHN0YXRlbWVudC5za2lwID0gKHBhZ2UgLSAxKSAqIHRoaXMuc2l6ZTtcbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoc3RhdGVtZW50KTtcbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIFBhZ2luYXRvcixcbiAgUXVlcnlFcnJvcixcbn0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBSYXdSYW1RdWVyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJhbVBhZ2luYXRvciB9IGZyb20gXCIuL1JhbVBhZ2luYXRvclwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHF1ZXJ5IHN0YXRlbWVudCBidWlsZGVyXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIFN0YXRlbWVudCBjbGFzcyB0byBwcm92aWRlIHF1ZXJ5IGJ1aWxkaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAqIFRoaXMgY2xhc3MgdHJhbnNsYXRlcyBoaWdoLWxldmVsIHF1ZXJ5IG9wZXJhdGlvbnMgaW50byBwcmVkaWNhdGVzIHRoYXQgY2FuIGZpbHRlciBhbmQgc29ydFxuICogaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgYmVpbmcgcXVlcmllZFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGUgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5XG4gKiBAcGFyYW0ge1JhbUFkYXB0ZXJ9IGFkYXB0ZXIgLSBUaGUgUkFNIGFkYXB0ZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBleGVjdXRpbmcgcXVlcmllc1xuICogQGNsYXNzIFJhbVN0YXRlbWVudFxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHN0YXRlbWVudCBmb3IgcXVlcnlpbmcgVXNlciBtb2RlbHNcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBSYW1TdGF0ZW1lbnQ8VXNlciwgVXNlcj4ocmFtQWRhcHRlcik7XG4gKlxuICogLy8gQnVpbGQgYSBxdWVyeSB0byBmaW5kIGFjdGl2ZSB1c2VycyB3aXRoIGFnZSA+IDE4XG4gKiBjb25zdCByZXN1bHRzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC53aGVyZShDb25kaXRpb24uYW5kKFxuICogICAgIENvbmRpdGlvbi5lcSgnYWN0aXZlJywgdHJ1ZSksXG4gKiAgICAgQ29uZGl0aW9uLmd0KCdhZ2UnLCAxOClcbiAqICAgKSlcbiAqICAgLm9yZGVyQnkoJ2xhc3ROYW1lJywgJ2FzYycpXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIFJhd1JhbVF1ZXJ5PE0+LFxuICBNLFxuICBSXG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogUmFtQWRhcHRlcikge1xuICAgIHN1cGVyKGFkYXB0ZXIgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNvcnQgY29tcGFyYXRvciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byBtb2RlbCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlIG9yZGVyQnkgY3JpdGVyaWEuXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZGlmZmVyZW50IGRhdGEgdHlwZXMgKHN0cmluZywgbnVtYmVyLCBkYXRlKSBhbmQgc29ydCBkaXJlY3Rpb25zIChhc2MsIGRlc2MpLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihNb2RlbCwgTW9kZWwpOiBudW1iZXJ9IEEgY29tcGFyYXRvciBmdW5jdGlvbiBmb3Igc29ydGluZyBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0U29ydCgpIHtcbiAgICByZXR1cm4gKGVsMTogTW9kZWwsIGVsMjogTW9kZWwpID0+IHtcbiAgICAgIGlmICghdGhpcy5vcmRlckJ5U2VsZWN0b3IpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIFwib3JkZXJCeVNlbGVjdG9yIG5vdCBzZXQuIFNob3VsZCBiZSBpbXBvc3NpYmxlXCJcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5vcmRlckJ5U2VsZWN0b3I7XG4gICAgICBjb25zdCBba2V5LCBkaXJlY3Rpb25dID0gc2VsZWN0b3I7XG4gICAgICBjb25zdCB0eXBlID0gUmVmbGVjdGlvbi5nZXRUeXBlRnJvbURlY29yYXRvcihlbDEsIGtleSBhcyBzdHJpbmcpO1xuICAgICAgaWYgKCF0eXBlKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgdHlwZSBub3QgY29tcGF0aWJsZSB3aXRoIHNvcnRpbmc6ICR7dHlwZX1gKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBzdHJpbmcpLmxvY2FsZUNvbXBhcmUoXG4gICAgICAgICAgICAgIGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IFwiYXNjXCIgPyAxIDogLTEpICpcbiAgICAgICAgICAgICgoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBudW1iZXIpIC1cbiAgICAgICAgICAgICAgKGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgbnVtYmVyKSlcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbDFba2V5IGFzIGtleW9mIE1vZGVsXSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgIGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IFwiYXNjXCIgPyAxIDogLTEpICpcbiAgICAgICAgICAgICAgKChlbDFba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIERhdGUpLnZhbHVlT2YoKSAtXG4gICAgICAgICAgICAgICAgKGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgRGF0ZSkudmFsdWVPZigpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgU29ydGluZyBub3Qgc3VwcG9ydGVkIGZvciBub3QgZGF0ZSBjbGFzc2VzYCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYHNvcnRpbmcgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgUkFNIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3Mgc2VsZWN0b3JzIGFuZCBjb25kaXRpb25zIGludG8gYSBSYXdSYW1RdWVyeSBvYmplY3RcbiAgICogdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYnkgdGhlIFJBTSBhZGFwdGVyLiBUaGlzIG1ldGhvZCBhc3NlbWJsZXMgYWxsIHF1ZXJ5IGNvbXBvbmVudHNcbiAgICogKHNlbGVjdCwgZnJvbSwgd2hlcmUsIGxpbWl0LCBvZmZzZXQsIHNvcnQpIGludG8gdGhlIGZpbmFsIHF1ZXJ5IHN0cnVjdHVyZS5cbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IFRoZSBjb25zdHJ1Y3RlZCBSQU0gcXVlcnkgb2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGQoKTogUmF3UmFtUXVlcnk8TT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmF3UmFtUXVlcnk8TT4gPSB7XG4gICAgICBzZWxlY3Q6IHRoaXMuc2VsZWN0U2VsZWN0b3IsXG4gICAgICBmcm9tOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIHdoZXJlOiB0aGlzLndoZXJlQ29uZGl0aW9uXG4gICAgICAgID8gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uKS53aGVyZVxuICAgICAgICA6IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAoZWw6IE0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICBsaW1pdDogdGhpcy5saW1pdFNlbGVjdG9yLFxuICAgICAgc2tpcDogdGhpcy5vZmZzZXRTZWxlY3RvcixcbiAgICB9O1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcikgcmVzdWx0LnNvcnQgPSB0aGlzLmdldFNvcnQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgcXVlcnlcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBxdWVyeSBhbmQgd3JhcHMgaXQgaW4gYSBSYW1QYWdpbmF0b3IgdG8gZW5hYmxlIHBhZ2luYXRpb24gb2YgcmVzdWx0cy5cbiAgICogVGhpcyBhbGxvd3MgcmV0cmlldmluZyBsYXJnZSByZXN1bHQgc2V0cyBpbiBzbWFsbGVyIGNodW5rcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgcGFnZSBzaXplIChudW1iZXIgb2YgcmVzdWx0cyBwZXIgcGFnZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgUmF3UmFtUXVlcnk8TT4+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBwYWdpbmF0b3IgZm9yIHRoZSBxdWVyeVxuICAgKi9cbiAgYXN5bmMgcGFnaW5hdGUoc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgUmF3UmFtUXVlcnk8TT4+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5idWlsZCgpO1xuICAgICAgcmV0dXJuIG5ldyBSYW1QYWdpbmF0b3I8TSwgUj4oXG4gICAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHNpemUsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIFJBTSBxdWVyeSBwcmVkaWNhdGVcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZFxuICAgKiB0byBmaWx0ZXIgbW9kZWwgaW5zdGFuY2VzIGluIG1lbW9yeS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIHNpbXBsZSBjb25kaXRpb25zXG4gICAqIChlcXVhbHMsIGdyZWF0ZXIgdGhhbiwgZXRjLikgYW5kIGNvbXBsZXggY29uZGl0aW9ucyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQsIE9SKS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBwYXJzZVxuICAgKiBAcmV0dXJuIHtSYXdSYW1RdWVyeTxNPn0gQSBSQU0gcXVlcnkgb2JqZWN0IHdpdGggYSB3aGVyZSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgU2ltcGxlQ29uZGl0aW9uXG4gICAqICAgcGFydGljaXBhbnQgQ29tcGxleENvbmRpdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbVN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29uZGl0aW9uKVxuICAgKiAgIGFsdCBTaW1wbGUgY29uZGl0aW9uIChlcSwgZ3QsIGx0LCBldGMuKVxuICAgKiAgICAgUmFtU3RhdGVtZW50LT4+U2ltcGxlQ29uZGl0aW9uOiBFeHRyYWN0IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvblxuICAgKiAgICAgU2ltcGxlQ29uZGl0aW9uLS0+PlJhbVN0YXRlbWVudDogUmV0dXJuIHByZWRpY2F0ZSBmdW5jdGlvblxuICAgKiAgIGVsc2UgTG9naWNhbCBvcGVyYXRvciAoQU5ELCBPUilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PkNvbXBsZXhDb25kaXRpb246IEV4dHJhY3QgbmVzdGVkIGNvbmRpdGlvbnNcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlJhbVN0YXRlbWVudDogcGFyc2VDb25kaXRpb24obGVmdENvbmRpdGlvbilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlJhbVN0YXRlbWVudDogcGFyc2VDb25kaXRpb24ocmlnaHRDb25kaXRpb24pXG4gICAqICAgICBDb21wbGV4Q29uZGl0aW9uLS0+PlJhbVN0YXRlbWVudDogQ29tYmluZSBwcmVkaWNhdGVzIHdpdGggbG9naWNhbCBvcGVyYXRvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbVN0YXRlbWVudC0tPj5DYWxsZXI6IFJldHVybiBxdWVyeSB3aXRoIHdoZXJlIHByZWRpY2F0ZVxuICAgKi9cbiAgcGFyc2VDb25kaXRpb248TSBleHRlbmRzIE1vZGVsPihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2hlcmU6IChtOiBNb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgICAgICkgPT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQklHR0VSOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPiBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5CSUdHRVJfRVE6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA+PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5ESUZGRVJFTlQ6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSAhPT0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA9PT0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuUkVHRVhQOlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgICAgICAgICAgYEludmFsaWQgcmVnZXhwIGNvbXBhcmlzb24gb24gYSBub24gc3RyaW5nIGF0dHJpYnV0ZTogJHttW2F0dHIxIGFzIGtleW9mIE1vZGVsXX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuICEhKG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nKS5tYXRjaChcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGNvbXBhcmlzb24sIFwiZ1wiKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TTUFMTEVSOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPCBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TTUFMTEVSX0VROlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPD0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBzdGFuZGFyZCBjb21wYXJpc29uczogJHtvcGVyYXRvcn1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvcDE6IFJhd1JhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICAgICAgYXR0cjEgYXMgQ29uZGl0aW9uPE0+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvcDI6IFJhd1JhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICAgICAgY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT5cbiAgICAgICAgICApO1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICAgIHJldHVybiBvcDEud2hlcmUobSkgJiYgb3AyLndoZXJlKG0pO1xuICAgICAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLk9SOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pIHx8IG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBBbmQvT3IgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IGFzIFJhd1JhbVF1ZXJ5PGFueT47XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udGV4dCBjbGFzcyBmb3IgUkFNIGFkYXB0ZXIgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzcGVjaWFsaXplZCBjb250ZXh0IGZvciBSQU0gYWRhcHRlciBvcGVyYXRpb25zLCBleHRlbmRpbmcgdGhlIGJhc2UgQ29udGV4dCB3aXRoIFJBTS1zcGVjaWZpYyBmbGFncy4gVGhpcyBjb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBvcGVyYXRpb24gcGFyYW1ldGVycyBhbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAqIEBjbGFzcyBSYW1Db250ZXh0XG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IFJBTSBjb250ZXh0XG4gKiBjb25zdCBjb250ZXh0ID0gbmV3IFJhbUNvbnRleHQoKTtcbiAqIC8vIE9wdGlvbmFsbHkgc2V0IGEgZmxhZ1xuICogY29udGV4dC5zZXQoJ1VVSUQnLCAnMTIzZTQ1NjctZTg5Yi0xMmQzLWE0NTYtNDI2NjE0MTc0MDAwJyk7XG4gKiAvLyBBY2Nlc3MgYSBmbGFnIGZyb20gdGhlIGNvbnRleHRcbiAqIGNvbnN0IHV1aWQgPSBjb250ZXh0LmdldCgnVVVJRCcpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBSYW1Db250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IEJhc2VDb250ZXh0IGFzIENvbnRleHRcbiAqICAgQ2FsbGVyLT4+UmFtQ29udGV4dDogbmV3IFJhbUNvbnRleHQoKVxuICogICBSYW1Db250ZXh0LT4+QmFzZUNvbnRleHQ6IHN1cGVyKClcbiAqICAgUmFtQ29udGV4dC0tPj5DYWxsZXI6IGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1Db250ZXh0IGV4dGVuZHMgQ29udGV4dDxSYW1GbGFncz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBpbmRleCwgdGFibGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxcIjtcbmltcG9ydCB7IHBrIH0gZnJvbSBcIi4uLy4uL2lkZW50aXR5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTSBzZXF1ZW5jZSBtb2RlbCBmb3IgYXV0by1pbmNyZW1lbnRpbmcgdmFsdWVzXG4gKiBAc3VtbWFyeSBBIG1vZGVsIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHNlcXVlbmNlIGluIHRoZSBSQU0gYWRhcHRlci4gSXQgc3RvcmVzIHRoZSBjdXJyZW50IHZhbHVlXG4gKiBvZiBhIHNlcXVlbmNlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCBpZGVudGlmaWVycyBmb3IgZW50aXRpZXMuXG4gKiBUaGUgc2VxdWVuY2UgaXMgaWRlbnRpZmllZCBieSBpdHMgSUQgYW5kIG1haW50YWlucyB0aGUgY3VycmVudCB2YWx1ZS5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8U2VxdWVuY2U+fSBzZXEgLSBJbml0aWFsIHNlcXVlbmNlIGRhdGFcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBzZXF1ZW5jZVxuICogY29uc3Qgb3JkZXJTZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZSh7IGlkOiAnb3JkZXJfc2VxJywgY3VycmVudDogMSB9KTtcbiAqXG4gKiAvLyBVc2UgdGhlIHNlcXVlbmNlIHRvIGdldCB0aGUgbmV4dCB2YWx1ZVxuICogY29uc3QgbmV4dE9yZGVySWQgPSBwYXJzZUludChvcmRlclNlcXVlbmNlLmN1cnJlbnQudG9TdHJpbmcoKSkgKyAxO1xuICogb3JkZXJTZXF1ZW5jZS5jdXJyZW50ID0gbmV4dE9yZGVySWQ7XG4gKiBgYGBcbiAqL1xuQHRhYmxlKFwiX19SYW1TZXF1ZW5jZVwiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSYW1TZXF1ZW5jZU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogVXNlZCB0byBnZW5lcmF0ZSB0aGUgbmV4dCBzZXF1ZW50aWFsIHZhbHVlXG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBjdXJyZW50ITogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNlcT86IE1vZGVsQXJnPFJhbVNlcXVlbmNlTW9kZWw+KSB7XG4gICAgc3VwZXIoc2VxKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmFtU2VxdWVuY2VNb2RlbCB9IGZyb20gXCIuL21vZGVsL1JhbVNlcXVlbmNlTW9kZWxcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0tc3BlY2lmaWMgc2VxdWVuY2UgaW1wbGVtZW50YXRpb25cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgU2VxdWVuY2UgY2xhc3MgdG8gcHJvdmlkZSBhdXRvLWluY3JlbWVudGluZyBzZXF1ZW5jZSBmdW5jdGlvbmFsaXR5XG4gKiBmb3IgdGhlIFJBTSBhZGFwdGVyLiBUaGlzIGNsYXNzIG1hbmFnZXMgc2VxdWVuY2VzIHN0b3JlZCBpbiBtZW1vcnksIGFsbG93aW5nIGZvciB0aGUgZ2VuZXJhdGlvblxuICogb2Ygc2VxdWVudGlhbCBpZGVudGlmaWVycyBmb3IgZW50aXRpZXMuXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gKiBAcGFyYW0ge1JhbUFkYXB0ZXJ9IGFkYXB0ZXIgLSBUaGUgUkFNIGFkYXB0ZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBzdG9yYWdlXG4gKiBAY2xhc3MgUmFtU2VxdWVuY2VcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgbnVtZXJpYyBzZXF1ZW5jZSBzdGFydGluZyBhdCAxXG4gKiBjb25zdCBzZXF1ZW5jZSA9IG5ldyBSYW1TZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICdvcmRlcl9zZXF1ZW5jZScsXG4gKiAgIHR5cGU6ICdOdW1iZXInLFxuICogICBzdGFydFdpdGg6IDEsXG4gKiAgIGluY3JlbWVudEJ5OiAxXG4gKiB9LCByYW1BZGFwdGVyKTtcbiAqXG4gKiAvLyBHZXQgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKlxuICogLy8gR2V0IGEgcmFuZ2Ugb2YgdmFsdWVzXG4gKiBjb25zdCBpZFJhbmdlID0gYXdhaXQgc2VxdWVuY2UucmFuZ2UoNSk7IC8vIFJldHVybnMgNSBzZXF1ZW50aWFsIHZhbHVlc1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1TZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgcHJvdGVjdGVkIHJlcG86IFJlcG88UmFtU2VxdWVuY2VNb2RlbD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU2VxdWVuY2VPcHRpb25zLCBhZGFwdGVyOiBSYW1BZGFwdGVyKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChSYW1TZXF1ZW5jZU1vZGVsLCBhZGFwdGVyLmFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZSBmcm9tIHN0b3JhZ2UuIElmIHRoZSBzZXF1ZW5jZVxuICAgKiBkb2Vzbid0IGV4aXN0IHlldCwgaXQgcmV0dXJucyB0aGUgY29uZmlndXJlZCBzdGFydGluZyB2YWx1ZS5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCBzZXF1ZW5jZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcXVlbmNlOiBSYW1TZXF1ZW5jZU1vZGVsID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQobmFtZSBhcyBzdHJpbmcpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxdWVuY2UuY3VycmVudCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnRXaXRoID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgXCJTdGFydGluZyB2YWx1ZSBpcyBub3QgZGVmaW5lZCBmb3IgYSBub24gZXhpc3Rpbmcgc2VxdWVuY2VcIlxuICAgICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc3RhcnRXaXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGluaXRpYWwgdmFsdWUgZm9yIHNlcXVlbmNlICR7c3RhcnRXaXRofTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSBjdXJyZW50IHZhbHVlIGZvciBzZXF1ZW5jZSAke25hbWV9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIHZhbHVlIGFjY29yZGluZyB0byB0aGUgc2VxdWVuY2UgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgc2VxdWVuY2UgKHN0cmluZywgbnVtYmVyLCBvciBiaWdpbnQpXG4gICAqIHVzaW5nIHRoZSBiYXNlIFNlcXVlbmNlIGNsYXNzJ3MgcGFyc2VWYWx1ZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBwYXJzZVxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IFRoZSBwYXJzZWQgdmFsdWUgaW4gdGhlIGNvcnJlY3QgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMudHlwZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZSB2YWx1ZVxuICAgKiBAc3VtbWFyeSBJbmNyZWFzZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgdmFsdWUgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQgYW5kIHBlcnNpc3RzXG4gICAqIHRoZSBuZXcgdmFsdWUgdG8gc3RvcmFnZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIG51bWVyaWMgYW5kIEJpZ0ludCBzZXF1ZW5jZSB0eXBlcy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudF0gLSBPcHRpb25hbCBhbW91bnQgdG8gaW5jcmVtZW50IGJ5LCBkZWZhdWx0cyB0byB0aGUgc2VxdWVuY2UncyBpbmNyZW1lbnRCeSB2YWx1ZVxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgc2VxdWVuY2UgdmFsdWUgYWZ0ZXIgaW5jcmVtZW50aW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgbGV0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICBjb25zdCB0b0luY3JlbWVudEJ5ID0gY291bnQgfHwgaW5jcmVtZW50Qnk7XG4gICAgaWYgKHRvSW5jcmVtZW50QnkgJSBpbmNyZW1lbnRCeSAhPT0gMClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgVmFsdWUgdG8gaW5jcmVtZW50IGRvZXMgbm90IGNvbnNpZGVyIHRoZSBpbmNyZW1lbnRCeSBzZXR0aW5nOiAke2luY3JlbWVudEJ5fWBcbiAgICAgICk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgIG5leHQgPSAodGhpcy5wYXJzZShjdXJyZW50KSBhcyBudW1iZXIpICsgdG9JbmNyZW1lbnRCeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgIG5leHQgPSAodGhpcy5wYXJzZShjdXJyZW50KSBhcyBiaWdpbnQpICsgQmlnSW50KHRvSW5jcmVtZW50QnkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJTdHJpbmdcIjpcbiAgICAgICAgbmV4dCA9IHRoaXMucGFyc2UoY3VycmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJTaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xuICAgIH1cbiAgICBsZXQgc2VxOiBSYW1TZXF1ZW5jZU1vZGVsO1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLnJlcG8ub3ZlcnJpZGUoe1xuICAgICAgaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzOiBbXCJ1cGRhdGVkT25cIl0sXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIHNlcSA9IGF3YWl0IHJlcG8udXBkYXRlKG5ldyBSYW1TZXF1ZW5jZU1vZGVsKHsgaWQ6IG5hbWUsIGN1cnJlbnQ6IG5leHQgfSkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBzZXEgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgUmFtU2VxdWVuY2VNb2RlbCh7IGlkOiBuYW1lLCBjdXJyZW50OiBuZXh0IH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VxLmN1cnJlbnQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIGFuZCBpbmNyZW1lbnRzIGl0IGJ5IHRoZVxuICAgKiBjb25maWd1cmVkIGluY3JlbWVudCBhbW91bnQuIFRoaXMgaXMgdGhlIG1haW4gbWV0aG9kIHVzZWQgdG8gZ2V0IGEgbmV3IHNlcXVlbnRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuY3VycmVudCgpO1xuICAgIHJldHVybiB0aGlzLmluY3JlbWVudChjdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgcmFuZ2Ugb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBzZXF1ZW50aWFsIHZhbHVlcyBmcm9tIHRoZSBzZXF1ZW5jZS5cbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBhbGxvY2F0ZSBtdWx0aXBsZSBJRHMgYXQgb25jZS5cbiAgICogVGhlIG1ldGhvZCBpbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZSBieSB0aGUgdG90YWwgYW1vdW50IG5lZWRlZCBhbmQgcmV0dXJucyBhbGwgdmFsdWVzIGluIHRoZSByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBzZXF1ZW50aWFsIHZhbHVlcyB0byBnZW5lcmF0ZVxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqL1xuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZShcbiAgICAgIHRoaXMub3B0aW9ucy5pbmNyZW1lbnRCeSBhcyBudW1iZXJcbiAgICApIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0ICYmIHRoaXMub3B0aW9ucy50eXBlICE9PSBcIlN0cmluZ1wiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwbyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbFwiO1xuaW1wb3J0IHsgUmFtRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdGVkIGJ5IGZpZWxkIG9uIGEgbW9kZWwgZHVyaW5nIFJBTSBjcmVhdGUvdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIGEgbW9kZWwgZmllbGQgd2l0aCB0aGUgVVVJRCBmcm9tIHRoZSBjb250ZXh0IGR1cmluZyBjcmVhdGUgb3IgdXBkYXRlIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBoYW5kbGVyIGZvciBSQU0gb3BlcmF0aW9ucyB0byB0cmFjayBlbnRpdHkgY3JlYXRpb24uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgb2YgdGhlIG1vZGVsIGJlaW5nIGNyZWF0ZWQvdXBkYXRlZFxuICogQHRlbXBsYXRlIFIgLSBUeXBlIG9mIHRoZSByZXBvc2l0b3J5IGhhbmRsaW5nIHRoZSBtb2RlbFxuICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBvZiB0aGUgUkFNIGZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgb2YgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyB1c2VyIGlkZW50aWZpY2F0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgd2l0aCB0aGUgVVVJRFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkL3VwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpZWxkIGhhcyBiZWVuIHNldFxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSYW1GbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXVpZDogc3RyaW5nID0gY29udGV4dC5nZXQoXCJVVUlEXCIpO1xuICBpZiAoIXV1aWQpXG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIlRoaXMgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgaWRlbnRpZmljYXRpb25cIlxuICAgICk7XG4gIG1vZGVsW2tleV0gPSB1dWlkIGFzIE1ba2V5b2YgTV07XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGlmaWVyIGZvciB0aGUgUkFNIGFkYXB0ZXJcbiAqIEBzdW1tYXJ5IEEgY29uc3RhbnQgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgUkFNIGFkYXB0ZXIgaW4gdGhlIHN5c3RlbS4gVXNlZCBmb3IgYWRhcHRlciB0eXBlIGlkZW50aWZpY2F0aW9uIGFuZCBjb25maWd1cmF0aW9uIGFjcm9zcyB0aGUgY29yZSBtb2R1bGUuXG4gKiBAY29uc3QgUmFtRmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKi9cbmV4cG9ydCBjb25zdCBSYW1GbGF2b3VyID0gXCJyYW1cIjtcbiIsImltcG9ydCB7XG4gIFJhbUZsYWdzLFxuICBSYXdSYW1RdWVyeSxcbiAgUmFtU3RvcmFnZSxcbiAgUmFtUmVwb3NpdG9yeSxcbiAgUmFtQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmFtU3RhdGVtZW50IH0gZnJvbSBcIi4vUmFtU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBSYW1Db250ZXh0IH0gZnJvbSBcIi4vUmFtQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cywgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSBcIkBkZWNhZi10cy90cmFuc2FjdGlvbmFsLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBoYXNoT2JqLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtU2VxdWVuY2UgfSBmcm9tIFwiLi9SYW1TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUgfSBmcm9tIFwiLi9oYW5kbGVyc1wiO1xuaW1wb3J0IHsgUmFtRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5BZGFwdGVyLnNldEN1cnJlbnQoUmFtRmxhdm91cik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEluLW1lbW9yeSBhZGFwdGVyIGZvciBkYXRhIHBlcnNpc3RlbmNlXG4gKiBAc3VtbWFyeSBUaGUgUmFtQWRhcHRlciBwcm92aWRlcyBhbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBlcnNpc3RlbmNlIGxheWVyLlxuICogSXQgc3RvcmVzIGRhdGEgaW4gSmF2YVNjcmlwdCBNYXBzIGFuZCBwcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGNhcGFiaWxpdGllcy5cbiAqIFRoaXMgYWRhcHRlciBpcyB1c2VmdWwgZm9yIHRlc3RpbmcsIHByb3RvdHlwaW5nLCBhbmQgYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZVxuICogcGVyc2lzdGVudCBzdG9yYWdlIGFjcm9zcyBhcHBsaWNhdGlvbiByZXN0YXJ0cy5cbiAqIEBjbGFzcyBSYW1BZGFwdGVyXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IFJBTSBhZGFwdGVyXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFJhbUFkYXB0ZXIoJ215UmFtQWRhcHRlcicpO1xuICpcbiAqIC8vIENyZWF0ZSBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWxcbiAqIGNvbnN0IHVzZXJSZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoVXNlciwgYWRhcHRlcik7XG4gKlxuICogLy8gUGVyZm9ybSBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IG5hbWU6ICdKb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9KTtcbiAqIGF3YWl0IHVzZXJSZXBvLmNyZWF0ZSh1c2VyKTtcbiAqIGNvbnN0IHJldHJpZXZlZFVzZXIgPSBhd2FpdCB1c2VyUmVwby5maW5kQnlJZCh1c2VyLmlkKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAqXG4gKiAgIENsaWVudC0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwb3NpdG9yeS0+PlJhbUFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQoaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqXG4gKiAgIENsaWVudC0+PlJlcG9zaXRvcnk6IGZpbmRCeUlkKGlkKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICogICBTdG9yYWdlLS0+PlJhbUFkYXB0ZXI6IG1vZGVsXG4gKiAgIFJhbUFkYXB0ZXItLT4+UmVwb3NpdG9yeTogbW9kZWxcbiAqICAgUmVwb3NpdG9yeS0tPj5DbGllbnQ6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUmFtQ29uZmlnLFxuICBSYW1TdG9yYWdlLFxuICBSYXdSYW1RdWVyeTxhbnk+LFxuICBSYW1GbGFncyxcbiAgUmFtQ29udGV4dFxuPiB7XG4gIGNvbnN0cnVjdG9yKGNvbmY6IFJhbUNvbmZpZyA9IHt9IGFzIGFueSwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihjb25mLCBSYW1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlbCB0eXBlLlxuICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBSQU0tc3BlY2lmaWMgcmVwb3NpdG9yeSBmdW5jdGlvbmFsaXR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgcmVwb3NpdG9yeVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSYW1SZXBvc2l0b3J5PE0+Pn0gQSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgUkFNIHJlcG9zaXRvcmllc1xuICAgKi9cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJhbVJlcG9zaXRvcnk8TT5cbiAgPiB7XG4gICAgcmV0dXJuIHN1cGVyLnJlcG9zaXRvcnk8TT4oKSBhcyBDb25zdHJ1Y3RvcjxSYW1SZXBvc2l0b3J5PE0+PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvcGVyYXRpb24gZmxhZ3Mgd2l0aCBVVUlEXG4gICAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgZmxhZ3Mgd2l0aCBhIFVVSUQgZm9yIHVzZXIgaWRlbnRpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCBhbGwgb3BlcmF0aW9ucyBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRyYWNraW5nIHB1cnBvc2VzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8UmFtRmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gYmUgZXh0ZW5kZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxSYW1GbGFncz59IENvbXBsZXRlIGZsYWdzIHdpdGggVVVJRFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFJhbUZsYWdzPlxuICApOiBQcm9taXNlPFJhbUZsYWdzPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpLCB7XG4gICAgICBVVUlEOiB0aGlzLmNvbmZpZy51c2VyIHx8IFwiXCIgKyBEYXRlLm5vdygpLFxuICAgIH0pIGFzIFJhbUZsYWdzO1xuICB9XG5cbiAgb3ZlcnJpZGUgQ29udGV4dCA9IFJhbUNvbnRleHQ7XG5cbiAgcHJpdmF0ZSBpbmRleGVzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIFJlY29yZDxzdHJpbmcsIGFueT4+XG4gID4gPSB7fTtcblxuICBwcml2YXRlIGxvY2sgPSBuZXcgTG9jaygpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kZXhlcyBtb2RlbHMgaW4gdGhlIFJBTSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IEEgbm8tb3AgaW5kZXhpbmcgbWV0aG9kIGZvciB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFNpbmNlIFJBTSBhZGFwdGVyIGRvZXNuJ3QgcmVxdWlyZSBleHBsaWNpdCBpbmRleGluZywgdGhpcyBtZXRob2Qgc2ltcGx5IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0gbW9kZWxzIC0gTW9kZWxzIHRvIGJlIGluZGV4ZWQgKHVudXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluZGV4aW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluZGV4KC4uLm1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSB0byBhIGZvcm1hdCBzdWl0YWJsZSBmb3Igc3RvcmFnZSBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBwcmltYXJ5IGtleSBhbmQgY3JlYXRlcyBhIHJlY29yZCB3aXRob3V0IHRoZSBwcmltYXJ5IGtleSBmaWVsZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBwcmVwYXJlZFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBPYmplY3QgY29udGFpbmluZyB0aGUgcmVjb3JkIGFuZCBJRFxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHsgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBpZDogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gc3VwZXIucHJlcGFyZShtb2RlbCwgcGspO1xuICAgIGRlbGV0ZSBwcmVwYXJlZC5yZWNvcmRbcGsgYXMgc3RyaW5nXTtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RvcmVkIHJlY29yZCBiYWNrIHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVjb25zdHJ1Y3RzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBhIHN0b3JlZCByZWNvcmQgYnkgYWRkaW5nIGJhY2sgdGhlIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJlcGFyZSBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdG8gcmV2ZXJ0IHRvXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIC0gVGhlIHN0b3JlZCByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBNIHtcbiAgICBjb25zdCByZXMgPSBzdXBlci5yZXZlcnQob2JqLCBjbGF6eiwgcGssIGlkKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgU3RvcmVzIGEgbmV3IHJlY29yZCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlIHdpdGggdGhlIGdpdmVuIElELlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNyZWF0ZXMgdGhlIHRhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsXG4gICAqIGNoZWNrcyBmb3IgY29uZmxpY3RzLCBhbmQgc3RvcmVzIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgcmVjb3JkIGluXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhIHRvIHN0b3JlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdG9yZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKVxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBDb25mbGljdEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IG1vZGVsXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5jbGllbnQuaGFzKHRhYmxlTmFtZSkpIHRoaXMuY2xpZW50LnNldCh0YWJsZU5hbWUsIG5ldyBNYXAoKSk7XG4gICAgaWYgKHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpICYmIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5oYXMoaWQpKVxuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBhbHJlYWR5IGV4aXN0cyBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5zZXQoaWQsIG1vZGVsKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVjb3JkIGZyb20gaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZnJvbSB0aGUgZ2l2ZW4gdGFibGUuXG4gICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCBhbmQgdGhyb3dzIGFwcHJvcHJpYXRlIGVycm9ycyBpZiBub3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmV0cmlldmUgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogcmVjb3JkXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlY29yZFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGlmICghdGhpcy5jbGllbnQuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uZ2V0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyByZWNvcmQgaW4gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QsXG4gICAqIGFuZCB1cGRhdGVzIHRoZSByZWNvcmQgd2l0aCB0aGUgbmV3IGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG5ldyByZWNvcmQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiB1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IG1vZGVsXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5jbGllbnQuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5zZXQoaWQsIG1vZGVsKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QsXG4gICAqIHJldHJpZXZlcyB0aGUgcmVjb3JkIGJlZm9yZSBkZWxldGlvbiwgYW5kIHRoZW4gcmVtb3ZlcyBpdCBmcm9tIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogcmVjb3JkXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGRlbGV0ZShpZClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5jbGllbnQuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IG5hdGl2ZWQgPSB0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uZ2V0KGlkKTtcbiAgICB0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBuYXRpdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSB0YWJsZSBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBNYXAgcmVwcmVzZW50aW5nIGEgdGFibGUgZm9yIGEgZ2l2ZW4gbW9kZWwgb3IgdGFibGUgbmFtZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXNuJ3QgZXhpc3QsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB1c2VkXG4gICAqIGJ5IG90aGVyIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IHN0b3JhZ2UgbG9jYXRpb24uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBmcm9tIC0gVGhlIG1vZGVsIGNsYXNzIG9yIHRhYmxlIG5hbWVcbiAgICogQHJldHVybiB7TWFwPHN0cmluZyB8IG51bWJlciwgYW55PiB8IHVuZGVmaW5lZH0gVGhlIHRhYmxlIE1hcCBvciB1bmRlZmluZWRcbiAgICovXG4gIHByb3RlY3RlZCB0YWJsZUZvcjxNIGV4dGVuZHMgTW9kZWw+KGZyb206IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSBcInN0cmluZ1wiKSBmcm9tID0gTW9kZWwuZ2V0KGZyb20pIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IHRhYmxlID0gUmVwb3NpdG9yeS50YWJsZShmcm9tKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50Lmhhcyh0YWJsZSkpIHRoaXMuY2xpZW50LnNldCh0YWJsZSwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBxdWVyeSBvcGVyYXRpb24gb24gdGhlIGluLW1lbW9yeSBkYXRhIHN0b3JlIHVzaW5nIHRoZSBwcm92aWRlZCBxdWVyeSBzcGVjaWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBmaWx0ZXJpbmcsIHNvcnRpbmcsIHBhZ2luYXRpb24sIGFuZCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge1Jhd1JhbVF1ZXJ5PGFueT59IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHNwZWNpZmljYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiByYXcocmF3SW5wdXQpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHRhYmxlRm9yKGZyb20pXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGZpbmRQcmltYXJ5S2V5KG5ldyBmcm9tKCkpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGVudHJpZXMoKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogZW50cmllc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggZW50cnlcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXZlcnQociwgZnJvbSwgaWQsIHBrKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBXaGVyZSBjb25kaXRpb24gZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LmZpbHRlcih3aGVyZSlcbiAgICogICBlbmRcbiAgICogICBhbHQgU29ydCBjb25kaXRpb24gZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNvcnQoc29ydClcbiAgICogICBlbmRcbiAgICogICBhbHQgU2tpcCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2Uoc2tpcClcbiAgICogICBlbmRcbiAgICogICBhbHQgTGltaXQgc3BlY2lmaWVkXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNsaWNlKDAsIGxpbWl0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTZWxlY3QgZmllbGRzIHNwZWNpZmllZFxuICAgKiAgICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IEZpbHRlciB0byBzZWxlY3RlZCBmaWVsZHNcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUmF3UmFtUXVlcnk8YW55Pik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgd2hlcmUsIHNvcnQsIGxpbWl0LCBza2lwLCBmcm9tIH0gPSByYXdJbnB1dDtcbiAgICBsZXQgeyBzZWxlY3QgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLnRhYmxlRm9yKGZyb20pO1xuICAgIGlmICghY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUYWJsZSAke2Zyb219IG5vdCBmb3VuZCBpbiBSYW1BZGFwdGVyYCk7XG4gICAgY29uc3QgeyBpZCwgcHJvcHMgfSA9IGZpbmRQcmltYXJ5S2V5KG5ldyBmcm9tKCkpO1xuXG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBBcnJheS5mcm9tKGNvbGxlY3Rpb24uZW50cmllcygpKS5tYXAoKFtwaywgcl0pID0+XG4gICAgICB0aGlzLnJldmVydChcbiAgICAgICAgcixcbiAgICAgICAgZnJvbSxcbiAgICAgICAgaWQgYXMgYW55LFxuICAgICAgICBTZXF1ZW5jZS5wYXJzZVZhbHVlKHByb3BzLnR5cGUgYXMgYW55LCBwayBhcyBzdHJpbmcpIGFzIHN0cmluZ1xuICAgICAgKVxuICAgICk7XG5cbiAgICByZXN1bHQgPSB3aGVyZSA/IHJlc3VsdC5maWx0ZXIod2hlcmUpIDogcmVzdWx0O1xuXG4gICAgaWYgKHNvcnQpIHJlc3VsdCA9IHJlc3VsdC5zb3J0KHNvcnQpO1xuXG4gICAgaWYgKHNraXApIHJlc3VsdCA9IHJlc3VsdC5zbGljZShza2lwKTtcbiAgICBpZiAobGltaXQpIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsaW1pdCk7XG5cbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBzZWxlY3QgPSBBcnJheS5pc0FycmF5KHNlbGVjdCkgPyBzZWxlY3QgOiBbc2VsZWN0XTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoKHIpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHIpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKChzZWxlY3QgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkpIGFjY1trZXldID0gdmFsO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgdG8gYXBwcm9wcmlhdGUgdHlwZXNcbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IGVycm9ycyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZy5cbiAgICogSWYgdGhlIGVycm9yIGlzIGFscmVhZHkgYSBCYXNlRXJyb3IsIGl0J3MgcmV0dXJuZWQgYXMgaXM7IG90aGVyd2lzZSwgaXQncyB3cmFwcGVkIGluIGFuIEludGVybmFsRXJyb3IuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGV4cGVjdGVkIGVycm9yIHR5cGUsIGV4dGVuZGluZyBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge1Z9IFRoZSBwYXJzZWQgZXJyb3Igb2YgdGhlIGV4cGVjdGVkIHR5cGVcbiAgICovXG4gIHBhcnNlRXJyb3I8ViBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvcik6IFYge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgVjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBxdWVyaWVzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TdGF0ZW1lbnQgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHF1ZXJpZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgZmx1ZW50IHF1ZXJ5IGNvbnN0cnVjdGlvbiBhZ2FpbnN0IHRoZSBSQU0gYWRhcHRlci5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHN0YXRlbWVudFxuICAgKiBAcmV0dXJuIHtSYW1TdGF0ZW1lbnQ8TSwgYW55Pn0gQSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KCk6IFJhbVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFJhbVN0YXRlbWVudDxNLCBhbnk+KHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZSBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIElEc1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUmFtU2VxdWVuY2UgaW5zdGFuY2UgZm9yIElEIGdlbmVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSBhdXRvLWluY3JlbWVudGluZyBzZXF1ZW5jZXMgZm9yIGVudGl0eSBJRHMuXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFJhbVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBmb3IoY29uZmlnOiBQYXJ0aWFsPFJhbUNvbmZpZz4sIC4uLmFyZ3M6IGFueVtdKTogdHlwZW9mIHRoaXMge1xuICAgIGlmICghdGhpcy5wcm94aWVzKSB0aGlzLnByb3hpZXMgPSB7fTtcbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmFsaWFzfSAtICR7aGFzaE9iaihjb25maWcpfWA7XG4gICAgaWYgKGtleSBpbiB0aGlzLnByb3hpZXMpIHJldHVybiB0aGlzLnByb3hpZXNba2V5XSBhcyB0eXBlb2YgdGhpcztcblxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IFJhbUNvbmZpZyA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbENvbmYsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3hpZXNba2V5XSA9IHByb3h5O1xuICAgIHJldHVybiBwcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBSQU0tc3BlY2lmaWMgZGVjb3JhdGlvbnMgZm9yIG1vZGVsIHByb3BlcnRpZXNcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBkZWNvcmF0aW9ucyBmb3IgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZmllbGRzIGluIHRoZSBSQU0gYWRhcHRlci5cbiAgICogVGhpcyBzdGF0aWMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdG8gc2V0IHVwIGhhbmRsZXJzIHRoYXQgYXV0b21hdGljYWxseVxuICAgKiBwb3B1bGF0ZSB0aGVzZSBmaWVsZHMgd2l0aCB0aGUgY3VycmVudCB1c2VyJ3MgVVVJRCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERlY29yYXRpb25cbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlJhbUFkYXB0ZXI6IGNyZWF0ZWRCeUtleVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5SYW1BZGFwdGVyOiB1cGRhdGVkQnlLZXlcbiAgICpcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlJhbUFkYXB0ZXI6IERlY29yYXRvckJ1aWxkZXJcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogZm9yKGNyZWF0ZWRCeUtleSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGFwcGx5KClcbiAgICpcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlJhbUFkYXB0ZXI6IERlY29yYXRvckJ1aWxkZXJcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogZm9yKHVwZGF0ZWRCeUtleSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGFwcGx5KClcbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCk6IHZvaWQge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldENsaWVudCgpOiBSYW1TdG9yYWdlIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpO1xuICB9XG59XG5cblJhbUFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KFJhbUZsYXZvdXIpO1xuIiwiLyoqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIG1vZHVsZSBmb3IgdGhlIERlY2FmIFR5cGVTY3JpcHQgZnJhbWV3b3JrXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZm91bmRhdGlvbmFsIGNvbXBvbmVudHMgb2YgdGhlIERlY2FmIGZyYW1ld29yaywgaW5jbHVkaW5nIGlkZW50aXR5IG1hbmFnZW1lbnQsXG4gKiBtb2RlbCBkZWZpbml0aW9ucywgcmVwb3NpdG9yeSBwYXR0ZXJucywgcGVyc2lzdGVuY2UgbGF5ZXIsIHF1ZXJ5IGJ1aWxkaW5nLCBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKiBJdCBleHBvcnRzIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHNldHMgdXAgdGhlIGluamVjdGFibGUgcmVnaXN0cnkgZm9yIHJlcG9zaXRvcnkgZGVjb3JhdG9ycy5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlc1JlZ2lzdHJ5IH0gZnJvbSBcIi4vcmVwb3NpdG9yeS9pbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuXG4vLyBvdmVycmlkZXMgdGhlIHByZXZpb3VzIEluamVjdGFibGVzIHJlZ2lzdHJ5IHRvIGVuYWJsZSB0aGUgQHJlcG9zaXRvcnkgZGVjb3JhdG9yXG5JbmplY3RhYmxlcy5zZXRSZWdpc3RyeShuZXcgSW5qZWN0YWJsZXNSZWdpc3RyeSgpKTtcblxuLy8gaW1wb3J0ZWQgZmlyc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmFtL1JhbUFkYXB0ZXJcIjtcbi8vbGVmdCB0byBsYXN0IG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBzdW1tYXJ5IEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb3JlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiUmVwb3NpdG9yeSIsIlJlcG8iLCJSZXAiLCJwb3B1bGF0ZSIsInBvcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7O0FBTUc7SUFDUztBQUFaLENBQUEsVUFBWSxlQUFlLEVBQUE7O0FBRXpCLElBQUEsZUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7O0FBR2YsSUFBQSxlQUFBLENBQUEsUUFBQSxDQUFBLEdBQUEsUUFBaUI7O0FBR2pCLElBQUEsZUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztBQUduQixJQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsR0FBQSwyQkFBd0M7O0FBR3hDLElBQUEsZUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7O0FBR2YsSUFBQSxlQUFBLENBQUEsUUFBQSxDQUFBLEdBQUEsUUFBaUI7O0FBR2pCLElBQUEsZUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFlBQXVCOzs7QUFJdkIsSUFBQSxlQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsV0FBdUI7O0FBR3ZCLElBQUEsZUFBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLHNCQUFzQzs7QUFHdEMsSUFBQSxlQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsc0JBQXNDOzs7QUFLdEMsSUFBQSxlQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsYUFBeUI7O0FBR3pCLElBQUEsZUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFVBQXFCOztBQUdyQixJQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsR0FBQSxxQkFBcUM7O0FBR3JDLElBQUEsZUFBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLHNCQUF1Qzs7QUFHdkMsSUFBQSxlQUFBLENBQUEsYUFBQSxDQUFBLEdBQUEsc0JBQXVDOztBQUV2QyxJQUFBLGVBQUEsQ0FBQSxjQUFBLENBQUEsR0FBQSx1QkFBeUM7O0FBR3pDLElBQUEsZUFBQSxDQUFBLFVBQUEsQ0FBQSxHQUFBLFVBQXFCO0FBQ3ZCLENBQUMsRUFyRFcsZUFBZSxLQUFmLGVBQWUsR0FxRDFCLEVBQUEsQ0FBQSxDQUFBOztBQzVERDs7Ozs7OztBQU9HO1NBQ2EsS0FBSyxHQUFBO0FBQ25CLElBQUEsT0FBTyxDQUNMLE1BQWMsRUFDZCxXQUFpQixFQUNqQixVQUErQixLQUM3QjtBQUNGLFFBQUEsSUFBSSxDQUFDLFVBQVU7QUFDYixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUM7QUFDaEUsUUFBQSxJQUFJLFVBQVUsRUFBRSxZQUFZLEVBQUU7QUFDNUIsWUFBQSxVQUFVLENBQUMsWUFBWSxHQUFHLEtBQUs7O0FBRWpDLFFBQUEsT0FBTyxVQUFVO0FBQ25CLEtBQUM7QUFDSDs7QUNuQkE7Ozs7Ozs7Ozs7Ozs7QUFhRztBQUNHLE1BQU8sa0JBQW1CLFNBQVEsZUFBZSxDQUFBO0lBQ3JELFdBQVksQ0FBQSxHQUFtQixFQUFFLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBQTtBQUN6RSxRQUFBLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzs7QUFFekI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7QUFjRztBQUNHLE1BQU8sY0FBZSxTQUFRLGtCQUFrQixDQUFBO0FBQ3BELElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUUsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUE7QUFDekQsUUFBQSxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7O0FBRXhCO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkc7QUFDRyxNQUFPLGVBQWdCLFNBQVEsYUFBYSxDQUFBO0FBQ2hELElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7UUFDN0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQzs7QUFFeEM7O0FDdkREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJHO01BQ1UsZUFBZSxDQUFBO0FBQTVCLElBQUEsV0FBQSxHQUFBO0FBQ0U7OztBQUdHO1FBQ2dCLElBQVMsQ0FBQSxTQUFBLEdBR3RCLEVBQUU7O0FBRVI7Ozs7QUFJRztJQUNILEtBQUssR0FBQTtBQUNILFFBQUEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07O0FBRzlCOzs7Ozs7QUFNRztJQUNILE9BQU8sQ0FBQyxRQUFrQixFQUFFLE1BQXVCLEVBQUE7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDckUsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFFLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztBQUN4RSxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0FBRzdEOzs7OztBQUtHO0FBQ0gsSUFBQSxTQUFTLENBQUMsUUFBa0IsRUFBQTtRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNyRSxJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUUsWUFBQSxNQUFNLElBQUksYUFBYSxDQUFDLHlCQUF5QixDQUFDO1FBQ3BFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7O0FBR2pDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkNHO0FBQ0gsSUFBQSxNQUFNLGVBQWUsQ0FDbkIsR0FBVyxFQUNYLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQ1osR0FBRyxJQUFXLEVBQUE7UUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQ3RDLElBQUksQ0FBQztBQUNGLGFBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFJO0FBQ1osWUFBQSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUNwQixZQUFBLElBQUksQ0FBQyxNQUFNO0FBQUUsZ0JBQUEsT0FBTyxJQUFJO0FBQ3hCLFlBQUEsSUFBSTtnQkFDRixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7WUFDL0IsT0FBTyxDQUFVLEVBQUU7QUFDbkIsZ0JBQUEsR0FBRyxDQUFDLEtBQUssQ0FDUCxDQUFBLDBCQUFBLEVBQTZCLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUEsRUFBQSxFQUFLLENBQUMsQ0FBQSxDQUFFLENBQzNEO0FBQ0QsZ0JBQUEsT0FBTyxLQUFLOztBQUVoQixTQUFDO0FBQ0EsYUFBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUk7QUFDVCxZQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQzlDLENBQUMsQ0FDTDtRQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFJO0FBQzVCLFlBQUEsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVU7QUFDOUIsZ0JBQUEsR0FBRyxDQUFDLEtBQUssQ0FDUCwrQkFBK0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBSyxFQUFBLEVBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQSxDQUFFLENBQ2hGO0FBQ0wsU0FBQyxDQUFDOztBQUVMOztBQzFKRDs7Ozs7Ozs7QUFRRztBQUNHLFNBQVUsWUFBWSxDQUMxQixLQUF5QixFQUFBO0FBRXpCLElBQUEsTUFBTSxHQUFHLEdBQUcsS0FBSyxZQUFZLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUs7SUFFOUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDckNBLFlBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUNyQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQXFDLENBQUMsSUFBSSxHQUFHLENBQzVEO0lBQ0QsSUFBSSxRQUFRLEVBQUU7QUFDWixRQUFBLE9BQU8sUUFBUTs7QUFFakIsSUFBQSxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7QUFDMUIsUUFBQSxPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSTs7SUFFL0IsT0FBTyxLQUFLLENBQUMsSUFBSTtBQUNuQjtBQUVnQixTQUFBLGFBQWEsQ0FDM0IsS0FBUSxFQUNSLFNBQWlCLEVBQUE7QUFFakIsSUFBQSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNsQ0EsWUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQ3RDLEtBQUssRUFDTCxTQUFTLENBQ1Y7SUFDRCxPQUFPLFFBQVEsR0FBRyxRQUFRLEdBQUcsU0FBUztBQUN4QztBQUVBOzs7Ozs7Ozs7QUFTRztTQUNhLG9CQUFvQixDQUNsQyxLQUF5QixFQUN6QixHQUFHLElBQWMsRUFBQTtBQUVqQixJQUFBLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ2pEOztBQ25CQSxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFXLEtBQUk7QUFDNUMsSUFBQSxJQUFJO1FBQ0YsUUFDRSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsR0FBSSxHQUFXLENBQUM7QUFDdEUsWUFBQSxPQUFPLENBQUMsY0FBYztBQUN0QixZQUFBLGNBQWM7OztJQUdoQixPQUFPLENBQVUsRUFBRTs7O0FBR3JCLElBQUEsSUFBSTtBQUNGLFFBQUEsT0FBTyxPQUFPLENBQUMsY0FBYyxJQUFJLGNBQWM7OztJQUUvQyxPQUFPLENBQVUsRUFBRTtBQUNuQixRQUFBLE9BQU8sY0FBYzs7QUFFekIsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyRkc7QUFDRyxNQUFnQixPQU9wQixTQUFRLFdBQVcsQ0FBQTthQVNKLElBQU0sQ0FBQSxNQUFBLEdBQXFELEVBQXJELENBQXdEO0FBWTdFOzs7OztBQUtHO0FBQ0gsSUFBQSxJQUFJLE1BQU0sR0FBQTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU87O0FBR3JCOzs7O0FBSUc7QUFDSCxJQUFBLElBQUksS0FBSyxHQUFBO0FBQ1AsUUFBQSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU87O0FBR3BDOzs7OztBQUtHO0lBQ0gsVUFBVSxHQUFBO1FBU1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO0FBQzFCLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FDckIsQ0FBQSw4RUFBQSxDQUFnRixDQUNqRjtRQUNILE9BQU8sT0FBTyxDQUFDLGVBQWU7O0FBSWhCLElBQU4sTUFBTSxlQUFlLENBQUMsQ0FBVSxFQUFBO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFO1FBQ25CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDM0IsWUFBQSxNQUFNLElBQUksYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUEsQ0FBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDTixZQUFBLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUM5QixnQkFBQSxJQUFJO29CQUNGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUU7O2dCQUNsQyxPQUFPLENBQVUsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBc0MsbUNBQUEsRUFBQSxHQUFHLENBQUssRUFBQSxFQUFBLENBQUMsQ0FBRSxDQUFBLENBQUM7b0JBQ2pFOztBQUVGLGdCQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7OzthQUVyQjtBQUNMLFlBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0FBQ2hDLGdCQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7O1lBQ3RCLE9BQU8sQ0FBVSxFQUFFO2dCQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFzQyxtQ0FBQSxFQUFBLENBQUMsQ0FBSyxFQUFBLEVBQUEsQ0FBQyxDQUFFLENBQUEsQ0FBQzs7OztBQUtyRTs7Ozs7QUFLRztBQUNILElBQUEsTUFBTSxRQUFRLEdBQUE7QUFDWixRQUFBLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRTtRQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRO0FBQUUsWUFBQSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFOztBQUdoRDs7O0FBR0c7QUFDSCxJQUFBLFdBQUEsQ0FDbUIsT0FBYSxFQUNyQixPQUFlLEVBQ1AsTUFBZSxFQUFBO0FBRWhDLFFBQUEsS0FBSyxFQUFFO1FBSlUsSUFBTyxDQUFBLE9BQUEsR0FBUCxPQUFPO1FBQ2YsSUFBTyxDQUFBLE9BQUEsR0FBUCxPQUFPO1FBQ0MsSUFBTSxDQUFBLE1BQUEsR0FBTixNQUFNO0FBd0d6Qjs7O0FBR0c7QUFDTyxRQUFBLElBQUEsQ0FBQSxPQUFPLElBQUcsT0FBYyxDQUFBO0FBekdoQyxRQUFBLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTTtZQUM5QixNQUFNLElBQUksYUFBYSxDQUNyQixDQUFHLEVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQSxxQkFBQSxFQUF3QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUEsQ0FBQSxFQUFJLElBQUksQ0FBQyxPQUFPLENBQUEsRUFBQSxDQUFJLEdBQUcsRUFBRSxDQUFxQixtQkFBQSxDQUFBLENBQ2xHO1FBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSTtRQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWCxDQUFXLFFBQUEsRUFBQSxJQUFJLENBQUMsS0FBSyxDQUF3QixxQkFBQSxFQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQSxDQUFBLEVBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQSxFQUFBLENBQUksR0FBRyxFQUFFLENBQXNCLG9CQUFBLENBQUEsQ0FDM0c7QUFDRCxRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO1lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQVcsUUFBQSxFQUFBLElBQUksQ0FBQyxLQUFLLENBQWlDLCtCQUFBLENBQUEsQ0FBQztBQUN4RSxZQUFBLE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUs7OztBQVl4Qzs7OztBQUlHO0lBQ08sUUFBUSxHQUFBO0FBQ2hCLFFBQUEsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUU7O0FBR3BDOzs7O0FBSUc7SUFDTyxlQUFlLEdBQUE7UUFDdkIsT0FBTyxJQUFJLGVBQWUsRUFBRTs7QUFHOUI7Ozs7O0FBS0c7QUFDTyxJQUFBLFVBQVUsQ0FBQyxJQUFZLEVBQUE7UUFDL0IsT0FBTyxDQUFDLElBQUk7O0FBV2Q7Ozs7O0FBS0c7O0FBRUgsSUFBQSxNQUFNLFVBQVUsQ0FBQyxHQUFHLElBQVc7QUFVL0I7Ozs7Ozs7Ozs7QUFVRztBQUNPLElBQUEsTUFBTSxLQUFLLENBQ25CLFNBQXdCLEVBQ3hCLEtBQXFCLEVBQ3JCLEtBQXFCOztBQUVyQixJQUFBLEdBQUcsSUFBVyxFQUFBO1FBRWQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUU7QUFDdEQsWUFBQSxjQUFjLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQztBQUNuQyxZQUFBLGNBQWMsRUFBRSxTQUFTLEtBQUssYUFBYSxDQUFDLElBQUk7WUFDaEQsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO0FBQ3JCLFlBQUEsU0FBUyxFQUFFLFNBQVM7QUFDckIsU0FBQSxDQUFVOztBQVNiOzs7Ozs7Ozs7O0FBVUc7SUFFRyxNQUFBLE9BQU8sQ0FDWCxTQUl3QixFQUN4QixTQUF5QixFQUN6QixLQUFxQixFQUNyQixHQUFHLElBQVcsRUFBQTtBQUVkLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN0QyxRQUFBLEdBQUcsQ0FBQyxLQUFLLENBQ1AsNEJBQTRCLFNBQVMsQ0FBQSxjQUFBLEVBQWlCLEtBQUssQ0FBQyxJQUFJLENBQStCLDRCQUFBLEVBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQSxDQUFFLENBQzNIO0FBQ0QsUUFBQSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDcEUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUF1Qjs7QUFHbkU7Ozs7Ozs7O0FBUUc7SUFDSCxPQUFPLENBQ0wsS0FBUSxFQUNSLEVBQVcsRUFBQTtBQU1YLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN0QyxRQUFBLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQy9DLENBQUMsS0FBMEIsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSTtZQUN6QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFdBQVc7QUFBRSxnQkFBQSxPQUFPLEtBQUs7WUFDNUMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDNUMsWUFBQSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0FBQzdCLGdCQUFBLE1BQU0sSUFBSSxhQUFhLENBQUMsaUJBQWlCLFVBQVUsQ0FBQSxZQUFBLENBQWMsQ0FBQztBQUNwRSxZQUFBLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHO0FBQ3ZCLFlBQUEsT0FBTyxLQUFLO1NBQ2IsRUFDRCxFQUFFLENBQ0g7QUFDRCxRQUFBLElBQUssS0FBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUM1QyxZQUFBLEdBQUcsQ0FBQyxLQUFLLENBQ1AsQ0FBQSx1Q0FBQSxFQUEyQyxLQUFhLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFFLENBQUEsQ0FDckY7WUFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO0FBQ3RELGdCQUFBLFVBQVUsRUFBRSxLQUFLO0FBQ2pCLGdCQUFBLFFBQVEsRUFBRSxLQUFLO0FBQ2YsZ0JBQUEsWUFBWSxFQUFFLElBQUk7QUFDbEIsZ0JBQUEsS0FBSyxFQUFHLEtBQWEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO0FBQ2hELGFBQUEsQ0FBQzs7UUFHSixPQUFPO0FBQ0wsWUFBQSxNQUFNLEVBQUUsTUFBTTtBQUNkLFlBQUEsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQVc7WUFDdkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQzNCOztBQUdIOzs7Ozs7Ozs7OztBQVdHO0lBQ0gsTUFBTSxDQUNKLEdBQXdCLEVBQ3hCLEtBQThCLEVBQzlCLEVBQVcsRUFDWCxFQUE0QixFQUM1QixTQUErQixFQUFBO0FBRS9CLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBd0IsRUFBRTtBQUNsQyxRQUFBLEVBQUUsQ0FBQyxFQUFZLENBQUMsR0FBRyxFQUFFO1FBQ3JCLE1BQU0sQ0FBQyxJQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FDOUQ7QUFDTixRQUFBLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQSxpQkFBQSxFQUFvQixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQSxJQUFBLEVBQU8sRUFBRSxDQUFBLENBQUUsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztBQUM5QyxRQUFBLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBUSxFQUFFLEdBQUcsS0FBSTtZQUNyRCxJQUFJLEdBQUcsS0FBSyxFQUFFO0FBQUUsZ0JBQUEsT0FBTyxLQUFLO0FBQzNCLFlBQUEsS0FBNkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRSxZQUFBLE9BQU8sS0FBSztTQUNiLEVBQUUsQ0FBQyxDQUFDO1FBRUwsSUFBSSxTQUFTLEVBQUU7QUFDYixZQUFBLEdBQUcsQ0FBQyxPQUFPLENBQ1QsQ0FBbUMsZ0NBQUEsRUFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFFLENBQ3ZFO0FBQ0QsWUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFJO2dCQUMvQyxJQUFJLEdBQUcsSUFBSSxNQUFNO0FBQ2Ysb0JBQUEsTUFBTSxJQUFJLGFBQWEsQ0FDckIsQ0FBQSxtQkFBQSxFQUFzQixHQUFHLENBQUEseUJBQUEsRUFBNEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUEsc0JBQUEsQ0FBd0IsQ0FDaEc7QUFDSCxnQkFBQSxNQUFNLENBQUMsR0FBYyxDQUFDLEdBQUcsR0FBRztBQUM5QixhQUFDLENBQUM7O1FBR0osSUFBSSxRQUFRLEVBQUU7QUFDWixZQUFBLEdBQUcsQ0FBQyxLQUFLLENBQ1AsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQTZCLDBCQUFBLEVBQUEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQU8sSUFBQSxFQUFBLEVBQUUsS0FBSyxRQUFRLENBQUEsQ0FBRSxDQUNyRztZQUNELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7QUFDdEQsZ0JBQUEsVUFBVSxFQUFFLEtBQUs7QUFDakIsZ0JBQUEsWUFBWSxFQUFFLEtBQUs7QUFDbkIsZ0JBQUEsUUFBUSxFQUFFLEtBQUs7QUFDZixnQkFBQSxLQUFLLEVBQUUsUUFBUTtBQUNoQixhQUFBLENBQUM7O0FBR0osUUFBQSxPQUFPLE1BQU07O0FBbUJmOzs7Ozs7OztBQVFHO0lBQ0gsTUFBTSxTQUFTLENBQ2IsU0FBaUIsRUFDakIsRUFBdUIsRUFDdkIsS0FBNEIsRUFDNUIsR0FBRyxJQUFXLEVBQUE7QUFFZCxRQUFBLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtBQUM1QixZQUFBLE1BQU0sSUFBSSxhQUFhLENBQUMsMENBQTBDLENBQUM7QUFDckUsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBWSxTQUFBLEVBQUEsRUFBRSxDQUFDLE1BQU0sQ0FBWSxTQUFBLEVBQUEsU0FBUyxDQUFRLE1BQUEsQ0FBQSxDQUFDO0FBQy9ELFFBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFFLENBQUM7QUFDdkIsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUN2RTs7QUFpQkg7Ozs7Ozs7QUFPRztJQUNILE1BQU0sT0FBTyxDQUNYLFNBQWlCLEVBQ2pCLEVBQWdDLEVBQ2hDLEdBQUcsSUFBVyxFQUFBO0FBRWQsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBVyxRQUFBLEVBQUEsRUFBRSxDQUFDLE1BQU0sQ0FBWSxTQUFBLEVBQUEsU0FBUyxDQUFRLE1BQUEsQ0FBQSxDQUFDO0FBQzlELFFBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFFLENBQUM7UUFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7QUFtQnJFOzs7Ozs7OztBQVFHO0lBQ0gsTUFBTSxTQUFTLENBQ2IsU0FBaUIsRUFDakIsRUFBdUIsRUFDdkIsS0FBNEIsRUFDNUIsR0FBRyxJQUFXLEVBQUE7QUFFZCxRQUFBLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtBQUM1QixZQUFBLE1BQU0sSUFBSSxhQUFhLENBQUMsMENBQTBDLENBQUM7QUFDckUsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBWSxTQUFBLEVBQUEsRUFBRSxDQUFDLE1BQU0sQ0FBWSxTQUFBLEVBQUEsU0FBUyxDQUFRLE1BQUEsQ0FBQSxDQUFDO0FBQy9ELFFBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFFLENBQUM7QUFDdkIsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUN2RTs7QUFpQkg7Ozs7Ozs7QUFPRztJQUNILE1BQU0sU0FBUyxDQUNiLFNBQWlCLEVBQ2pCLEVBQWdDLEVBQ2hDLEdBQUcsSUFBVyxFQUFBO0FBRWQsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBWSxTQUFBLEVBQUEsRUFBRSxDQUFDLE1BQU0sQ0FBWSxTQUFBLEVBQUEsU0FBUyxDQUFRLE1BQUEsQ0FBQSxDQUFDO0FBQy9ELFFBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFFLENBQUM7UUFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7QUFjdkU7Ozs7Ozs7QUFPRztJQUVILE9BQU8sQ0FBQyxRQUFrQixFQUFFLE1BQXVCLEVBQUE7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO0FBQ3ZCLFlBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7QUFDN0MsZ0JBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7QUFDN0IsZ0JBQUEsUUFBUSxFQUFFLEtBQUs7QUFDaEIsYUFBQSxDQUFDO1FBQ0osSUFBSSxDQUFDLGVBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7QUFDL0MsUUFBQSxJQUFJLENBQUM7QUFDRixhQUFBLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTzthQUNoQixPQUFPLENBQUMsNEJBQTRCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFFLENBQUM7QUFDN0QsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNsQixZQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBeUIsc0JBQUEsRUFBQSxJQUFJLENBQUMsS0FBSyxDQUFBLENBQUUsQ0FBQztBQUN0RSxZQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUMvQixZQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs7O0FBSS9COzs7OztBQUtHO0FBRUgsSUFBQSxTQUFTLENBQUMsUUFBa0IsRUFBQTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7QUFDdkIsWUFBQSxNQUFNLElBQUksYUFBYSxDQUNyQixvRUFBb0UsQ0FDckU7QUFDSCxRQUFBLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxRQUFBLElBQUksQ0FBQztBQUNGLGFBQUEsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTO2FBQ2xCLE9BQU8sQ0FBQyxZQUFZLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQSxRQUFBLENBQVUsQ0FBQzs7QUFHdkQ7Ozs7Ozs7OztBQVNHO0lBQ0gsTUFBTSxlQUFlLENBQ25CLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQ1osR0FBRyxJQUFXLEVBQUE7UUFFZCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7QUFDdkIsWUFBQSxNQUFNLElBQUksYUFBYSxDQUNyQixvRUFBb0UsQ0FDckU7QUFDSCxRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7QUFDOUMsUUFBQSxHQUFHLENBQUMsT0FBTyxDQUNULENBQVksU0FBQSxFQUFBLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLDBCQUEwQixJQUFJLENBQUMsS0FBSyxDQUFBLENBQUUsQ0FDL0U7QUFDRCxRQUFBLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxFQUFFLEVBQ0YsR0FBRyxJQUFJLENBQ1I7O0FBR0g7Ozs7Ozs7O0FBUUc7SUFDSCxNQUFNLE9BQU8sQ0FDWCxLQUFhLEVBQ2IsS0FBcUQsRUFDckQsRUFBWSxFQUNaLEdBQUcsSUFBVyxFQUFBO0FBRWQsUUFBQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7O0FBR3hEOzs7O0FBSUc7SUFDTSxRQUFRLEdBQUE7QUFDZixRQUFBLE9BQU8sQ0FBRyxFQUFBLElBQUksQ0FBQyxPQUFPLHNCQUFzQjs7QUFHOUM7Ozs7OztBQU1HO0lBQ0gsT0FBTyxTQUFTLENBQWtCLEtBQXFCLEVBQUE7QUFDckQsUUFBQSxRQUNFLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBQzdELFlBQUEsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPOztBQUl6QixJQUFBLFdBQVcsY0FBYyxHQUFBO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZTtBQUMxQixZQUFBLE1BQU0sSUFBSSxhQUFhLENBQ3JCLENBQUEsMERBQUEsQ0FBNEQsQ0FDN0Q7UUFDSCxPQUFPLE9BQU8sQ0FBQyxlQUFlOztBQUdoQzs7OztBQUlHO0FBQ0gsSUFBQSxXQUFXLE9BQU8sR0FBQTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQzs7QUFHekM7Ozs7Ozs7Ozs7QUFVRztJQUNILE9BQU8sR0FBRyxDQU1SLE9BQWEsRUFBQTtBQUNiLFFBQUEsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztBQUN0RCxRQUFBLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNO0FBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELFFBQUEsTUFBTSxJQUFJLGFBQWEsQ0FBQywrQkFBK0IsT0FBTyxDQUFBLENBQUEsQ0FBRyxDQUFDOztBQUdwRTs7Ozs7QUFLRztJQUNILE9BQU8sVUFBVSxDQUFDLE9BQWUsRUFBQTtBQUMvQixRQUFBLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTzs7QUFHaEM7Ozs7O0FBS0c7SUFDSCxPQUFPLEdBQUcsQ0FBQyxHQUFXLEVBQUE7QUFDcEIsUUFBQSxPQUFPQyxZQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7QUFHdEI7Ozs7OztBQU1HO0lBQ0gsT0FBTyxNQUFNLENBQWtCLE9BQWUsRUFBQTtBQUM1QyxRQUFBLElBQUk7QUFDRixZQUFBLE1BQU0sUUFBUSxHQUFJLEtBQWEsQ0FBQyxXQUFXLEVBQXdCO0FBQ25FLFlBQUEsTUFBTSxLQUFLLEdBQ1QsUUFDRCxDQUFDLEtBQUs7QUFDUCxZQUFBLE1BQU0sYUFBYSxHQUE0QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUs7QUFDL0QsaUJBQUEsR0FBRyxDQUFDLENBQUMsQ0FBc0IsS0FBSTtBQUM5QixnQkFBQSxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsQ0FBMEIsQ0FDM0I7QUFDRCxnQkFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTztBQUFFLG9CQUFBLE9BQU8sQ0FBQztnQkFDaEMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNOLG9CQUFBLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQzlCQSxZQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFDM0IsQ0FBMEIsQ0FDM0I7QUFDRCxvQkFBQSxJQUFJLENBQUMsSUFBSTt3QkFBRTtvQkFDWCxNQUFNLFVBQVUsR0FBSSxJQUFJLENBQUMsZUFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBRTVELG9CQUFBLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsVUFBVSxDQUNYO0FBQ0Qsb0JBQUEsT0FBTyxDQUFDOztBQUVaLGFBQUM7aUJBQ0EsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsWUFBQSxPQUFPLGFBQWE7O1FBQ3BCLE9BQU8sQ0FBTSxFQUFFO0FBQ2YsWUFBQSxNQUFNLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQzs7O0lBSTlCLE9BQU8sVUFBVSxHQUFBO0FBaUJqQixJQUFBLElBQ0ksTUFBTSxHQUFBO0FBQ1IsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTs7UUFFakMsT0FBTyxJQUFJLENBQUMsT0FBTzs7O0FBSXJCLElBQUEsR0FBRyxDQUFDLE1BQXFCLEVBQUUsR0FBRyxJQUFXLEVBQUE7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO0FBQUUsWUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUU7QUFDcEMsUUFBQSxNQUFNLEdBQUcsR0FBRyxDQUFHLEVBQUEsSUFBSSxDQUFDLEtBQUssQ0FBTSxHQUFBLEVBQUEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUU7QUFDaEQsUUFBQSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTztBQUFFLFlBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBZ0I7QUFFaEUsUUFBQSxJQUFJLE1BQVc7QUFDZixRQUFBLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtZQUM1QixHQUFHLEVBQUUsQ0FBQyxNQUFtQixFQUFFLENBQWtCLEVBQUUsUUFBYSxLQUFJO0FBQzlELGdCQUFBLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNuQixvQkFBQSxNQUFNLFlBQVksR0FBUyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDO29CQUMzRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7O0FBRWhELGdCQUFBLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNuQixvQkFBQSxPQUFPLE1BQU07O2dCQUVmLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQzthQUN4QztZQUNELEdBQUcsRUFBRSxDQUFDLE1BQVcsRUFBRSxDQUFrQixFQUFFLEtBQVUsRUFBRSxRQUFhLEtBQUk7QUFDbEUsZ0JBQUEsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO29CQUNuQixNQUFNLEdBQUcsS0FBSztBQUNkLG9CQUFBLE9BQU8sSUFBSTs7QUFFYixnQkFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDO2FBQy9DO0FBQ0YsU0FBQSxDQUFDO0FBQ0YsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7QUFDekIsUUFBQSxPQUFPLEtBQUs7OztBQW50QkUsVUFBQSxDQUFBO0FBRGYsSUFBQSxLQUFLLEVBQUU7Ozs7QUF1QlAsQ0FBQSxFQUFBLE9BQUEsQ0FBQSxTQUFBLEVBQUEsaUJBQUEsRUFBQSxJQUFBLENBQUE7QUE4SUssVUFBQSxDQUFBO0FBREwsSUFBQSxLQUFLLEVBQUU7Ozs7QUFpQlAsQ0FBQSxFQUFBLE9BQUEsQ0FBQSxTQUFBLEVBQUEsU0FBQSxFQUFBLElBQUEsQ0FBQTtBQXdSRCxVQUFBLENBQUE7QUFEQyxJQUFBLEtBQUssRUFBRTs7OztBQWdCUCxDQUFBLEVBQUEsT0FBQSxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsSUFBQSxDQUFBO0FBU0QsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7Ozs7QUFVUCxDQUFBLEVBQUEsT0FBQSxDQUFBLFNBQUEsRUFBQSxXQUFBLEVBQUEsSUFBQSxDQUFBO0FBbU1ELFVBQUEsQ0FBQTtBQUFDLElBQUEsS0FBSyxFQUFFOzs7QUFNUCxDQUFBLEVBQUEsT0FBQSxDQUFBLFNBQUEsRUFBQSxRQUFBLEVBQUEsSUFBQSxDQUFBOztBQ2g1Qkg7Ozs7OztBQU1HO0lBQ1M7QUFBWixDQUFBLFVBQVksY0FBYyxFQUFBOztBQUV4QixJQUFBLGNBQUEsQ0FBQSxLQUFBLENBQUEsR0FBQSxLQUFXOztBQUdYLElBQUEsY0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLE1BQVk7QUFDZCxDQUFDLEVBTlcsY0FBYyxLQUFkLGNBQWMsR0FNekIsRUFBQSxDQUFBLENBQUE7QUFFRDs7Ozs7O0FBTUc7SUFDUztBQUFaLENBQUEsVUFBWSxPQUFPLEVBQUE7O0FBRWpCLElBQUEsT0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztBQUVuQixJQUFBLE9BQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0FBQ2YsQ0FBQyxFQUxXLE9BQU8sS0FBUCxPQUFPLEdBS2xCLEVBQUEsQ0FBQSxDQUFBO0FBRUQ7Ozs7Ozs7QUFPRztBQUNVLE1BQUEsY0FBYyxHQUFvQjtJQUM3QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU87SUFDdkIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJOzs7QUN2Q3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JHO0FBQ0csTUFBTyxnQkFBaUIsU0FBUSxhQUFhLENBQUE7QUFDakQsSUFBQSxXQUFBLENBQVksR0FBbUIsRUFBQTtRQUM3QixLQUFLLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7O0FBRXpDOztBQ3ZCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNHO01BQ21CLFFBQVEsQ0FBQTtBQU81Qjs7OztBQUlHO0FBQ0gsSUFBQSxJQUFjLEdBQUcsR0FBQTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFXLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUMsTUFBTTs7QUFHcEI7OztBQUdHO0FBQ0gsSUFBQSxXQUFBLENBQXlDLE9BQXdCLEVBQUE7UUFBeEIsSUFBTyxDQUFBLE9BQUEsR0FBUCxPQUFPOztBQXdCaEQ7Ozs7OztBQU1HO0lBQ0gsT0FBTyxFQUFFLENBQWtCLEtBQXlCLEVBQUE7QUFDbEQsUUFBQSxPQUFPLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7O0FBRzFDOzs7Ozs7QUFNRztBQUNILElBQUEsT0FBTyxVQUFVLENBQ2YsSUFBOEMsRUFDOUMsS0FBK0IsRUFBQTtRQUUvQixRQUFRLElBQUk7QUFDVixZQUFBLEtBQUssUUFBUTtnQkFDWCxPQUFPLE9BQU8sS0FBSyxLQUFLO0FBQ3RCLHNCQUFFLFFBQVEsQ0FBQyxLQUFLO0FBQ2hCLHNCQUFFLE9BQU8sS0FBSyxLQUFLO0FBQ2pCLDBCQUFFO0FBQ0YsMEJBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUNyQixZQUFBLEtBQUssUUFBUTtBQUNYLGdCQUFBLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN0QixZQUFBLEtBQUssU0FBUztBQUNkLFlBQUEsS0FBSyxRQUFRO0FBQ1gsZ0JBQUEsT0FBTyxLQUFLO0FBQ2QsWUFBQTtnQkFDRSxNQUFNLElBQUksZ0JBQWdCLENBQ3hCLENBQUEsMkJBQUEsRUFBOEIsSUFBSSxDQUFnQixhQUFBLEVBQUEsSUFBSSxDQUFFLENBQUEsQ0FDekQ7OztBQUdSOztBQ3pJRDs7Ozs7O0FBTUc7SUFDUztBQUFaLENBQUEsVUFBWSxRQUFRLEVBQUE7O0FBRWxCLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7O0FBRWYsSUFBQSxRQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsV0FBdUI7O0FBRXZCLElBQUEsUUFBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCOztBQUVqQixJQUFBLFFBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxXQUF1Qjs7QUFFdkIsSUFBQSxRQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7O0FBRW5CLElBQUEsUUFBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCOzs7QUFHekIsSUFBQSxRQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsS0FBVzs7QUFFWCxJQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsR0FBQSxJQUFTOzs7QUFHVCxJQUFBLFFBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtBQUNuQixDQUFDLEVBckJXLFFBQVEsS0FBUixRQUFRLEdBcUJuQixFQUFBLENBQUEsQ0FBQTtBQUVEOzs7Ozs7QUFNRztJQUNTO0FBQVosQ0FBQSxVQUFZLGFBQWEsRUFBQTs7QUFFdkIsSUFBQSxhQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsS0FBVzs7QUFFWCxJQUFBLGFBQUEsQ0FBQSxJQUFBLENBQUEsR0FBQSxJQUFTO0FBQ1gsQ0FBQyxFQUxXLGFBQWEsS0FBYixhQUFhLEdBS3hCLEVBQUEsQ0FBQSxDQUFBOztBQ3hDRDs7Ozs7O0FBTUc7QUFDRyxNQUFPLFVBQVcsU0FBUSxhQUFhLENBQUE7QUFDM0MsSUFBQSxXQUFBLENBQVksR0FBbUIsRUFBQTtRQUM3QixLQUFLLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDOztBQUVuQztBQUVEOzs7Ozs7QUFNRztBQUNHLE1BQU8sV0FBWSxTQUFRLGFBQWEsQ0FBQTtBQUM1QyxJQUFBLFdBQUEsQ0FBWSxHQUFtQixFQUFBO1FBQzdCLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7O0FBRXBDOztBQ2REOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4Qkc7QUFDRyxNQUFPLFNBQWdDLFNBQVEsS0FBb0IsQ0FBQTtBQVF2RSxJQUFBLFdBQUEsQ0FDRSxLQUE0QixFQUM1QixRQUFrQyxFQUNsQyxVQUFlLEVBQUE7QUFFZixRQUFBLEtBQUssRUFBRTtRQVhDLElBQUssQ0FBQSxLQUFBLEdBQTJCLFNBQVM7UUFFekMsSUFBUSxDQUFBLFFBQUEsR0FBOEIsU0FBUztRQUUvQyxJQUFVLENBQUEsVUFBQSxHQUFTLFNBQVM7QUFRcEMsUUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUs7QUFDbEIsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVE7QUFDeEIsUUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVU7O0FBRzlCOzs7OztBQUtHO0FBQ0gsSUFBQSxHQUFHLENBQUMsU0FBdUIsRUFBQTtRQUN6QixPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQzs7QUFHdkM7Ozs7O0FBS0c7QUFDSCxJQUFBLEVBQUUsQ0FBQyxTQUF1QixFQUFBO1FBQ3hCLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDOztBQUd0Qzs7Ozs7QUFLRztBQUNILElBQUEsR0FBRyxDQUFDLEdBQVEsRUFBQTtRQUNWLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDOztBQUcvQzs7Ozs7QUFLRztJQUNNLFNBQVMsQ0FDaEIsR0FBRyxVQUFvQixFQUFBO1FBRXZCLE1BQU0sY0FBYyxHQUFHLE1BQXVDO0FBQzVELFlBQUEsTUFBTSxnQkFBZ0IsR0FBRyxDQUFBLGlCQUFBLEVBQW9CLElBQUksQ0FBQyxRQUFRLEdBQUc7QUFFN0QsWUFBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDbEMsZ0JBQUEsSUFBSSxJQUFJLENBQUMsVUFBVSxZQUFZLFNBQVM7b0JBQ3RDLE9BQU87QUFDTCx3QkFBQSxVQUFVLEVBQUU7QUFDViw0QkFBQSxTQUFTLEVBQ1AsdURBQXVEO0FBQzFELHlCQUFBO3FCQUNzQjtBQUMzQixnQkFBQSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFvQixDQUFDLEtBQUssRUFBRTtvQkFDbkUsT0FBTztBQUNMLHdCQUFBLFFBQVEsRUFBRTtBQUNSLDRCQUFBLFNBQVMsRUFBRSxnQkFBZ0I7QUFDNUIseUJBQUE7cUJBQ3NCOztBQUc3QixZQUFBLElBQUksSUFBSSxDQUFDLEtBQUssWUFBWSxTQUFTLEVBQUU7QUFDbkMsZ0JBQUEsSUFDRSxFQUFFLElBQUksQ0FBQyxVQUFVLFlBQVksU0FBUyxDQUFDO0FBQ3ZDLG9CQUFBLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLEdBQUc7b0JBRTlCLE9BQU87QUFDTCx3QkFBQSxVQUFVLEVBQUU7QUFDViw0QkFBQSxTQUFTLEVBQUUsZ0JBQWdCO0FBQzVCLHlCQUFBO3FCQUNzQjtBQUMzQixnQkFBQSxJQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUNsQyxJQUFJLENBQUMsUUFBeUIsQ0FDL0IsS0FBSyxFQUFFO0FBQ1Isb0JBQUEsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsR0FBRztvQkFFOUIsT0FBTztBQUNMLHdCQUFBLFFBQVEsRUFBRTtBQUNSLDRCQUFBLFNBQVMsRUFBRSxnQkFBZ0I7QUFDNUIseUJBQUE7cUJBQ3NCOztBQUUvQixTQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUM3QyxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2pCLFlBQUEsUUFDRyxNQUEyQztnQkFDM0MsY0FBYyxFQUFVO1FBRzdCLE9BQU8sQ0FBQyxZQUFXO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDcEMsTUFBOEQsQ0FDL0Q7QUFDRCxZQUFBLE9BQU8sUUFBUSxJQUFJLGNBQWMsRUFBRTtTQUNwQyxHQUF3RTs7QUFHM0U7Ozs7Ozs7QUFPRztBQUNILElBQUEsT0FBTyxHQUFHLENBQ1IsVUFBd0IsRUFDeEIsVUFBd0IsRUFBQTtBQUV4QixRQUFBLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7O0FBR25FOzs7Ozs7O0FBT0c7QUFDSCxJQUFBLE9BQU8sRUFBRSxDQUNQLFVBQXdCLEVBQ3hCLFVBQXdCLEVBQUE7QUFFeEIsUUFBQSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDOztBQUdsRTs7Ozs7Ozs7QUFRRztBQUNLLElBQUEsT0FBTyxLQUFLLENBQ2xCLFVBQXdCLEVBQ3hCLFFBQXVCLEVBQ3ZCLFVBQXdCLEVBQUE7UUFFeEIsT0FBTyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQzs7QUFHeEQ7Ozs7OztBQU1HO0lBQ0gsT0FBTyxTQUFTLENBQWtCLElBQWEsRUFBQTtRQUM3QyxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7O0FBR25EOzs7Ozs7QUFNRztJQUNILE9BQU8sSUFBSSxDQUFrQixJQUFhLEVBQUE7QUFDeEMsUUFBQSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOztBQUc3Qjs7Ozs7O0FBTUc7YUFDWSxJQUFPLENBQUEsT0FBQSxHQUFHLE1BQU0sZ0JBQWdCLENBQUE7QUFBdEIsUUFBQSxXQUFBLEdBQUE7WUFHdkIsSUFBSyxDQUFBLEtBQUEsR0FBNEIsU0FBUztZQUMxQyxJQUFRLENBQUEsUUFBQSxHQUE4QixTQUFTO1lBQy9DLElBQVUsQ0FBQSxVQUFBLEdBQVMsU0FBUzs7QUFFNUI7Ozs7O0FBS0c7QUFDSCxRQUFBLFNBQVMsQ0FBQyxJQUFhLEVBQUE7QUFDckIsWUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUk7QUFDakIsWUFBQSxPQUFPLElBQUk7O0FBR2I7Ozs7O0FBS0c7QUFDSCxRQUFBLElBQUksQ0FBQyxJQUFhLEVBQUE7QUFDaEIsWUFBQSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOztBQUc3Qjs7Ozs7QUFLRztBQUNILFFBQUEsRUFBRSxDQUFDLEdBQVEsRUFBQTtZQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQzs7QUFHeEM7Ozs7O0FBS0c7QUFDSCxRQUFBLEdBQUcsQ0FBQyxHQUFRLEVBQUE7WUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7O0FBRzVDOzs7OztBQUtHO0FBQ0gsUUFBQSxFQUFFLENBQUMsR0FBUSxFQUFBO1lBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDOztBQUd6Qzs7Ozs7QUFLRztBQUNILFFBQUEsRUFBRSxDQUFDLEdBQVEsRUFBQTtZQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQzs7QUFHMUM7Ozs7O0FBS0c7QUFDSCxRQUFBLEdBQUcsQ0FBQyxHQUFRLEVBQUE7WUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7O0FBRzVDOzs7OztBQUtHO0FBQ0gsUUFBQSxHQUFHLENBQUMsR0FBUSxFQUFBO1lBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDOztBQUc3Qzs7Ozs7QUFLRztBQUNILFFBQUEsRUFBRSxDQUFDLEdBQVUsRUFBQTtZQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQzs7QUFHckM7Ozs7O0FBS0c7QUFDSCxRQUFBLE1BQU0sQ0FBQyxHQUFRLEVBQUE7QUFDYixZQUFBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs7QUFHNUQ7Ozs7OztBQU1HO1FBQ0ssS0FBSyxDQUFDLEVBQVksRUFBRSxHQUFRLEVBQUE7QUFDbEMsWUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUU7QUFDbEIsWUFBQSxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUc7QUFDckIsWUFBQSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUU7O0FBR3JCOzs7OztBQUtHO1FBQ0ssS0FBSyxHQUFBO0FBQ1gsWUFBQSxJQUFJO0FBQ0YsZ0JBQUEsT0FBTyxJQUFJLFNBQVMsQ0FDbEIsSUFBSSxDQUFDLEtBQThCLEVBQ25DLElBQUksQ0FBQyxRQUFvQixFQUN6QixJQUFJLENBQUMsVUFBaUIsQ0FDdkI7O1lBQ0QsT0FBTyxDQUFNLEVBQUU7QUFDZixnQkFBQSxNQUFNLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQzs7O0FBRzVCLEtBMUlxQixDQTBJcEI7QUFFRjs7Ozs7QUFLRztBQUNILElBQUEsT0FBTyxPQUFPLEdBQUE7QUFDWixRQUFBLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFLOzs7QUFqVnpCLFVBQUEsQ0FBQTtBQURULElBQUEsUUFBUSxFQUFFOztBQUN5QyxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxPQUFBLEVBQUEsTUFBQSxDQUFBO0FBRTFDLFVBQUEsQ0FBQTtBQURULElBQUEsUUFBUSxFQUFFOztBQUMrQyxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxVQUFBLEVBQUEsTUFBQSxDQUFBO0FBRWhELFVBQUEsQ0FBQTtBQURULElBQUEsUUFBUSxFQUFFOztBQUM0QixDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxZQUFBLEVBQUEsTUFBQSxDQUFBOztBQzdDekM7Ozs7Ozs7OztBQVNHO0FBQ0csU0FBVSxJQUFJLENBQUMsT0FBZSxFQUFBO0lBQ2xDLE9BQU8sU0FBUyxJQUFJLENBQUMsUUFBYSxFQUFBO0FBQ2hDLFFBQUEsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQ25FLFFBQVEsQ0FDVDtBQUNILEtBQUM7QUFDSDs7QUN1Q0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvREc7QUFDRyxNQUFPLFVBT1gsU0FBUUMsWUFBWSxDQUFBO2FBR0wsSUFBTSxDQUFBLE1BQUEsR0FHakIsRUFIaUIsQ0FHZDtBQVlQOzs7O0FBSUc7QUFDSCxJQUFBLElBQUksR0FBRyxHQUFBO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO0FBQ2QsWUFBQSxJQUFJLENBQUMsTUFBTSxHQUNULElBQUksQ0FBQyxPQUFPLENBQUMsS0FBa0MsQ0FDaEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU07O0FBR3BCOzs7Ozs7QUFNRztBQUNILElBQUEsSUFBYyxPQUFPLEdBQUE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO0FBQ2hCLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FDckIsQ0FBQSxvR0FBQSxDQUFzRyxDQUN2RztRQUNILE9BQU8sSUFBSSxDQUFDLFFBQVE7O0FBR3RCOzs7O0FBSUc7QUFDSCxJQUFBLElBQWMsU0FBUyxHQUFBO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLFVBQVU7O0FBR3hCOzs7O0FBSUc7QUFDSCxJQUFBLElBQXVCLE9BQU8sR0FBQTtRQUM1QixPQUFPLEtBQUssQ0FBQyxPQUFPOzs7QUFJdEIsSUFBQSxXQUFBLENBQVksT0FBVyxFQUFFLEtBQXNCLEVBQUUsR0FBRyxJQUFXLEVBQUE7UUFDN0QsS0FBSyxDQUFDLEtBQUssQ0FBQztRQTNESixJQUFTLENBQUEsU0FBQSxHQUFlLEVBQUU7QUE0RGxDLFFBQUEsSUFBSSxPQUFPO0FBQUUsWUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU87UUFDcEMsSUFBSSxLQUFLLEVBQUU7QUFDVCxZQUFBLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNwRCxJQUFJLE9BQU8sRUFBRTtBQUNYLGdCQUFBLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUNwQyxLQUFLLENBQ047QUFDRCxnQkFBQSxJQUFJLE9BQU8sSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU87QUFDeEMsb0JBQUEsTUFBTSxJQUFJLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUM7OztRQUdoQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQ3BFLENBQUMsQ0FBQyxLQUFJO0FBQ0osWUFBQSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSTtBQUNuQixZQUFBLHFCQUFxQixDQUNuQixJQUFJLEVBQ0gsSUFBWSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsRUFDOUIsQ0FBQyxFQUNBLElBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQy9CO0FBQ0gsU0FBQyxDQUNGOztBQUdIOzs7OztBQUtHO0FBQ0gsSUFBQSxRQUFRLENBQUMsS0FBaUIsRUFBQTtBQUN4QixRQUFBLElBQUksQ0FBQztBQUNGLGFBQUEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRO2FBQ2pCLEtBQUssQ0FBQyxDQUFvQyxpQ0FBQSxFQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUUsQ0FBQSxDQUFDO0FBQ3JFLFFBQUEsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDckIsR0FBRyxFQUFFLENBQUMsTUFBbUIsRUFBRSxDQUFrQixFQUFFLFFBQWEsS0FBSTtBQUM5RCxnQkFBQSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxZQUFZO0FBQUUsb0JBQUEsT0FBTyxNQUFNO2dCQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUM7YUFDeEM7QUFDRixTQUFBLENBQUM7O0FBR0o7Ozs7Ozs7Ozs7OztBQVlHO0FBQ0gsSUFBQSxHQUFHLENBQ0QsSUFBdUMsRUFDdkMsR0FBRyxJQUFXLEVBQUE7QUFFZCxRQUFBLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEdBQUcsRUFBRSxDQUFDLE1BQVcsRUFBRSxDQUFrQixFQUFFLFFBQWEsS0FBSTtBQUN0RCxnQkFBQSxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDOztnQkFFeEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDO2FBQ3hDO0FBQ0YsU0FBQSxDQUFDOztBQUdKOzs7O0FBSUc7SUFDTyxlQUFlLEdBQUE7UUFDdkIsT0FBTyxJQUFJLGVBQWUsRUFBRTs7QUFHOUI7Ozs7Ozs7O0FBUUc7QUFDZ0IsSUFBQSxNQUFNLFlBQVksQ0FDbkMsS0FBUSxFQUNSLEdBQUcsSUFBVyxFQUFBO1FBRWQsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUNwQyxhQUFhLENBQUMsTUFBTSxFQUNwQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksRUFDSixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUN0QjtRQUNELEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzdCLFFBQUEsTUFBTSxtQkFBbUIsQ0FDdkIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLEtBQUssRUFDTCxhQUFhLENBQUMsTUFBTSxFQUNwQixhQUFhLENBQUMsRUFBRSxDQUNqQjtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDbEMsS0FBSyxDQUFDLFNBQVMsQ0FDYixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSxDQUFDLENBQ2xFLENBQ0Y7QUFDRCxRQUFBLElBQUksTUFBTTtZQUFFLE1BQU0sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXhELE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDOztBQUdyQzs7Ozs7O0FBTUc7QUFDSCxJQUFBLE1BQU0sTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVcsRUFBQTs7UUFFbkMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDcEUsUUFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDdkUsSUFBSSxDQUFDLEdBQWtCLFNBQVM7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQU07QUFDL0MsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN4QixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsRUFBRSxFQUNQLEVBQUUsRUFDRixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQzNEOztBQUdIOzs7Ozs7QUFNRztBQUNNLElBQUEsTUFBTSxZQUFZLENBQUMsS0FBUSxFQUFFLE9BQVUsRUFBQTtRQUM5QyxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQzs7QUFHM0M7Ozs7OztBQU1HO0FBQ00sSUFBQSxNQUFNLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUE7UUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQUUsWUFBQSxPQUFPLE1BQU07UUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BFLFFBQUEsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3JDLFFBQUEsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzNDLFFBQUEsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQ2QsR0FBMEIsRUFDMUIsT0FBTyxFQUNQLEdBQUcsSUFBSSxDQUNSO0FBQ0QsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQW9CLENBQUMsQ0FDdkU7O0FBR0g7Ozs7Ozs7QUFPRztBQUNnQixJQUFBLE1BQU0sZUFBZSxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVcsRUFBQTtRQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ3BDLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQ3RCO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLEdBQUcsR0FBNkMsRUFBRTtBQUN0RCxRQUFBLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtBQUFFLGdCQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDOzthQUMvRDtZQUNMLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSTtnQkFDeEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssV0FBVztBQUNuQyxvQkFBQSxNQUFNLElBQUksYUFBYSxDQUNyQixvREFBb0QsQ0FBQyxDQUFBLENBQUUsQ0FDeEQ7QUFDSCxnQkFBQSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFXO0FBQzdCLGFBQUMsQ0FBQzs7QUFHSixRQUFBLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFJO1lBQ3hCLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLFlBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ2IsZ0JBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVE7b0JBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUztBQUNyQixvQkFBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBZTs7QUFHeEQsWUFBQSxNQUFNLG1CQUFtQixDQUN2QixJQUFJLEVBQ0osV0FBVyxDQUFDLE9BQU8sRUFDbkIsQ0FBQyxFQUNELGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxFQUFFLENBQ2pCO0FBQ0QsWUFBQSxPQUFPLENBQUM7U0FDVCxDQUFDLENBQ0g7QUFFRCxRQUFBLE1BQU0sWUFBWSxHQUNoQixXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUU7QUFFOUQsUUFBQSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNqRTtBQUVELFFBQUEsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQXlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSTtBQUN0RSxZQUFBLElBQUksQ0FBQztnQkFDSCxLQUFLO29CQUNILE9BQU8sS0FBSyxLQUFLOzBCQUNiLEtBQUssR0FBRyxDQUFRLEtBQUEsRUFBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFFOzBCQUNwQyxNQUFNLENBQUMsQ0FBQSxFQUFBLEVBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBLENBQUU7QUFDbEMsWUFBQSxPQUFPLEtBQUs7U0FDYixFQUFFLFNBQVMsQ0FBQztBQUViLFFBQUEsSUFBSSxhQUFhO0FBQUUsWUFBQSxNQUFNLElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUMzRCxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzs7QUFHdEM7Ozs7OztBQU1HO0FBQ2dCLElBQUEsTUFBTSxVQUFVLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVyxFQUFBO1FBQzdELE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLElBQUksRUFDbEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEI7QUFDRCxRQUFBLE1BQU0sS0FBSyxHQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNqQyxRQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBaUI7QUFDbEMsUUFBQSxNQUFNLG1CQUFtQixDQUN2QixJQUFJLEVBQ0osV0FBVyxDQUFDLE9BQU8sRUFDbkIsS0FBSyxFQUNMLGFBQWEsQ0FBQyxJQUFJLEVBQ2xCLGFBQWEsQ0FBQyxFQUFFLENBQ2pCO1FBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7O0FBR25DOzs7Ozs7QUFNRztBQUNILElBQUEsTUFBTSxJQUFJLENBQUMsRUFBNEIsRUFBRSxHQUFHLElBQVcsRUFBQTtBQUNyRCxRQUFBLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUQsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztBQUczRDs7Ozs7O0FBTUc7QUFDZ0IsSUFBQSxNQUFNLGFBQWEsQ0FDcEMsSUFBeUIsRUFDekIsR0FBRyxJQUFXLEVBQUE7UUFFZCxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQ3BDLGFBQWEsQ0FBQyxJQUFJLEVBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQ3RCO0FBQ0QsUUFBQSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSTtBQUNuQixZQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtBQUMxQixZQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBZTtBQUM1QixZQUFBLE9BQU8sbUJBQW1CLENBQ3hCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDLEVBQ0QsYUFBYSxDQUFDLElBQUksRUFDbEIsYUFBYSxDQUFDLEVBQUUsQ0FDakI7U0FDRixDQUFDLENBQ0g7UUFDRCxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzs7QUFHcEM7Ozs7OztBQU1HO0FBQ00sSUFBQSxNQUFNLE9BQU8sQ0FDcEIsSUFBeUIsRUFDekIsR0FBRyxJQUFXLEVBQUE7QUFFZCxRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDekUsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRDs7QUFHSDs7Ozs7O0FBTUc7QUFDSCxJQUFBLE1BQU0sTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVcsRUFBQTs7UUFFbkMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDcEUsUUFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDdkUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7O0FBRzNFOzs7Ozs7OztBQVFHO0FBQ2dCLElBQUEsTUFBTSxZQUFZLENBQ25DLEtBQVEsRUFDUixHQUFHLElBQVcsRUFBQTtRQUVkLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEI7UUFDRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBVztBQUNuQyxRQUFBLElBQUksQ0FBQyxFQUFFO1lBQ0wsTUFBTSxJQUFJLGFBQWEsQ0FDckIsQ0FBQSxrREFBQSxFQUFxRCxJQUFJLENBQUMsRUFBWSxDQUFFLENBQUEsQ0FDekU7QUFDSCxRQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ3pELEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7UUFDbkMsTUFBTSxtQkFBbUIsQ0FDdkIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLEtBQUssRUFDTCxhQUFhLENBQUMsTUFBTSxFQUNwQixhQUFhLENBQUMsRUFBRSxFQUNoQixRQUFRLENBQ1Q7QUFFRCxRQUFBLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDbEMsS0FBSyxDQUFDLFNBQVMsQ0FDYixRQUFRLEVBQ1IsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDbkMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUNsRSxDQUNGO0FBQ0QsUUFBQSxJQUFJLE1BQU07WUFBRSxNQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4RCxRQUFBLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNwQyxZQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUNoQyxnQkFBQSxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUVuRSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzs7QUFHckM7Ozs7OztBQU1HO0FBQ00sSUFBQSxNQUFNLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUE7UUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzFDLElBQUksQ0FBQyxTQUFTLEVBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUM1QixHQUFHLElBQUksQ0FDUjtBQUNELFFBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQzNEOztBQUdIOzs7Ozs7OztBQVFHO0FBQ2dCLElBQUEsTUFBTSxlQUFlLENBQ3RDLE1BQVcsRUFDWCxHQUFHLElBQVcsRUFBQTtRQUVkLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEI7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFJO1lBQzNCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFXO0FBQy9CLFlBQUEsSUFBSSxDQUFDLEVBQUU7QUFBRSxnQkFBQSxNQUFNLElBQUksYUFBYSxDQUFDLGdDQUFnQyxDQUFDO0FBQ2xFLFlBQUEsT0FBTyxFQUFFO0FBQ1gsU0FBQyxDQUFDO0FBQ0YsUUFBQSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM5RCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUk7QUFDM0IsWUFBQSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN4QyxnQkFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDNUIsb0JBQUEsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkUsWUFBQSxPQUFPLENBQUM7QUFDVixTQUFDLENBQUM7QUFDRixRQUFBLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FDZCxtQkFBbUIsQ0FDakIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLENBQUMsRUFDRCxhQUFhLENBQUMsTUFBTSxFQUNwQixhQUFhLENBQUMsRUFBRSxFQUNoQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2IsQ0FDRixDQUNGO0FBRUQsUUFBQSxNQUFNLFlBQVksR0FDaEIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFO0FBRTlELFFBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FDZCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQy9ELENBQ0Y7QUFFRCxRQUFBLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUF5QixFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUk7QUFDdEUsWUFBQSxJQUFJLENBQUM7Z0JBQ0gsS0FBSztvQkFDSCxPQUFPLEtBQUssS0FBSzswQkFDYixLQUFLLEdBQUcsQ0FBUSxLQUFBLEVBQUEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBRTswQkFDcEMsTUFBTSxDQUFDLENBQUEsRUFBQSxFQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQSxDQUFFO0FBQ2xDLFlBQUEsT0FBTyxLQUFLO1NBQ2IsRUFBRSxTQUFTLENBQUM7QUFFYixRQUFBLElBQUksYUFBYTtBQUFFLFlBQUEsTUFBTSxJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFFM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUk7WUFDdEIsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3hDLGdCQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUM1QixvQkFBQSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVyRSxTQUFDLENBQUM7UUFDRixPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzs7QUFHdEM7Ozs7OztBQU1HO0FBQ2dCLElBQUEsTUFBTSxZQUFZLENBQUMsR0FBUSxFQUFFLEdBQUcsSUFBVyxFQUFBO1FBQzVELE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEI7QUFDRCxRQUFBLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO0FBQ3ZELFFBQUEsTUFBTSxtQkFBbUIsQ0FDdkIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLEtBQUssRUFDTCxhQUFhLENBQUMsTUFBTSxFQUNwQixhQUFhLENBQUMsRUFBRSxDQUNqQjtRQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDOztBQUduQzs7Ozs7O0FBTUc7QUFDSCxJQUFBLE1BQU0sTUFBTSxDQUFDLEVBQTRCLEVBQUUsR0FBRyxJQUFXLEVBQUE7QUFDdkQsUUFBQSxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hFLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7QUFHM0Q7Ozs7OztBQU1HO0FBQ2dCLElBQUEsTUFBTSxlQUFlLENBQ3RDLElBQXlCLEVBQ3pCLEdBQUcsSUFBVyxFQUFBO1FBRWQsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUNwQyxhQUFhLENBQUMsTUFBTSxFQUNwQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksRUFDSixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUN0QjtBQUNELFFBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFDNUQsUUFBQSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSTtBQUNyQixZQUFBLE9BQU8sbUJBQW1CLENBQ3hCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDLEVBQ0QsYUFBYSxDQUFDLE1BQU0sRUFDcEIsYUFBYSxDQUFDLEVBQUUsQ0FDakI7U0FDRixDQUFDLENBQ0g7UUFDRCxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQzs7QUFHcEM7Ozs7OztBQU1HO0FBQ00sSUFBQSxNQUFNLFNBQVMsQ0FDdEIsSUFBeUIsRUFDekIsR0FBRyxJQUFXLEVBQUE7QUFFZCxRQUFBLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0UsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRDs7QUF3Qkg7Ozs7OztBQU1HO0FBQ0gsSUFBQSxNQUFNLENBQ0osUUFBMEIsRUFBQTtRQUUxQixPQUFPLElBQUksQ0FBQztBQUNULGFBQUEsU0FBUzthQUNULE1BQU0sQ0FBQyxRQUEyQjtBQUNsQyxhQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztBQUdyQjs7Ozs7Ozs7O0FBU0c7QUFDSCxJQUFBLE1BQU0sS0FBSyxDQUNULFNBQXVCLEVBQ3ZCLE9BQWdCLEVBQ2hCLEtBQXdCLEdBQUEsY0FBYyxDQUFDLEdBQUcsRUFDMUMsS0FBYyxFQUNkLElBQWEsRUFBQTtBQUViLFFBQUEsTUFBTSxJQUFJLEdBQXVCLENBQUMsT0FBTyxFQUFFLEtBQXVCLENBQUM7QUFDbkUsUUFBQSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDMUQsUUFBQSxJQUFJLEtBQUs7QUFBRSxZQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzdCLFFBQUEsSUFBSSxJQUFJO0FBQUUsWUFBQSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM1QixRQUFBLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRTs7QUFHeEIsSUFBQSxJQUFJLENBQUMsSUFBYSxFQUFBO0FBQ2hCLFFBQUEsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFJLElBQUksQ0FBQzs7QUFHaEM7Ozs7Ozs7QUFPRztJQUVILE9BQU8sQ0FBQyxRQUFrQixFQUFFLE1BQXVCLEVBQUE7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO0FBQ3ZCLFlBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7QUFDN0MsZ0JBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7QUFDN0IsZ0JBQUEsUUFBUSxFQUFFLEtBQUs7QUFDaEIsYUFBQSxDQUFDO0FBQ0osUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUM5QyxRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQWEsS0FBSyxTQUFTLEtBQUssS0FBSyxDQUFDO1FBQ2xFLEdBQUcsQ0FBQyxPQUFPLENBQ1QsQ0FBaUIsY0FBQSxFQUFBLElBQUksQ0FBQyxPQUFPLENBQTJCLHdCQUFBLEVBQUEsU0FBUyxDQUFFLENBQUEsQ0FDcEU7UUFDRCxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUMvQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQTJCLHdCQUFBLEVBQUEsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFFLENBQUEsQ0FBQzs7QUFHL0Q7Ozs7Ozs7QUFPRztBQUVILElBQUEsU0FBUyxDQUFDLFFBQWtCLEVBQUE7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO0FBQ3ZCLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FDckIsb0VBQW9FLENBQ3JFO0FBQ0gsUUFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDeEMsUUFBQSxJQUFJLENBQUM7QUFDRixhQUFBLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUzthQUNsQixPQUFPLENBQUMsWUFBWSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUEsUUFBQSxDQUFVLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ2QsQ0FBb0MsaUNBQUEsRUFBQSxJQUFJLENBQUMsT0FBTyxDQUFpQixlQUFBLENBQUEsQ0FDbEU7QUFDRCxZQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM1QixZQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUEsNEJBQUEsRUFBK0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUEsQ0FBRSxDQUFDOzs7QUFJM0U7Ozs7Ozs7OztBQVNHO0lBQ0gsTUFBTSxlQUFlLENBQ25CLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQ1osR0FBRyxJQUFXLEVBQUE7UUFFZCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7QUFDdkIsWUFBQSxNQUFNLElBQUksYUFBYSxDQUNyQixvRUFBb0UsQ0FDckU7QUFDSCxRQUFBLElBQUksQ0FBQztBQUNGLGFBQUEsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlO0FBQ3hCLGFBQUEsT0FBTyxDQUNOLENBQUEsU0FBQSxFQUFZLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQWtCLGVBQUEsRUFBQSxJQUFJLENBQUUsQ0FBQSxDQUNqRTtBQUNILFFBQUEsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FDeEMsSUFBSSxDQUFDLEdBQUcsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtjQUNaLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQVc7QUFDbkUsY0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBWSxFQUMxRCxHQUFHLElBQUksQ0FDUjs7QUFHSDs7Ozs7Ozs7QUFRRztJQUNILE1BQU0sT0FBTyxDQUNYLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQ1osR0FBRyxJQUFXLEVBQUE7QUFFZCxRQUFBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQzs7QUFHeEQ7Ozs7Ozs7Ozs7QUFVRztJQUNILE9BQU8sUUFBUSxDQUNiLEtBQXFCLEVBQ3JCLEtBQWMsRUFDZCxHQUFHLElBQVcsRUFBQTtBQUVkLFFBQUEsSUFBSSxJQUFvQztRQUV4QyxNQUFNLE1BQU0sR0FDVixLQUFLO0FBQ0wsWUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNoRSxPQUFPLENBQUMsY0FBYztBQUN4QixRQUFBLElBQUk7WUFDRixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUF1Qjs7O1FBRXBELE9BQU8sQ0FBTSxFQUFFO1lBQ2YsSUFBSSxHQUFHLFNBQVM7O1FBR2xCLElBQUksSUFBSSxZQUFZLFVBQVU7QUFBRSxZQUFBLE9BQU8sSUFBUztRQUVoRCxNQUFNLE9BQU8sR0FDWCxLQUFLO0FBQ0wsWUFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUNoRSxhQUFDLElBQUk7QUFDSCxnQkFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxjQUFjO1FBQ3hCLE1BQU0sT0FBTyxHQUE0QztBQUN2RCxjQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTztjQUNuQixTQUFTO0FBRWIsUUFBQSxJQUFJLENBQUMsT0FBTztBQUNWLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FDckIsbURBQW1ELE9BQU8sQ0FBQSxDQUFFLENBQzdEO0FBRUgsUUFBQSxJQUFJLEdBQUcsSUFBSSxJQUFLLE9BQU8sQ0FBQyxVQUFVLEVBQXFCO1FBQ3ZELE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBTTs7QUFHL0M7Ozs7Ozs7O0FBUUc7QUFDSyxJQUFBLE9BQU8sR0FBRyxDQUNoQixLQUFxQixFQUNyQixLQUFjLEVBQUE7UUFFZCxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNsQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7O0FBRTdDLFFBQUEsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU07QUFDckIsWUFBQSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUE4QztBQUN2RSxRQUFBLE1BQU0sSUFBSSxhQUFhLENBQ3JCLDhDQUE4QyxJQUFJLENBQUEsQ0FBRSxDQUNyRDs7QUFHSDs7Ozs7Ozs7QUFRRztBQUNILElBQUEsT0FBTyxRQUFRLENBQ2IsS0FBcUIsRUFDckIsSUFBb0MsRUFDcEMsS0FBYyxFQUFBO1FBRWQsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDbEMsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxRQUFBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNO0FBQ3JCLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQSxtQ0FBQSxDQUFxQyxDQUFDO0FBQ3ZFLFFBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFXOztBQUdqQzs7Ozs7O0FBTUc7QUFDSCxJQUFBLE9BQU8sV0FBVyxDQUFrQixLQUFRLEVBQUUsUUFBYSxFQUFBO1FBQ3pELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7QUFDckQsWUFBQSxVQUFVLEVBQUUsS0FBSztBQUNqQixZQUFBLFlBQVksRUFBRSxJQUFJO0FBQ2xCLFlBQUEsUUFBUSxFQUFFLEtBQUs7QUFDZixZQUFBLEtBQUssRUFBRSxRQUFRO0FBQ2hCLFNBQUEsQ0FBQzs7QUFHSjs7Ozs7O0FBTUc7SUFDSCxPQUFPLFdBQVcsQ0FBa0IsS0FBUSxFQUFBO0FBQzFDLFFBQUEsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUNoRCxLQUFLLEVBQ0wsZUFBZSxDQUFDLFFBQVEsQ0FDekI7UUFDRCxPQUFPLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLFNBQVM7O0FBR2xEOzs7OztBQUtHO0lBQ0gsT0FBTyxjQUFjLENBQWtCLEtBQVEsRUFBQTtBQUM3QyxRQUFBLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDaEQsS0FBSyxFQUNMLGVBQWUsQ0FBQyxRQUFRLENBQ3pCO0FBQ0QsUUFBQSxJQUFJLFVBQVU7QUFBRSxZQUFBLE9BQVEsS0FBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7O0FBR2pFOzs7Ozs7O0FBT0c7SUFDSCxPQUFPLGtCQUFrQixDQUFrQixLQUFRLEVBQUE7UUFDakQsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDbkMsUUFBQSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNsQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFDekIsS0FBSyxFQUNMLEVBQVksQ0FDYjtBQUNELFFBQUEsSUFBSSxDQUFDLFFBQVE7QUFDWCxZQUFBLE1BQU0sSUFBSSxhQUFhLENBQ3JCLHVFQUF1RSxDQUN4RTtBQUNILFFBQUEsT0FBTyxRQUEyQjs7QUFHcEM7Ozs7OztBQU1HO0lBQ0gsT0FBTyxPQUFPLENBQWtCLEtBQXlCLEVBQUE7UUFDdkQsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLHdCQUF3QixDQUN6RCxLQUFLLFlBQVksS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxFQUM1QyxNQUFNLENBQUMsT0FBTyxDQUNmO1FBQ0QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQ2pELENBQUMsS0FBb0QsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSTtZQUNqRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2RSxZQUFBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDdkIsZ0JBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDdEIsb0JBQUEsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHO29CQUMxQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFzQjs7O0FBRzFDLFlBQUEsT0FBTyxLQUFLO1NBQ2IsRUFDRCxFQUFFLENBQ0g7O0FBR0g7Ozs7OztBQU1HO0lBQ0gsT0FBTyxTQUFTLENBQWtCLEtBQXlCLEVBQUE7UUFDekQsTUFBTSxNQUFNLEdBQWEsRUFBRTtBQUMzQixRQUFBLElBQUksU0FBUyxHQUNYLEtBQUssWUFBWTtBQUNmLGNBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLO0FBQzdCLGNBQUcsS0FBYSxDQUFDLFNBQVM7QUFDOUIsUUFBQSxPQUFPLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQWEsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7WUFDNUQsSUFBSSxLQUFLLEVBQUU7QUFDVCxnQkFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDOztBQUV2QixZQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQzs7QUFFOUMsUUFBQSxPQUFPLE1BQU07O0FBR2Y7Ozs7OztBQU1HO0lBQ0gsT0FBTyxLQUFLLENBQWtCLEtBQXlCLEVBQUE7QUFDckQsUUFBQSxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUM7O0FBRzVCOzs7Ozs7O0FBT0c7QUFDSCxJQUFBLE9BQU8sTUFBTSxDQUFrQixLQUFRLEVBQUUsU0FBaUIsRUFBQTtBQUN4RCxRQUFBLE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7OztBQTVVeEMsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7Ozs7QUFlUCxDQUFBLEVBQUEsVUFBQSxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsSUFBQSxDQUFBO0FBV0QsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7Ozs7QUFpQlAsQ0FBQSxFQUFBLFVBQUEsQ0FBQSxTQUFBLEVBQUEsV0FBQSxFQUFBLElBQUEsQ0FBQTtBQXVTSCxJQUFJLE9BQU87QUFBRSxJQUFBLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFVBQVU7O0FDenBDcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NHO0FBQ2EsU0FBQSxtQ0FBbUMsQ0FDakQsS0FBeUIsRUFDekIsT0FBZ0IsRUFBQTtJQUVoQixJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ1osTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQ2hELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUMzQixHQUFHLEVBQ0gsS0FBSyxZQUFZLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FDbkQ7QUFDRCxRQUFBLElBQUksQ0FBQyxPQUFPO1lBQ1YsTUFBTSxJQUFJLGFBQWEsQ0FDckIsQ0FBQSxzQ0FBQSxFQUF5QyxLQUFLLFlBQVksS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUUsQ0FBQSxDQUN4Rzs7QUFFTCxJQUFBLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRTs7QUN6Q0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0RHO0FBQ0csTUFBTyxtQkFBb0IsU0FBUSxxQkFBcUIsQ0FBQTtBQUc1RCxJQUFBLElBQWMsR0FBRyxHQUFBO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQVcsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyxNQUFNOztBQUdwQixJQUFBLFdBQUEsR0FBQTtBQUNFLFFBQUEsS0FBSyxFQUFFOztBQUdUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NHO0lBQ00sR0FBRyxDQUNWLElBQXNDLEVBQ3RDLE9BQWdCLEVBQUE7QUFFaEIsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDOztBQUVsQyxRQUFBLElBQUksVUFBeUI7QUFDN0IsUUFBQSxJQUFJO0FBQ0YsWUFBQSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFXLENBQUM7O0FBQ25DLFFBQUEsTUFBTTs7O1FBSVIsSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUNmLFlBQUEsSUFBSSxTQUF1QztZQUMzQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVU7Z0JBQUUsU0FBUyxHQUFHLElBQXdCO2lCQUMvRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzdELFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBMEI7O0FBR2pFLFlBQUEsSUFBSSxDQUFDLFNBQVM7QUFBRSxnQkFBQSxPQUFPLFNBQVM7O1lBR2hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUNwRCxNQUFNLGVBQWUsR0FDbkIsT0FBTztBQUNOLGdCQUFBLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBd0I7QUFFakUsWUFBQSxJQUFJOzs7Z0JBR0YsSUFBSSxVQUFVLEdBQUcsZUFBZTtBQUNoQyxnQkFBQSxJQUFJO0FBQ0Ysb0JBQUEsSUFBSSxlQUFlO0FBQUUsd0JBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7O0FBQ2pELGdCQUFBLE1BQU07QUFDTixvQkFBQSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBYztBQUN0QyxvQkFBQSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLGVBQWU7QUFDaEQsd0JBQUEsVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLOztnQkFHOUIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQzlCLFNBQTZCLEVBQzdCLFVBQVUsQ0FDTjtnQkFDTixJQUFJLFVBQVUsWUFBWSxVQUFVO0FBQUUsb0JBQUEsT0FBTyxVQUFlOztnQkFHNUQsTUFBTSxDQUFDLEdBQ0wsZUFBZTtvQkFDZCxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRyxVQUFrQixDQUFDLFdBQVcsQ0FFL0M7QUFDYixvQkFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQXdCO0FBQ2pFLGdCQUFBLFdBQVcsQ0FBQyxRQUFRLENBQ2xCLFVBQVUsRUFDVixtQ0FBbUMsQ0FDakMsU0FBa0MsRUFDbEMsQ0FBVyxDQUNaLENBQ0Y7O1lBQ0QsT0FBTyxDQUFVLEVBQUU7QUFDbkIsZ0JBQUEsR0FBRyxDQUFDLEtBQUssQ0FDUCxDQUF1RixtRkFBQSxFQUFBLENBQVcsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFFLENBQ25JO2dCQUNELE1BQU0sUUFBUSxHQUFJLFVBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQztBQUN2RSxnQkFBQSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtvQkFDbEMsTUFBTSxPQUFPLEdBQUc7QUFDZCwwQkFBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWU7QUFDOUIsMEJBQUcsT0FBTyxDQUFDLE9BQWU7QUFDNUIsb0JBQUEsSUFBSSxDQUFDLE9BQU87QUFBRSx3QkFBQSxPQUFPLFNBQVM7b0JBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7QUFDakQsb0JBQUEsT0FBTyxRQUFhOzs7O0FBSzFCLFFBQUEsT0FBTyxVQUEyQjs7QUFFckM7O0FDbkxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJHO0FBQ0csTUFBTyxRQUFTLFNBQVEsV0FBVyxDQUFBO0FBYXZDOzs7QUFHRztBQUNILElBQUEsV0FBQSxHQUFBO0FBQ0UsUUFBQSxLQUFLLEVBQUU7O0FBR1Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNHO0FBQ08sSUFBQSxNQUFNLFVBQVUsR0FBQTtBQUN4QixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFOzs7O0FBSWpCLFlBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ2QsQ0FBQSx5REFBQSxDQUEyRCxDQUM1RDtZQUNEOztBQUVGLFFBQUEsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQXNDO0FBRXpELFFBQUE7QUFDRSxZQUFBLGFBQWEsQ0FBQyxNQUFNO0FBQ3BCLFlBQUEsYUFBYSxDQUFDLE1BQU07QUFDcEIsWUFBQSxhQUFhLENBQUMsTUFBTTtBQUNwQixZQUFBLHFCQUFxQixDQUFDLFVBQVU7QUFDaEMsWUFBQSxxQkFBcUIsQ0FBQyxVQUFVO0FBQ2hDLFlBQUEscUJBQXFCLENBQUMsVUFBVTtBQUVuQyxTQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFJO0FBQ25CLFlBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLE1BQU0sSUFBSSxhQUFhLENBQ3JCLENBQVUsT0FBQSxFQUFBLE1BQU0sQ0FBaUIsY0FBQSxFQUFBLE9BQU8sQ0FBQyxLQUFLLENBQXVDLHFDQUFBLENBQUEsQ0FDdEY7WUFFSCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUNqRSxJQUFJLEtBQUssR0FBUSxPQUFPO1lBQ3hCLE9BQU8sQ0FBQyxVQUFVLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUU7QUFDaEQsZ0JBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7O1lBRzdELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixDQUF5QixzQkFBQSxFQUFBLE1BQU0sQ0FBK0IsNkJBQUEsQ0FBQSxDQUMvRDtnQkFDRDs7WUFFRixTQUFTLFlBQVksQ0FBQyxNQUFjLEVBQUE7Z0JBQ2xDLFFBQVEsTUFBTTtvQkFDWixLQUFLLHFCQUFxQixDQUFDLFVBQVU7d0JBQ25DLE9BQU8sYUFBYSxDQUFDLE1BQU07b0JBQzdCLEtBQUsscUJBQXFCLENBQUMsVUFBVTt3QkFDbkMsT0FBTyxhQUFhLENBQUMsTUFBTTtvQkFDN0IsS0FBSyxxQkFBcUIsQ0FBQyxVQUFVO3dCQUNuQyxPQUFPLGFBQWEsQ0FBQyxNQUFNO0FBQzdCLG9CQUFBO0FBQ0Usd0JBQUEsT0FBTyxNQUFNOzs7O1lBSW5CLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzNDLEtBQUssRUFBRSxPQUFPLE1BQVcsRUFBRSxPQUFPLEVBQUUsUUFBZSxLQUFJO0FBQ3JELG9CQUFBLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsUUFBUTtvQkFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7b0JBQ3BELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFlO3lCQUNsRSxJQUFJLENBQUMsTUFBSzt3QkFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FDZCxDQUFrQywrQkFBQSxFQUFBLE1BQU0sQ0FBUSxLQUFBLEVBQUEsU0FBUyxDQUFFLENBQUEsQ0FDNUQ7d0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBUSxLQUFBLEVBQUEsR0FBRyxDQUFFLENBQUEsQ0FBQztBQUMvQixxQkFBQzt5QkFDQSxLQUFLLENBQUMsQ0FBQyxDQUFVLEtBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLENBQUEsd0NBQUEsRUFBMkMsTUFBTSxDQUFPLElBQUEsRUFBQSxTQUFTLEtBQUssQ0FBQyxDQUFBLENBQUUsQ0FDMUUsQ0FDRjtBQUNILG9CQUFBLE9BQU8sTUFBTTtpQkFDZDtBQUNGLGFBQUEsQ0FBQztBQUNKLFNBQUMsQ0FBQzs7QUFHSjs7OztBQUlHO0FBQ0gsSUFBQSxNQUFNLEtBQUssR0FBQTs7O0FBSVg7Ozs7O0FBS0c7QUFDSCxJQUFBLE9BQU8sQ0FBQyxRQUFxQyxFQUFBO0FBQzNDLFFBQUEsSUFBSSxFQUFFLFFBQVEsWUFBWSxPQUFPLENBQUM7QUFDaEMsWUFBQSxNQUFNLElBQUksZ0JBQWdCLENBQUMsMkNBQTJDLENBQUM7QUFDekUsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVE7QUFDdkIsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FDZCxDQUE0Qix5QkFBQSxFQUFBLElBQUksQ0FBQyxPQUFRLENBQUMsS0FBSyxDQUFBLFFBQUEsQ0FBVSxDQUMxRCxDQUNGOztBQUdIOzs7OztBQUtHO0FBQ0gsSUFBQSxTQUFTLENBQUMsUUFBa0IsRUFBQTtBQUMxQixRQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRO0FBQzNCLFlBQUEsTUFBTSxJQUFJLGdCQUFnQixDQUN4Qiw2REFBNkQsQ0FDOUQ7QUFDSCxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUzs7QUFHMUI7Ozs7Ozs7QUFPRztBQUNILElBQUEsTUFBTSxlQUFlLENBQ25CLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQUE7QUFFWixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUNkLENBQWtFLCtEQUFBLEVBQUEsS0FBSyxDQUFJLENBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUNuRjtZQUNEOztBQUVGLFFBQUEsSUFBSTtBQUNGLFlBQUEsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7UUFDNUMsT0FBTyxDQUFVLEVBQUU7QUFDbkIsWUFBQSxNQUFNLElBQUksYUFBYSxDQUFDLCtCQUErQixDQUFDLENBQUEsQ0FBRSxDQUFDOzs7QUFHaEU7QUFFRCxJQUFJLE9BQU87QUFBRSxJQUFBLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxRQUFROztBQ3RPaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJHO0FBQ2EsU0FBQSxVQUFVLENBQ3hCLEtBQXFCLEVBQ3JCLE9BQWdCLEVBQUE7QUFFaEIsSUFBQSxRQUFRLENBQUMsUUFBYSxFQUFFLFdBQWlCLEtBQUk7UUFDM0MsSUFBSSxXQUFXLEVBQUU7QUFDZixZQUFBLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBNEIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUNuRSxRQUFRLEVBQ1IsV0FBVyxDQUNaOztBQUdILFFBQUEsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDakUsT0FBTztZQUNMLE9BQU87QUFDUCxnQkFBQSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUNyRSxRQUFBLFVBQVUsQ0FBQyxRQUFRLENBQ2pCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBNEIsQ0FBQyxJQUFJLEtBQUssRUFDdEQsUUFBUSxFQUNSLE9BQU8sQ0FDUjtRQUNELE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBNEIsQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUN4RSxZQUFBLFFBQVEsRUFBRSxDQUFDLFFBQXdCLEtBQUk7Z0JBQ3JDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFDNUMsb0JBQUEsVUFBVSxFQUFFLEtBQUs7QUFDakIsb0JBQUEsWUFBWSxFQUFFLEtBQUs7QUFDbkIsb0JBQUEsUUFBUSxFQUFFLEtBQUs7QUFDZixvQkFBQSxLQUFLLEVBQUUsS0FBSztBQUNiLGlCQUFBLENBQUM7QUFDRixnQkFBQSxPQUFPLFFBQVE7YUFDaEI7U0FDRixDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ2QsS0FBQztBQUNIOztBQ2pFQTs7Ozs7Ozs7Ozs7Ozs7QUFjRztBQUNHLE1BQU8sYUFBYyxTQUFRLGFBQWEsQ0FBQTtBQUM5QyxJQUFBLFdBQUEsQ0FBWSxHQUFtQixFQUFBO1FBQzdCLEtBQUssQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7O0FBRXRDOztBQ2lDRDs7Ozs7QUFLRztBQUNVLE1BQUEsbUJBQW1CLEdBQW9CO0FBQ2xELElBQUEsSUFBSSxFQUFFLFNBQVM7QUFDZixJQUFBLFNBQVMsRUFBRSxLQUFLO0FBQ2hCLElBQUEsU0FBUyxFQUFFLENBQUM7QUFDWixJQUFBLFdBQVcsRUFBRSxDQUFDO0FBQ2QsSUFBQSxLQUFLLEVBQUUsS0FBSzs7QUFHZDs7Ozs7QUFLRztBQUNJLE1BQU0sc0JBQXNCLEdBQW9CO0FBRXZEOzs7OztBQUtHO0FBQ1UsTUFBQSxlQUFlLEdBQW9CO0FBQzlDLElBQUEsSUFBSSxFQUFFLFFBQVE7QUFDZCxJQUFBLFNBQVMsRUFBRSxJQUFJO0FBQ2YsSUFBQSxTQUFTLEVBQUUsQ0FBQztBQUNaLElBQUEsV0FBVyxFQUFFLENBQUM7QUFDZCxJQUFBLEtBQUssRUFBRSxLQUFLOztBQUdkOzs7OztBQUtHO0FBQ1UsTUFBQSxjQUFjLEdBQW9CLE1BQU0sQ0FBQyxNQUFNLENBQzFELEVBQUUsRUFDRixlQUFlLEVBQ2Y7QUFDRSxJQUFBLElBQUksRUFBRSxRQUFRO0FBQ2YsQ0FBQTs7QUNsRkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Q0c7QUFDSSxlQUFlLGNBQWMsQ0FJbEMsS0FBUSxFQUNSLE9BQW1CLEVBQ25CLEtBQWMsRUFDZCxVQUFtQyxFQUFBO0lBRW5DLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDZixRQUFBLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFDckQsUUFBQSxJQUFJLENBQUMsV0FBVztZQUNkLE1BQU0sSUFBSSxhQUFhLENBQUMsQ0FBd0IscUJBQUEsRUFBQSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBRSxDQUFBLENBQUM7UUFDM0UsVUFBVSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQzlCLFdBQTZDLEVBQzdDLEtBQUssQ0FDTjs7SUFFSCxJQUFJLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSyxXQUFXO1FBQzdDLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1NBQ3JDO0FBQ0gsUUFBQSxJQUFJO1lBQ0YsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7O1FBQ3hDLE9BQU8sQ0FBTSxFQUFFO0FBQ2YsWUFBQSxJQUFJLEVBQUUsQ0FBQyxZQUFZLGFBQWEsQ0FBQztBQUFFLGdCQUFBLE1BQU0sQ0FBQztZQUMxQyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQzs7O0FBRzlDO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpREc7QUFDSSxlQUFlLGdCQUFnQixDQVFwQyxPQUFtQixFQUNuQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtBQUVSLElBQUEsTUFBTSxhQUFhLEdBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUNyQyxJQUFBLElBQUksQ0FBQyxhQUFhO1FBQUU7QUFFcEIsSUFBQSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRTtBQUNyQyxRQUFBLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUMxQyxLQUFLLEVBQ0wsR0FBRyxFQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUNuQjtRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDaEQsUUFBQSxNQUFNLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUM7QUFDcEUsUUFBQSxLQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYTtRQUNuQzs7QUFHRixJQUFBLElBQUksQ0FBQyxLQUFLO1FBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFJLElBQUksQ0FBQyxLQUFhLEVBQUUsQ0FBQyxJQUFJO0lBRTFFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQWUsQ0FBQztBQUNuRCxJQUFBLElBQUksQ0FBQyxXQUFXO1FBQ2QsTUFBTSxJQUFJLGFBQWEsQ0FBQyxDQUFBLHFCQUFBLEVBQXdCLElBQUksQ0FBQyxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQy9ELElBQUEsTUFBTSxJQUFJLEdBQWMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNoRCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtBQUNyQyxJQUFBLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNyRSxLQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUNuQztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOENHO0FBQ0ksZUFBZSxnQkFBZ0IsQ0FRcEMsT0FBbUIsRUFDbkIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRLEVBQUE7QUFFUixJQUFBLE1BQU0sYUFBYSxHQUFRLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDckMsSUFBQSxJQUFJLENBQUMsYUFBYTtRQUFFO0lBQ3BCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE9BQU87UUFBRTtBQUU3QyxJQUFBLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO0FBQ3JDLFFBQUEsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQzFDLEtBQUssRUFDTCxHQUFHLEVBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ25CO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztBQUNoRCxRQUFBLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQztBQUNwRSxRQUFBLEtBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhO1FBQ25DOztBQUdGLElBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQ2xDLEtBQUssQ0FBQyxHQUFHLENBQU0sRUFDZixPQUFPLEVBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ25CO0lBQ0QsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUU7QUFDckMsSUFBQSxNQUFNLHFCQUFxQixDQUN6QixPQUFPLEVBQ1AsS0FBSyxFQUNMLEdBQUcsRUFDSCxPQUFPLENBQUMsRUFBRSxDQUFXLEVBQ3JCLE9BQU8sQ0FDUjtJQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzFCO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Q0c7QUFDSSxlQUFlLGdCQUFnQixDQVFwQyxPQUFtQixFQUNuQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtBQUVSLElBQUEsTUFBTSxhQUFhLEdBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUNyQyxJQUFBLElBQUksQ0FBQyxhQUFhO1FBQUU7SUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsT0FBTztRQUFFO0FBQzdDLElBQUEsTUFBTSxTQUFTLEdBQVksMEJBQTBCLENBQ25ELEtBQUssRUFDTCxHQUFHLEVBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ25CO0FBQ0QsSUFBQSxJQUFJLE9BQVU7QUFDZCxJQUFBLElBQUksRUFBRSxhQUFhLFlBQVksS0FBSyxDQUFDO1FBQ25DLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBVyxDQUFDOztBQUV0RCxRQUFBLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQzdCLEtBQUssQ0FBQyxHQUFHLENBQU8sQ0FBQyxTQUFTLENBQUMsRUFBYSxDQUFXLENBQ3JEO0FBQ0gsSUFBQSxNQUFNLHFCQUFxQixDQUN6QixPQUFPLEVBQ1AsS0FBSyxFQUNMLEdBQUcsRUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBVyxFQUMvQixPQUFPLENBQ1I7QUFDSDtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFERztBQUNJLGVBQWUsaUJBQWlCLENBUXJDLE9BQW1CLEVBQ25CLElBQU8sRUFDUCxHQUFZLEVBQ1osS0FBUSxFQUFBO0FBRVIsSUFBQSxNQUFNLGNBQWMsR0FBUSxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQ3RDLElBQUEsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1FBQUU7QUFDL0MsSUFBQSxNQUFNLFNBQVMsR0FBRyxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsSUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQVMsS0FBSyxPQUFPLElBQUksS0FBSyxTQUFTLENBQUM7QUFDakUsUUFBQSxNQUFNLElBQUksYUFBYSxDQUNyQiwrQ0FBK0MsR0FBYSxDQUFBLDBCQUFBLENBQTRCLENBQ3pGO0lBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELElBQUEsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFO0FBQzFCLFFBQUEsTUFBTSxJQUFJLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN2RSxRQUFBLEtBQUssTUFBTSxFQUFFLElBQUksWUFBWSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDaEMsWUFBQSxNQUFNLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUM7O1FBRTNELEtBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3ZDOztJQUdGLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBRW5ELElBQUEsTUFBTSxNQUFNLEdBQWdCLElBQUksR0FBRyxFQUFFO0FBRXJDLElBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxjQUFjLEVBQUU7QUFDOUIsUUFBQSxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ25FLFFBQUEsTUFBTSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztJQUczQixLQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNuQztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JHO0FBQ0ksZUFBZSxpQkFBaUIsQ0FRckMsT0FBbUIsRUFDbkIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRLEVBQUE7QUFFUixJQUFBLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJO0FBQ3hCLElBQUEsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxPQUFPO1FBQUU7QUFDeEMsSUFBQSxPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFXLEVBQUU7UUFDMUMsT0FBTztRQUNQLElBQUk7UUFDSixHQUFrQjtRQUNsQixLQUFLO0FBQ04sS0FBQSxDQUFDO0FBQ0o7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQ0c7QUFDSSxlQUFlLGlCQUFpQixDQVFyQyxPQUFtQixFQUNuQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtJQUVSLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE9BQU87UUFBRTtBQUM3QyxJQUFBLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQVE7QUFDaEMsSUFBQSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07UUFBRTtBQUMvQixJQUFBLE1BQU0sU0FBUyxHQUFHLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNsQyxJQUFBLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFTLEtBQUssT0FBTyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQzdFLElBQUEsSUFBSSxDQUFDLGNBQWM7QUFDakIsUUFBQSxNQUFNLElBQUksYUFBYSxDQUNyQiwrQ0FBK0MsR0FBYSxDQUFBLDBCQUFBLENBQTRCLENBQ3pGO0FBQ0gsSUFBQSxNQUFNLGNBQWMsR0FBRyxTQUFTLEtBQUssUUFBUTtJQUM3QyxNQUFNLElBQUksR0FBRztBQUNYLFVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO0FBQ25ELFVBQUUsMEJBQTBCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUU5RCxJQUFBLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDO0FBQzNCLFFBQUEsSUFBSTtBQUNGLGNBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQXNCLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFZLENBQUM7Y0FDM0QsTUFBTSxDQUFDO0FBQ1osS0FBQSxDQUFDO0lBRUYsS0FBSyxNQUFNLEVBQUUsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztBQUNyQyxRQUFBLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQzs7SUFFOUQsS0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7QUFDekM7QUFFQTs7Ozs7Ozs7O0FBU0c7U0FDYSxjQUFjLENBQzVCLFNBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLEVBQW1CLEVBQUE7QUFFbkIsSUFBQSxPQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdkU7QUFFQTs7Ozs7Ozs7Ozs7OztBQWFHO0FBQ0ksZUFBZSxxQkFBcUIsQ0FJekMsT0FBbUIsRUFDbkIsV0FBYyxFQUNkLFdBQTZCLEVBQzdCLE9BQXdCLEVBQ3hCLFVBQWUsRUFBQTtBQUVmLElBQUEsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUM3QixXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksRUFDNUIsV0FBcUIsRUFDckIsT0FBTyxDQUNSO0FBQ0QsSUFBQSxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxVQUFVLEVBQUUsQ0FBQztBQUN2RDtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFERztBQUNJLGVBQWUsUUFBUSxDQVE1QixPQUFtQixFQUNuQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtJQUVSLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtRQUFFO0FBQ3BCLElBQUEsTUFBTSxNQUFNLEdBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNuQyxJQUFBLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUFFO0lBRXJFLGVBQWUsbUJBQW1CLENBQ2hDLENBQWEsRUFDYixLQUFRLEVBQ1IsUUFBZ0IsRUFDaEIsYUFBb0IsRUFDcEIsS0FBYyxFQUFBO0FBRWQsUUFBQSxJQUFJLFFBQWdCO0FBQ3BCLFFBQUEsSUFBSSxHQUFRO1FBQ1osTUFBTSxPQUFPLEdBQVEsRUFBRTtBQUN2QixRQUFBLEtBQUssTUFBTSxXQUFXLElBQUksYUFBYSxFQUFFO0FBQ3ZDLFlBQUEsUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO0FBQ3hFLFlBQUEsSUFBSTtnQkFDRixHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQWUsQ0FBQzs7O1lBRWxDLE9BQU8sQ0FBTSxFQUFFO2dCQUNmLE1BQU0sSUFBSSxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO0FBQy9ELGdCQUFBLElBQUksQ0FBQyxJQUFJO0FBQUUsb0JBQUEsTUFBTSxJQUFJLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDekQsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7O0FBRXBDLFlBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7O0FBRW5CLFFBQUEsT0FBTyxPQUFPOztBQUVoQixJQUFBLE1BQU0sR0FBRyxHQUFHLE1BQU0sbUJBQW1CLENBQ25DLE9BQU8sRUFDUCxLQUFLLEVBQ0wsR0FBYSxFQUNiLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ25CO0FBQ0EsSUFBQSxLQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVDO0FBRUE7Ozs7O0FBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRztJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLE1BQU07SUFDTixRQUFRO0NBQ1Q7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5Q0c7U0FDYSwwQkFBMEIsQ0FDeEMsS0FBVSxFQUNWLFdBQTZCLEVBQzdCLEtBQWMsRUFBQTtBQUVkLElBQUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDL0IsVUFBVSxDQUFDLEdBQUcsQ0FDWixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7VUFDNUIsY0FBYyxDQUFDO1VBQ2YsY0FBYyxDQUFDLElBQUksQ0FDeEIsRUFDRCxLQUFLLEVBQ0wsV0FBcUIsQ0FDdEI7SUFDRCxNQUFNLFdBQVcsR0FBUSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7VUFDckQsS0FBSyxDQUFDO0FBQ1IsVUFBRSxLQUFLLENBQUMsV0FBVztBQUNyQixJQUFBLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXO0FBQ3hCLFFBQUEsTUFBTSxJQUFJLGFBQWEsQ0FDckIsZ0RBQWdELFdBQXFCLENBQUEsQ0FBRSxDQUN4RTtJQUVILE1BQU0sWUFBWSxHQUFhLENBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQzdELEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxVQUFVLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FDdkMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUEsRUFBRyxDQUFDLENBQUEsQ0FBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQ25EO0FBQ0QsSUFBQSxJQUFJLENBQUMsZUFBZTtBQUNsQixRQUFBLE1BQU0sSUFBSSxhQUFhLENBQ3JCLGdCQUFnQixXQUFxQixDQUFBLHVDQUFBLENBQXlDLENBQy9FO0lBQ0gsTUFBTSxXQUFXLEdBQStCLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzFFLElBQUEsSUFBSSxDQUFDLFdBQVc7QUFDZCxRQUFBLE1BQU0sSUFBSSxhQUFhLENBQUMsaUNBQWlDLGVBQWUsQ0FBQSxDQUFFLENBQUM7SUFFN0UsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFDaEQ7O0FDanlCQTs7Ozs7OztBQU9HO0FBQ0csU0FBVSxLQUFLLENBQWdCLElBQVcsRUFBQTtJQUM5QyxPQUFPLFNBQVMsS0FBSyxDQUFDLE1BQVcsRUFBQTtRQUMvQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7QUFDOUMsUUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztBQUN0QixhQUFBLE1BQU0sQ0FBQztBQUNOLFlBQUEsU0FBUyxFQUFFLFFBQVE7QUFDbkIsWUFBQSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0M7QUFDQSxhQUFBLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUNwQixLQUFDO0FBQ0g7QUFFQTs7Ozs7OztBQU9HO0FBQ0csU0FBVSxNQUFNLENBQWdCLFVBQWlCLEVBQUE7SUFDckQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO0FBQy9DLElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUc7QUFDdEIsU0FBQSxNQUFNLENBQUM7QUFDTixRQUFBLFNBQVMsRUFBRSxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFBO0FBQzdCLFlBQUEsT0FBTyxTQUFTLE1BQU0sQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFBO0FBQ3hDLGdCQUFBLE9BQU8sWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztBQUM5QyxhQUFDO1NBQ0Y7QUFDRCxRQUFBLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7S0FDeEI7QUFDQSxTQUFBLEtBQUssRUFBRTtBQUNaO1NBeUJnQixLQUFLLENBQ25CLFVBQWlELEVBQ2pELFlBQWdDLEVBQ2hDLElBQWEsRUFBQTtBQUViLElBQUEsU0FBUyxLQUFLLENBQ1osVUFBaUQsRUFDakQsWUFBZ0MsRUFDaEMsSUFBYSxFQUFBO0FBRWIsUUFBQSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUNsQyxJQUFJLEdBQUcsVUFBVTtZQUNqQixVQUFVLEdBQUcsU0FBUztZQUN0QixZQUFZLEdBQUcsU0FBUzs7QUFFMUIsUUFBQSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRTtZQUNwQyxJQUFJLEdBQUcsWUFBWTtZQUNuQixZQUFZLEdBQUcsU0FBUzs7QUFFMUIsUUFBQSxJQUFJLENBQUMsWUFBWSxJQUFJLFVBQVUsRUFBRTtZQUMvQixJQUNFLFVBQVUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFRLENBQUMsQ0FDcEUsRUFDRDtnQkFDQSxZQUFZLEdBQUcsVUFBc0I7Z0JBQ3JDLFVBQVUsR0FBRyxTQUFTOzs7QUFJMUIsUUFBQSxPQUFPLFlBQVksQ0FDakIsVUFBVSxDQUFDLEdBQUcsQ0FDWixDQUFBLEVBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQSxFQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUEsQ0FBQSxFQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBRSxHQUFHLEVBQUUsQ0FBQSxDQUFFLENBQ3JHLEVBQ0Q7QUFDRSxZQUFBLFVBQVUsRUFBRSxVQUFVO0FBQ3RCLFlBQUEsWUFBWSxFQUFFLFlBQVk7QUFDMUIsWUFBQSxJQUFJLEVBQUUsSUFBSTtBQUNNLFNBQUEsQ0FDbkI7O0FBR0gsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUs7QUFDeEMsU0FBQSxNQUFNLENBQUM7QUFDTixRQUFBLFNBQVMsRUFBRSxLQUFLO0FBQ2hCLFFBQUEsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUM7S0FDdkM7QUFDQSxTQUFBLEtBQUssRUFBRTtBQUNaO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkc7QUFDSSxlQUFlLG9CQUFvQixDQVF4QyxPQUFtQixFQUNuQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtBQUVSLElBQUEsSUFBSSxDQUFFLEtBQWEsQ0FBQyxHQUFHLENBQUM7UUFBRTtBQUMxQixJQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU07QUFDL0IsU0FBQSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLFNBQUEsT0FBTyxFQUFFO0lBQ1osSUFBSSxRQUFRLENBQUMsTUFBTTtRQUNqQixNQUFNLElBQUksYUFBYSxDQUNyQixDQUFBLG1DQUFBLEVBQXNDLEdBQWEsQ0FBYSxVQUFBLEVBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBRSxLQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFFLENBQUEsQ0FDcEg7QUFDTDtBQUVBOzs7Ozs7Ozs7Ozs7OztBQWNHO1NBQ2EsTUFBTSxHQUFBO0lBQ3BCLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztBQUNsRCxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0FBQ3RCLFNBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ2xFLFNBQUEsS0FBSyxFQUFFO0FBQ1o7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdCRztBQUNJLGVBQWUsdUJBQXVCO0FBUTNDO0FBQ0EsT0FBbUI7QUFDbkI7QUFDQSxJQUFPO0FBQ1A7QUFDQSxHQUFZO0FBQ1o7QUFDQSxLQUFRLEVBQUE7QUFFUixJQUFBLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsbURBQW1ELENBQ3BEO0FBQ0g7QUFFQTs7Ozs7Ozs7Ozs7OztBQWFHO1NBQ2EsU0FBUyxHQUFBO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztBQUN0RCxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0FBQ3RCLFNBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQy9ELFNBQUEsS0FBSyxFQUFFO0FBQ1o7QUFFQTs7Ozs7Ozs7Ozs7OztBQWFHO1NBQ2EsU0FBUyxHQUFBO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztBQUN0RCxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0FBQ3RCLFNBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3JFLFNBQUEsS0FBSyxFQUFFO0FBQ1o7U0FFZ0IsU0FBUyxHQUFBO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFDO1NBRWdCLFNBQVMsR0FBQTtJQUN2QixPQUFPLFNBQVMsRUFBRTtBQUNwQjtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Qkc7QUFDYSxTQUFBLFFBQVEsQ0FDdEIsS0FBOEMsRUFDOUMsY0FBQSxHQUFrQyxjQUFjLEVBQ2hEQyxVQUFvQixHQUFBLElBQUksRUFDeEIsY0FBa0MsRUFDbEMsRUFBVyxFQUFBO0lBRVgsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDOztJQUd0RCxTQUFTLFdBQVcsQ0FDbEIsS0FBOEMsRUFDOUMsT0FBd0IsRUFDeEJBLFVBQWlCLEVBQ2pCLGNBQWtDLEVBQ2xDLEVBQVcsRUFBQTtBQUVYLFFBQUEsTUFBTSxJQUFJLEdBQXNCO0FBQzlCLFlBQUEsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBSSxLQUFhO0FBQy9DLFlBQUEsT0FBTyxFQUFFLE9BQU87QUFDaEIsWUFBQSxRQUFRLEVBQUVBLFVBQVE7U0FDbkI7QUFDRCxRQUFBLElBQUksY0FBYztBQUFFLFlBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjO0FBQ25ELFFBQUEsSUFBSSxFQUFFO0FBQUUsWUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDdEIsT0FBTyxLQUFLLENBQ1YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFDL0IsSUFBSSxDQUFDO1lBQ0gsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFJLEtBQWE7QUFDeEMsWUFBQSxNQUFNLENBQUMsSUFBSTtBQUNYLFlBQUEsTUFBTSxDQUFDLElBQUk7QUFDWCxZQUFBLE1BQU0sQ0FBQyxJQUFJO0FBQ1osU0FBQSxDQUFDLEVBQ0YsUUFBUSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxFQUNoQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEVBQ2hDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFDaEMsUUFBUSxDQUFDQyxRQUFHLEVBQUUsSUFBSSxDQUFDLEVBQ25CLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQ3hCOztBQUdILElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUc7QUFDdEIsU0FBQSxNQUFNLENBQUM7QUFDTixRQUFBLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUVELFVBQVEsRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDO0tBQzVEO0FBQ0EsU0FBQSxLQUFLLEVBQUU7QUFDWjtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkc7QUFDYSxTQUFBLFNBQVMsQ0FDdkIsS0FBOEMsRUFDOUMsY0FBQSxHQUFrQyxjQUFjLEVBQ2hEQSxVQUFvQixHQUFBLElBQUksRUFDeEIsYUFBa0UsRUFDbEUsRUFBVyxFQUFBO0lBRVgsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO0lBRXZELFNBQVMsWUFBWSxDQUNuQixLQUE4QyxFQUM5QyxPQUF3QixFQUN4QkEsVUFBaUIsRUFDakIsYUFBa0UsRUFDbEUsRUFBVyxFQUFBO0FBRVgsUUFBQSxNQUFNLFFBQVEsR0FBc0I7QUFDbEMsWUFBQSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFJLEtBQWE7QUFDL0MsWUFBQSxPQUFPLEVBQUUsT0FBTztBQUNoQixZQUFBLFFBQVEsRUFBRUEsVUFBUTtTQUNuQjtBQUNELFFBQUEsSUFBSSxhQUFhO0FBQUUsWUFBQSxRQUFRLENBQUMsU0FBUyxHQUFHLGFBQWE7QUFDckQsUUFBQSxJQUFJLEVBQUU7QUFBRSxZQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUMxQixPQUFPLEtBQUssQ0FDVixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQixJQUFJLENBQUM7WUFDSCxLQUF1QjtZQUN2QixNQUFNO1lBQ04sTUFBTTs7WUFFTixNQUFNO0FBQ1AsU0FBQSxDQUFDLEVBQ0YsUUFBUSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxFQUNyQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLEVBQ3JDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsRUFDckMsUUFBUSxDQUFDQyxRQUFHLEVBQUUsUUFBUSxDQUFDLEVBQ3ZCLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQzVCOztBQUdILElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUc7QUFDdEIsU0FBQSxNQUFNLENBQUM7QUFDTixRQUFBLFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUVELFVBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDO0tBQzNEO0FBQ0EsU0FBQSxLQUFLLEVBQUU7QUFDWjtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkc7QUFDYSxTQUFBLFNBQVMsQ0FDdkIsS0FBOEMsRUFDOUMsY0FBa0MsR0FBQSxjQUFjLEVBQ2hELFFBQVEsR0FBRyxJQUFJLEVBQ2YsYUFBa0UsRUFDbEUsRUFBVyxFQUFBOztJQUlYLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUV2RCxTQUFTLFlBQVksQ0FDbkIsS0FBOEMsRUFDOUMsT0FBd0IsRUFDeEIsUUFBaUIsRUFDakIsYUFBa0UsRUFDbEUsRUFBVyxFQUFBO1FBRVgsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQ2IsS0FBSyxHQUFJLEtBQThCLEVBQW9CO0FBQzdELFFBQUEsTUFBTSxRQUFRLEdBQXNCO0FBQ2xDLFlBQUEsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBSSxLQUFhO0FBQy9DLFlBQUEsT0FBTyxFQUFFLE9BQU87QUFDaEIsWUFBQSxRQUFRLEVBQUUsUUFBUTtTQUNuQjtBQUNELFFBQUEsSUFBSSxhQUFhO0FBQUUsWUFBQSxRQUFRLENBQUMsU0FBUyxHQUFHLGFBQWE7QUFDckQsUUFBQSxJQUFJLEVBQUU7QUFBRSxZQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUMxQixPQUFPLEtBQUssQ0FDVixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQixJQUFJLENBQUM7WUFDSCxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUksS0FBYTtBQUN4QyxZQUFBLE1BQU0sQ0FBQyxJQUFJO0FBQ1gsWUFBQSxNQUFNLENBQUMsSUFBSTtBQUNYLFlBQUEsTUFBTSxDQUFDLElBQUk7U0FDWixDQUFDOzs7OztBQUtGLFFBQUEsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FDNUI7O0FBR0gsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztBQUN0QixTQUFBLE1BQU0sQ0FBQztBQUNOLFFBQUEsU0FBUyxFQUFFLFlBQVk7UUFDdkIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQztLQUMzRDtBQUNBLFNBQUEsS0FBSyxFQUFFO0FBQ1o7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJHO0FBQ2EsU0FBQSxVQUFVLENBQ3hCLEtBQThDLEVBQzlDLGNBQWtDLEdBQUEsY0FBYyxFQUNoRCxRQUFRLEdBQUcsSUFBSSxFQUNmLGFBQWtFLEVBQ2xFLEVBQVcsRUFBQTs7SUFHWCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7SUFFeEQsU0FBUyxhQUFhLENBQ3BCLEtBQThDLEVBQzlDLE9BQXdCLEVBQ3hCLFFBQWlCLEVBQ2pCLGFBQWtFLEVBQ2xFLEVBQVcsRUFBQTtBQUVYLFFBQUEsTUFBTSxRQUFRLEdBQXNCO0FBQ2xDLFlBQUEsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBSSxLQUFhO0FBQy9DLFlBQUEsT0FBTyxFQUFFLE9BQU87QUFDaEIsWUFBQSxRQUFRLEVBQUUsUUFBUTtTQUNuQjtBQUNELFFBQUEsSUFBSSxhQUFhO0FBQUUsWUFBQSxRQUFRLENBQUMsU0FBUyxHQUFHLGFBQWE7QUFDckQsUUFBQSxJQUFJLEVBQUU7QUFBRSxZQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUMxQixPQUFPLEtBQUssQ0FDVixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQixJQUFJLENBQUM7WUFDSCxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUksS0FBYTtBQUN4QyxZQUFBLE1BQU0sQ0FBQyxJQUFJO0FBQ1gsWUFBQSxNQUFNLENBQUMsSUFBSTtBQUNYLFlBQUEsTUFBTSxDQUFDLElBQUk7U0FDWixDQUFDOzs7OztBQUtGLFFBQUEsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FDNUI7O0FBRUgsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztBQUN0QixTQUFBLE1BQU0sQ0FBQztBQUNOLFFBQUEsU0FBUyxFQUFFLGFBQWE7UUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQztLQUMzRDtBQUNBLFNBQUEsS0FBSyxFQUFFO0FBQ1o7O0FDemtCQSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUU3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQ0c7QUFDSSxlQUFlLFVBQVUsQ0FROUIsT0FBbUIsRUFDbkIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRLEVBQUE7QUFFUixJQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDL0M7O0FBR0YsSUFBQSxNQUFNLGtCQUFrQixHQUFHLFVBQ3pCLE1BQVMsRUFDVCxXQUFtQixFQUNuQixLQUErQixFQUFBO0FBRS9CLFFBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFO0FBQ3pDLFlBQUEsVUFBVSxFQUFFLElBQUk7QUFDaEIsWUFBQSxRQUFRLEVBQUUsS0FBSztBQUNmLFlBQUEsWUFBWSxFQUFFLElBQUk7QUFDbEIsWUFBQSxLQUFLLEVBQUUsS0FBSztBQUNiLFNBQUEsQ0FBQztBQUNKLEtBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7UUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7QUFDN0QsSUFBQSxJQUFJLFFBQWtCO0FBQ3RCLElBQUEsSUFBSTtRQUNGLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7SUFDNUMsT0FBTyxDQUFNLEVBQUU7UUFDZixNQUFNLElBQUksYUFBYSxDQUNyQixDQUFrQywrQkFBQSxFQUFBLElBQUksQ0FBQyxJQUFJLENBQUssRUFBQSxFQUFBLENBQUMsQ0FBRSxDQUFBLENBQ3BEOztBQUdILElBQUEsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFO0FBQ2xDLElBQUEsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQWEsRUFBRSxJQUFJLENBQUM7QUFDaEQ7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CRztBQUNhLFNBQUEsRUFBRSxDQUNoQixJQUFBLEdBR0ksc0JBQXNCLEVBQUE7SUFFMUIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRTtRQUNyRCxTQUFTLEVBQ1AsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUs7QUFDckMsY0FBRTtBQUNGLGNBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxTQUFTO0FBQ3pELEtBQUEsQ0FBb0I7SUFFckIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ3JDLElBQUEsU0FBUyxLQUFLLENBQUMsT0FBd0IsRUFBRSxTQUFxQixFQUFBO0FBQzVELFFBQUEsT0FBTyxTQUFTLEtBQUssQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFBO1lBQ3ZDLE9BQU8sS0FBSyxDQUNWLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQy9DLFFBQVEsRUFBRSxFQUNWLFFBQVEsRUFBRSxFQUNWLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQzFCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUN4QyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FDOUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQ2QsU0FBQzs7QUFFSCxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0FBQ3RCLFNBQUEsTUFBTSxDQUFDO0FBQ04sUUFBQSxTQUFTLEVBQUUsS0FBSztRQUNoQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztLQUM5QztBQUNBLFNBQUEsS0FBSyxFQUFFO0FBQ1o7O0FDN0pBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JHO0FBQ0csTUFBZ0IsU0FBVSxTQUFRLEtBQUssQ0FBQTtBQWUzQyxJQUFBLFdBQUEsQ0FBc0IsR0FBeUIsRUFBQTtRQUM3QyxLQUFLLENBQUMsR0FBRyxDQUFDOztBQUViO0FBWkMsVUFBQSxDQUFBO0FBREMsSUFBQSxTQUFTLEVBQUU7OEJBQ0EsSUFBSTtBQUFDLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFdBQUEsRUFBQSxNQUFBLENBQUE7QUFPakIsVUFBQSxDQUFBO0FBREMsSUFBQSxTQUFTLEVBQUU7OEJBQ0EsSUFBSTtBQUFDLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFdBQUEsRUFBQSxNQUFBLENBQUE7O0FDbkNuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVERztNQUNtQixTQUFTLENBQUE7QUFRN0IsSUFBQSxJQUFJLE9BQU8sR0FBQTtRQUNULE9BQU8sSUFBSSxDQUFDLFlBQVk7O0FBRzFCLElBQUEsSUFBSSxLQUFLLEdBQUE7UUFDUCxPQUFPLElBQUksQ0FBQyxXQUFXOztBQUd6QixJQUFBLElBQUksS0FBSyxHQUFBO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWTs7QUFHMUIsSUFBQSxJQUFjLFNBQVMsR0FBQTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxVQUFVOztBQUd4QixJQUFBLFdBQUEsQ0FDcUIsT0FBdUMsRUFDdkMsS0FBUSxFQUNsQixJQUFZLEVBQ0YsS0FBcUIsRUFBQTtRQUhyQixJQUFPLENBQUEsT0FBQSxHQUFQLE9BQU87UUFDUCxJQUFLLENBQUEsS0FBQSxHQUFMLEtBQUs7UUFDZixJQUFJLENBQUEsSUFBQSxHQUFKLElBQUk7UUFDTSxJQUFLLENBQUEsS0FBQSxHQUFMLEtBQUs7O0FBSzFCLElBQUEsTUFBTSxJQUFJLEdBQUE7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7O0FBR3BDLElBQUEsTUFBTSxRQUFRLEdBQUE7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7O0FBRzFCLElBQUEsWUFBWSxDQUFDLElBQVksRUFBQTtRQUNqQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNyQyxZQUFBLE1BQU0sSUFBSSxXQUFXLENBQ25CLHNEQUFzRCxDQUN2RDtRQUNILElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVc7WUFDcEUsTUFBTSxJQUFJLFdBQVcsQ0FDbkIsQ0FBUSxLQUFBLEVBQUEsSUFBSSxDQUFDLFdBQVcsQ0FBcUMsa0NBQUEsRUFBQSxJQUFJLENBQUUsQ0FBQSxDQUNwRTtBQUNILFFBQUEsT0FBTyxJQUFJOztBQUlkOzs7QUN0RkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0RHO0FBQ0csTUFBZ0IsU0FDcEIsU0FBUSxXQUFXLENBQUE7QUFlbkIsSUFBQSxXQUFBLENBQWdDLE9BQXVDLEVBQUE7QUFDckUsUUFBQSxLQUFLLEVBQUU7UUFEdUIsSUFBTyxDQUFBLE9BQUEsR0FBUCxPQUFPOztBQUl2QyxJQUFBLElBQXVCLEdBQUcsR0FBQTtRQUN4QixPQUFRLElBQUksQ0FBQyxPQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7O0FBWWpELElBQUEsTUFBTSxDQUNKLFFBQTBCLEVBQUE7QUFFMUIsUUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtBQUM1QyxZQUFBLEtBQUssRUFBRSxRQUFRO0FBQ2YsWUFBQSxRQUFRLEVBQUUsS0FBSztBQUNoQixTQUFBLENBQUM7QUFDRixRQUFBLE9BQU8sSUFBb0U7O0FBSTdFLElBQUEsUUFBUSxDQUNOLFFBQVcsRUFBQTtBQUVYLFFBQUEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVE7QUFDaEMsUUFBQSxPQUFPLElBQWlDOztBQUkxQyxJQUFBLEdBQUcsQ0FBOEIsUUFBVyxFQUFBO0FBQzFDLFFBQUEsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRO0FBQzNCLFFBQUEsT0FBTyxJQUEwQjs7QUFJbkMsSUFBQSxHQUFHLENBQThCLFFBQVcsRUFBQTtBQUMxQyxRQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUTtBQUMzQixRQUFBLE9BQU8sSUFBMEI7O0FBSW5DLElBQUEsS0FBSyxDQUE4QixRQUFZLEVBQUE7QUFDN0MsUUFBQSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVE7QUFDN0IsUUFBQSxPQUFPLElBQThCOztBQUloQyxJQUFBLElBQUksQ0FBQyxRQUF5QixFQUFBO1FBQ25DLElBQUksQ0FBQyxZQUFZLElBQ2YsT0FBTyxRQUFRLEtBQUssUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUM1QztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7QUFDcEIsWUFBQSxNQUFNLElBQUksVUFBVSxDQUFDLGtDQUFrQyxRQUFRLENBQUEsQ0FBRSxDQUFDO0FBQ3BFLFFBQUEsT0FBTyxJQUFJOztBQUlOLElBQUEsS0FBSyxDQUFDLFNBQXVCLEVBQUE7QUFDbEMsUUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVM7QUFDL0IsUUFBQSxPQUFPLElBQUk7O0FBSU4sSUFBQSxPQUFPLENBQ1osUUFBNEIsRUFBQTtBQUU1QixRQUFBLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUTtBQUMvQixRQUFBLE9BQU8sSUFBSTs7QUFJTixJQUFBLE9BQU8sQ0FBQyxRQUE0QixFQUFBO0FBQ3pDLFFBQUEsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRO0FBQy9CLFFBQUEsT0FBTyxJQUFJOztBQUlOLElBQUEsS0FBSyxDQUFDLEtBQWEsRUFBQTtBQUN4QixRQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSztBQUMxQixRQUFBLE9BQU8sSUFBSTs7QUFJTixJQUFBLE1BQU0sQ0FBQyxLQUFhLEVBQUE7QUFDekIsUUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUs7QUFDM0IsUUFBQSxPQUFPLElBQUk7O0lBSVAsTUFBQSxPQUFPLEdBQUE7QUFDWCxRQUFBLElBQUk7QUFDRixZQUFBLE1BQU0sS0FBSyxHQUFNLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDN0IsUUFBUSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDOztRQUM3QixPQUFPLENBQVUsRUFBRTtBQUNuQixZQUFBLE1BQU0sSUFBSSxhQUFhLENBQUMsQ0FBVSxDQUFDOzs7SUFJdkMsTUFBTSxHQUFHLENBQUksUUFBVyxFQUFBO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUksUUFBUSxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztBQUFFLFlBQUEsT0FBTyxPQUFPO0FBQ3hDLFFBQUEsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUMzQixJQUFLLElBQUksQ0FBQyxZQUErQixFQUFFLENBQzVDLENBQUMsRUFBRTtBQUVKLFFBQUEsTUFBTSxTQUFTLEdBQUcsU0FBUyxlQUFlLENBRXhDLENBQU0sRUFBQTtBQUVOLFlBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNwQixZQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3hCLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBZ0MsRUFDckMsTUFBTSxFQUNOLEVBQUUsQ0FDSTtBQUNWLFNBQUMsQ0FBQyxJQUFJLENBQUMsSUFBVyxDQUFDO0FBRW5CLFFBQUEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUFFLFlBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBTTtBQUM5RCxRQUFBLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBTTs7QUFNakM7QUFuSEMsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7Ozs7QUFTUCxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxRQUFBLEVBQUEsSUFBQSxDQUFBO0FBR0QsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7O0FBRUksSUFBQSxVQUFBLENBQUEsbUJBQUEsRUFBQSxDQUFBLFFBQUEsRUFBQSxHQUFBLE9BQUEsQ0FBQyxvQkFBRCxDQUFDLENBQUEsS0FBQSxVQUFBLEdBQUEsRUFBQSxHQUFBLE1BQUEsQ0FBQSxDQUFBOztBQUlaLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLENBQUE7QUFHRCxVQUFBLENBQUE7QUFEQyxJQUFBLEtBQUssRUFBRTs7QUFDbUMsSUFBQSxVQUFBLENBQUEsbUJBQUEsRUFBQSxDQUFBLFFBQUEsRUFBQSxHQUFBLE9BQUEsQ0FBQyxvQkFBRCxDQUFDLENBQUEsS0FBQSxVQUFBLEdBQUEsRUFBQSxHQUFBLE1BQUEsQ0FBQSxDQUFBOztBQUczQyxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxLQUFBLEVBQUEsSUFBQSxDQUFBO0FBR0QsVUFBQSxDQUFBO0FBREMsSUFBQSxLQUFLLEVBQUU7O0FBQ21DLElBQUEsVUFBQSxDQUFBLG1CQUFBLEVBQUEsQ0FBQSxRQUFBLEVBQUEsR0FBQSxPQUFBLENBQUMsb0JBQUQsQ0FBQyxDQUFBLEtBQUEsVUFBQSxHQUFBLEVBQUEsR0FBQSxNQUFBLENBQUEsQ0FBQTs7QUFHM0MsQ0FBQSxFQUFBLFNBQUEsQ0FBQSxTQUFBLEVBQUEsS0FBQSxFQUFBLElBQUEsQ0FBQTtBQUdELFVBQUEsQ0FBQTtBQURDLElBQUEsS0FBSyxFQUFFOztBQUNzQyxJQUFBLFVBQUEsQ0FBQSxtQkFBQSxFQUFBLENBQUEsUUFBQSxFQUFBLEdBQUEsT0FBQSxDQUFDLG9CQUFELENBQUMsQ0FBQSxLQUFBLFVBQUEsR0FBQSxFQUFBLEdBQUEsTUFBQSxDQUFBLENBQUE7O0FBRzlDLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLE9BQUEsRUFBQSxJQUFBLENBQUE7QUFHTSxVQUFBLENBQUE7QUFETixJQUFBLEtBQUssRUFBRTs7OztBQVFQLENBQUEsRUFBQSxTQUFBLENBQUEsU0FBQSxFQUFBLE1BQUEsRUFBQSxJQUFBLENBQUE7QUFHTSxVQUFBLENBQUE7QUFETixJQUFBLEtBQUssRUFBRTs7cUNBQ2dCLFNBQVMsQ0FBQSxDQUFBOztBQUdoQyxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxPQUFBLEVBQUEsSUFBQSxDQUFBO0FBR00sVUFBQSxDQUFBO0FBRE4sSUFBQSxLQUFLLEVBQUU7Ozs7QUFNUCxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsSUFBQSxDQUFBO0FBR00sVUFBQSxDQUFBO0FBRE4sSUFBQSxLQUFLLEVBQUU7Ozs7QUFJUCxDQUFBLEVBQUEsU0FBQSxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsSUFBQSxDQUFBO0FBR00sVUFBQSxDQUFBO0FBRE4sSUFBQSxLQUFLLEVBQUU7Ozs7QUFJ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
5669
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvcGVyc2lzdGVuY2UvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2Vycm9ycy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9TZXF1ZW5jZS50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvZXJyb3JzLnRzIiwiLi4vc3JjL3F1ZXJ5L0NvbmRpdGlvbi50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvRGlzcGF0Y2gudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIiwiLi4vc3JjL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2lkZW50aXR5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvcXVlcnkvdHlwZXMudHMiLCIuLi9zcmMvcXVlcnkvdXRpbHMudHMiLCIuLi9zcmMvcXVlcnkvTWV0aG9kUXVlcnlCdWlsZGVyLnRzIiwiLi4vc3JjL3F1ZXJ5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmFtL1JhbVBhZ2luYXRvci50cyIsIi4uL3NyYy9yYW0vUmFtU3RhdGVtZW50LnRzIiwiLi4vc3JjL3JhbS9SYW1Db250ZXh0LnRzIiwiLi4vc3JjL3JhbS9tb2RlbC9SYW1TZXF1ZW5jZU1vZGVsLnRzIiwiLi4vc3JjL3JhbS9SYW1TZXF1ZW5jZS50cyIsIi4uL3NyYy9yYW0vaGFuZGxlcnMudHMiLCIuLi9zcmMvcmFtL2NvbnN0YW50cy50cyIsIi4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBQZXJzaXN0ZW5jZS1yZWxhdGVkIGNvbnN0YW50IGtleXNcbiAqIEBzdW1tYXJ5IEVudW0gY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIG1ldGFkYXRhLCByZWxhdGlvbnMsIGFuZCBvdGhlciBwZXJzaXN0ZW5jZS1yZWxhdGVkIG9wZXJhdGlvbnNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBQZXJzaXN0ZW5jZUtleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgaW5kZXggbWV0YWRhdGEgKi9cbiAgSU5ERVggPSBcImluZGV4XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVuaXF1ZSBjb25zdHJhaW50IG1ldGFkYXRhICovXG4gIFVOSVFVRSA9IFwidW5pcXVlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGFkYXB0ZXIgbWV0YWRhdGEgKi9cbiAgQURBUFRFUiA9IFwiYWRhcHRlclwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVGVtcGxhdGUgZm9yIGluamVjdGFibGUgYWRhcHRlciBuYW1lcyAqL1xuICBJTkpFQ1RBQkxFID0gXCJkZWNhZl97MH1fYWRhcHRlcl9mb3JfezF9XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRhYmxlIG5hbWUgbWV0YWRhdGEgKi9cbiAgVEFCTEUgPSBcInRhYmxlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNvbHVtbiBuYW1lIG1ldGFkYXRhICovXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGdlbmVyYWwgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBNRVRBREFUQSA9IFwiX19tZXRhZGF0YVwiLFxuXG4gIC8vIE93bmVyc2hpcFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgT1dORVJTSElQID0gXCJvd25lcnNoaXBcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgQ1JFQVRFRF9CWSA9IGAke09XTkVSU0hJUH0uY3JlYXRlZC1ieWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVwZGF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIFVQREFURURfQlkgPSBgJHtPV05FUlNISVB9LnVwZGF0ZWQtYnlgLFxuXG4gIC8vIFJlbGF0aW9uc1xuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciByZWxhdGlvbnMgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBSRUxBVElPTlMgPSBcIl9fcmVsYXRpb25zXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OID0gXCJyZWxhdGlvblwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBvbmUtdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19PTkUgPSBgJHtSRUxBVElPTn0ub25lLXRvLW9uZWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1tYW55IHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm9uZS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19PTkUgPSBgJHtSRUxBVElPTn0ubWFueS10by1vbmVgLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm1hbnktdG8tbWFueWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHBvcHVsYXRlIG1ldGFkYXRhICovXG4gIFBPUFVMQVRFID0gXCJwb3B1bGF0ZVwiLFxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1ha2VzIGEgbWV0aG9kIG5vbi1jb25maWd1cmFibGVcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIHByZXZlbnRzIGEgbWV0aG9kIGZyb20gYmVpbmcgb3ZlcnJpZGRlbiBieSBtYWtpbmcgaXQgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEl0IHRocm93cyBhbiBlcnJvciBpZiB1c2VkIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtZXRob2RzXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbCBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBtZXRob2RzXCIpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5jb25maWd1cmFibGUpIHtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQmFkUmVxdWVzdEVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIGFuIGFjdGlvblxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gd2l0aG91dCBwcm9wZXIgYXV0aGVudGljYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGFuIEF1dGhvcml6YXRpb25FcnJvclxuICogaWYgKCF1c2VyLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gKiAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoJ1VzZXIgbm90IGF1dGhlbnRpY2F0ZWQnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgQmFkUmVxdWVzdEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciwgbmFtZSA9IEF1dGhvcml6YXRpb25FcnJvci5uYW1lLCBjb2RlID0gNDAxKSB7XG4gICAgc3VwZXIobXNnLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHVzZXIgaXMgZm9yYmlkZGVuIGZyb20gYWNjZXNzaW5nIGEgcmVzb3VyY2VcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gYXV0aGVudGljYXRlZCB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHJlc291cmNlIG9yIHBlcmZvcm0gYW4gYWN0aW9uIHRoZXkgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGZvclxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGb3JiaWRkZW5FcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgdGhyb3dpbmcgYSBGb3JiaWRkZW5FcnJvclxuICogaWYgKCF1c2VyLmhhc1Blcm1pc3Npb24oJ2FkbWluJykpIHtcbiAqICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdVc2VyIGRvZXMgbm90IGhhdmUgYWRtaW4gcGVybWlzc2lvbnMnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBBdXRob3JpemF0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yLCBuYW1lID0gRm9yYmlkZGVuRXJyb3IubmFtZSkge1xuICAgIHN1cGVyKG1zZywgbmFtZSwgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2aWNlIGZhaWxzXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBhcHBsaWNhdGlvbiBmYWlscyB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVxdWlyZWQgc2VydmljZSBvciByZXNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBDb25uZWN0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgQ29ubmVjdGlvbkVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBkYXRhYmFzZS5jb25uZWN0KCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byBkYXRhYmFzZScpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29ubmVjdGlvbkVycm9yLm5hbWUsIDUwMyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBPYnNlcnZlckZpbHRlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIG9ic2VydmVycyBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gKiBAc3VtbWFyeSBUaGUgT2JzZXJ2ZXJIYW5kbGVyIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGNlbnRyYWxpemVkXG4gKiB3YXkgdG8gbWFuYWdlIG11bHRpcGxlIG9ic2VydmVycy4gSXQgYWxsb3dzIHJlZ2lzdGVyaW5nIG9ic2VydmVycyB3aXRoIG9wdGlvbmFsIGZpbHRlcnMgdG8gY29udHJvbFxuICogd2hpY2ggZXZlbnRzIHRoZXkgcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvciwgYW5kIGhhbmRsZXMgdGhlIHByb2Nlc3Mgb2Ygbm90aWZ5aW5nIGFsbCByZWxldmFudFxuICogb2JzZXJ2ZXJzIHdoZW4gZGF0YWJhc2UgZXZlbnRzIG9jY3VyLlxuICogQGNsYXNzIE9ic2VydmVySGFuZGxlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhbiBvYnNlcnZlciBoYW5kbGVyXG4gKiBjb25zdCBoYW5kbGVyID0gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyXG4gKiBjb25zdCBteU9ic2VydmVyID0ge1xuICogICByZWZyZXNoOiBhc3luYyAodGFibGUsIGV2ZW50LCBpZCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGBDaGFuZ2UgaW4gJHt0YWJsZX06ICR7ZXZlbnR9IGZvciBJRCAke2lkfWApO1xuICogICB9XG4gKiB9O1xuICpcbiAqIC8vIEFkZCBvYnNlcnZlciB3aXRoIGEgZmlsdGVyIGZvciBvbmx5IHVzZXIgdGFibGUgZXZlbnRzXG4gKiBoYW5kbGVyLm9ic2VydmUobXlPYnNlcnZlciwgKHRhYmxlLCBldmVudCwgaWQpID0+IHRhYmxlID09PSAndXNlcnMnKTtcbiAqXG4gKiAvLyBOb3RpZnkgb2JzZXJ2ZXJzIGFib3V0IGFuIGV2ZW50XG4gKiBhd2FpdCBoYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhsb2dnZXIsICd1c2VycycsICdDUkVBVEUnLCAxMjMpO1xuICpcbiAqIC8vIFJlbW92ZSBhbiBvYnNlcnZlciB3aGVuIG5vIGxvbmdlciBuZWVkZWRcbiAqIGhhbmRsZXIudW5PYnNlcnZlKG15T2JzZXJ2ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNlcnZlckhhbmRsZXIgaW1wbGVtZW50cyBPYnNlcnZhYmxlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG9ic2VydmVyIG9iamVjdHMgYWxvbmcgd2l0aCB0aGVpciBvcHRpb25hbCBmaWx0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJzOiB7XG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyO1xuICAgIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyO1xuICB9W10gPSBbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjb3VudCBvZiBvYnNlcnZlcnMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGhhbmRsZXJcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqL1xuICBjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBuZXcgb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byB0aGUgY29sbGVjdGlvbiB3aXRoIGFuIG9wdGlvbmFsIGZpbHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5tYXAoKG8pID0+IG8ub2JzZXJ2ZXIpLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiT2JzZXJ2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goeyBvYnNlcnZlcjogb2JzZXJ2ZXIsIGZpbHRlcjogZmlsdGVyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIGZyb20gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byBmaW5kIE9ic2VydmVyXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCByZWxldmFudCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG9ic2VydmVycyBiYXNlZCBvbiB0aGVpciBmaWx0ZXIgZnVuY3Rpb25zIGFuZCBjYWxscyByZWZyZXNoIG9uIGVhY2ggbWF0Y2hpbmcgb2JzZXJ2ZXJcbiAgICogQHBhcmFtIHtMb2dnZXJ9IGxvZyAtIExvZ2dlciBmb3IgcmVjb3JkaW5nIG5vdGlmaWNhdGlvbiBhY3Rpdml0aWVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlckhhbmRsZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlclxuICAgKlxuICAgKiAgIENsaWVudC0+Pk9ic2VydmVySGFuZGxlcjogdXBkYXRlT2JzZXJ2ZXJzKGxvZywgdGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IEZpbHRlciBvYnNlcnZlcnNcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIG9ic2VydmVyIHdpdGggbWF0Y2hpbmcgZmlsdGVyXG4gICAqICAgICBhbHQgT2JzZXJ2ZXIgaGFzIGZpbHRlclxuICAgKiAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogQXBwbHkgZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpXG4gICAqICAgICAgIGFsdCBGaWx0ZXIgdGhyb3dzIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgdHJ1ZVxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgZmFsc2VcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBObyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IHJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVySGFuZGxlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgIGFsdCBSZXN1bHQgaXMgcmVqZWN0ZWRcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0tPj5DbGllbnQ6IFJldHVyblxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIGxvZzogTG9nZ2VyLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aGlzLm9ic2VydmVyc1xuICAgICAgICAuZmlsdGVyKChvKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXIgfSA9IG87XG4gICAgICAgICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBmaWx0ZXIgb2JzZXJ2ZXIgJHtvLm9ic2VydmVyLnRvU3RyaW5nKCl9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKG8pID0+IHtcbiAgICAgICAgICBvLm9ic2VydmVyLnJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXS50b1N0cmluZygpfTogJHtyZXN1bHQucmVhc29ufWBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbCBieSBjaGVja2luZyBtZXRhZGF0YSBvciBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbnN0cnVjdG9yIG5hbWVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3RvciB0byBnZXQgdGhlIHRhYmxlIG5hbWUgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWxcbiAqIEBmdW5jdGlvbiBnZXRUYWJsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZyB7XG4gIGNvbnN0IG9iaiA9IG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsO1xuXG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLFxuICAgIG9ialtNb2RlbEtleXMuQU5DSE9SIGFzIHVua25vd24gYXMga2V5b2YgdHlwZW9mIG9ial0gfHwgb2JqXG4gICk7XG4gIGlmIChtZXRhZGF0YSkge1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgIHJldHVybiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIHJldHVybiBtb2RlbC5uYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgYXR0cmlidXRlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICBtb2RlbCxcbiAgICBhdHRyaWJ1dGVcbiAgKTtcbiAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEgOiBhdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgc2VxdWVuY2UgbmFtZSBieSBjb21iaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBuYW1lIGZvclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFyZ3MgLSBBZGRpdGlvbmFsIHN0cmluZyBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRoZSBzZXF1ZW5jZSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgbmFtZVxuICogQGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgcmV0dXJuIFtnZXRUYWJsZU5hbWUobW9kZWwpLCAuLi5hcmdzXS5qb2luKFwiX1wiKTtcbn1cbiIsImltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBDb250ZXh0LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHR1YWwsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWxUb1RyYW5zaWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBoYXNoT2JqLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgTW9kZWxSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1Jhd0V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBFcnJvclBhcnNlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50SWRzLCB0eXBlIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWUsIGdldFRhYmxlTmFtZSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSBhcyBSZXBvIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyRGlzcGF0Y2ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5EZWNvcmF0aW9uLnNldEZsYXZvdXJSZXNvbHZlcigob2JqOiBvYmplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgQWRhcHRlci5mbGF2b3VyT2YoTW9kZWwuaXNNb2RlbChvYmopID8gb2JqLmNvbnN0cnVjdG9yIDogKG9iaiBhcyBhbnkpKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fFxuICAgICAgRGVmYXVsdEZsYXZvdXJcbiAgICApO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyIHx8IERlZmF1bHRGbGF2b3VyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxufSk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEZhY2FkZSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UgYWRhcHRlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgZGF0YWJhc2UgYWRhcHRlcnMgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLiBUaGlzIGNsYXNzXG4gKiBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBwcm92aWRlIGEgY29uc2lzdGVudCBBUEkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMsIG9ic2VydmVyXG4gKiBwYXR0ZXJuIHN1cHBvcnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSXQgbWFuYWdlcyBhZGFwdGVyIHJlZ2lzdHJhdGlvbiwgQ1JVRCBvcGVyYXRpb25zLCBhbmRcbiAqIG9ic2VydmVyIG5vdGlmaWNhdGlvbnMuXG4gKiBAdGVtcGxhdGUgQ09ORklHIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHRlbXBsYXRlIFFVRVJZIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDT05URVhUIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDT05GSUd9IF9jb25maWcgLSBUaGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtfYWxpYXNdIC0gT3B0aW9uYWwgYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhpcyBhZGFwdGVyXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEltcGxlbWVudGluZyBhIGNvbmNyZXRlIGFkYXB0ZXJcbiAqIGNsYXNzIFBvc3RncmVzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8cGcuUG9vbENvbmZpZywgcGcuUXVlcnksIFBvc3RncmVzRmxhZ3MsIFBvc3RncmVzQ29udGV4dD4ge1xuICogICBjb25zdHJ1Y3RvcihjbGllbnQ6IHBnLlBvb2xDb25maWcpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBDT05GLFxuICAgIENPTk4sXG4gICAgUVVFUlksXG4gICAgRkxBR1MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQ09OVEVYVCBleHRlbmRzIENvbnRleHQ8RkxBR1M+ID0gQ29udGV4dDxGTEFHUz4sXG4gID5cbiAgZXh0ZW5kcyBMb2dnZWRDbGFzc1xuICBpbXBsZW1lbnRzXG4gICAgUmF3RXhlY3V0b3I8UVVFUlk+LFxuICAgIENvbnRleHR1YWw8RkxBR1MsIENPTlRFWFQ+LFxuICAgIE9ic2VydmFibGUsXG4gICAgT2JzZXJ2ZXIsXG4gICAgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+ID0ge307XG4gIHByaXZhdGUgc3RhdGljIF9iYXNlUmVwb3NpdG9yeTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxhbnksIGFueSwgYW55LCBhbnksIGFueT5cbiAgPjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VEaXNwYXRjaDogQ29uc3RydWN0b3I8RGlzcGF0Y2g+O1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IEFkYXB0ZXJEaXNwYXRjaDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByb3RlY3RlZCBfY2xpZW50PzogQ09OTjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBjb25maWdcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTkZcbiAgICogQHJldHVybiB7Q09ORn0gVGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gICAqL1xuICBnZXQgY29uZmlnKCk6IENPTkYge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIncyBhbGlhcyBvciBmbGF2b3IgbmFtZVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBhbGlhcyBpZiBzZXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBmbGF2b3IgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyJ3MgaWRlbnRpZmllclxuICAgKi9cbiAgZ2V0IGFsaWFzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWFzIHx8IHRoaXMuZmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBhZGFwdGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBRVUVSWSwgQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+LCBGTEFHUywgQ09OVEVYVD4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8XG4gICAgICBNLFxuICAgICAgUVVFUlksXG4gICAgICBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4sXG4gICAgICBGTEFHUyxcbiAgICAgIENPTlRFWFRcbiAgICA+XG4gID4ge1xuICAgIGlmICghQWRhcHRlci5fYmFzZVJlcG9zaXRvcnkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2hlbiBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlcGxhY2VkIGxhemlseWBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2Jhc2VSZXBvc2l0b3J5O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIHNodXRkb3duUHJveGllcyhrPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHJldHVybjtcbiAgICBpZiAoayAmJiAhKGsgaW4gdGhpcy5wcm94aWVzKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBwcm94eSBmb3VuZCBmb3IgJHtrfWApO1xuICAgIGlmICghaykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wcm94aWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tleV0uc2h1dGRvd24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a2V5fTogJHtlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tdLnNodXRkb3duKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba107XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a306ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHRhc2tzLCBzdWNoIGFzIGNsb3NpbmcgY29ubmVjdGlvbnNcbiAgICogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBlbnN1cmUgdG8gY2FsbCB0aGUgYmFzZSBtZXRob2QgZmlyc3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzaHV0ZG93biBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zaHV0ZG93blByb3hpZXMoKTtcbiAgICBpZiAodGhpcy5kaXNwYXRjaCkgYXdhaXQgdGhpcy5kaXNwYXRjaC5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgd2l0aCB0aGUgbmF0aXZlIGRyaXZlciBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBhZGFwdGVyIGNhY2hlXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDT05GLFxuICAgIHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh0aGlzLmFsaWFzIGluIEFkYXB0ZXIuX2NhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgJHt0aGlzLl9hbGlhcyA/IGAoJHt0aGlzLmZsYXZvdXJ9KSBgIDogXCJcIn0gYWxyZWFkeSByZWdpc3RlcmVkYFxuICAgICAgKTtcbiAgICBBZGFwdGVyLl9jYWNoZVt0aGlzLmFsaWFzXSA9IHRoaXM7XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBDcmVhdGVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBwZXJzaXN0ZW5jZSBhZGFwdGVyYFxuICAgICk7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgRGVmaW5lZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgYXMgY3VycmVudGApO1xuICAgICAgQWRhcHRlci5fY3VycmVudEZsYXZvdXIgPSB0aGlzLmFsaWFzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgc3RhdGVtZW50IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgcXVlcmllcyBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1N0YXRlbWVudH0gQSBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgdGhlIG1vZGVsXG4gICAqL1xuICBhYnN0cmFjdCBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBTdGF0ZW1lbnQ8UVVFUlksIE0sIGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGRpc3BhdGNoIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7RGlzcGF0Y2h9IEEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgRGlzcGF0Y2goKTogRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgQWRhcHRlci5fYmFzZURpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gb2JzZXJ2ZXIgaGFuZGxlciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhYXR0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgZGF0YWJhc2UgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBkYXRhYmFzZS1zcGVjaWZpYyBlcnJvcnMgaW50byBzdGFuZGFyZGl6ZWQgYXBwbGljYXRpb24gZXJyb3JzXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBvcmlnaW5hbCBkYXRhYmFzZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IEEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqL1xuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgYWRhcHRlciwgc3VjaCBhcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvciBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHJlcG9zaXRvcnkgZmxhZ3MgZm9yIGFuIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBzZXQgb2YgZmxhZ3MgdGhhdCBkZXNjcmliZSBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgY29tYmluaW5nIGRlZmF1bHQgZmxhZ3Mgd2l0aCBvdmVycmlkZXNcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBGbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Rj59IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8RkxBR1M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZMQUdTPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogZ2V0VGFibGVOYW1lKG1vZGVsKSxcbiAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgIH0pIGFzIEZMQUdTO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIENvbnRleHQgPSBDb250ZXh0PEZMQUdTPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb250ZXh0IGZvciBhIGRhdGFiYXNlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBjb250ZXh0IG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgdXNlZCBmb3IgdHJhY2tpbmcgYW5kIGF1ZGl0aW5nXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5DUkVBVEV8T3BlcmF0aW9uS2V5cy5SRUFEfE9wZXJhdGlvbktleXMuVVBEQVRFfE9wZXJhdGlvbktleXMuREVMRVRFfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBvdmVycmlkZXMgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZXh0IG9iamVjdFxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGTEFHUz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Q09OVEVYVD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsLm5hbWV9IG1vZGVsIHdpdGggZmxhZyBvdmVycmlkZXM6ICR7SlNPTi5zdHJpbmdpZnkob3ZlcnJpZGVzKX1gXG4gICAgKTtcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgb3ZlcnJpZGVzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoZmxhZ3MpIGFzIHVua25vd24gYXMgQ09OVEVYVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gbW9kZWxUb1RyYW5zaWVudChtb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoc3BsaXQubW9kZWwpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGFjY3VtO1xuICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gZ2V0Q29sdW1uTmFtZShtb2RlbCwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IG1vZGVsW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBkYXRhYmFzZSBkYXRhIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gZGF0YWJhc2UgZGF0YSwgaGFuZGxpbmcgY29sdW1uIG1hcHBpbmdcbiAgICogYW5kIHJlYXR0YWNoaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIG9iaiAtIFRoZSBkYXRhYmFzZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNsYXNzIG9yIG5hbWVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHBhcmFtIFt0cmFuc2llbnRdIC0gVHJhbnNpZW50IHByb3BlcnRpZXMgdG8gcmVhdHRhY2hcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IE0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG9ialtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gcGspIHJldHVybiBhY2N1bTtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gb2JqW2dldENvbHVtbk5hbWUoYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuXG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHJlc3VsdClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfTogJHttZXRhZGF0YX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIGZvciB0aGUgbmV3IHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0IGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMucmVhZCh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIGFuIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgbXVsdGlwbGUgZXhpc3RpbmcgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBbGxvd3MgZXhlY3V0aW5nIGRhdGFiYXNlLXNwZWNpZmljIHF1ZXJpZXMgZGlyZWN0bHlcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcmF3IHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UX0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRVUVSWSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciBkYXRhYmFzZSBldmVudHNcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byBiZSBub3RpZmllZCBhYm91dCBkYXRhYmFzZSBjaGFuZ2VzLiBUaGUgb2JzZXJ2ZXIgY2FuIG9wdGlvbmFsbHlcbiAgICogcHJvdmlkZSBhIGZpbHRlciBmdW5jdGlvbiB0byByZWNlaXZlIG9ubHkgc3BlY2lmaWMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlciEub2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm9ic2VydmUpXG4gICAgICAudmVyYm9zZShgUmVnaXN0ZXJpbmcgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgICBpZiAoIXRoaXMuZGlzcGF0Y2gpIHtcbiAgICAgIHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpLmluZm8oYENyZWF0aW5nIGRpc3BhdGNoIGZvciAke3RoaXMuYWxpYXN9YCk7XG4gICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5EaXNwYXRjaCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaC5vYnNlcnZlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvYnNlcnZlciBzbyBpdCBubyBsb25nZXIgcmVjZWl2ZXMgZGF0YWJhc2UgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBTZW5kcyBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2UsXG4gICAqIGZpbHRlcmluZyBiYXNlZCBvbiBlYWNoIG9ic2VydmVyJ3MgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgYWRhcHRlciAke3RoaXMuYWxpYXN9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGhpcy5sb2csXG4gICAgICB0YWJsZSxcbiAgICAgIGV2ZW50LFxuICAgICAgaWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIGRhdGEgYmFzZWQgb24gYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byB1cGRhdGVPYnNlcnZlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyByZWxhdGVkIHRvIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyByZWZyZXNoKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqL1xuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBBZGFwdGVyYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBmbGF2b3IgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIGZsYXZvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNsYXNzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlciBmbGF2b3IgbmFtZVxuICAgKi9cbiAgc3RhdGljIGZsYXZvdXJPZjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEodGhpcy5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIHRoaXMuY3VycmVudD8uZmxhdm91clxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGN1cnJlbnRGbGF2b3VyKCkge1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudEZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHBlcnNpc3RlbmNlIGZsYXZvdXIgc2V0LiBQbGVhc2UgaW5pdGlhbGl6ZSB5b3VyIGFkYXB0ZXJgXG4gICAgICApO1xuICAgIHJldHVybiBBZGFwdGVyLl9jdXJyZW50Rmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIHRoYXQgaXMgY3VycmVudGx5IHNldCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJuIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IFRoZSBjdXJyZW50IGFkYXB0ZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgY3VycmVudCgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLmN1cnJlbnRGbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBhZGFwdGVyIGJ5IGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIGFkYXB0ZXIgYnkgaXRzIGZsYXZvciBuYW1lXG4gICAqIEB0ZW1wbGF0ZSBDT05GIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTk4gLSBUaGUgZGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlXG4gICAqIEB0ZW1wbGF0ZSBRVUVSWSAtIFRoZSBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBDQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHRlbXBsYXRlIEZMQUdTIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBDT05URVhULCBGTEFHUz4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8XG4gICAgQ09ORixcbiAgICBDT05OLFxuICAgIFFVRVJZLFxuICAgIENPTlRFWFQgZXh0ZW5kcyBDb250ZXh0PEZMQUdTPixcbiAgICBGTEFHUyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihmbGF2b3VyPzogYW55KTogQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZsYXZvdXIpIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLl9jdXJyZW50Rmxhdm91cik7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXTtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gQWRhcHRlciByZWdpc3RlcmVkIHVuZGVyICR7Zmxhdm91cn0uYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENoYW5nZXMgd2hpY2ggYWRhcHRlciBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHNldCBhcyBjdXJyZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50Rmxhdm91ciA9IGZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc3RhbmRhcmRpemVkIG1ldGFkYXRhIGtleSBmb3IgcGVyc2lzdGVuY2UtcmVsYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBSZXBvLmtleShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBtb2RlbHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gdXNlIGEgc3BlY2lmaWMgYWRhcHRlciBmbGF2b3JcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBhZGFwdGVyIGZsYXZvciB0byBmaW5kIG1vZGVscyBmb3JcbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHN0YXRpYyBtb2RlbHM8TSBleHRlbmRzIE1vZGVsPihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSAoTW9kZWwgYXMgYW55KS5nZXRSZWdpc3RyeSgpIGFzIE1vZGVsUmVnaXN0cnk8YW55PjtcbiAgICAgIGNvbnN0IGNhY2hlID0gKFxuICAgICAgICByZWdpc3RyeSBhcyB1bmtub3duIGFzIHsgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8YW55Pj4gfVxuICAgICAgKS5jYWNoZTtcbiAgICAgIGNvbnN0IG1hbmFnZWRNb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gT2JqZWN0LnZhbHVlcyhjYWNoZSlcbiAgICAgICAgLm1hcCgobTogTW9kZWxDb25zdHJ1Y3RvcjxNPikgPT4ge1xuICAgICAgICAgIGxldCBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZiAmJiBmID09PSBmbGF2b3VyKSByZXR1cm4gbTtcbiAgICAgICAgICBpZiAoIWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG8gPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBSZXBvLmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXBvKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gKHRoaXMuX2Jhc2VSZXBvc2l0b3J5IGFzIGFueSkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgcHJveGllcz86IFJlY29yZDxzdHJpbmcsIHR5cGVvZiB0aGlzPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byByZXR1cm4gdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDT04gLSBUaGUgdHlwZSBvZiB0aGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0NPTn0gVGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBmdW5jdGlvbiBnZXRDbGllbnRcbiAgICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q2xpZW50KCk6IENPTk47XG5cbiAgQGZpbmFsKClcbiAgZ2V0IGNsaWVudCgpOiBDT05OIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxDT05GPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgbGV0IGNsaWVudDogYW55O1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IENPTkYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnksIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgY2xpZW50ID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm94aWVzW2tleV0gPSBwcm94eTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHNvcnQgZGlyZWN0aW9ucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBzb3J0IGRpcmVjdGlvbnMgZm9yIG9yZGVyaW5nIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gT3JkZXJEaXJlY3Rpb24ge1xuICAvKiogQXNjZW5kaW5nIG9yZGVyIChBIHRvIFosIDAgdG8gOSkgKi9cbiAgQVNDID0gXCJhc2NcIixcblxuICAvKiogRGVzY2VuZGluZyBvcmRlciAoWiB0byBBLCA5IHRvIDApICovXG4gIERTQyA9IFwiZGVzY1wiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBjYXNjYWRlIG9wZXJhdGlvbiB0eXBlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBjYXNjYWRlIGJlaGF2aW9ycyBmb3IgZW50aXR5IHJlbGF0aW9uc2hpcHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gQ2FzY2FkZSB7XG4gIC8qKiBQZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgQ0FTQ0FERSA9IFwiY2FzY2FkZVwiLFxuICAvKiogRG8gbm90IHBlcmZvcm0gY2FzY2FkZSBvcGVyYXRpb24gb24gcmVsYXRlZCBlbnRpdGllcyAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBkZWZhdWx0IGNhc2NhZGUgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBpbiByZXBvc2l0b3JpZXMuXG4gKiBAc3VtbWFyeSBEb2N1bWVudHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FzY2FkZSBjb25maWd1cmF0aW9uIHdpdGggZXhwbGljaXQgdXBkYXRlIGFuZCBkZWxldGUgYmVoYXZpb3JzLlxuICogQHByb3BlcnR5IHsnY2FzY2FkZSd8J25vbmUnfSB1cGRhdGUgLSBEZXRlcm1pbmVzIHdoZXRoZXIgdXBkYXRlcyBjYXNjYWRlIHRvIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiBAcHJvcGVydHkgeydjYXNjYWRlJ3wnbm9uZSd9IGRlbGV0ZSAtIERldGVybWluZXMgd2hldGhlciBkZWxldGVzIGNhc2NhZGUgdG8gcmVsYXRlZCBlbnRpdGllcy5cbiAqIEB0eXBlRGVmIERlZmF1bHRDYXNjYWRlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgYWRhcHRlci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBVbnN1cHBvcnRlZEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlcyAobGlrZSBwcmltYXJ5IGtleXMpIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci5cbiAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhbmRsZSB0aGUgc3BlY2lmaWNzIG9mIGhvdyBzZXF1ZW5jZXMgYXJlIHN0b3JlZCBhbmQgaW5jcmVtZW50ZWQgaW4gZGlmZmVyZW50XG4gKiBkYXRhYmFzZSBzeXN0ZW1zLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2VcbiAqIGNsYXNzIFBvc3RncmVzU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICogICAgIHN1cGVyKG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IG5leHQgdmFsdWUgZnJvbSBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLmV4ZWN1dG9yLnJhdyhgU0VMRUNUIG5leHR2YWwoJyR7dGhpcy5vcHRpb25zLm5hbWV9JylgKTtcbiAqICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LnJvd3NbMF0ubmV4dHZhbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgY3VycmVudCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgY3VycnZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5jdXJydmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgYSByYW5nZSBvZiB2YWx1ZXNcbiAqICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gKiAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gKiAgICAgICB2YWx1ZXMucHVzaChhd2FpdCB0aGlzLm5leHQoKSk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB2YWx1ZXM7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2FnZVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUG9zdGdyZXNTZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICd1c2VyX2lkX3NlcScsXG4gKiAgIGV4ZWN1dG9yOiBkYkV4ZWN1dG9yXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgTGF6aWx5IGluaXRpYWxpemVkIGxvZ2dlciBmb3IgdGhlIHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFjY2Vzc29yIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgb3IgaW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3RlY3RlZCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBzZXF1ZW5jZSwgaW5jcmVtZW50aW5nIGl0IGluIHRoZSBwcm9jZXNzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhYnN0cmFjdCBuZXh0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2Ugd2l0aG91dCBpbmNyZW1lbnRpbmcgaXRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBzZXF1ZW50aWFsIHZhbHVlcyBhdCBvbmNlLCB3aGljaCBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIG5leHQoKSBtdWx0aXBsZSB0aW1lc1xuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFic3RyYWN0IHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge018Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5XG4gICAqL1xuICBzdGF0aWMgcGs8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBzZXF1ZW5jZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSAoTnVtYmVyIG9yIEJpZ0ludClcbiAgICogQHBhcmFtIHtcIk51bWJlclwifFwiQmlnSW50XCJ8dW5kZWZpbmVkfSB0eXBlIC0gVGhlIHRhcmdldCB0eXBlIHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsdWUoXG4gICAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgc2VxdWVuY2UgdHlwZTogJHt0eXBlfSBmb3IgYWRhcHRlciAke3RoaXN9YFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIHF1ZXJ5IGNvbmRpdGlvbnNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgZm9yIGNvbXBhcmluZyB2YWx1ZXMgaW4gZGF0YWJhc2UgcXVlcmllc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9wZXJhdG9yIHtcbiAgLyoqIEVxdWFsIGNvbXBhcmlzb24gKD0pICovXG4gIEVRVUFMID0gXCJFUVVBTFwiLFxuICAvKiogTm90IGVxdWFsIGNvbXBhcmlzb24gKCE9KSAqL1xuICBESUZGRVJFTlQgPSBcIkRJRkZFUkVOVFwiLFxuICAvKiogR3JlYXRlciB0aGFuIGNvbXBhcmlzb24gKD4pICovXG4gIEJJR0dFUiA9IFwiQklHR0VSXCIsXG4gIC8qKiBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPj0pICovXG4gIEJJR0dFUl9FUSA9IFwiQklHR0VSX0VRXCIsXG4gIC8qKiBMZXNzIHRoYW4gY29tcGFyaXNvbiAoPCkgKi9cbiAgU01BTExFUiA9IFwiU01BTExFUlwiLFxuICAvKiogTGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKDw9KSAqL1xuICBTTUFMTEVSX0VRID0gXCJTTUFMTEVSX0VRXCIsXG4gIC8vIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgLyoqIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpICovXG4gIE5PVCA9IFwiTk9UXCIsXG4gIC8qKiBJbmNsdXNpb24gb3BlcmF0b3IgKElOKSAqL1xuICBJTiA9IFwiSU5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIC8qKiBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgKi9cbiAgUkVHRVhQID0gXCJSRUdFWFBcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9naWNhbCBvcGVyYXRvcnMgZm9yIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBncm91cGluZyBtdWx0aXBsZSBjb25kaXRpb25zIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBHcm91cE9wZXJhdG9yIHtcbiAgLyoqIExvZ2ljYWwgQU5EIG9wZXJhdG9yIC0gYWxsIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlICovXG4gIEFORCA9IFwiQU5EXCIsXG4gIC8qKiBMb2dpY2FsIE9SIG9wZXJhdG9yIC0gYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUgKi9cbiAgT1IgPSBcIk9SXCIsXG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biBkdXJpbmcgcXVlcnkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcXVlcnkgYnVpbGRpbmcgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBRdWVyeUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFF1ZXJ5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gZHVyaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcGFnaW5hdGlvbiBzZXR1cCBvciBleGVjdXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIFBhZ2luZ0Vycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdpbmdFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBQYWdpbmdFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGVPcHRpb24sIENvbmRpdGlvbkJ1aWxkZXJPcHRpb24gfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQge1xuICBDb25kaXRpb25hbEFzeW5jLFxuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG50eXBlIEluZmVyQXN5bmM8TT4gPSBNIGV4dGVuZHMgTW9kZWw8aW5mZXIgQT4gPyBBIDogZmFsc2U7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbmRpdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgQSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBxdWVyeSBjb25kaXRpb25zIHdpdGggc3VwcG9ydCBmb3IgY29tcGxleCBsb2dpY2FsIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGNsYXNzIGFsbG93cyBmb3IgYnVpbGRpbmcgYW5kIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zIHVzaW5nIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQsIE9SLCBOT1QpXG4gKiBhbmQgY29tcGFyaXNvbiBvcGVyYXRvcnMgKGVxdWFscywgbm90IGVxdWFscywgZ3JlYXRlciB0aGFuLCBldGMuKS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uZGl0aW9uPE0+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+fSBBIG5ldyBjb25kaXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgY29uZmlndXJlZCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZCgpOiBDb25kaXRpb248TT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5hdHRyMSBhcyBzdHJpbmcgfCBDb25kaXRpb248TT4sXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcixcbiAgICAgICAgICB0aGlzLmNvbXBhcmlzb24gYXMgYW55XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbmRpdGlvbiBidWlsZGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gYnVpbGRlciB3aWxsIG9wZXJhdGUgb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBidWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcjxNPigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yIGEgbW9kZWwgc2hvdWxkIHVzZVxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byBhIG1vZGVsIGNsYXNzIHRvIGluZGljYXRlIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yXG4gKiBzaG91bGQgYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGF0YWJhc2Ugb3BlcmF0aW9ucyBvbiBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiBUaGUgZmxhdm9yIGlzIGEgc3RyaW5nXG4gKiBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSByZWdpc3RlcmVkIGFkYXB0ZXIgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFkYXB0ZXIgZmxhdm9yIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBtb2RlbCBjbGFzc1xuICogQGZ1bmN0aW9uIHVzZXNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzKGZsYXZvdXI6IHN0cmluZykge1xuICByZXR1cm4gZnVuY3Rpb24gdXNlcyhvcmlnaW5hbDogYW55KSB7XG4gICAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgZmxhdm91cikpKFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBDb250ZXh0LFxuICBEQktleXMsXG4gIERlZmF1bHRTZXBhcmF0b3IsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB3cmFwTWV0aG9kV2l0aENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFdoZXJlT3B0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L29wdGlvbnNcIjtcbmltcG9ydCB7IE9yZGVyQnlTZWxlY3RvciwgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnkvc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lLCBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXZlbnRJZHMsXG4gIEluZmVycmVkQWRhcHRlckNvbmZpZyxcbiAgdHlwZSBPYnNlcnZlckZpbHRlcixcbn0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgYWxpYXMgZm9yIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBzaW1wbGlmaWVkIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbW9yZSBjb25jaXNlIHdheSB0byByZWZlcmVuY2UgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICogQHR5cGVkZWYgUmVwb1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcG88XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IGFueSxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBhbnksXG4gIFEgPSBhbnksXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBRLCBGLCBDPiA9IGFueSxcbj4gPSBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gbW9kZWxzIG9uIGEgdGFibGUgYnkgdGFibGUgd2F5LlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeWluZyBjYXBhYmlsaXRpZXMsIGFuZCBvYnNlcnZlciBwYXR0ZXJuIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbCBwZXJzaXN0ZW5jZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGZvciBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtBfSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVwb3NpdG9yeSBpbml0aWFsaXphdGlvbi5cbiAqIEBjbGFzcyBSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCB1c2VyUmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoVXNlcik7XG4gKlxuICogLy8gVXNpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdKb2huJyB9KSk7XG4gKiBjb25zdCByZXRyaWV2ZWRVc2VyID0gYXdhaXQgdXNlclJlcG8ucmVhZCh1c2VyLmlkKTtcbiAqIHVzZXIubmFtZSA9ICdKYW5lJztcbiAqIGF3YWl0IHVzZXJSZXBvLnVwZGF0ZSh1c2VyKTtcbiAqIGF3YWl0IHVzZXJSZXBvLmRlbGV0ZSh1c2VyLmlkKTtcbiAqXG4gKiAvLyBRdWVyeWluZyB3aXRoIGNvbmRpdGlvbnNcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgdXNlclJlcG9cbiAqICAgLnNlbGVjdCgpXG4gKiAgIC53aGVyZSh7IG5hbWU6ICdKYW5lJyB9KVxuICogICAub3JkZXJCeSgnY3JlYXRlZEF0JywgT3JkZXJEaXJlY3Rpb24uRFNDKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICpcbiAqICAgQy0+PitSOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5SOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFItPj4rQTogcHJlcGFyZShtb2RlbClcbiAqICAgQS0tPj4tUjogcHJlcGFyZWQgZGF0YVxuICogICBSLT4+K0E6IGNyZWF0ZSh0YWJsZSwgaWQsIHJlY29yZClcbiAqICAgQS0+PitEQjogSW5zZXJ0IE9wZXJhdGlvblxuICogICBEQi0tPj4tQTogUmVzdWx0XG4gKiAgIEEtLT4+LVI6IHJlY29yZFxuICogICBSLT4+K0E6IHJldmVydChyZWNvcmQpXG4gKiAgIEEtLT4+LVI6IG1vZGVsIGluc3RhbmNlXG4gKiAgIFItPj5SOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFItPj4rTzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBDUkVBVEUsIGlkKVxuICogICBPLS0+Pi1SOiBOb3RpZmljYXRpb24gY29tcGxldGVcbiAqICAgUi0tPj4tQzogY3JlYXRlZCBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeTxcbiAgICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gICAgUSxcbiAgICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgZXh0ZW5kcyBSZXA8TSwgRiwgQz5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUXVlcmlhYmxlPE0+LCBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQ29uc3RydWN0b3I8UmVwbzxNb2RlbD4+IHwgUmVwbzxNb2RlbD5cbiAgPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfb3ZlcnJpZGVzPzogUGFydGlhbDxGPjtcblxuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvZ2dlciBmb3IgdGhpcyByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcilcbiAgICAgIHRoaXMubG9nZ2VyID0gKFxuICAgICAgICB0aGlzLmFkYXB0ZXJbXCJsb2dcIiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5hZGFwdGVyXSBhcyBMb2dnZXJcbiAgICAgICkuZm9yKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICAgKiBAcmV0dXJuIHtBfSBUaGUgYWRhcHRlciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyBmb3VuZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUYWJsZSBuYW1lIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHByb3BlcnRpZXMgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBzZXF1ZW5jZSBvcHRpb25zIGNvbnRhaW5pbmcgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IHBrUHJvcHMoKTogU2VxdWVuY2VPcHRpb25zIHtcbiAgICByZXR1cm4gc3VwZXIucGtQcm9wcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHtcbiAgICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoY2xhenosIHRoaXMsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgY2xhenpcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZsYXZvdXIgJiYgZmxhdm91ciAhPT0gYWRhcHRlci5mbGF2b3VyKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSW5jb21wYXRpYmxlIGZsYXZvdXJzXCIpO1xuICAgICAgICB1c2VzKGFkYXB0ZXIuZmxhdm91cikoY2xhenopO1xuICAgICAgfVxuICAgIH1cbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgICAgbSxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm94eSB3aXRoIG92ZXJyaWRkZW4gcmVwb3NpdG9yeSBmbGFncy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgZmxhZ3Mgb3ZlcnJpZGRlbi5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIFRoZSBmbGFncyB0byBvdmVycmlkZS5cbiAgICogQHJldHVybiB7UmVwb3NpdG9yeX0gQSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBvdmVycmlkZGVuIGZsYWdzLlxuICAgKi9cbiAgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8Rj4pOiBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm92ZXJyaWRlKVxuICAgICAgLmRlYnVnKGBPdmVycmlkaW5nIHJlcG9zaXRvcnkgZmxhZ3Mgd2l0aCAke0pTT04uc3RyaW5naWZ5KGZsYWdzKX1gKTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKHAgIT09IFwiX292ZXJyaWRlc1wiKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0LCBmbGFncyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggYSBzcGVjaWZpYyBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHR5cGUgb2YgdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHRlbXBsYXRlIEMgLSBUaGUgdHlwZSBvZiB0aGUgY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj59IGNvbmYgLSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25zIHRvIG92ZXJyaWRlLlxuICAgKiBAcGFyYW0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYW5kIGFyZ3VtZW50cy5cbiAgICovXG4gIGZvcihcbiAgICBjb25mOiBQYXJ0aWFsPEluZmVycmVkQWRhcHRlckNvbmZpZzxBPj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcImFkYXB0ZXJcIikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZm9yKGNvbmYsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlci5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgcHJlcGFyZXMgaXQgZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZSB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICBsZXQgYzogQyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQztcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQb3N0LWNyZWF0aW9uIGhvb2suXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGFmdGVyIGEgbW9kZWwgaXMgY3JlYXRlZCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBjcmVhdGVkIG1vZGVsLlxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBwcm9jZXNzZWQgbW9kZWwuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlU3VmZml4KG1vZGVsLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgY3JlYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgICBjb25zdCBvcHRzID0gUmVwb3NpdG9yeS5nZXRTZXF1ZW5jZU9wdGlvbnMobW9kZWxzWzBdKTtcbiAgICBsZXQgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgaWYgKCFvcHRzLm5hbWUpIG9wdHMubmFtZSA9IFNlcXVlbmNlLnBrKG1vZGVsc1swXSk7XG4gICAgICBpZHMgPSBhd2FpdCAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKG9wdHMpKS5yYW5nZShtb2RlbHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bdGhpcy5wa10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgUHJpbWFyeSBrZXkgaXMgbm90IGRlZmluZWQgZm9yIG1vZGVsIGluIHBvc2l0aW9uICR7aX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1bdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgICAgIG1bdGhpcy5wa10gPSAob3B0cy50eXBlICE9PSAnU3RyaW5nJyA/IFxuICAgICAgICAgICAgaWRzW2ldIDogb3B0cy5nZW5lcmF0ZWQgPyBcbiAgICAgICAgICAgICAgaWRzW2ldIDogYCR7bVt0aGlzLnBrXX1gLnRvU3RyaW5nKCkpIGFzIE1ba2V5b2YgTV07XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBNW2tleW9mIE1dO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHVwZGF0ZWQgbW9kZWwgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBtdWx0aXBsZSBleGlzdGluZyBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIm1pc3NpbmcgaWQgb24gdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICBtID0gdGhpcy5tZXJnZShvbGRNb2RlbHNbaV0sIG0pO1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtLCAuLi5pZ25vcmVkUHJvcHMpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aG91dCBzcGVjaWZ5aW5nIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbGwgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBXaGVyZU9wdGlvbjxNLCBNW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRoIHNwZWNpZmljIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZHMuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNlbGVjdCBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwgd2l0aCBvcHRpb25hbCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIFtzZWxlY3Rvcl0gLSBPcHRpb25hbCBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgTVtdPiB8IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlclxuICAgICAgLlN0YXRlbWVudDxNPigpXG4gICAgICAuc2VsZWN0KHNlbGVjdG9yIGFzIHJlYWRvbmx5IFsuLi5TXSlcbiAgICAgIC5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb25zIGFuZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSB3aXRoIGNvbW1vbiBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBmaWx0ZXIgcmVjb3Jkcy5cbiAgICogQHBhcmFtIG9yZGVyQnkgLSBUaGUgZmllbGQgdG8gb3JkZXIgcmVzdWx0cyBieS5cbiAgICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyPU9yZGVyRGlyZWN0aW9uLkFTQ10gLSBUaGUgc29ydCBkaXJlY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gT3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBxdWVyeSByZXN1bHRzIGFzIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIG9yZGVyQnk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3I8TT4gPSBbb3JkZXJCeSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9XG5cbiAgYXR0cihwcm9wOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5hdHRyPE0+KHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBtb2RlbHMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgdG8gbGltaXQgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHRoaXMuYWRhcHRlci5vYnNlcnZlKHRoaXMsICh0YWJsZTogc3RyaW5nKSA9PiB0YWJsZU5hbWUgPT09IHRhYmxlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBub3cgb2JzZXJ2aW5nICR7dGhpcy5hZGFwdGVyfSBmaWx0ZXJpbmcgb24gdGFibGUgPT09ICR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIGxvZy52ZXJib3NlKGBSZWdpc3RlcmVkIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZyb20gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIHNvIGl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIG1vcmUgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgZm9yICR7dGhpcy5hZGFwdGVyfSwgdW5zdWJzY3JpYmluZ2BcbiAgICAgICk7XG4gICAgICB0aGlzLmFkYXB0ZXIudW5PYnNlcnZlKHRoaXMpO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgTm8gbG9uZ2VyIG9ic2VydmluZyBhZGFwdGVyICR7dGhpcy5hZGFwdGVyLmZsYXZvdXJ9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciAke3RoaXN9YFxuICAgICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBBcnJheS5pc0FycmF5KGlkKVxuICAgICAgICA/IGlkLm1hcCgoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaSkgYXMgc3RyaW5nKVxuICAgICAgICA6IChTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpZCkgYXMgc3RyaW5nKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50IChhbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFJlcG88TT4uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGRlZmF1bHQgYWRhcHRlciBmbGF2b3VyIGlmIG5vdCBzcGVjaWZpZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSfSBBIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmxhdm91ci5cbiAgICovXG4gIHN0YXRpYyBmb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWwsIFIgZXh0ZW5kcyBSZXBvPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFIgfCBDb25zdHJ1Y3RvcjxSPiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IF9hbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwsIF9hbGlhcykgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgZnJvbSB0aGUgY2FjaGUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsIGZyb20gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gVGhlIGFkYXB0ZXIgYWxpYXMuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPiB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggYSBtb2RlbCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IHJlcG8gLSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gdGhlIGFkYXB0ZXIgYWxpYXMvZmxhdm91ci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYSByZXBvc2l0b3J5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZShtb2RlbCwgYXR0cmlidXRlKTtcbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlUmVwb3NpdG9yeVwiXSA9IFJlcG9zaXRvcnk7XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHVuaXF1ZSBpbmplY3RhYmxlIG5hbWUgZm9yIGEgcmVwb3NpdG9yeS5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgcmVwb3NpdG9yaWVzIHVzaW5nIHRoZSBhZGFwdGVyIGZsYXZvdXIgYW5kIG1vZGVsIHRhYmxlIG5hbWUuXG4gKiBUaGlzIGhlbHBzIHRoZSBESSBzeXN0ZW0gcmVnaXN0ZXIgYW5kIHJlc29sdmUgcmVwb3NpdG9yeSBpbnN0YW5jZXMgY29uc2lzdGVudGx5IGFjcm9zcyBhZGFwdGVycy5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD4gfCBUfSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcy4gSWYgb21pdHRlZCwgaXQgaXMgcmVhZCBmcm9tIG1vZGVsIG1ldGFkYXRhLlxuICogQHJldHVybiB7c3RyaW5nfSBBIG5hbWVzcGFjZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgdGhlIHJlcG9zaXRvcnkgKGUuZy4sIFwiZGI6cmVwbzpyYW06dXNlcnNcIikuXG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgZmxhdm91ciBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGFyZ3VtZW50cyBvciBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBVIGFzIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdCBNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTdHJpbmcgRm9ybWF0dGVyXG4gKiAgIEMtPj5VOiBjYWxsKG1vZGVsLCBmbGF2b3VyPylcbiAqICAgYWx0IGZsYXZvdXIgcHJvdmlkZWRcbiAqICAgICBVLS0+PlU6IHVzZSBwcm92aWRlZCBmbGF2b3VyXG4gKiAgIGVsc2UgZmxhdm91ciBub3QgcHJvdmlkZWRcbiAqICAgICBVLT4+QTogQWRhcHRlci5rZXkoQURBUFRFUilcbiAqICAgICBVLT4+UjogZ2V0TWV0YWRhdGEoa2V5LCBtb2RlbHxtb2RlbC5jdG9yKVxuICogICAgIGFsdCBtZXRhZGF0YSBwcmVzZW50XG4gKiAgICAgICBSLS0+PlU6IGZsYXZvdXJcbiAqICAgICBlbHNlIG1pc3NpbmdcbiAqICAgICAgIFUtLT4+QzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgVS0+PlM6IHNmKElOSkVDVEFCTEUsIGZsYXZvdXIsIFJlcG9zaXRvcnkudGFibGUobW9kZWwpKVxuICogICBTLS0+PkM6IHRva2VuIHN0cmluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4gfCBULFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoIWZsYXZvdXIpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBrZXksXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICAgICk7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV0cmlldmUgZmxhdm91ciBmcm9tIG1vZGVsICR7bW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgOiBtb2RlbC5uYW1lfWBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuIHNmKFBlcnNpc3RlbmNlS2V5cy5JTkpFQ1RBQkxFLCBmbGF2b3VyLCBnZXRUYWJsZU5hbWUobW9kZWwpKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgaW5qZWN0YWJsZSByZXBvc2l0b3JpZXMgd2l0aCBhdXRvLXJlc29sdXRpb24uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhbiBJbmplY3RhYmxlUmVnaXN0cnkgaW1wbGVtZW50YXRpb24gdGhhdCByZXNvbHZlcyByZXBvc2l0b3JpZXMgYnkgbW9kZWwgbmFtZSBvciBjb25zdHJ1Y3Rvci4gSWYgYSByZXBvc2l0b3J5XG4gKiBpcyBub3QgZXhwbGljaXRseSByZWdpc3RlcmVkLCBpdCBhdHRlbXB0cyB0byBpbmZlciB0aGUgY29ycmVjdCByZXBvc2l0b3J5IHVzaW5nIG1vZGVsIG1ldGFkYXRhIGFuZCB0aGUgYWN0aXZlIG9yIHNwZWNpZmllZCBhZGFwdGVyIGZsYXZvdXIuXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVycyByZXF1aXJlZDsgdGhlIHN1cGVyY2xhc3MgaGFuZGxlcyBpbnRlcm5hbCBzdGF0ZS5cbiAqIEBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2U6IHJldHJpZXZlIGEgcmVwb3NpdG9yeSBieSBtb2RlbCBuYW1lXG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCk7XG4gKiBjb25zdCB1c2VyUmVwbyA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oJ1VzZXInKTtcbiAqIC8vIElmIFVzZXJSZXBvc2l0b3J5IGlzIHJlZ2lzdGVyZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZCBpZiBhIFVzZXIgbW9kZWwgZXhpc3RzLlxuICpcbiAqIC8vIFJldHJpZXZlIGJ5IGNvbnN0cnVjdG9yIGFuZCBzcGVjaWZ5IGFkYXB0ZXIgZmxhdm91clxuICogY29uc3QgcmVwb0J5Q3RvciA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oVXNlck1vZGVsLCAncmFtJyk7XG4gKlxuICogLy8gUmV0cmlldmUgYnkgc3ltYm9sIChlLmcuLCBpbmplY3RhYmxlIHRva2VuKVxuICogY29uc3QgdG9rZW4gPSBTeW1ib2wuZm9yKCdVc2VyUmVwb3NpdG9yeScpO1xuICogY29uc3QgYnlUb2tlbiA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4odG9rZW4pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnN1bWVyXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBCIGFzIEJhc2VSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gKiAgIEMtPj5SOiBnZXQobmFtZSwgZmxhdm91cj8pXG4gKiAgIGFjdGl2YXRlIFJcbiAqICAgUi0+PkI6IHN1cGVyLmdldChuYW1lKVxuICogICBhbHQgRm91bmQgaW4gYmFzZSByZWdpc3RyeVxuICogICAgIEItLT4+UjogaW5qZWN0YWJsZVxuICogICAgIFItLT4+QzogaW5qZWN0YWJsZVxuICogICBlbHNlIE5vdCBmb3VuZFxuICogICAgIFItPj5NOiBNb2RlbC5nZXQobmFtZSlcbiAqICAgICBhbHQgTW9kZWwgZm91bmRcbiAqICAgICAgIFItPj5BOiByZXNvbHZlIGZsYXZvdXIgKGZyb20gYXJnL21ldGFkYXRhL2N1cnJlbnQpXG4gKiAgICAgICBSLT4+UlA6IFJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWxDdG9yLCBhbGlhcylcbiAqICAgICAgIGFsdCBSZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICAgIFJQLS0+PlI6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbHNlIFJlcG9zaXRvcnkgY3RvclxuICogICAgICAgICBSLT4+QTogQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBvciBBZGFwdGVyLmN1cnJlbnRcbiAqICAgICAgICAgQS0tPj5SOiBhZGFwdGVyIGluc3RhbmNlXG4gKiAgICAgICAgIFItPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbmRcbiAqICAgICBlbHNlIE1vZGVsIG5vdCBmb3VuZFxuICogICAgICAgUi0tPj5DOiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5IGV4dGVuZHMgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIHtcbiAgcHJpdmF0ZSBsb2dnZXI/OiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhbiBpbmplY3RhYmxlIHdpdGggcmVwb3NpdG9yeSBhdXRvLXJlc29sdXRpb24uXG4gICAqIEBzdW1tYXJ5IEF0dGVtcHRzIHRvIGdldCBhbiBpbmplY3RhYmxlIGZyb20gdGhlIGJhc2UgcmVnaXN0cnk7IGlmIG5vdCBmb3VuZCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEga25vd24gbW9kZWwsIGl0XG4gICAqIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSByZXBvc2l0b3J5IHVzaW5nIHRoZSBzcGVjaWZpZWQgZmxhdm91ciBvciBtb2RlbCBtZXRhZGF0YSwgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50IGFkYXB0ZXIgd2hlbiBuZWVkZWQuXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSBpbmplY3RhYmxlIHR5cGUgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3I8VD59IG5hbWUgVG9rZW4sIG1vZGVsIG5hbWUsIG9yIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5qZWN0YWJsZSBvciBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIgKGUuZy4sIFwicmFtXCIpLiBJZiBvbWl0dGVkLCBkZXJpdmVzIGZyb20gbWV0YWRhdGEgb3IgY3VycmVudCBhZGFwdGVyLlxuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfSBUaGUgbG9jYXRlZCBvciBhdXRvLWNyZWF0ZWQgaW5qZWN0YWJsZSBpbnN0YW5jZTsgb3RoZXJ3aXNlIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgZ2V0KG5hbWUsIGZsYXZvdXI/KVxuICAgKiAgIHBhcnRpY2lwYW50IEJSIGFzIEJhc2VSZWdpc3RyeVxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gICAqICAgRy0+PkJSOiBzdXBlci5nZXQobmFtZSlcbiAgICogICBhbHQgRm91bmRcbiAgICogICAgIEJSLS0+Pkc6IGluamVjdGFibGVcbiAgICogICBlbHNlIE5vdCBmb3VuZFxuICAgKiAgICAgRy0+Pk06IGRlcml2ZSBtb2RlbEN0b3IgZnJvbSBuYW1lXG4gICAqICAgICBhbHQgbW9kZWxDdG9yIHJlc29sdmVkXG4gICAqICAgICAgIEctPj5BOiByZXNvbHZlIGZsYXZvdXIgKGFyZyB8IG1ldGFkYXRhIHwgY3VycmVudClcbiAgICogICAgICAgRy0+PlJQOiBSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsQ3RvciwgYWxpYXMpXG4gICAqICAgICAgIGFsdCByZXR1cm5zIGluc3RhbmNlXG4gICAqICAgICAgICAgUlAtLT4+RzogUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgKiAgICAgICBlbHNlIHJldHVybnMgY3RvclxuICAgKiAgICAgICAgIEctPj5BOiBBZGFwdGVyLmdldChmbGF2b3VyKSB8IEFkYXB0ZXIuY3VycmVudFxuICAgKiAgICAgICAgIEEtLT4+RzogYWRhcHRlciBpbnN0YW5jZVxuICAgKiAgICAgICAgIEctPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIG5vIG1vZGVsQ3RvclxuICAgKiAgICAgICBHLS0+Pkc6IHJldHVybiB1bmRlZmluZWRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IENvbnN0cnVjdG9yPFQ+IHwgc3RyaW5nLFxuICAgIGZsYXZvdXI/OiBzdHJpbmdcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0KTtcbiAgICAvLyBGaXJzdCwgdHJ5IGJhc2UgcmVnaXN0cnksIGJ1dCBndWFyZCBhZ2FpbnN0IHRocm93biBlcnJvcnNcbiAgICBsZXQgaW5qZWN0YWJsZTogVCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lIGFzIGFueSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYW5kbGUgaXQgbGF0ZXJcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIGxldCBtb2RlbEN0b3I6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIikgbW9kZWxDdG9yID0gbmFtZSBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIgfHwgdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbW9kZWxDdG9yID0gTW9kZWwuZ2V0KG5hbWUudG9TdHJpbmcoKSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vZGVsQ3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgLy8gUmVzb2x2ZSBmbGF2b3VyIGZyb20gbWV0YWRhdGEgaWYgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBtZXRhS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRGbGF2b3VyID1cbiAgICAgICAgZmxhdm91ciB8fFxuICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCBtb2RlbEN0b3IpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIERldGVybWluZSBhbiBhbGlhcyB0byB1c2U6IHByZWZlciBhIGRpcmVjdGx5IHJlZ2lzdGVyZWQgYWRhcHRlcjsgb3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBhZGFwdGVyXG4gICAgICAgIC8vIGhhcyB0aGUgc2FtZSBmbGF2b3VyLCB1c2UgaXRzIGFsaWFzIHRvIHNhdGlzZnkgUmVwb3NpdG9yeS5mb3JNb2RlbC9BZGFwdGVyLmdldCBsb29rdXBzLlxuICAgICAgICBsZXQgYWxpYXNUb1VzZSA9IHJlc29sdmVkRmxhdm91cjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRGbGF2b3VyKSBBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gQWRhcHRlci5jdXJyZW50IGFzIGFueTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LmZsYXZvdXIgPT09IHJlc29sdmVkRmxhdm91cilcbiAgICAgICAgICAgIGFsaWFzVG9Vc2UgPSBjdXJyZW50LmFsaWFzO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICAgICAgbW9kZWxDdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgYWxpYXNUb1VzZVxuICAgICAgICApIGFzIFQ7XG4gICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlZ2lzdGVyIHRoZSByZXNvbHZlZCBpbmplY3RhYmxlIG5hbWUgZm9yIGxhdGVyIHJldHJpZXZhbFxuICAgICAgICBjb25zdCBmID1cbiAgICAgICAgICByZXNvbHZlZEZsYXZvdXIgfHxcbiAgICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCAoaW5qZWN0YWJsZSBhcyBhbnkpLmNvbnN0cnVjdG9yKSBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIG1vZGVsQ3RvcikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgIG1vZGVsQ3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICBmIGFzIHN0cmluZ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgIGBObyByZWdpc3RlcmVkIHJlcG9zaXRvcnkgb3IgYWRhcHRlciBmb3VuZC4gZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYWRhcHRlci4gRXJyb3I6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVwb0N0b3IgPSAoUmVwb3NpdG9yeSBhcyBhbnkpW1wiZ2V0XCJdKG1vZGVsQ3RvciwgcmVzb2x2ZWRGbGF2b3VyKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBvQ3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlciA9IHJlc29sdmVkRmxhdm91clxuICAgICAgICAgICAgPyAoQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBhcyBhbnkpXG4gICAgICAgICAgICA6IChBZGFwdGVyLmN1cnJlbnQgYXMgYW55KTtcbiAgICAgICAgICBpZiAoIWFkYXB0ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKTtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXJEaXNwYXRjaCwgRXZlbnRJZHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlcyBkYXRhYmFzZSBvcGVyYXRpb24gZXZlbnRzIHRvIG9ic2VydmVyc1xuICogQHN1bW1hcnkgVGhlIERpc3BhdGNoIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJjZXB0aW5nXG4gKiBkYXRhYmFzZSBvcGVyYXRpb25zIGZyb20gYW4gQWRhcHRlciBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyB3aGVuIGNoYW5nZXMgb2NjdXIuIEl0IHVzZXMgcHJveGllcyB0b1xuICogd3JhcCB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyBhbmQgYXV0b21hdGljYWxseSB0cmlnZ2VyIG9ic2VydmVyIHVwZGF0ZXMgYWZ0ZXIgb3BlcmF0aW9ucyBjb21wbGV0ZS5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIG5hdGl2ZSBkYXRhYmFzZSBkcml2ZXIgdHlwZVxuICogQHBhcmFtIHt2b2lkfSAtIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnNcbiAqIEBjbGFzcyBEaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0aW5nIGFuZCB1c2luZyBhIERpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBEaXNwYXRjaDxQb3N0Z3Jlc0RyaXZlcj4oKTtcbiAqXG4gKiAvLyBDb25uZWN0IGl0IHRvIGFuIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKGNvbm5lY3Rpb24pO1xuICogZGlzcGF0Y2gub2JzZXJ2ZShhZGFwdGVyKTtcbiAqXG4gKiAvLyBOb3cgYW55IENSVUQgb3BlcmF0aW9ucyBvbiB0aGUgYWRhcHRlciB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIC8vIHRyaWdnZXIgb2JzZXJ2ZXIgbm90aWZpY2F0aW9uc1xuICogYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMTIzLCB1c2VyTW9kZWwpO1xuICogLy8gT2JzZXJ2ZXJzIHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlIGNyZWF0aW9uXG4gKlxuICogLy8gV2hlbiBkb25lLCB5b3UgY2FuIGRpc2Nvbm5lY3RcbiAqIGRpc3BhdGNoLnVuT2JzZXJ2ZShhZGFwdGVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2ggZXh0ZW5kcyBMb2dnZWRDbGFzcyBpbXBsZW1lbnRzIEFkYXB0ZXJEaXNwYXRjaCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGFkYXB0ZXIgYmVpbmcgb2JzZXJ2ZWRcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHdob3NlIG9wZXJhdGlvbnMgYXJlIGJlaW5nIG1vbml0b3JlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFkYXB0ZXI/OiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGFkYXB0ZXJcbiAgICovXG4gIHByb3RlY3RlZCBtb2RlbHMhOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2Ugd2l0aG91dCBhbnkgYWRhcHRlclxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoIGJ5IHByb3h5aW5nIGFkYXB0ZXIgbWV0aG9kc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHByb3hpZXMgb24gdGhlIGFkYXB0ZXIncyBDUlVEIG1ldGhvZHMgdG8gaW50ZXJjZXB0IG9wZXJhdGlvbnMgYW5kIG5vdGlmeSBvYnNlcnZlcnMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gYWRhcHRlciBpcyBvYnNlcnZlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQcm94eVxuICAgKlxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IENoZWNrIGlmIGFkYXB0ZXIgZXhpc3RzXG4gICAqICAgYWx0IE5vIGFkYXB0ZXJcbiAgICogICAgIERpc3BhdGNoLS0+PkRpc3BhdGNoOiBUaHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBDUlVEIG1ldGhvZFxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBDaGVjayBpZiBtZXRob2QgZXhpc3RzXG4gICAqICAgICBhbHQgTWV0aG9kIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBHZXQgcHJvcGVydHkgZGVzY3JpcHRvclxuICAgKiAgICAgbG9vcCBXaGlsZSBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIHByb3RvdHlwZSBjaGFpblxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBhbHQgRGVzY3JpcHRvciBub3QgZm91bmQgb3Igbm90IHdyaXRhYmxlXG4gICAqICAgICAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IExvZyBlcnJvciBhbmQgY29udGludWVcbiAgICogICAgIGVsc2UgRGVzY3JpcHRvciBmb3VuZCBhbmQgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5Qcm94eTogQ3JlYXRlIHByb3h5IGZvciBtZXRob2RcbiAgICogICAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBSZXBsYWNlIG1ldGhvZCB3aXRoIHByb3h5XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAvLyBHcmFjZWZ1bGx5IHNraXAgaW5pdGlhbGl6YXRpb24gd2hlbiBubyBhZGFwdGVyIGlzIG9ic2VydmVkIHlldC5cbiAgICAgIC8vIFNvbWUgdGVzdHMgb3Igc2V0dXBzIG1heSBjb25zdHJ1Y3QgYSBEaXNwYXRjaCBiZWZvcmUgY2FsbGluZyBvYnNlcnZlKCkuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHRocm93aW5nLCB3ZSBuby1vcCBzbyB0aGF0IGxhdGVyIG9ic2VydmUoKSBjYW4gcHJvY2VlZC5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb25gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PjtcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgaWYgKCFhZGFwdGVyW21ldGhvZF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHttZXRob2R9IG5vdCBmb3VuZCBpbiAke2FkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFkYXB0ZXIsIG1ldGhvZCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IGFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHttZXRob2R9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICBhZGFwdGVyW21ldGhvZF0gPSBuZXcgUHJveHkoYWRhcHRlclttZXRob2RdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAodGFyZ2V0OiBhbnksIHRoaXNBcmcsIGFyZ0FycmF5OiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFt0YWJsZU5hbWUsIGlkc10gPSBhcmdBcnJheTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlTmFtZSwgYnVsa1RvU2luZ2xlKG1ldGhvZCksIGlkcyBhcyBFdmVudElkcylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgICAgICAgICBgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7bWV0aG9kfSBmb3IgJHt0YWJsZU5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHttZXRob2R9IG9uICR7dGFibGVOYW1lfTogJHtlfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZGlzcGF0Y2hcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHdoZW4gdGhlIGRpc3BhdGNoIGlzIG5vIGxvbmdlciBuZWVkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjbG9zaW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB0byBub3RoaW5nIGluIHRoaXMgaW5zdGFuY2UgYnV0IG1heSBiZSByZXF1aXJlZCBmb3IgY2xvc2luZyBjb25uZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiT25seSBBZGFwdGVycyBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIik7XG4gICAgdGhpcy5hZGFwdGVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5tb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBEaXNwYXRjaCBpbml0aWFsaXplZCBmb3IgJHt0aGlzLmFkYXB0ZXIhLmFsaWFzfSBhZGFwdGVyYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0b3BzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IERpc2Nvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggZnJvbSBhbiBhZGFwdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gc3RvcCBvYnNlcnZpbmdcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZGFwdGVyICE9PSBvYnNlcnZlcilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgdGhlIGFkYXB0ZXIgdGhhdCB3YXMgdXNlZCB0byBvYnNlcnZlIGNhbiBiZSB1bm9ic2VydmVkXCJcbiAgICAgICk7XG4gICAgdGhpcy5hZGFwdGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dGFibGV9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBEaXNwYXRjaDtcbiIsImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEQktleXMsIElSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZGVjb3JhdG9yIGZvciBtb2RlbCBjbGFzc2VzLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FuIGJlIHVzZWQgYXMgYm90aCBhIHByb3BlcnR5IGRlY29yYXRvciBhbmQgYSBjbGFzcyBkZWNvcmF0b3IuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD59IG1vZGVsIC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSB0aGUgcmVxdWlyZWQgYWRhcHRlcidzIGZsYXZvdXIvYWxpYXMuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwgbWV0YWRhdGEuLlxuICogQHJldHVybiB7YW55fSAtIFRoZSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKlxuICogICBDLT4+RDogQXBwbHkgQHJlcG9zaXRvcnkoTW9kZWwpXG4gKiAgIGFsdCBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAqICAgICBELT4+RDogQ2hlY2sgaWYgcHJvcGVydHlLZXkgZXhpc3RzXG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0KG5hbWUpIGRlY29yYXRvclxuICogICBlbHNlIENsYXNzIERlY29yYXRvclxuICogICAgIEQtPj5NOiBTZXQgcmVwb3NpdG9yeSBtZXRhZGF0YSBvbiBtb2RlbFxuICogICAgIEQtPj5SOiBSZWdpc3RlciBtb2RlbCB3aXRoIFJlcG9zaXRvcnlcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3RhYmxlIGRlY29yYXRvciB3aXRoIGNvbmZpZ1xuICogICAgIEMtPj5DOiBEZWZpbmUgREJLZXlzLkNMQVNTIHByb3BlcnR5XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwpKFxuICAgICAgICBvcmlnaW5hbCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLCBvcmlnaW5hbC5uYW1lKShtb2RlbCk7XG4gICAgZmxhdm91ciA9XG4gICAgICBmbGF2b3VyIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgb3JpZ2luYWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoXG4gICAgICBtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIGZsYXZvdXJcbiAgICApO1xuICAgIHJldHVybiBpbmplY3RhYmxlKG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCwge1xuICAgICAgY2FsbGJhY2s6IChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9LFxuICAgIH0pKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3MgT2JzZXJ2ZXJFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgcmVwb3NpdG9yeSBvYnNlcnZlciBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9ic2VydmVyRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPYnNlcnZlckVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3Igc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnM8XG4gIFRZUEUgPSBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgZ2VuZXJhdGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZXMgTnVtYmVyIG9yIEJpZ0ludCB2YWx1ZXNcbiAgICovXG4gIHR5cGU6IFRZUEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIHN0YXJ0cyB3aXRoXG4gICAqL1xuICBzdGFydFdpdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIGVhY2ggc3RlcCBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VxdWVuY2UgaW5jcmVhc2VzIHdpdGggZWFjaCBjYWxsXG4gICAqL1xuICBpbmNyZW1lbnRCeTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWluaW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2UgY2FuIGdlbmVyYXRlXG4gICAqL1xuICBtaW5WYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgc2VxdWVuY2Ugc2hvdWxkIGN5Y2xlIHdoZW4gcmVhY2hpbmcgaXRzIGxpbWl0c1xuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCB0aGUgc2VxdWVuY2Ugd2lsbCByZXN0YXJ0IGZyb20gbWluVmFsdWUgd2hlbiByZWFjaGluZyBtYXhWYWx1ZVxuICAgKi9cbiAgY3ljbGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOb25lU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogdW5kZWZpbmVkLFxuICBnZW5lcmF0ZWQ6IGZhbHNlLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG9wdGlvbnMgZm9yIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMgPSBOb25lU2VxdWVuY2VPcHRpb25zO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmVkZWZpbmVkIG9wdGlvbnMgZm9yIG51bWVyaWMgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBzdGFuZGFyZCBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgTnVtZXJpY1NlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBnZW5lcmF0ZWQ6IHRydWUsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgQmlnSW50IHNlcXVlbmNlc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBmb3IgQmlnSW50IHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IEJpZ0ludFNlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IEJpZ0ludFNlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICB7fSxcbiAgTnVtZXJpY1NlcXVlbmNlLFxuICB7XG4gICAgdHlwZTogXCJCaWdJbnRcIixcbiAgfVxuKTtcbiIsImltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGUgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvciB1cGRhdGVzIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciB0byBjcmVhdGUgYSBuZXcgbW9kZWwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBwcmltYXJ5IGtleVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjcmVhdGUgb3IgdXBkYXRlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtSZXBvPE0sIEYsIENvbnRleHQ8Rj4+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+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IGlubmVyUmVwbzogUmVwbzxNPiA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgbGV0IGRlbGV0ZWQ6IE07XG4gIGlmICghKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNb2RlbCkpXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUobW9kZWxba2V5XSBhcyBzdHJpbmcpO1xuICBlbHNlXG4gICAgZGVsZXRlZCA9IGF3YWl0IGlubmVyUmVwby5kZWxldGUoXG4gICAgICAobW9kZWxba2V5XSBhcyBNKVtpbm5lclJlcG8ucGsgYXMga2V5b2YgTV0gYXMgc3RyaW5nXG4gICAgKTtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSBhcyBzdHJpbmcsXG4gICAgZGVsZXRlZFxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGV4aXN0aW5nIG1vZGVscyBvciBjcmVhdGluZyBuZXcgb25lc1xuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uQ3JlYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGFsdCBhcnJheVR5cGUgaXMgbm90IFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlcG9cbiAqICAgICBsb29wIGZvciBlYWNoIGlkIGluIHVuaXF1ZVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5yZXBvOiByZWFkKGlkKVxuICogICAgICAgcmVwby0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVhZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkXG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBlbHNlIGFycmF5VHlwZSBpcyBcIm9iamVjdFwiXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogcHJvcGVydHlWYWx1ZXNbMF1cbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcGtOYW1lXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHJlc3VsdCBzZXRcbiAqICAgICBsb29wIGZvciBlYWNoIG0gaW4gcHJvcGVydHlWYWx1ZXNcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG0sIGNvbnRleHRcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBhZGQgcmVjb3JkW3BrTmFtZV0gdG8gcmVzdWx0XG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4ucmVzdWx0XVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMgfHwgIXByb3BlcnR5VmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZXNbMF07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gdHlwZW9mIGl0ZW0gPT09IGFycmF5VHlwZSkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRpb24uIEFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IG11c3QgbWF0Y2ggdGhlIHNhbWUgdHlwZS5gXG4gICAgKTtcbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbLi4ucHJvcGVydHlWYWx1ZXNdKTtcbiAgaWYgKGFycmF5VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzKSB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGlkKTtcbiAgICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgcmVhZCk7XG4gICAgfVxuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa05hbWUgPSBmaW5kUHJpbWFyeUtleShwcm9wZXJ0eVZhbHVlc1swXSkuaWQ7XG5cbiAgY29uc3QgcmVzdWx0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IG0gb2YgcHJvcGVydHlWYWx1ZXMpIHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBjcmVhdGVPclVwZGF0ZShtLCBjb250ZXh0LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkKTtcbiAgICByZXN1bHQuYWRkKHJlY29yZFtwa05hbWVdKTtcbiAgfVxuXG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4ucmVzdWx0XTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgdXBkYXRlc1xuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZGVsZWdhdGluZyB0byBvbmVUb01hbnlPbkNyZWF0ZSBpZiBjYXNjYWRlIHVwZGF0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPblVwZGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPblVwZGF0ZS0+Pm9uZVRvTWFueU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICogICAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFwcGx5KHRoaXMsIFtjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXSlcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0tPj5vbmVUb01hbnlPblVwZGF0ZTogdm9pZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjYXNjYWRlIH0gPSBkYXRhO1xuICBpZiAoY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICByZXR1cm4gb25lVG9NYW55T25DcmVhdGUuYXBwbHkodGhpcyBhcyBhbnksIFtcbiAgICBjb250ZXh0LFxuICAgIGRhdGEsXG4gICAga2V5IGFzIGtleW9mIE1vZGVsLFxuICAgIG1vZGVsLFxuICBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgZGVsZXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIGFsbCByZWxhdGVkIG1vZGVscyBpZiBjYXNjYWRlIGRlbGV0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uRGVsZXRlXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPbkRlbGV0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBjYXNjYWRlLmRlbGV0ZSBpcyBDQVNDQURFXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIHZhbHVlcyBleGlzdHMgYW5kIGhhcyBsZW5ndGhcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgYWxsIGVsZW1lbnRzIGhhdmUgc2FtZSB0eXBlXG4gKlxuICogICBhbHQgaXNJbnN0YW50aWF0ZWQgKGFycmF5VHlwZSBpcyBcIm9iamVjdFwiKVxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwodmFsdWVzWzBdKVxuICogICAgIFJlcG9zaXRvcnktLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZWxzZSBub3QgaW5zdGFudGlhdGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiByZXBvXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvOiBkZWxldGUoaWQsIGNvbnRleHQpXG4gKiAgICAgcmVwby0tPj5vbmVUb01hbnlPbkRlbGV0ZTogZGVsZXRlZFxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IHNldCBtb2RlbFtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc11cbiAqICAgb25lVG9NYW55T25EZWxldGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGF0YS5jYXNjYWRlLmRlbGV0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IHZhbHVlcyA9IG1vZGVsW2tleV0gYXMgYW55O1xuICBpZiAoIXZhbHVlcyB8fCAhdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICBjb25zdCBhcmVBbGxTYW1lVHlwZSA9IHZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKTtcbiAgaWYgKCFhcmVBbGxTYW1lVHlwZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCBpc0luc3RhbnRpYXRlZCA9IGFycmF5VHlwZSA9PT0gXCJvYmplY3RcIjtcbiAgY29uc3QgcmVwbyA9IGlzSW5zdGFudGlhdGVkXG4gICAgPyBSZXBvc2l0b3J5LmZvck1vZGVsKHZhbHVlc1swXSwgdGhpcy5hZGFwdGVyLmFsaWFzKVxuICAgIDogcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcblxuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oaXNJbnN0YW50aWF0ZWRcbiAgICAgID8gdmFsdWVzLm1hcCgodjogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdltyZXBvLnBrIGFzIHN0cmluZ10pXG4gICAgICA6IHZhbHVlcyksXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIGRlbGV0ZWQpO1xuICB9XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciBjYWNoaW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgdW5pcXVlIGtleSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBwb3B1bGF0ZWQgbW9kZWwgcmVsYXRpb25zaGlwcyBpbiB0aGUgY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHJldHVybiB7c3RyaW5nfSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXkoXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuKSB7XG4gIHJldHVybiBbUGVyc2lzdGVuY2VLZXlzLlBPUFVMQVRFLCB0YWJsZU5hbWUsIGZpZWxkTmFtZSwgaWRdLmpvaW4oXCIuXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYWNoZXMgYSBtb2RlbCBmb3IgbGF0ZXIgcG9wdWxhdGlvblxuICogQHN1bW1hcnkgU3RvcmVzIGEgbW9kZWwgaW4gdGhlIGNvbnRleHQgY2FjaGUgZm9yIGVmZmljaWVudCByZXRyaWV2YWwgZHVyaW5nIHJlbGF0aW9uc2hpcCBwb3B1bGF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtNfSBwYXJlbnRNb2RlbCAtIFRoZSBwYXJlbnQgbW9kZWwgdGhhdCBjb250YWlucyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBwa1ZhbHVlIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcGFyYW0ge2FueX0gY2FjaGVWYWx1ZSAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjYWNoZVxuICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNhY2hlIG9wZXJhdGlvblxuICogQGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsRm9yUG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIHBhcmVudE1vZGVsOiBNLFxuICBwcm9wZXJ0eUtleToga2V5b2YgTSB8IHN0cmluZyxcbiAgcGtWYWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBjYWNoZVZhbHVlOiBhbnlcbikge1xuICBjb25zdCBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KFxuICAgIHBhcmVudE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nLFxuICAgIHBrVmFsdWVcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQuYWNjdW11bGF0ZSh7IFtjYWNoZUtleV06IGNhY2hlVmFsdWUgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvcHVsYXRlcyBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGF0dGFjaGVzIHJlbGF0ZWQgbW9kZWxzIHRvIGEgbW9kZWwncyByZWxhdGlvbnNoaXAgcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gcG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcG9wdWxhdGVcbiAqICAgcGFydGljaXBhbnQgZmV0Y2hQb3B1bGF0ZVZhbHVlc1xuICogICBwYXJ0aWNpcGFudCBnZXRQb3B1bGF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKlxuICogICBDYWxsZXItPj5wb3B1bGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBjaGVjayBpZiBkYXRhLnBvcHVsYXRlIGlzIHRydWVcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogZ2V0IG5lc3RlZCB2YWx1ZSBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzXG4gKlxuICogICBwb3B1bGF0ZS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF1cbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBpbml0aWFsaXplIHZhcmlhYmxlc1xuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBwcm9LZXlWYWx1ZSBpbiBwcm9wS2V5VmFsdWVzXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmdldFBvcHVsYXRlS2V5OiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWVcbiAqICAgICBnZXRQb3B1bGF0ZUtleS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjYWNoZUtleVxuICpcbiAqICAgICBhbHQgdHJ5IHRvIGdldCBmcm9tIGNhY2hlXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Q29udGV4dDogZ2V0KGNhY2hlS2V5KVxuICogICAgICAgQ29udGV4dC0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbHNlIGNhdGNoIGVycm9yXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wTmFtZVxuICogICAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogcmVwb1xuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG86IHJlYWQocHJvS2V5VmFsdWUpXG4gKiAgICAgICByZXBvLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVuZFxuICpcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogYWRkIHZhbCB0byByZXN1bHRzXG4gKiAgIGVuZFxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0tPj5wb3B1bGF0ZTogcmVzdWx0c1xuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBzZXQgbW9kZWxba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdXG4gKiAgIHBvcHVsYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnBvcHVsYXRlKSByZXR1cm47XG4gIGNvbnN0IG5lc3RlZDogYW55ID0gbW9kZWxba2V5XTtcbiAgY29uc3QgaXNBcnIgPSBBcnJheS5pc0FycmF5KG5lc3RlZCk7XG4gIGlmICh0eXBlb2YgbmVzdGVkID09PSBcInVuZGVmaW5lZFwiIHx8IChpc0FyciAmJiBuZXN0ZWQubGVuZ3RoID09PSAwKSkgcmV0dXJuO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgYzogQ29udGV4dDxGPixcbiAgICBtb2RlbDogTSxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIHByb3BLZXlWYWx1ZXM6IGFueVtdLFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBjYWNoZUtleTogc3RyaW5nO1xuICAgIGxldCB2YWw6IGFueTtcbiAgICBjb25zdCByZXN1bHRzOiBNW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb0tleVZhbHVlIG9mIHByb3BLZXlWYWx1ZXMpIHtcbiAgICAgIGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkobW9kZWwuY29uc3RydWN0b3IubmFtZSwgcHJvcE5hbWUsIHByb0tleVZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbCA9IGF3YWl0IGMuZ2V0KGNhY2hlS2V5IGFzIGFueSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIHByb3BOYW1lLCBhbGlhcyk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXkgYXMgc3RyaW5nLFxuICAgIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF0sXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTGlzdCBvZiBjb21tb24gSmF2YVNjcmlwdCB0eXBlc1xuICogQHN1bW1hcnkgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgY29tbW9uIEphdmFTY3JpcHQgdHlwZXMgdGhhdCBhcmUgbm90IGN1c3RvbSBtb2RlbCB0eXBlc1xuICogQGNvbnN0IGNvbW1vbVR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuY29uc3QgY29tbW9tVHlwZXMgPSBbXG4gIFwiYXJyYXlcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJudW1iZXJcIixcbiAgXCJib29sZWFuXCIsXG4gIFwic3ltYm9sXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJvYmplY3RcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJudWxsXCIsXG4gIFwiYmlnaW50XCIsXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIHByb3BlcnR5IGJhc2VkIG9uIGl0cyB0eXBlIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFeGFtaW5lcyBhIG1vZGVsIHByb3BlcnR5J3MgdHlwZSBtZXRhZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHJlcG9zaXRvcnkgZm9yIHJlbGF0ZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHthbnl9IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGV4YW1pbmVcbiAqIEByZXR1cm4ge1JlcG88TT59IEEgcmVwb3NpdG9yeSBmb3IgdGhlIG1vZGVsIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IFJlZmxlY3RcbiAqICAgcGFydGljaXBhbnQgVmFsaWRhdGlvblxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BlcnR5S2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlZhbGlkYXRpb246IGtleShBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSkgPyBWYWxpZGF0aW9uS2V5cy5MSVNUIDogVmFsaWRhdGlvbktleXMuVFlQRSlcbiAqICAgVmFsaWRhdGlvbi0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdmFsaWRhdGlvbktleVxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZWZsZWN0OiBnZXRNZXRhZGF0YSh2YWxpZGF0aW9uS2V5LCBtb2RlbCwgcHJvcGVydHlLZXkpXG4gKiAgIFJlZmxlY3QtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHR5cGVzXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBkZXRlcm1pbmUgY3VzdG9tVHlwZXMgYmFzZWQgb24gcHJvcGVydHkgdHlwZVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiB0eXBlcyBhbmQgY3VzdG9tVHlwZXMgZXhpc3RcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNyZWF0ZSBhbGxvd2VkVHlwZXMgYXJyYXlcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogZmluZCBjb25zdHJ1Y3Rvck5hbWUgbm90IGluIGNvbW1vbVR5cGVzXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yTmFtZSBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+TW9kZWw6IGdldChjb25zdHJ1Y3Rvck5hbWUpXG4gKiAgIE1vZGVsLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjb25zdHJ1Y3RvclxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiBjb25zdHJ1Y3RvciBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgIFJlcG9zaXRvcnktLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHJlcG9cbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+PkNhbGxlcjogcmVwb1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyB8IGtleW9mIE0sXG4gIGFsaWFzPzogc3RyaW5nXG4pOiBSZXBvPE0+IHtcbiAgY29uc3QgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFZhbGlkYXRpb24ua2V5KFxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEVcbiAgICApLFxuICAgIG1vZGVsLFxuICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZ1xuICApO1xuICBjb25zdCBjdXN0b21UeXBlczogYW55ID0gQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgPyB0eXBlcy5jbGF6elxuICAgIDogdHlwZXMuY3VzdG9tVHlwZXM7XG4gIGlmICghdHlwZXMgfHwgIWN1c3RvbVR5cGVzKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmaW5kIHR5cGVzIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfWBcbiAgICApO1xuXG4gIGNvbnN0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSAoXG4gICAgQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcykgPyBbLi4uY3VzdG9tVHlwZXNdIDogW2N1c3RvbVR5cGVzXVxuICApLm1hcCgodCkgPT4gKHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgPyB0KCkgOiB0KSk7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGFsbG93ZWRUeXBlcy5maW5kKFxuICAgICh0KSA9PiAhY29tbW9tVHlwZXMuaW5jbHVkZXMoYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIGlmICghY29uc3RydWN0b3JOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFByb3BlcnR5IGtleSAke3Byb3BlcnR5S2V5IGFzIHN0cmluZ30gZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGNvbnN0cnVjdG9yIHR5cGVgXG4gICAgKTtcbiAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KGNvbnN0cnVjdG9yTmFtZSk7XG4gIGlmICghY29uc3RydWN0b3IpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7Y29uc3RydWN0b3JOYW1lfWApO1xuXG4gIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCBhbGlhcyk7XG59XG4iLCJpbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvblVwZGF0ZSxcbiAgYWZ0ZXJBbnksXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dCxcbiAgdGltZXN0YW1wLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhLCBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRDYXNjYWRlLCBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGxpc3QsXG4gIE1vZGVsLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7XG4gIEpvaW5Db2x1bW5PcHRpb25zLFxuICBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICBKb2luVGFibGVPcHRpb25zLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIG9uZVRvTWFueU9uQ3JlYXRlLFxuICBvbmVUb01hbnlPbkRlbGV0ZSxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIG9uZVRvT25lT25DcmVhdGUsXG4gIG9uZVRvT25lT25EZWxldGUsXG4gIG9uZVRvT25lT25VcGRhdGUsXG4gIHBvcHVsYXRlIGFzIHBvcCxcbn0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzIGluIHRoZSBkYXRhYmFzZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzXG4gKiBAZnVuY3Rpb24gdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZTxPUFRTID0gc3RyaW5nPihvcHRzPzogT1BUUykge1xuICByZXR1cm4gZnVuY3Rpb24gdGFibGUodGFyZ2V0OiBhbnkpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpO1xuICAgIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBtZXRhZGF0YSxcbiAgICAgICAgYXJnczogW2tleSwgb3B0cyB8fCB0YXJnZXQubmFtZS50b0xvd2VyQ2FzZSgpXSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKSh0YXJnZXQpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KG5hbWU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW11cbik6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW10sXG4gIG5hbWU6IHN0cmluZ1xuKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChjb21wb3NpdGlvbnM6IHN0cmluZ1tdKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgY29tcG9zaXRpb25zOiBzdHJpbmdbXSxcbiAgbmFtZTogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSB8IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbmFtZT86IHN0cmluZ1xuKSB7XG4gIGZ1bmN0aW9uIGluZGV4KFxuICAgIGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdIHwgc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgY29tcG9zaXRpb25zPzogc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb21wb3NpdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBjb21wb3NpdGlvbnM7XG4gICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghY29tcG9zaXRpb25zICYmIGRpcmVjdGlvbnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGlyZWN0aW9ucy5maW5kKFxuICAgICAgICAgIChkKSA9PiAhW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXS5pbmNsdWRlcyhkIGFzIGFueSlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvc2l0aW9ucyA9IGRpcmVjdGlvbnMgYXMgc3RyaW5nW107XG4gICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KFxuICAgICAgICBgJHtQZXJzaXN0ZW5jZUtleXMuSU5ERVh9JHtjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCA/IGAuJHtjb21wb3NpdGlvbnMuam9pbihcIi5cIil9YCA6IFwiXCJ9YFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgZGlyZWN0aW9uczogZGlyZWN0aW9ucyxcbiAgICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB9IGFzIEluZGV4TWV0YWRhdGFcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5JTkRFWClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5kZXgsXG4gICAgICBhcmdzOiBbZGlyZWN0aW9ucywgY29tcG9zaXRpb25zLCBuYW1lXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmZvcmNlcyB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgZHVyaW5nIG1vZGVsIGNyZWF0aW9uIGFuZCB1cGRhdGVcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIHVuaXF1ZSBkZWNvcmF0b3IgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2VcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIG1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlIG9yIHJlamVjdHMgd2l0aCBhIENvbmZsaWN0RXJyb3JcbiAqIEBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEobW9kZWwgYXMgYW55KVtrZXldKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zZWxlY3QoKVxuICAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKGtleSkuZXEobW9kZWxba2V5XSkpXG4gICAgLmV4ZWN1dGUoKTtcbiAgaWYgKGV4aXN0aW5nLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgIGBtb2RlbCBhbHJlYWR5IGV4aXN0cyB3aXRoIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlbnN1cmVzIGEgcHJvcGVydHkgdmFsdWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdW5pcXVlKClcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB1c2VyIGlkZW50aWZpY2F0aW9uIGZvciBvd25lcnNoaXAgdHJhY2tpbmdcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGRlY29yYXRvcnMgdG8gc2V0IG93bmVyc2hpcCBpbmZvcm1hdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc3RvcmUgdGhlIHVzZXIgaWRlbnRpZmllclxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiBBdXRob3JpemF0aW9uRXJyb3IgaWYgdXNlciBpZGVudGlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZGF0YTogVixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgY3JlYXRvciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBjcmVhdGVkQnkoKVxuICogICBjcmVhdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGxhc3QgdXBkYXRlciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdXBkYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVwZGF0ZWRCeSgpXG4gKiAgIGxhc3RFZGl0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoW09wZXJhdGlvbktleXMuQ1JFQVRFXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAb25lVG9PbmUoUHJvZmlsZSlcbiAqICAgcHJvZmlsZSE6IHN0cmluZyB8IFByb2ZpbGU7XG4gKiB9XG4gKlxuICogY2xhc3MgUHJvZmlsZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIGJpbyE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbiAgam9pbkNvbHVtbk9wdHM/OiBKb2luQ29sdW1uT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBmdW5jdGlvbiBvbmVUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhLmpvaW5UYWJsZSA9IGpvaW5Db2x1bW5PcHRzO1xuICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb09uZU9uQ3JlYXRlLCBtZXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvT25lT25VcGRhdGUsIG1ldGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pbkNvbHVtbk9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKlxuICogICBAb25lVG9NYW55KEJvb2spXG4gKiAgIGJvb2tzITogc3RyaW5nW10gfCBCb29rW107XG4gKiB9XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvT25lXG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBvbmVUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenogYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgIFN0cmluZyxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEJpZ2ludCBpcyBub3QgYSBjb25zdHJ1Y3RvclxuICAgICAgICBCaWdJbnQsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG5cbiAgZnVuY3Rpb24gbWFueVRvT25lRGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBjbGF6ek5hbWUgPSAoKSA9PlxuICAgICAgKGNsYXp6Py5uYW1lID8gY2xhenogOiAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3I8TT4pKCkpLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xheno/Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW2NsYXp6TmFtZSwgU3RyaW5nLm5hbWUsIE51bWJlci5uYW1lLCBCaWdJbnQubmFtZV0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5UYWJsZU9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuXG4gIGZ1bmN0aW9uIG1hbnlUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbGwocG9wdWxhdGUsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsImltcG9ydCB7XG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0U2VxdWVuY2VPcHRpb25zLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG59IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBHcm91cFNvcnQsXG4gIEludGVybmFsRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICByZWFkb25seSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gXCIuLi9tb2RlbC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuY29uc3QgZGVmYXVsdFBrUHJpb3JpdHkgPSA2MDsgLy8gRGVmYXVsdCBwcmlvcml0eSBmb3IgcHJpbWFyeSBrZXkgdG8gcnVuIGxhdHRlciB0aGFuIG90aGVyIHByb3BlcnRpZXNcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByaW1hcnkga2V5IGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwcmltYXJ5IGtleSB2YWx1ZXMgZm9yIG1vZGVscyB1c2luZyBzZXF1ZW5jZXNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSB0aGF0IGV4dGVuZHMgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUeXBlIHRoYXQgZXh0ZW5kcyBTZXF1ZW5jZU9wdGlvbnNcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSB0aGF0IGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgdGhhdCBleHRlbmRzIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHNlcXVlbmNlIG9wdGlvbnNcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCBhcyBwcmltYXJ5IGtleVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHJpbWFyeSBrZXkgaXMgc2V0XG4gKiBAZnVuY3Rpb24gcGtPbkNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgcGtPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFNlcXVlbmNlXG4gKlxuICogICBNb2RlbC0+PnBrT25DcmVhdGU6IENhbGwgd2l0aCBtb2RlbCBpbnN0YW5jZVxuICogICBOb3RlIG92ZXIgcGtPbkNyZWF0ZTogQ2hlY2sgaWYga2V5IGFscmVhZHkgZXhpc3RzXG4gKiAgIGFsdCBLZXkgZXhpc3RzIG9yIG5vIHR5cGUgc3BlY2lmaWVkXG4gKiAgICAgcGtPbkNyZWF0ZS0tPj5Nb2RlbDogUmV0dXJuIGVhcmx5XG4gKiAgIGVsc2UgS2V5IG5lZWRzIHRvIGJlIGNyZWF0ZWRcbiAqICAgICBwa09uQ3JlYXRlLT4+cGtPbkNyZWF0ZTogR2VuZXJhdGUgc2VxdWVuY2UgbmFtZSBpZiBub3QgcHJvdmlkZWRcbiAqICAgICBwa09uQ3JlYXRlLT4+QWRhcHRlcjogUmVxdWVzdCBTZXF1ZW5jZShkYXRhKVxuICogICAgIEFkYXB0ZXItPj5TZXF1ZW5jZTogQ3JlYXRlIHNlcXVlbmNlXG4gKiAgICAgU2VxdWVuY2UtLT4+cGtPbkNyZWF0ZTogUmV0dXJuIHNlcXVlbmNlXG4gKiAgICAgcGtPbkNyZWF0ZS0+PlNlcXVlbmNlOiBDYWxsIG5leHQoKVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBuZXh0IHZhbHVlXG4gKiAgICAgcGtPbkNyZWF0ZS0+Pk1vZGVsOiBTZXQgcHJpbWFyeSBrZXkgdmFsdWVcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwa09uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEudHlwZSB8fCAhZGF0YS5nZW5lcmF0ZWQgfHwgbW9kZWxba2V5XSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldFByaW1hcnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgaWYgKCFkYXRhLm5hbWUpIGRhdGEubmFtZSA9IHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICBsZXQgc2VxdWVuY2U6IFNlcXVlbmNlO1xuICB0cnkge1xuICAgIHNlcXVlbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKGRhdGEpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gaW5zdGFudGlhdGUgU2VxdWVuY2UgJHtkYXRhLm5hbWV9OiAke2V9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBuZXh0ID0gYXdhaXQgc2VxdWVuY2UubmV4dCgpO1xuICBzZXRQcmltYXJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG5leHQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IEtleSBEZWNvcmF0b3JcbiAqIEBzdW1tYXJ5IE1hcmtzIGEgcHJvcGVydHkgYXMgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXkgd2l0aCBhdXRvbWF0aWMgc2VxdWVuY2UgZ2VuZXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY29tYmluZXMgbXVsdGlwbGUgYmVoYXZpb3JzOiBpdCBtYXJrcyB0aGUgcHJvcGVydHkgYXMgdW5pcXVlLCByZXF1aXJlZCxcbiAqIGFuZCBlbnN1cmVzIHRoZSBpbmRleCBpcyBjcmVhdGVkIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgc2VxdWVuY2Ugb3B0aW9ucy5cbiAqIEBwYXJhbSB7T21pdDxTZXF1ZW5jZU9wdGlvbnMsIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCI+fSBvcHRzIC0gT3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG1vZGVsIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBwa1xuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHBrKClcbiAqICAgaWQhOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGsoXG4gIG9wdHM6IE9taXQ8XG4gICAgU2VxdWVuY2VPcHRpb25zLFxuICAgIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCJcbiAgPiA9IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnNcbikge1xuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucywgb3B0cywge1xuICAgIGdlbmVyYXRlZDpcbiAgICAgIG9wdHMudHlwZSAmJiB0eXBlb2Ygb3B0cy5nZW5lcmF0ZWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogb3B0cy5nZW5lcmF0ZWQgfHwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucy5nZW5lcmF0ZWQsXG4gIH0pIGFzIFNlcXVlbmNlT3B0aW9ucztcblxuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpO1xuICBmdW5jdGlvbiBwa0RlYyhvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsIGdyb3Vwc29ydD86IEdyb3VwU29ydCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBwa0RlYyhvYmo6IGFueSwgYXR0cjogYW55KSB7XG4gICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgIGluZGV4KFtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoa2V5LCBvcHRpb25zKSxcbiAgICAgICAgb25DcmVhdGUocGtPbkNyZWF0ZSwgb3B0aW9ucywgZ3JvdXBzb3J0KSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKERCS2V5cy5JRCwgYXR0cilcbiAgICAgICkob2JqLCBhdHRyKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHBrRGVjLFxuICAgICAgYXJnczogW29wdHMsIHsgcHJpb3JpdHk6IGRlZmF1bHRQa1ByaW9yaXR5IH1dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjcmVhdGVkQXQsIHVwZGF0ZWRBdCB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBtb2RlbCBjbGFzcyBmb3IgYWxsIGRvbWFpbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBNb2RlbCBjbGFzcyBmcm9tIGRlY29yYXRvci12YWxpZGF0aW9uIGFuZCBhZGRzIHRpbWVzdGFtcCBmdW5jdGlvbmFsaXR5LlxuICogQWxsIGRvbWFpbiBtb2RlbHMgaW4gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyB0byBpbmhlcml0IGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBiZWhhdmlvcnMuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEJhc2VNb2RlbD59IGFyZyAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIGRhdGEgZm9yIHRoZSBtb2RlbFxuICogQGNsYXNzIEJhc2VNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqICAgXG4gKiAgIEBlbWFpbCgpXG4gKiAgIGVtYWlsITogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IoZGF0YT86IE1vZGVsQXJnPFVzZXI+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+O1xufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IgfSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHF1ZXJ5IGJ1aWxkaW5nIGJlaGF2aW9yLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5T3B0aW9uc2AgdHlwZSBkZWZpbmVzIGZsYWdzIHRoYXQgZGV0ZXJtaW5lIHdoZXRoZXIgY2VydGFpbiBjbGF1c2VzXG4gKiAobGltaXQsIG9mZnNldCwgb3JkZXIgYnkpIGFyZSBwZXJtaXR0ZWQsIGFzIHdlbGwgYXMgd2hldGhlciB2aW9sYXRpb25zXG4gKiBzaG91bGQgdGhyb3cgYW4gZXJyb3IgZHVyaW5nIHF1ZXJ5IGNvbnN0cnVjdGlvbi5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5T3B0aW9ucyA9IHtcbiAgYWxsb3dMaW1pdD86IGJvb2xlYW47XG4gIGFsbG93T2Zmc2V0PzogYm9vbGVhbjtcbiAgYWxsb3dPcmRlckJ5PzogYm9vbGVhbjtcbiAgdGhyb3dzPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgcGFyc2VkIHF1ZXJ5IGNsYXVzZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgUXVlcnlBc3Npc3RgIGludGVyZmFjZSBkZWZpbmVzIHRoZSBzdGFuZGFyZCBzdHJ1Y3R1cmUgcmV0dXJuZWRcbiAqIGJ5IHF1ZXJ5IGJ1aWxkZXJzLiBJdCBpbmNsdWRlcyBhY3Rpb25zIHN1Y2ggYXMgZmluZCwgb3B0aW9uYWwgY2xhdXNlc1xuICogbGlrZSBzZWxlY3QsIGdyb3VwQnksIGFuZCBvcmRlckJ5LCBhbmQgcGFnaW5hdGlvbiBjb250cm9scyAobGltaXQsIG9mZnNldCkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIGVudGl0eSBvciByZWNvcmQgdHlwZSB0aGF0IGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvLlxuICpcbiAqIEBpbnRlcmZhY2UgUXVlcnlBc3Npc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUFzc2lzdCB7XG4gIGFjdGlvbjogXCJmaW5kXCI7XG4gIHNlbGVjdDogdW5kZWZpbmVkIHwgc3RyaW5nW107XG4gIHdoZXJlOiBDb25kaXRpb248YW55PjtcbiAgZ3JvdXBCeT86IHN0cmluZ1tdO1xuICBvcmRlckJ5PzogT3JkZXJCeVNlbGVjdG9yPGFueT5bXTtcbiAgbGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgb2Zmc2V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFbnVtZXJhdGlvbiBvZiBzdXBwb3J0ZWQgcXVlcnkgY2xhdXNlcyBmb3IgYnVpbGRpbmcgbWV0aG9kLWJhc2VkIHF1ZXJpZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgUXVlcnlDbGF1c2VgIGVudW0gZGVmaW5lcyBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnRcbiAqIGRpZmZlcmVudCBzZWdtZW50cyBvZiBhIHF1ZXJ5IChlLmcuLCBgZmluZEJ5YCwgYFNlbGVjdGAsIGBBbmRgLCBgT3JgKS5cbiAqXG4gKiBAZW51bSBRdWVyeUNsYXVzZVxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgZW51bSBRdWVyeUNsYXVzZSB7XG4gIEZJTkRfQlkgPSBcImZpbmRCeVwiLFxuICBTRUxFQ1QgPSBcIlNlbGVjdFwiLFxuICBBTkQgPSBcIkFuZFwiLFxuICBPUiA9IFwiT3JcIixcbiAgR1JPVVBfQlkgPSBcIkdyb3VwQnlcIixcbiAgT1JERVJfQlkgPSBcIk9yZGVyQnlcIixcbiAgVEhFTiA9IFwiVGhlblwiLFxuICBUSEVOX0JZID0gXCJUaGVuQnlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEZ1bmN0aW9uIHNpZ25hdHVyZSBmb3IgcGFyc2luZyBvcGVyYXRvcnMgaW4gcXVlcnkgYnVpbGRpbmcuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgT3BlcmF0b3JQYXJzZXJgIHR5cGUgcmVwcmVzZW50cyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBmaWVsZCBuYW1lXG4gKiBhbmQgYXJndW1lbnRzLCB0aGVuIHByb2R1Y2VzIGEgYENvbmRpdGlvbmAgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBxdWVyeS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgY29uZGl0aW9uIHJlc3VsdC5cbiAqXG4gKiBAcGFyYW0gZmllbGQge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgcGFyc2VkLlxuICogQHBhcmFtIGFyZ3Mge2FueVtdfSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBvcGVyYXRvciBldmFsdWF0aW9uLlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbjxhbnk+fSBBIGNvbmRpdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgb3BlcmF0b3IuXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRvclBhcnNlciA9IChmaWVsZDogc3RyaW5nLCAuLi5hcmdzOiBhbnkpID0+IENvbmRpdGlvbjxhbnk+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVzY3JpcHRvciBmb3IgZmllbGRzIGFuZCB0aGVpciBhc3NvY2lhdGVkIG9wZXJhdG9ycyBpbiBxdWVyeSBwYXJzaW5nLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYEZpbHRlckRlc2NyaXB0b3JgIGludGVyZmFjZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB3aGVuIHBhcnNpbmdcbiAqIG1ldGhvZCBzZWdtZW50cyBpbnRvIGZpbHRlcmFibGUgZmllbGRzIGFuZCBhc3NvY2lhdGVkIG9wZXJhdG9ycy5cbiAqXG4gKiBAaW50ZXJmYWNlIEZpbHRlckRlc2NyaXB0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJEZXNjcmlwdG9yIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgb3BlcmF0b3I/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi9Db25kaXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdG9yUGFyc2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE1hcCBvZiBzdXBwb3J0ZWQgb3BlcmF0b3JzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgcGFyc2VyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBPcGVyYXRvcnNNYXBgIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9wZXJhdG9yIG5hbWVzIGFzIGtleXNcbiAqIChzdWNoIGFzIGBFcXVhbHNgLCBgTGVzc1RoYW5gLCBgQmV0d2VlbmAsIGV0Yy4pLCBlYWNoIG1hcHBlZCB0byBhXG4gKiBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYSBgQ29uZGl0aW9uYCBvYmplY3QgZm9yIHRoYXQgb3BlcmF0b3IuXG4gKiBUaGVzZSBmdW5jdGlvbnMgdHJhbnNsYXRlIHF1ZXJ5IGNsYXVzZXMgaW50byBjb25jcmV0ZSBjb25kaXRpb25cbiAqIGJ1aWxkZXJzLCBlbmFibGluZyBkeW5hbWljIHF1ZXJ5IGNvbnN0cnVjdGlvbiBmcm9tIG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgZmllbGQgdmFsdWVzIHVzZWQgaW4gY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0gZiB7c3RyaW5nfSAtIFRoZSBmaWVsZCBuYW1lIHRoZSBjb25kaXRpb24gYXBwbGllcyB0by5cbiAqIEBwYXJhbSB2MSB7YW55fSAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBmaWVsZCBhZ2FpbnN0IG9yIHRoZSBsb3dlciBib3VuZCB2YWx1ZSBmb3IgcmFuZ2UtYmFzZWQgb3BlcmF0b3JzLlxuICogQHBhcmFtIHYyIHthbnl9IC0gVGhlIHVwcGVyIGJvdW5kIHZhbHVlIGZvciByYW5nZS1iYXNlZCBvcGVyYXRvcnMuXG4gKlxuICogQHJldHVybiB7Q29uZGl0aW9uPGFueT59IEEgY29uZGl0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG9wZXJhdG9yIGFwcGxpZWQgdG8gdGhlIGZpZWxkLlxuICpcbiAqIEBmdW5jdGlvbiBPcGVyYXRvcnNNYXBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudCBhcyBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgTWFwIGFzIE9wZXJhdG9yc01hcFxuICogICBwYXJ0aWNpcGFudCBQYXJzZXIgYXMgT3BlcmF0b3JQYXJzZXJcbiAqICAgcGFydGljaXBhbnQgQ29uZCBhcyBDb25kaXRpb25cbiAqXG4gKiAgIENsaWVudC0+Pk1hcDogUmVxdWVzdCBvcGVyYXRvciBwYXJzZXIgKFwiQmV0d2VlblwiLCBmaWVsZCwgdjEsIHYyKVxuICogICBNYXAtPj5QYXJzZXI6IENhbGwgY29ycmVzcG9uZGluZyBvcGVyYXRvciBmdW5jdGlvblxuICogICBQYXJzZXItPj5Db25kOiBDb25kaXRpb24uYXR0cmlidXRlKGZpZWxkKVxuICogICBDb25kLS0+PlBhcnNlcjogQ29uZGl0aW9uIGluc3RhbmNlXG4gKiAgIFBhcnNlci0+PkNvbmQ6IEFwcGx5IGd0ZSh2MSlcbiAqICAgUGFyc2VyLT4+Q29uZDogQXBwbHkgYW5kKGx0ZSh2MikpXG4gKiAgIFBhcnNlci0tPj5DbGllbnQ6IFJldHVybiBidWlsdCBDb25kaXRpb25cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBjb25zdCBPcGVyYXRvcnNNYXA6IFJlY29yZDxzdHJpbmcsIE9wZXJhdG9yUGFyc2VyPiA9IHtcbiAgRXF1YWxzOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkuZXEodiksXG4gIERpZmY6IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5kaWYodiksXG4gIExlc3NUaGFuOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkubHQodiksXG4gIExlc3NUaGFuRXF1YWw6IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5sdGUodiksXG4gIEdyZWF0ZXJUaGFuOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkuZ3QodiksXG4gIEdyZWF0ZXJUaGFuRXF1YWw6IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5ndGUodiksXG4gIEJldHdlZW46IChmLCB2MSwgdjIpID0+XG4gICAgQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSlcbiAgICAgIC5ndGUodjEpXG4gICAgICAuYW5kKENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmx0ZSh2MikpLFxuICBJbjogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmluKHYpLFxuICBNYXRjaGVzOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkucmVnZXhwKHYpLFxufTtcbiIsImltcG9ydCB7IENvbmRpdGlvbiwgT3JkZXJCeVNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBGaWx0ZXJEZXNjcmlwdG9yLCBRdWVyeUFzc2lzdCwgUXVlcnlDbGF1c2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT3BlcmF0b3JzTWFwIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgbG93ZXJGaXJzdCA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PlxuICBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG5cbmV4cG9ydCB0eXBlIE9yZGVyTGltaXRPZmZzZXRFeHRyYWN0ID0ge1xuICBvcmRlckJ5PzogT3JkZXJCeVNlbGVjdG9yPGFueT5bXTtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVdGlsaXR5IGNsYXNzIHRvIGJ1aWxkIHF1ZXJ5IG9iamVjdHMgZnJvbSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBNZXRob2RRdWVyeUJ1aWxkZXJgIGNsYXNzIHBhcnNlcyBtZXRob2QgbmFtZXMgdGhhdCBmb2xsb3cgYSBzcGVjaWZpYyBuYW1pbmcgY29udmVudGlvblxuICogKGUuZy4sIGBmaW5kQnlOYW1lQW5kQWdlT3JkZXJCeUNvdW50cnlBc2NgKSBhbmQgY29udmVydHMgdGhlbSBpbnRvIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0c1xuICogKGBRdWVyeUFzc2lzdGApLiBJdCBleHRyYWN0cyBjbGF1c2VzIHN1Y2ggYXMgYHNlbGVjdGAsIGB3aGVyZWAsIGBncm91cEJ5YCwgYG9yZGVyQnlgLCBgbGltaXRgLFxuICogYW5kIGBvZmZzZXRgLCBlbnN1cmluZyB0aGF0IGRldmVsb3BlcnMgY2FuIGRlY2xhcmUgcmVwb3NpdG9yeSBxdWVyaWVzIHVzaW5nIGV4cHJlc3NpdmUgbWV0aG9kIG5hbWVzLlxuICpcbiAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIHJlcG9zaXRvcnkgbWV0aG9kIG5hbWUgdG8gcGFyc2UgYW5kIGNvbnZlcnQgaW50byBhIHF1ZXJ5LlxuICogQHBhcmFtIHZhbHVlcyB7YW55W119IC0gVGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIG1ldGhvZCBwYXJhbWV0ZXJzIHVzZWQgZm9yIHF1ZXJ5IGNvbmRpdGlvbnMuXG4gKlxuICogQHJldHVybiB7UXVlcnlBc3Npc3R9IEEgc3RydWN0dXJlZCBxdWVyeSBvYmplY3QgZGVzY3JpYmluZyB0aGUgcGFyc2VkIGFjdGlvbiwgc2VsZWN0LCB3aGVyZSxcbiAqIGdyb3VwQnksIG9yZGVyQnksIGxpbWl0LCBhbmQgb2Zmc2V0IGNsYXVzZXMuXG4gKlxuICogQGNsYXNzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBxdWVyeSA9IE1ldGhvZFF1ZXJ5QnVpbGRlci5idWlsZChcbiAqICAgXCJmaW5kQnlOYW1lQW5kQWdlT3JkZXJCeUNvdW50cnlBc2NcIixcbiAqICAgXCJKb2huXCIsXG4gKiAgIDI1LFxuICogICBbW1wiY291bnRyeVwiLCBcIkFTQ1wiXV1cbiAqICk7XG4gKlxuICogY29uc29sZS5sb2cocXVlcnkpO1xuICogLy8ge1xuICogLy8gICBhY3Rpb246IFwiZmluZFwiLFxuICogLy8gICBzZWxlY3Q6IHVuZGVmaW5lZCxcbiAqIC8vICAgd2hlcmU6IHsgLi4uIH0sXG4gKiAvLyAgIGdyb3VwQnk6IHVuZGVmaW5lZCxcbiAqIC8vICAgb3JkZXJCeTogW1tcImNvdW50cnlcIiwgXCJBU0NcIl1dLFxuICogLy8gICBsaW1pdDogdW5kZWZpbmVkLFxuICogLy8gICBvZmZzZXQ6IHVuZGVmaW5lZFxuICogLy8gfVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIFJlcG9zaXRvcnkgTWV0aG9kXG4gKiAgIHBhcnRpY2lwYW50IE1RQiBhcyBNZXRob2RRdWVyeUJ1aWxkZXJcbiAqICAgcGFydGljaXBhbnQgUXVlcnkgYXMgUXVlcnlBc3Npc3RcbiAqXG4gKiAgIFJlcG8tPj5NUUI6IGJ1aWxkKG1ldGhvZE5hbWUsIC4uLnZhbHVlcylcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0Q29yZShtZXRob2ROYW1lKVxuICogICBNUUItPj5NUUI6IGV4dHJhY3RTZWxlY3QobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0R3JvdXBCeShtZXRob2ROYW1lKVxuICogICBNUUItPj5NUUI6IGJ1aWxkV2hlcmUoY29yZSwgdmFsdWVzKVxuICogICBNUUItPj5NUUI6IGV4dHJhY3RPcmRlckxpbWl0T2Zmc2V0KGNvcmUsIHZhbHVlcylcbiAqICAgTVFCLT4+UXVlcnk6IHJldHVybiBzdHJ1Y3R1cmVkIFF1ZXJ5QXNzaXN0IG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgTWV0aG9kUXVlcnlCdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCdWlsZHMgYSBgUXVlcnlBc3Npc3RgIG9iamVjdCBieSBwYXJzaW5nIGEgcmVwb3NpdG9yeSBtZXRob2QgbmFtZSBhbmQgdmFsdWVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBUaGUgbWV0aG9kIHZhbGlkYXRlcyB0aGUgbWV0aG9kIG5hbWUsIGV4dHJhY3RzIGNsYXVzZXMgKGNvcmUsIHNlbGVjdCwgZ3JvdXBCeSwgd2hlcmUsXG4gICAqIG9yZGVyQnksIGxpbWl0LCBhbmQgb2Zmc2V0KSwgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBzdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdFxuICAgKiB0aGF0IGNhbiBiZSBleGVjdXRlZCBhZ2FpbnN0IGEgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIHJlcG9zaXRvcnkgbWV0aG9kIG5hbWUgdGhhdCBlbmNvZGVzIHF1ZXJ5IGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0gdmFsdWVzIHthbnlbXX0gLSBUaGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gY29uZGl0aW9ucyBhbmQgZXh0cmEgY2xhdXNlcy5cbiAgICpcbiAgICogQHJldHVybiB7UXVlcnlBc3Npc3R9IEEgc3RydWN0dXJlZCBxdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgcXVlcnkuXG4gICAqL1xuICBzdGF0aWMgYnVpbGQobWV0aG9kTmFtZTogc3RyaW5nLCAuLi52YWx1ZXM6IGFueVtdKTogUXVlcnlBc3Npc3Qge1xuICAgIGlmICghbWV0aG9kTmFtZS5zdGFydHNXaXRoKFF1ZXJ5Q2xhdXNlLkZJTkRfQlkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZE5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29yZSA9IHRoaXMuZXh0cmFjdENvcmUobWV0aG9kTmFtZSk7XG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5leHRyYWN0U2VsZWN0KG1ldGhvZE5hbWUpO1xuICAgIGNvbnN0IGdyb3VwQnkgPSB0aGlzLmV4dHJhY3RHcm91cEJ5KG1ldGhvZE5hbWUpO1xuICAgIC8vIGNvbnN0IG9yZGVyQnkgPSB0aGlzLmV4dHJhY3RPcmRlckJ5KG1ldGhvZE5hbWUpO1xuICAgIGNvbnN0IHdoZXJlID0gdGhpcy5idWlsZFdoZXJlKGNvcmUsIHZhbHVlcyk7XG4gICAgY29uc3QgeyBvcmRlckJ5LCBsaW1pdCwgb2Zmc2V0IH0gPSB0aGlzLmV4dHJhY3RPcmRlckxpbWl0T2Zmc2V0KFxuICAgICAgY29yZSxcbiAgICAgIHZhbHVlc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZpbmRcIixcbiAgICAgIHNlbGVjdDogc2VsZWN0LFxuICAgICAgd2hlcmUsXG4gICAgICBncm91cEJ5LFxuICAgICAgb3JkZXJCeSxcbiAgICAgIGxpbWl0LFxuICAgICAgb2Zmc2V0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEV4dHJhY3RzIHRoZSBjb3JlIHBhcnQgb2YgdGhlIG1ldGhvZCBuYW1lIGFmdGVyIGBmaW5kQnlgIGFuZCBiZWZvcmUgYW55IHNwZWNpYWwgY2xhdXNlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogUmVtb3ZlcyBwcmVmaXhlcyBhbmQgZGV0ZWN0cyBkZWxpbWl0ZXJzIChgVGhlbmAsIGBPcmRlckJ5YCwgYEdyb3VwQnlgLCBgTGltaXRgLCBgT2Zmc2V0YClcbiAgICogdG8gaXNvbGF0ZSB0aGUgbWFpbiBjb25kaXRpb25hbCBwYXJ0IG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgbWV0aG9kIG5hbWUgdG8gcGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGV4dHJhY3RlZCBjb3JlIHN0cmluZyB1c2VkIGZvciBidWlsZGluZyBjb25kaXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdENvcmUobWV0aG9kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBhZnRlckZpbmRCeSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFF1ZXJ5Q2xhdXNlLkZJTkRfQlkubGVuZ3RoKTtcbiAgICBjb25zdCByZWdleCA9IC8oVGhlbltBLVpdfE9yZGVyQnl8R3JvdXBCeXxMaW1pdHxPZmZzZXQpLztcbiAgICBjb25zdCBtYXRjaCA9IGFmdGVyRmluZEJ5Lm1hdGNoKHJlZ2V4KTtcbiAgICByZXR1cm4gbWF0Y2ggPyBhZnRlckZpbmRCeS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpIDogYWZ0ZXJGaW5kQnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEV4dHJhY3RzIHRoZSBzZWxlY3QgY2xhdXNlIGZyb20gYSBtZXRob2QgbmFtZS5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRGV0ZWN0cyB0aGUgYFNlbGVjdGAga2V5d29yZCBpbiB0aGUgbWV0aG9kIG5hbWUsIGlzb2xhdGVzIHRoZSBmaWVsZHMgZm9sbG93aW5nIGl0LFxuICAgKiBhbmQgcmV0dXJucyB0aGVtIGFzIGFuIGFycmF5IG9mIGxvd2VyY2FzZS1maXJzdCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXJzZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nW10gfCB1bmRlZmluZWR9IEFuIGFycmF5IG9mIHNlbGVjdGVkIGZpZWxkcyBvciBgdW5kZWZpbmVkYCBpZiBubyBzZWxlY3QgY2xhdXNlIGV4aXN0cy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RTZWxlY3QobWV0aG9kTmFtZTogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlbGVjdEluZGV4ID0gbWV0aG9kTmFtZS5pbmRleE9mKFF1ZXJ5Q2xhdXNlLlNFTEVDVCk7XG4gICAgaWYgKHNlbGVjdEluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFmdGVyU2VsZWN0ID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoXG4gICAgICBzZWxlY3RJbmRleCArIFF1ZXJ5Q2xhdXNlLlNFTEVDVC5sZW5ndGhcbiAgICApO1xuXG4gICAgLy8gU2VhcmNoIGZvciBuZXh0IFRoZW4sIEdyb3VwQnksIE9yZGVyQnkuLi5cbiAgICBjb25zdCBtYXRjaCA9IGFmdGVyU2VsZWN0Lm1hdGNoKC8oVGhlbltBLVpdfE9yZGVyQnl8R3JvdXBCeXxMaW1pdHxPZmZzZXQpLyk7XG5cbiAgICBjb25zdCBzZWxlY3RQYXJ0ID0gbWF0Y2hcbiAgICAgID8gYWZ0ZXJTZWxlY3Quc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KVxuICAgICAgOiBhZnRlclNlbGVjdDtcblxuICAgIHJldHVybiBzZWxlY3RQYXJ0LnNwbGl0KFF1ZXJ5Q2xhdXNlLkFORCkubWFwKGxvd2VyRmlyc3QpLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXh0cmFjdHMgdGhlIGdyb3VwIGJ5IGNsYXVzZSBmcm9tIGEgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVjdHMgdGhlIGBHcm91cEJ5YCBrZXl3b3JkIGluIHRoZSBtZXRob2QgbmFtZSwgaXNvbGF0ZXMgdGhlIGZpZWxkcyBmb2xsb3dpbmcgaXQsXG4gICAqIGFuZCByZXR1cm5zIHRoZW0gYXMgYW4gYXJyYXkgb2YgbG93ZXJjYXNlLWZpcnN0IHN0cmluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gQW4gYXJyYXkgb2YgZ3JvdXAgYnkgZmllbGRzIG9yIGB1bmRlZmluZWRgIGlmIG5vIGdyb3VwIGJ5IGNsYXVzZSBleGlzdHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0R3JvdXBCeShtZXRob2ROYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZ3JvdXBCeUluZGV4ID0gbWV0aG9kTmFtZS5pbmRleE9mKFF1ZXJ5Q2xhdXNlLkdST1VQX0JZKTtcbiAgICBpZiAoZ3JvdXBCeUluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFmdGVyID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoXG4gICAgICBncm91cEJ5SW5kZXggKyBRdWVyeUNsYXVzZS5HUk9VUF9CWS5sZW5ndGhcbiAgICApO1xuICAgIGNvbnN0IGdyb3VwQnlQYXJ0ID0gYWZ0ZXIuc3BsaXQoUXVlcnlDbGF1c2UuT1JERVJfQlkpWzBdO1xuICAgIHJldHVybiBncm91cEJ5UGFydFxuICAgICAgLnNwbGl0KFF1ZXJ5Q2xhdXNlLlRIRU5fQlkpXG4gICAgICAubWFwKGxvd2VyRmlyc3QpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdE9yZGVyQnkoXG4gIC8vICAgbWV0aG9kTmFtZTogc3RyaW5nXG4gIC8vICk6IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W10gfCB1bmRlZmluZWQge1xuICAvLyAgIGNvbnN0IG9yZGVyQnlJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5PUkRFUl9CWSk7XG4gIC8vICAgaWYgKG9yZGVyQnlJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vXG4gIC8vICAgY29uc3QgYWZ0ZXIgPSBtZXRob2ROYW1lLnN1YnN0cmluZyhcbiAgLy8gICAgIG9yZGVyQnlJbmRleCArIFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLmxlbmd0aFxuICAvLyAgICk7XG4gIC8vICAgY29uc3Qgb3JkZXJQYXJ0cyA9IGFmdGVyLnNwbGl0KFwiVGhlbkJ5XCIpO1xuICAvL1xuICAvLyAgIHJldHVybiBvcmRlclBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAvLyAgICAgY29uc3QgbWF0Y2ggPSBwYXJ0Lm1hdGNoKC8oLio/KShBc2N8RGVzY3xEc2MpJC8pO1xuICAvLyAgICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE9yZGVyQnkgcGFydDogJHtwYXJ0fWApO1xuICAvLyAgICAgY29uc3QgWywgZmllbGQsIGRpcl0gPSBtYXRjaDtcbiAgLy8gICAgIHJldHVybiBbXG4gIC8vICAgICAgIGxvd2VyRmlyc3QoZmllbGQpLFxuICAvLyAgICAgICBkaXIudG9Mb3dlckNhc2UoKSA9PT0gXCJkc2NcIlxuICAvLyAgICAgICAgID8gT3JkZXJEaXJlY3Rpb24uRFNDXG4gIC8vICAgICAgICAgOiAoZGlyLnRvTG93ZXJDYXNlKCkgYXMgT3JkZXJEaXJlY3Rpb24pLFxuICAvLyAgICAgXTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQnVpbGRzIHRoZSBgd2hlcmVgIGNvbmRpdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIHBhcnNlZCBjb3JlIHN0cmluZyBhbmQgcGFyYW1ldGVyIHZhbHVlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogU3BsaXRzIHRoZSBjb3JlIHN0cmluZyBieSBsb2dpY2FsIG9wZXJhdG9ycyAoYEFuZGAsIGBPcmApLCBwYXJzZXMgZWFjaCB0b2tlbiBpbnRvIGEgZmllbGRcbiAgICogYW5kIG9wZXJhdG9yLCBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgYENvbmRpdGlvbmAgb2JqZWN0IHVzaW5nIHRoZSBwcm92aWRlZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb3JlIHtzdHJpbmd9IC0gVGhlIGV4dHJhY3RlZCBjb3JlIHN0cmluZyBmcm9tIHRoZSBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlcyB7YW55W119IC0gVGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb25kaXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248YW55Pn0gQSBzdHJ1Y3R1cmVkIGNvbmRpdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBxdWVyeSdzIHdoZXJlIGNsYXVzZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkV2hlcmUoY29yZTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogQ29uZGl0aW9uPGFueT4ge1xuICAgIGNvbnN0IHBhcnRzID0gY29yZS5zcGxpdCgvT3JkZXJCeXxHcm91cEJ5LylbMF0gfHwgXCJcIjtcbiAgICBjb25zdCBjb25kaXRpb25zID0gcGFydHMuc3BsaXQoL0FuZHxPci8pO1xuXG4gICAgY29uc3Qgb3BlcmF0b3JzID0gY29yZS5tYXRjaCgvQW5kfE9yL2cpIHx8IFtdO1xuXG4gICAgbGV0IHdoZXJlOiBDb25kaXRpb248YW55PiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbmRpdGlvbnMuZm9yRWFjaCgodG9rZW4sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgeyBmaWVsZCwgb3BlcmF0b3IgfSA9IHRoaXMucGFyc2VGaWVsZEFuZE9wZXJhdG9yKHRva2VuKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG9wZXJhdG9yID8gT3BlcmF0b3JzTWFwW29wZXJhdG9yXSA6IE9wZXJhdG9yc01hcC5FcXVhbHM7XG4gICAgICBpZiAoIXBhcnNlcikgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBvcGVyYXRvciAke29wZXJhdG9yfWApO1xuXG4gICAgICBjb25zdCBjb25kaXRpb25WYWx1ZSA9IHZhbHVlc1tpZHhdO1xuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIGZpZWxkICR7ZmllbGR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHBhcnNlcihmaWVsZCwgY29uZGl0aW9uVmFsdWUpO1xuICAgICAgd2hlcmUgPVxuICAgICAgICBpZHggPT09IDBcbiAgICAgICAgICA/IGNvbmRpdGlvblxuICAgICAgICAgIDogb3BlcmF0b3JzW2lkeCAtIDFdID09PSBRdWVyeUNsYXVzZS5BTkRcbiAgICAgICAgICAgID8gd2hlcmUhLmFuZChjb25kaXRpb24pXG4gICAgICAgICAgICA6IHdoZXJlIS5vcihjb25kaXRpb24pO1xuICAgIH0pO1xuXG4gICAgaWYgKCF3aGVyZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZGl0aW9ucyBmb3VuZCBpbiBtZXRob2QgbmFtZVwiKTtcbiAgICByZXR1cm4gd2hlcmU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFBhcnNlcyBhIGZpZWxkIG5hbWUgYW5kIG9wZXJhdG9yIGZyb20gYSBzdHJpbmcgdG9rZW4uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElkZW50aWZpZXMgdGhlIG9wZXJhdG9yIHN1ZmZpeCAoaWYgcHJlc2VudCkgYW5kIHJldHVybnMgYSBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGhlIGZpZWxkXG4gICAqIG5hbWUgaW4gbG93ZXJjYXNlLWZpcnN0IGZvcm1hdCBhbG9uZyB3aXRoIHRoZSBvcGVyYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHN0ciB7c3RyaW5nfSAtIFRoZSB0b2tlbiBzdHJpbmcgdG8gcGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge0ZpbHRlckRlc2NyaXB0b3J9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWVsZCBuYW1lIGFuZCBvcGVyYXRvci5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRmllbGRBbmRPcGVyYXRvcihzdHI6IHN0cmluZyk6IEZpbHRlckRlc2NyaXB0b3Ige1xuICAgIGZvciAoY29uc3Qgb3BlcmF0b3Igb2YgT2JqZWN0LmtleXMoT3BlcmF0b3JzTWFwKSkge1xuICAgICAgaWYgKHN0ci5lbmRzV2l0aChvcGVyYXRvcikpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzdHIuc2xpY2UoMCwgLW9wZXJhdG9yLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB7IGZpZWxkOiBsb3dlckZpcnN0KGZpZWxkKSwgb3BlcmF0b3IgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZmllbGQ6IGxvd2VyRmlyc3Qoc3RyKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyBgb3JkZXJCeWAsIGBsaW1pdGAsIGFuZCBgb2Zmc2V0YCBjbGF1c2VzIGZyb20gbWV0aG9kIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGNvbmRpdGlvbiBhcmd1bWVudHMsIHRoZW4gY2hlY2tzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzXG4gICAqIHRvIHJlc29sdmUgc29ydGluZywgbGltaXRpbmcsIGFuZCBwYWdpbmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29yZSB7c3RyaW5nfSAtIFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgZnJvbSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBtZXRob2QgYXJndW1lbnRzLCBpbmNsdWRpbmcgY29uZGl0aW9ucyBhbmQgZXh0cmFzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPcmRlckxpbWl0T2Zmc2V0RXh0cmFjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgb3JkZXJCeSwgbGltaXQsIGFuZCBvZmZzZXQgdmFsdWVzIGlmIHByZXNlbnQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0T3JkZXJMaW1pdE9mZnNldChcbiAgICBjb3JlOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBhbnlbXVxuICApOiBPcmRlckxpbWl0T2Zmc2V0RXh0cmFjdCB7XG4gICAgY29uc3QgY29uZGl0aW9uQ291bnQgPSBjb3JlLnNwbGl0KC9BbmR8T3IvKS5sZW5ndGg7XG4gICAgY29uc3QgZXh0cmFBcmdzID0gdmFsdWVzLnNsaWNlKGNvbmRpdGlvbkNvdW50KTtcblxuICAgIGxldCBvcmRlckJ5OiBPcmRlckJ5U2VsZWN0b3I8YW55PltdIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBvZmZzZXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChleHRyYUFyZ3MubGVuZ3RoID49IDEgJiYgQXJyYXkuaXNBcnJheShleHRyYUFyZ3NbMF0pKVxuICAgICAgb3JkZXJCeSA9IGV4dHJhQXJnc1swXSBhcyBPcmRlckJ5U2VsZWN0b3I8YW55PltdO1xuXG4gICAgaWYgKGV4dHJhQXJncy5sZW5ndGggPj0gMiAmJiB0eXBlb2YgZXh0cmFBcmdzWzFdID09PSBcIm51bWJlclwiKVxuICAgICAgbGltaXQgPSBleHRyYUFyZ3NbMV07XG5cbiAgICBpZiAoZXh0cmFBcmdzLmxlbmd0aCA+PSAzICYmIHR5cGVvZiBleHRyYUFyZ3NbMl0gPT09IFwibnVtYmVyXCIpXG4gICAgICBvZmZzZXQgPSBleHRyYUFyZ3NbMl07XG5cbiAgICByZXR1cm4geyBvcmRlckJ5LCBsaW1pdCwgb2Zmc2V0IH07XG4gIH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5T3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNZXRob2RRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9NZXRob2RRdWVyeUJ1aWxkZXJcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5KG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKTogYW55ID0+IHtcbiAgICAvLyBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5LnRvU3RyaW5nKCk7XG4gICAgKGRlc2NyaXB0b3IgYXMgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PikudmFsdWUgPSBmdW5jdGlvbiAoXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgeyBzZWxlY3QsIHdoZXJlLCBncm91cEJ5LCBvcmRlckJ5LCBsaW1pdCwgb2Zmc2V0IH0gPVxuICAgICAgICBNZXRob2RRdWVyeUJ1aWxkZXIuYnVpbGQobWV0aG9kTmFtZSwgLi4uYXJncyk7XG5cbiAgICAgIGxldCBzdG10ID0gKHRoaXMgYXMgYW55KS5zZWxlY3Qoc2VsZWN0KSBhcyBhbnk7XG4gICAgICBpZiAod2hlcmUpIHN0bXQgPSBzdG10LndoZXJlKHdoZXJlKTtcbiAgICAgIC8vIGlmIChvcmRlckJ5KSBzdG10ID0gc3RtdC5vcmRlckJ5KG9yZGVyQnlbMF0pO1xuICAgICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgICAgLy8gZ3JvdXAgYnkgbm90IGltcGxlbWVudGVkIHlldFxuICAgICAgICAvKiBzdG10ID0gc3RtdC5ncm91cEJ5KGdyb3VwQnkpOyAqL1xuICAgICAgfVxuXG4gICAgICAvLyBhbGxvdyBsaW1pdCBhbmQgb2Zmc2V0IGJ5IGRlZmF1bHRcbiAgICAgIGNvbnN0IHsgYWxsb3dMaW1pdCwgYWxsb3dPZmZzZXQsIGFsbG93T3JkZXJCeSwgdGhyb3dzIH0gPSB7XG4gICAgICAgIGFsbG93TGltaXQ6IHRydWUsXG4gICAgICAgIGFsbG93T3JkZXJCeTogdHJ1ZSxcbiAgICAgICAgYWxsb3dPZmZzZXQ6IHRydWUsXG4gICAgICAgIHRocm93czogdHJ1ZSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH0gYXMgUXVlcnlPcHRpb25zO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSBbXG4gICAgICAgIC8vIGtlZXAgdGhlIG9yZGVyIHRvIGVuc3VyZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3JcbiAgICAgICAgeyBrZXk6IFwib3JkZXJCeVwiLCB2YWx1ZTogKG9yZGVyQnkgfHwgW10pWzBdLCBhbGxvd2VkOiBhbGxvd09yZGVyQnkgfSwgLy8gb3JkZXJCeSBvbmx5IHN1cHBvcnRzIG9uZSBzZW50ZW5jZVxuICAgICAgICB7IGtleTogXCJsaW1pdFwiLCB2YWx1ZTogbGltaXQsIGFsbG93ZWQ6IGFsbG93TGltaXQgfSxcbiAgICAgICAgeyBrZXk6IFwib2Zmc2V0XCIsIHZhbHVlOiBvZmZzZXQsIGFsbG93ZWQ6IGFsbG93T2Zmc2V0IH0sXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW0udmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghcGFyYW0uYWxsb3dlZCAmJiB0aHJvd3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgICAgICBgJHtwYXJhbS5rZXlbMF0udG9VcHBlckNhc2UoKSArIHBhcmFtLmtleS5zbGljZSgxKX0gaXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgcXVlcnlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uYWxsb3dlZCkge1xuICAgICAgICAgICAgc3RtdCA9IHN0bXRbcGFyYW0ua2V5XShwYXJhbS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdG10LmV4ZWN1dGUoKTtcbiAgICB9O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmF3UmFtUXVlcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGFnaW5hdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTS1zcGVjaWZpYyBwYWdpbmF0b3IgaW1wbGVtZW50YXRpb25cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgUGFnaW5hdG9yIGNsYXNzIHRvIHByb3ZpZGUgcGFnaW5hdGlvbiBmdW5jdGlvbmFsaXR5IGZvciBSQU0gYWRhcHRlciBxdWVyaWVzLlxuICogVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBwYWdpbmF0aW9uIG9mIHF1ZXJ5IHJlc3VsdHMgZnJvbSB0aGUgaW4tbWVtb3J5IHN0b3JhZ2UsIGFsbG93aW5nXG4gKiBmb3IgZWZmaWNpZW50IHJldHJpZXZhbCBvZiBsYXJnZSByZXN1bHQgc2V0cyBpbiBzbWFsbGVyIGNodW5rcy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgYmVpbmcgcGFnaW5hdGVkXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZSByZXR1cm5lZCBieSB0aGUgcGFnaW5hdG9yXG4gKiBAY2xhc3MgUmFtUGFnaW5hdG9yXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgcXVlcnkgZm9yIFVzZXIgbW9kZWxcbiAqIGNvbnN0IHF1ZXJ5OiBSYXdSYW1RdWVyeTxVc2VyPiA9IHtcbiAqICAgc2VsZWN0OiB1bmRlZmluZWQsIC8vIFNlbGVjdCBhbGwgZmllbGRzXG4gKiAgIGZyb206IFVzZXIsXG4gKiAgIHdoZXJlOiAodXNlcikgPT4gdXNlci5hY3RpdmUgPT09IHRydWVcbiAqIH07XG4gKlxuICogLy8gQ3JlYXRlIGEgcGFnaW5hdG9yIHdpdGggcGFnZSBzaXplIG9mIDEwXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgUmFtUGFnaW5hdG9yPFVzZXIsIFVzZXI+KGFkYXB0ZXIsIHF1ZXJ5LCAxMCwgVXNlcik7XG4gKlxuICogLy8gR2V0IHRoZSBmaXJzdCBwYWdlIG9mIHJlc3VsdHNcbiAqIGNvbnN0IGZpcnN0UGFnZSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICpcbiAqIC8vIEdldCB0aGUgbmV4dCBwYWdlXG4gKiBjb25zdCBzZWNvbmRQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbVBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBSLFxuICBSYXdSYW1RdWVyeTxNPlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBSYXdSYW1RdWVyeTxNPiwgYW55LCBhbnk+LFxuICAgIHF1ZXJ5OiBSYXdSYW1RdWVyeTxNPixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgUkFNIHF1ZXJ5IGZvciBwYWdpbmF0aW9uXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIHRoZSByYXcgcXVlcnkgc3RhdGVtZW50IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzLlxuICAgKiBUaGlzIHByb3RlY3RlZCBtZXRob2Qgc2V0cyB0aGUgbGltaXQgcGFyYW1ldGVyIG9uIHRoZSBxdWVyeSB0byBtYXRjaCB0aGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge1Jhd1JhbVF1ZXJ5PE0+fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgcXVlcnkgc3RhdGVtZW50XG4gICAqIEByZXR1cm4ge1Jhd1JhbVF1ZXJ5PE0+fSBUaGUgbW9kaWZpZWQgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogUmF3UmFtUXVlcnk8TT4pOiBSYXdSYW1RdWVyeTxNPiB7XG4gICAgY29uc3QgcXVlcnk6IFJhd1JhbVF1ZXJ5PGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCByYXdTdGF0ZW1lbnQpO1xuICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5zaXplO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVycyB0byByZXRyaWV2ZSBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0cy5cbiAgICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyB0aGUgYXBwcm9wcmlhdGUgc2tpcCB2YWx1ZSBiYXNlZCBvbiB0aGUgcGFnZSBudW1iZXIgYW5kIHBhZ2Ugc2l6ZSxcbiAgICogZXhlY3V0ZXMgdGhlIHF1ZXJ5LCBhbmQgdXBkYXRlcyB0aGUgY3VycmVudCBwYWdlIHRyYWNraW5nLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZ2U9MV0gLSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUgKDEtYmFzZWQpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cyBmb3IgdGhlIHJlcXVlc3RlZCBwYWdlXG4gICAqL1xuICBhc3luYyBwYWdlKHBhZ2U6IG51bWJlciA9IDEpOiBQcm9taXNlPFJbXT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMucHJlcGFyZSh0aGlzLnN0YXRlbWVudCk7XG4gICAgaWYgKCF0aGlzLl9yZWNvcmRDb3VudCB8fCAhdGhpcy5fdG90YWxQYWdlcykge1xuICAgICAgICB0aGlzLl90b3RhbFBhZ2VzID0gdGhpcy5fcmVjb3JkQ291bnQgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHRzOiBSW10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHsgLi4uc3RhdGVtZW50LCBsaW1pdDogdW5kZWZpbmVkIH0pIHx8IFtdO1xuICAgICAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fcmVjb3JkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gc3RhdGVtZW50Py5saW1pdCB8fCB0aGlzLnNpemU7XG4gICAgICAgICAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gc2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYWdlID0gdGhpcy52YWxpZGF0ZVBhZ2UocGFnZSk7XG4gICAgc3RhdGVtZW50LnNraXAgPSAocGFnZSAtIDEpICogdGhpcy5zaXplO1xuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhzdGF0ZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBPcGVyYXRvcixcbiAgUGFnaW5hdG9yLFxuICBRdWVyeUVycm9yLFxufSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IFJhd1JhbVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmFtUGFnaW5hdG9yIH0gZnJvbSBcIi4vUmFtUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSYW1BZGFwdGVyIH0gZnJvbSBcIi4vUmFtQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0tc3BlY2lmaWMgcXVlcnkgc3RhdGVtZW50IGJ1aWxkZXJcbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgU3RhdGVtZW50IGNsYXNzIHRvIHByb3ZpZGUgcXVlcnkgYnVpbGRpbmcgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIFJBTSBhZGFwdGVyLlxuICogVGhpcyBjbGFzcyB0cmFuc2xhdGVzIGhpZ2gtbGV2ZWwgcXVlcnkgb3BlcmF0aW9ucyBpbnRvIHByZWRpY2F0ZXMgdGhhdCBjYW4gZmlsdGVyIGFuZCBzb3J0XG4gKiBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBxdWVyaWVkXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZSByZXR1cm5lZCBieSB0aGUgcXVlcnlcbiAqIEBwYXJhbSB7UmFtQWRhcHRlcn0gYWRhcHRlciAtIFRoZSBSQU0gYWRhcHRlciBpbnN0YW5jZSB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAY2xhc3MgUmFtU3RhdGVtZW50XG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgc3RhdGVtZW50IGZvciBxdWVyeWluZyBVc2VyIG1vZGVsc1xuICogY29uc3Qgc3RhdGVtZW50ID0gbmV3IFJhbVN0YXRlbWVudDxVc2VyLCBVc2VyPihyYW1BZGFwdGVyKTtcbiAqXG4gKiAvLyBCdWlsZCBhIHF1ZXJ5IHRvIGZpbmQgYWN0aXZlIHVzZXJzIHdpdGggYWdlID4gMThcbiAqIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzdGF0ZW1lbnRcbiAqICAgLmZyb20oVXNlcilcbiAqICAgLndoZXJlKENvbmRpdGlvbi5hbmQoXG4gKiAgICAgQ29uZGl0aW9uLmVxKCdhY3RpdmUnLCB0cnVlKSxcbiAqICAgICBDb25kaXRpb24uZ3QoJ2FnZScsIDE4KVxuICogICApKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1TdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgUmF3UmFtUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBSYW1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlciBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc29ydCBjb21wYXJhdG9yIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIG1vZGVsIGluc3RhbmNlcyBiYXNlZCBvbiB0aGUgb3JkZXJCeSBjcml0ZXJpYS5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBkaWZmZXJlbnQgZGF0YSB0eXBlcyAoc3RyaW5nLCBudW1iZXIsIGRhdGUpIGFuZCBzb3J0IGRpcmVjdGlvbnMgKGFzYywgZGVzYykuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9uKE1vZGVsLCBNb2RlbCk6IG51bWJlcn0gQSBjb21wYXJhdG9yIGZ1bmN0aW9uIGZvciBzb3J0aW5nIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRTb3J0KCkge1xuICAgIHJldHVybiAoZWwxOiBNb2RlbCwgZWwyOiBNb2RlbCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgXCJvcmRlckJ5U2VsZWN0b3Igbm90IHNldC4gU2hvdWxkIGJlIGltcG9zc2libGVcIlxuICAgICAgICApO1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLm9yZGVyQnlTZWxlY3RvcjtcbiAgICAgIGNvbnN0IFtrZXksIGRpcmVjdGlvbl0gPSBzZWxlY3RvcjtcbiAgICAgIGNvbnN0IHR5cGUgPSBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKGVsMSwga2V5IGFzIHN0cmluZyk7XG4gICAgICBpZiAoIXR5cGUpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGB0eXBlIG5vdCBjb21wYXRpYmxlIHdpdGggc29ydGluZzogJHt0eXBlfWApO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwiU3RyaW5nXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IFwiYXNjXCIgPyAxIDogLTEpICpcbiAgICAgICAgICAgIChlbDFba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZykubG9jYWxlQ29tcGFyZShcbiAgICAgICAgICAgICAgZWwyW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBzdHJpbmdcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IDEgOiAtMSkgKlxuICAgICAgICAgICAgKChlbDFba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIG51bWJlcikgLVxuICAgICAgICAgICAgICAoZWwyW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBudW1iZXIpKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGluc3RhbmNlb2YgRGF0ZSAmJlxuICAgICAgICAgICAgZWwyW2tleSBhcyBrZXlvZiBNb2RlbF0gaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IDEgOiAtMSkgKlxuICAgICAgICAgICAgICAoKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgRGF0ZSkudmFsdWVPZigpIC1cbiAgICAgICAgICAgICAgICAoZWwyW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBEYXRlKS52YWx1ZU9mKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGBTb3J0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdCBkYXRlIGNsYXNzZXNgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgc29ydGluZyBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBSQU0gcXVlcnkgZnJvbSB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBzZWxlY3RvcnMgYW5kIGNvbmRpdGlvbnMgaW50byBhIFJhd1JhbVF1ZXJ5IG9iamVjdFxuICAgKiB0aGF0IGNhbiBiZSBleGVjdXRlZCBieSB0aGUgUkFNIGFkYXB0ZXIuIFRoaXMgbWV0aG9kIGFzc2VtYmxlcyBhbGwgcXVlcnkgY29tcG9uZW50c1xuICAgKiAoc2VsZWN0LCBmcm9tLCB3aGVyZSwgbGltaXQsIG9mZnNldCwgc29ydCkgaW50byB0aGUgZmluYWwgcXVlcnkgc3RydWN0dXJlLlxuICAgKiBAcmV0dXJuIHtSYXdSYW1RdWVyeTxNPn0gVGhlIGNvbnN0cnVjdGVkIFJBTSBxdWVyeSBvYmplY3RcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBSYXdSYW1RdWVyeTxNPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSYXdSYW1RdWVyeTxNPiA9IHtcbiAgICAgIHNlbGVjdDogdGhpcy5zZWxlY3RTZWxlY3RvcixcbiAgICAgIGZyb206IHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgd2hlcmU6IHRoaXMud2hlcmVDb25kaXRpb25cbiAgICAgICAgPyB0aGlzLnBhcnNlQ29uZGl0aW9uKHRoaXMud2hlcmVDb25kaXRpb24pLndoZXJlXG4gICAgICAgIDogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIChlbDogTSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSxcbiAgICAgIGxpbWl0OiB0aGlzLmxpbWl0U2VsZWN0b3IsXG4gICAgICBza2lwOiB0aGlzLm9mZnNldFNlbGVjdG9yLFxuICAgIH07XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9yKSByZXN1bHQuc29ydCA9IHRoaXMuZ2V0U29ydCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwYWdpbmF0b3IgZm9yIHRoZSBxdWVyeVxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCB3cmFwcyBpdCBpbiBhIFJhbVBhZ2luYXRvciB0byBlbmFibGUgcGFnaW5hdGlvbiBvZiByZXN1bHRzLlxuICAgKiBUaGlzIGFsbG93cyByZXRyaWV2aW5nIGxhcmdlIHJlc3VsdCBzZXRzIGluIHNtYWxsZXIgY2h1bmtzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBwYWdlIHNpemUgKG51bWJlciBvZiByZXN1bHRzIHBlciBwYWdlKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBSYXdSYW1RdWVyeTxNPj4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHBhZ2luYXRvciBmb3IgdGhlIHF1ZXJ5XG4gICAqL1xuICBhc3luYyBwYWdpbmF0ZShzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBSYXdSYW1RdWVyeTxNPj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICByZXR1cm4gbmV3IFJhbVBhZ2luYXRvcjxNLCBSPihcbiAgICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgUkFNIHF1ZXJ5IHByZWRpY2F0ZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkXG4gICAqIHRvIGZpbHRlciBtb2RlbCBpbnN0YW5jZXMgaW4gbWVtb3J5LiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggc2ltcGxlIGNvbmRpdGlvbnNcbiAgICogKGVxdWFscywgZ3JlYXRlciB0aGFuLCBldGMuKSBhbmQgY29tcGxleCBjb25kaXRpb25zIHdpdGggbG9naWNhbCBvcGVyYXRvcnMgKEFORCwgT1IpLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgY29uZGl0aW9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge1Jhd1JhbVF1ZXJ5PE0+fSBBIFJBTSBxdWVyeSBvYmplY3Qgd2l0aCBhIHdoZXJlIHByZWRpY2F0ZSBmdW5jdGlvblxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1TdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBTaW1wbGVDb25kaXRpb25cbiAgICogICBwYXJ0aWNpcGFudCBDb21wbGV4Q29uZGl0aW9uXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtU3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqICAgYWx0IFNpbXBsZSBjb25kaXRpb24gKGVxLCBndCwgbHQsIGV0Yy4pXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5TaW1wbGVDb25kaXRpb246IEV4dHJhY3QgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uXG4gICAqICAgICBTaW1wbGVDb25kaXRpb24tLT4+UmFtU3RhdGVtZW50OiBSZXR1cm4gcHJlZGljYXRlIGZ1bmN0aW9uXG4gICAqICAgZWxzZSBMb2dpY2FsIG9wZXJhdG9yIChBTkQsIE9SKVxuICAgKiAgICAgUmFtU3RhdGVtZW50LT4+Q29tcGxleENvbmRpdGlvbjogRXh0cmFjdCBuZXN0ZWQgY29uZGl0aW9uc1xuICAgKiAgICAgUmFtU3RhdGVtZW50LT4+UmFtU3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihsZWZ0Q29uZGl0aW9uKVxuICAgKiAgICAgUmFtU3RhdGVtZW50LT4+UmFtU3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihyaWdodENvbmRpdGlvbilcbiAgICogICAgIENvbXBsZXhDb25kaXRpb24tLT4+UmFtU3RhdGVtZW50OiBDb21iaW5lIHByZWRpY2F0ZXMgd2l0aCBsb2dpY2FsIG9wZXJhdG9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtU3RhdGVtZW50LS0+PkNhbGxlcjogUmV0dXJuIHF1ZXJ5IHdpdGggd2hlcmUgcHJlZGljYXRlXG4gICAqL1xuICBwYXJzZUNvbmRpdGlvbjxNIGV4dGVuZHMgTW9kZWw+KGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogUmF3UmFtUXVlcnk8TT4ge1xuICAgIHJldHVybiB7XG4gICAgICB3aGVyZTogKG06IE1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICAgICAgKSA9PT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5CSUdHRVI6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA+IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkJJR0dFUl9FUTpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID49IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkRJRkZFUkVOVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdICE9PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5FUVVBTDpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID09PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5SRUdFWFA6XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gIT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgICAgICAgICBgSW52YWxpZCByZWdleHAgY29tcGFyaXNvbiBvbiBhIG5vbiBzdHJpbmcgYXR0cmlidXRlOiAke21bYXR0cjEgYXMga2V5b2YgTW9kZWxdfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gISEobVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBzdHJpbmcpLm1hdGNoKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoY29tcGFyaXNvbiwgXCJnXCIpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlNNQUxMRVI6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA8IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlNNQUxMRVJfRVE6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA8PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgb3BlcmF0b3IgZm9yIHN0YW5kYXJkIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG9wMTogUmF3UmFtUXVlcnk8YW55PiA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgICAgICBhdHRyMSBhcyBDb25kaXRpb248TT5cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG9wMjogUmF3UmFtUXVlcnk8YW55PiA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgICAgICBjb21wYXJpc29uIGFzIENvbmRpdGlvbjxNPlxuICAgICAgICAgICk7XG4gICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICAgICAgcmV0dXJuIG9wMS53aGVyZShtKSAmJiBvcDIud2hlcmUobSk7XG4gICAgICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgICAgIHJldHVybiBvcDEud2hlcmUobSkgfHwgb3AyLndoZXJlKG0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgb3BlcmF0b3IgZm9yIEFuZC9PciBjb21wYXJpc29uczogJHtvcGVyYXRvcn1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0gYXMgUmF3UmFtUXVlcnk8YW55PjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb250ZXh0IGNsYXNzIGZvciBSQU0gYWRhcHRlciBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNwZWNpYWxpemVkIGNvbnRleHQgZm9yIFJBTSBhZGFwdGVyIG9wZXJhdGlvbnMsIGV4dGVuZGluZyB0aGUgYmFzZSBDb250ZXh0IHdpdGggUkFNLXNwZWNpZmljIGZsYWdzLiBUaGlzIGNvbnRleHQgaXMgdXNlZCB0byBwYXNzIG9wZXJhdGlvbiBwYXJhbWV0ZXJzIGFuZCB1c2VyIGluZm9ybWF0aW9uLlxuICogQGNsYXNzIFJhbUNvbnRleHRcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgUkFNIGNvbnRleHRcbiAqIGNvbnN0IGNvbnRleHQgPSBuZXcgUmFtQ29udGV4dCgpO1xuICogLy8gT3B0aW9uYWxseSBzZXQgYSBmbGFnXG4gKiBjb250ZXh0LnNldCgnVVVJRCcsICcxMjNlNDU2Ny1lODliLTEyZDMtYTQ1Ni00MjY2MTQxNzQwMDAnKTtcbiAqIC8vIEFjY2VzcyBhIGZsYWcgZnJvbSB0aGUgY29udGV4dFxuICogY29uc3QgdXVpZCA9IGNvbnRleHQuZ2V0KCdVVUlEJyk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFJhbUNvbnRleHRcbiAqICAgcGFydGljaXBhbnQgQmFzZUNvbnRleHQgYXMgQ29udGV4dFxuICogICBDYWxsZXItPj5SYW1Db250ZXh0OiBuZXcgUmFtQ29udGV4dCgpXG4gKiAgIFJhbUNvbnRleHQtPj5CYXNlQ29udGV4dDogc3VwZXIoKVxuICogICBSYW1Db250ZXh0LS0+PkNhbGxlcjogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbUNvbnRleHQgZXh0ZW5kcyBDb250ZXh0PFJhbUZsYWdzPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwsIGluZGV4LCB0YWJsZSB9IGZyb20gXCIuLi8uLi9tb2RlbFwiO1xuaW1wb3J0IHsgcGsgfSBmcm9tIFwiLi4vLi4vaWRlbnRpdHlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNIHNlcXVlbmNlIG1vZGVsIGZvciBhdXRvLWluY3JlbWVudGluZyB2YWx1ZXNcbiAqIEBzdW1tYXJ5IEEgbW9kZWwgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2VxdWVuY2UgaW4gdGhlIFJBTSBhZGFwdGVyLiBJdCBzdG9yZXMgdGhlIGN1cnJlbnQgdmFsdWVcbiAqIG9mIGEgc2VxdWVuY2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIGlkZW50aWZpZXJzIGZvciBlbnRpdGllcy5cbiAqIFRoZSBzZXF1ZW5jZSBpcyBpZGVudGlmaWVkIGJ5IGl0cyBJRCBhbmQgbWFpbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxTZXF1ZW5jZT59IHNlcSAtIEluaXRpYWwgc2VxdWVuY2UgZGF0YVxuICogQGNsYXNzIFNlcXVlbmNlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IHNlcXVlbmNlXG4gKiBjb25zdCBvcmRlclNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKHsgaWQ6ICdvcmRlcl9zZXEnLCBjdXJyZW50OiAxIH0pO1xuICpcbiAqIC8vIFVzZSB0aGUgc2VxdWVuY2UgdG8gZ2V0IHRoZSBuZXh0IHZhbHVlXG4gKiBjb25zdCBuZXh0T3JkZXJJZCA9IHBhcnNlSW50KG9yZGVyU2VxdWVuY2UuY3VycmVudC50b1N0cmluZygpKSArIDE7XG4gKiBvcmRlclNlcXVlbmNlLmN1cnJlbnQgPSBuZXh0T3JkZXJJZDtcbiAqIGBgYFxuICovXG5AdGFibGUoXCJfX1JhbVNlcXVlbmNlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJhbVNlcXVlbmNlTW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IGlkZW50aWZpZXIgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgQHBrKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBVc2VkIHRvIGdlbmVyYXRlIHRoZSBuZXh0IHNlcXVlbnRpYWwgdmFsdWVcbiAgICovXG4gIEByZXF1aXJlZCgpXG4gIEBpbmRleCgpXG4gIGN1cnJlbnQhOiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2VxPzogTW9kZWxBcmc8UmFtU2VxdWVuY2VNb2RlbD4pIHtcbiAgICBzdXBlcihzZXEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSYW1TZXF1ZW5jZU1vZGVsIH0gZnJvbSBcIi4vbW9kZWwvUmFtU2VxdWVuY2VNb2RlbFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBSYW1BZGFwdGVyIH0gZnJvbSBcIi4vUmFtQWRhcHRlclwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTS1zcGVjaWZpYyBzZXF1ZW5jZSBpbXBsZW1lbnRhdGlvblxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBTZXF1ZW5jZSBjbGFzcyB0byBwcm92aWRlIGF1dG8taW5jcmVtZW50aW5nIHNlcXVlbmNlIGZ1bmN0aW9uYWxpdHlcbiAqIGZvciB0aGUgUkFNIGFkYXB0ZXIuIFRoaXMgY2xhc3MgbWFuYWdlcyBzZXF1ZW5jZXMgc3RvcmVkIGluIG1lbW9yeSwgYWxsb3dpbmcgZm9yIHRoZSBnZW5lcmF0aW9uXG4gKiBvZiBzZXF1ZW50aWFsIGlkZW50aWZpZXJzIGZvciBlbnRpdGllcy5cbiAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAqIEBwYXJhbSB7UmFtQWRhcHRlcn0gYWRhcHRlciAtIFRoZSBSQU0gYWRhcHRlciBpbnN0YW5jZSB0byB1c2UgZm9yIHN0b3JhZ2VcbiAqIEBjbGFzcyBSYW1TZXF1ZW5jZVxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBudW1lcmljIHNlcXVlbmNlIHN0YXJ0aW5nIGF0IDFcbiAqIGNvbnN0IHNlcXVlbmNlID0gbmV3IFJhbVNlcXVlbmNlKHtcbiAqICAgbmFtZTogJ29yZGVyX3NlcXVlbmNlJyxcbiAqICAgdHlwZTogJ051bWJlcicsXG4gKiAgIHN0YXJ0V2l0aDogMSxcbiAqICAgaW5jcmVtZW50Qnk6IDFcbiAqIH0sIHJhbUFkYXB0ZXIpO1xuICpcbiAqIC8vIEdldCB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAqIGNvbnN0IG5leHRJZCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAqXG4gKiAvLyBHZXQgYSByYW5nZSBvZiB2YWx1ZXNcbiAqIGNvbnN0IGlkUmFuZ2UgPSBhd2FpdCBzZXF1ZW5jZS5yYW5nZSg1KTsgLy8gUmV0dXJucyA1IHNlcXVlbnRpYWwgdmFsdWVzXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbVNlcXVlbmNlIGV4dGVuZHMgU2VxdWVuY2Uge1xuICBwcm90ZWN0ZWQgcmVwbzogUmVwbzxSYW1TZXF1ZW5jZU1vZGVsPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsIGFkYXB0ZXI6IFJhbUFkYXB0ZXIpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKFJhbVNlcXVlbmNlTW9kZWwsIGFkYXB0ZXIuYWxpYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlIGZyb20gc3RvcmFnZS4gSWYgdGhlIHNlcXVlbmNlXG4gICAqIGRvZXNuJ3QgZXhpc3QgeWV0LCBpdCByZXR1cm5zIHRoZSBjb25maWd1cmVkIHN0YXJ0aW5nIHZhbHVlLlxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHNlcXVlbmNlIHZhbHVlXG4gICAqL1xuICBhc3luYyBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VxdWVuY2U6IFJhbVNlcXVlbmNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChuYW1lIGFzIHN0cmluZyk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZShzZXF1ZW5jZS5jdXJyZW50IGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydFdpdGggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBcIlN0YXJ0aW5nIHZhbHVlIGlzIG5vdCBkZWZpbmVkIGZvciBhIG5vbiBleGlzdGluZyBzZXF1ZW5jZVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShzdGFydFdpdGgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgaW5pdGlhbCB2YWx1ZSBmb3Igc2VxdWVuY2UgJHtzdGFydFdpdGh9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJldHJpZXZlIGN1cnJlbnQgdmFsdWUgZm9yIHNlcXVlbmNlICR7bmFtZX06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBzZXF1ZW5jZSB0eXBlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBzZXF1ZW5jZSAoc3RyaW5nLCBudW1iZXIsIG9yIGJpZ2ludClcbiAgICogdXNpbmcgdGhlIGJhc2UgU2VxdWVuY2UgY2xhc3MncyBwYXJzZVZhbHVlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gVGhlIHBhcnNlZCB2YWx1ZSBpbiB0aGUgY29ycmVjdCB0eXBlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluY3JlbWVudHMgdGhlIHNlcXVlbmNlIHZhbHVlXG4gICAqIEBzdW1tYXJ5IEluY3JlYXNlcyB0aGUgY3VycmVudCBzZXF1ZW5jZSB2YWx1ZSBieSB0aGUgc3BlY2lmaWVkIGFtb3VudCBhbmQgcGVyc2lzdHNcbiAgICogdGhlIG5ldyB2YWx1ZSB0byBzdG9yYWdlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggbnVtZXJpYyBhbmQgQmlnSW50IHNlcXVlbmNlIHR5cGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gY3VycmVudCAtIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2NvdW50XSAtIE9wdGlvbmFsIGFtb3VudCB0byBpbmNyZW1lbnQgYnksIGRlZmF1bHRzIHRvIHRoZSBzZXF1ZW5jZSdzIGluY3JlbWVudEJ5IHZhbHVlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBzZXF1ZW5jZSB2YWx1ZSBhZnRlciBpbmNyZW1lbnRpbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5jcmVtZW50KFxuICAgIGN1cnJlbnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICBjb3VudD86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgdHlwZSwgaW5jcmVtZW50QnksIG5hbWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIGNvbnN0IHRvSW5jcmVtZW50QnkgPSBjb3VudCB8fCBpbmNyZW1lbnRCeTtcbiAgICBpZiAodG9JbmNyZW1lbnRCeSAlIGluY3JlbWVudEJ5ICE9PSAwKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBWYWx1ZSB0byBpbmNyZW1lbnQgZG9lcyBub3QgY29uc2lkZXIgdGhlIGluY3JlbWVudEJ5IHNldHRpbmc6ICR7aW5jcmVtZW50Qnl9YFxuICAgICAgKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgbmV4dCA9ICh0aGlzLnBhcnNlKGN1cnJlbnQpIGFzIG51bWJlcikgKyB0b0luY3JlbWVudEJ5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJCaWdJbnRcIjpcbiAgICAgICAgbmV4dCA9ICh0aGlzLnBhcnNlKGN1cnJlbnQpIGFzIGJpZ2ludCkgKyBCaWdJbnQodG9JbmNyZW1lbnRCeSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICBuZXh0ID0gdGhpcy5wYXJzZShjdXJyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gICAgfVxuICAgIGxldCBzZXE6IFJhbVNlcXVlbmNlTW9kZWw7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMucmVwby5vdmVycmlkZSh7XG4gICAgICBpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXM6IFtcInVwZGF0ZWRPblwiXSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgc2VxID0gYXdhaXQgcmVwby51cGRhdGUobmV3IFJhbVNlcXVlbmNlTW9kZWwoeyBpZDogbmFtZSwgY3VycmVudDogbmV4dCB9KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHNlcSA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBSYW1TZXF1ZW5jZU1vZGVsKHsgaWQ6IG5hbWUsIGN1cnJlbnQ6IG5leHQgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXEuY3VycmVudCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UgYW5kIGluY3JlbWVudHMgaXQgYnkgdGhlXG4gICAqIGNvbmZpZ3VyZWQgaW5jcmVtZW50IGFtb3VudC4gVGhpcyBpcyB0aGUgbWFpbiBtZXRob2QgdXNlZCB0byBnZXQgYSBuZXcgc2VxdWVudGlhbCB2YWx1ZS5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5jdXJyZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50KGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSByYW5nZSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIGZyb20gdGhlIHNlcXVlbmNlLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGFsbG9jYXRlIG11bHRpcGxlIElEcyBhdCBvbmNlLlxuICAgKiBUaGUgbWV0aG9kIGluY3JlbWVudHMgdGhlIHNlcXVlbmNlIGJ5IHRoZSB0b3RhbCBhbW91bnQgbmVlZGVkIGFuZCByZXR1cm5zIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIGdlbmVyYXRlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gKGF3YWl0IHRoaXMuY3VycmVudCgpKSBhcyBudW1iZXI7XG4gICAgY29uc3QgaW5jcmVtZW50QnkgPSB0aGlzLnBhcnNlKFxuICAgICAgdGhpcy5vcHRpb25zLmluY3JlbWVudEJ5IGFzIG51bWJlclxuICAgICkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IGF3YWl0IHRoaXMuaW5jcmVtZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgICh0aGlzLnBhcnNlKGNvdW50KSBhcyBudW1iZXIpICogaW5jcmVtZW50QnlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlOiAobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICByYW5nZS5wdXNoKGN1cnJlbnQgKyBpbmNyZW1lbnRCeSAqICh0aGlzLnBhcnNlKGkpIGFzIG51bWJlcikpO1xuICAgIH1cbiAgICBpZiAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT09IG5leHQgJiYgdGhpcy5vcHRpb25zLnR5cGUgIT09IFwiU3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc2NhbGN1bGF0aW9uIG9mIHJhbmdlXCIpO1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsXCI7XG5pbXBvcnQgeyBSYW1GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNyZWF0ZWQgYnkgZmllbGQgb24gYSBtb2RlbCBkdXJpbmcgUkFNIGNyZWF0ZS91cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQXV0b21hdGljYWxseSBwb3B1bGF0ZXMgYSBtb2RlbCBmaWVsZCB3aXRoIHRoZSBVVUlEIGZyb20gdGhlIGNvbnRleHQgZHVyaW5nIGNyZWF0ZSBvciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGhhbmRsZXIgZm9yIFJBTSBvcGVyYXRpb25zIHRvIHRyYWNrIGVudGl0eSBjcmVhdGlvbi5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBvZiB0aGUgbW9kZWwgYmVpbmcgY3JlYXRlZC91cGRhdGVkXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgb2YgdGhlIHJlcG9zaXRvcnkgaGFuZGxpbmcgdGhlIG1vZGVsXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUeXBlIG9mIHRoZSBSQU0gZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIHVzZXIgaWRlbnRpZmljYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSBVVUlEXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQvdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmllbGQgaGFzIGJlZW4gc2V0XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQGNhdGVnb3J5IFJhbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJhbUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gIGlmICghdXVpZClcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICAgKTtcbiAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIHRoZSBSQU0gYWRhcHRlclxuICogQHN1bW1hcnkgQSBjb25zdGFudCBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBSQU0gYWRhcHRlciBpbiB0aGUgc3lzdGVtLiBVc2VkIGZvciBhZGFwdGVyIHR5cGUgaWRlbnRpZmljYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gYWNyb3NzIHRoZSBjb3JlIG1vZHVsZS5cbiAqIEBjb25zdCBSYW1GbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IGNvbnN0IFJhbUZsYXZvdXIgPSBcInJhbVwiO1xuIiwiaW1wb3J0IHtcbiAgUmFtRmxhZ3MsXG4gIFJhd1JhbVF1ZXJ5LFxuICBSYW1TdG9yYWdlLFxuICBSYW1SZXBvc2l0b3J5LFxuICBSYW1Db25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSYW1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9SYW1TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJhbUNvbnRleHQgfSBmcm9tIFwiLi9SYW1Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzLCBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvY2sgfSBmcm9tIFwiQGRlY2FmLXRzL3RyYW5zYWN0aW9uYWwtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGhhc2hPYmosXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1TZXF1ZW5jZSB9IGZyb20gXCIuL1JhbVNlcXVlbmNlXCI7XG5pbXBvcnQgeyBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuL2hhbmRsZXJzXCI7XG5pbXBvcnQgeyBSYW1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChSYW1GbGF2b3VyKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IGFkYXB0ZXIgZm9yIGRhdGEgcGVyc2lzdGVuY2VcbiAqIEBzdW1tYXJ5IFRoZSBSYW1BZGFwdGVyIHByb3ZpZGVzIGFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuXG4gKiBJdCBzdG9yZXMgZGF0YSBpbiBKYXZhU2NyaXB0IE1hcHMgYW5kIHByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgcXVlcnkgY2FwYWJpbGl0aWVzLlxuICogVGhpcyBhZGFwdGVyIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgcHJvdG90eXBpbmcsIGFuZCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCByZXF1aXJlXG4gKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWNyb3NzIGFwcGxpY2F0aW9uIHJlc3RhcnRzLlxuICogQGNsYXNzIFJhbUFkYXB0ZXJcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgUkFNIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUmFtQWRhcHRlcignbXlSYW1BZGFwdGVyJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShVc2VyLCBhZGFwdGVyKTtcbiAqXG4gKiAvLyBQZXJmb3JtIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYXdhaXQgdXNlclJlcG8uY3JlYXRlKHVzZXIpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLmZpbmRCeUlkKHVzZXIuaWQpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICpcbiAqICAgQ2xpZW50LT4+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+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKTogdm9pZCB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IFJhbVN0b3JhZ2Uge1xuICAgIHJldHVybiBuZXcgTWFwKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBtb2R1bGUgZm9yIHRoZSBEZWNhZiBUeXBlU2NyaXB0IGZyYW1ld29ya1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnRzIG9mIHRoZSBEZWNhZiBmcmFtZXdvcmssIGluY2x1ZGluZyBpZGVudGl0eSBtYW5hZ2VtZW50LFxuICogbW9kZWwgZGVmaW5pdGlvbnMsIHJlcG9zaXRvcnkgcGF0dGVybnMsIHBlcnNpc3RlbmNlIGxheWVyLCBxdWVyeSBidWlsZGluZywgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLlxuICogSXQgZXhwb3J0cyBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCBzZXRzIHVwIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5IGZvciByZXBvc2l0b3J5IGRlY29yYXRvcnMuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZXNSZWdpc3RyeSB9IGZyb20gXCIuL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcblxuLy8gb3ZlcnJpZGVzIHRoZSBwcmV2aW91cyBJbmplY3RhYmxlcyByZWdpc3RyeSB0byBlbmFibGUgdGhlIEByZXBvc2l0b3J5IGRlY29yYXRvclxuSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVzUmVnaXN0cnkoKSk7XG5cbi8vIGltcG9ydGVkIGZpcnN0IG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9xdWVyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JhbS9SYW1BZGFwdGVyXCI7XG4vL2xlZnQgdG8gbGFzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAc3VtbWFyeSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIlJlcG9zaXRvcnkiLCJSZXBvIiwiUmVwIiwicG9wdWxhdGUiLCJwb3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7OztBQU1HO0lBQ1M7QUFBWixDQUFBLFVBQVksZUFBZSxFQUFBOztBQUV6QixJQUFBLGVBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUdmLElBQUEsZUFBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCOztBQUdqQixJQUFBLGVBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjs7QUFHbkIsSUFBQSxlQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsMkJBQXdDOztBQUd4QyxJQUFBLGVBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUdmLElBQUEsZUFBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCOztBQUdqQixJQUFBLGVBQUEsQ0FBQSxVQUFBLENBQUEsR0FBQSxZQUF1Qjs7O0FBSXZCLElBQUEsZUFBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdB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