@decaf-ts/decoration 0.0.19 → 0.0.20

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.
@@ -271,14 +271,14 @@ class Metadata {
271
271
  return this.get(model, [DecorationKeys.PROPERTIES, prop].join(this.splitter));
272
272
  }
273
273
  /**
274
- * @description Resolves the canonical constructor associated with the provided model handle.
274
+ * @description Resolves the canonical constructor associated with the provided model handle and metadata.
275
275
  * @summary Returns the stored constructor reference when the provided model is a proxy or reduced value. Falls back to the original model when no constructor metadata has been recorded yet.
276
276
  * @template M
277
277
  * @param {Constructor<M>} model Model used when recording metadata.
278
- * @return {Constructor<M>|undefined} Canonical constructor if stored, otherwise `undefined`.
278
+ * @return {Constructor<M>} Canonical constructor if stored, otherwise the provided one`.
279
279
  */
280
280
  static constr(model) {
281
- return model[DecorationKeys.CONSTRUCTOR];
281
+ return model[DecorationKeys.CONSTRUCTOR] || model;
282
282
  }
283
283
  /**
284
284
  * @description Retrieves metadata for a model or a specific key within it.
@@ -292,7 +292,7 @@ class Metadata {
292
292
  static get(model, key) {
293
293
  if (key === DecorationKeys.CONSTRUCTOR)
294
294
  return this.constr(model);
295
- const resolvedModel = this.constr(model) || model;
295
+ const resolvedModel = this.constr(model);
296
296
  const constructors = this.collectConstructorChain(resolvedModel);
297
297
  if (constructors.length === 0) {
298
298
  const fallbackSymbol = Symbol.for(resolvedModel.toString());
@@ -970,8 +970,8 @@ function description(desc) {
970
970
  * @const VERSION
971
971
  * @memberOf module:decoration
972
972
  */
973
- const VERSION = "0.0.18";
973
+ const VERSION = "0.0.19";
974
974
  Metadata.registerLibrary("@decaf-ts/decoration", VERSION);
975
975
 
976
976
  export { Decoration, DecorationKeys, DefaultFlavour, DefaultMetadata, Metadata, ObjectKeySplitter, VERSION, apply, description, getValueBySplitter, metadata, method, methodMetadata, param, paramMetadata, prop, propMetadata, setValueBySplitter };
977
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21ldGFkYXRhL01ldGFkYXRhLnRzIiwiLi4vc3JjL2RlY29yYXRpb24vRGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2ljTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZsYXZvdXIgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvciBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBmYWxsYmFjayBmbGF2b3VyIHVzZWQgd2hlbiBubyBzcGVjaWZpYyB2YWx1ZSBpcyBwcm92aWRlZCwgZW5zdXJpbmcgY29uc2lzdGVudCBkZWNvcmF0b3Igc2VsZWN0aW9uIGFjcm9zcyB0aGUgbGlicmFyeS5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAY29uc3QgRGVmYXVsdEZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEZsYXZvdXIgPSBcImRlY2FmXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoYXJhY3RlciB1c2VkIHRvIHNwbGl0IG5lc3RlZCBtZXRhZGF0YSBrZXlzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVsaW1pdGVyIGFwcGxpZWQgYnkgdGhlIG1ldGFkYXRhIHN0b3JlIHdoZW4gdHJhdmVyc2luZyBuZXN0ZWQgb2JqZWN0IHBhdGhzIGZvciByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBPYmplY3RLZXlTcGxpdHRlclxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSB0b2tlbiByZWdpc3RyeSBmb3IgdGhlIGRlY29yYXRpb24gc3lzdGVtLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUga2V5cyB1c2VkIGR1cmluZyByZWZsZWN0aW9uIGFuZCBtZXRhZGF0YSBzdG9yYWdlIGZvciBjbGFzc2VzLCBwcm9wZXJ0aWVzLCBtZXRob2RzLCBkZXNjcmlwdGlvbnMsIGFuZCByZWdpc3RlcmVkIGxpYnJhcmllcy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBjb25zdCBEZWNvcmF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIERlY29yYXRpb25LZXlzIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIGJ1Y2tldCBmb3IgZGVjb3JhdGlvbi1hd2FyZSBsaWJyYXJ5IHJlZ2lzdHJhdGlvbnMuICovXG4gIExJQlJBUklFUyA9IFwibGlicmFyaWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBrZXkgbWlycm9yZWQgb24gY29uc3RydWN0b3JzIHRoYXQgaG9sZHMgcnVudGltZSBtZXRhZGF0YS4gKi9cbiAgUkVGTEVDVCA9IGBfXyR7RGVmYXVsdEZsYXZvdXJ9YCxcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb250YWluZXIgb2YgcmVmbGVjdGVkIHByb3BlcnR5IG1ldGFkYXRhIGZvciBhIG1vZGVsLiAqL1xuICBQUk9QRVJUSUVTID0gXCJwcm9wZXJ0aWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29udGFpbmVyIG9mIHJlZmxlY3RlZCBtZXRob2QgbWV0YWRhdGEgZm9yIGEgbW9kZWwuICovXG4gIE1FVEhPRFMgPSBcIm1ldGhvZHNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgdW5kZXIgd2hpY2ggdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBpcyBwZXJzaXN0ZWQuICovXG4gIENMQVNTID0gXCJjbGFzc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBmb3IgY2xhc3NlcyBhbmQgbWVtYmVycy4gKi9cbiAgREVTQ1JJUFRJT04gPSBcImRlc2NyaXB0aW9uXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBzbG90IHRyYWNraW5nIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciB3aGVuIG92ZXJyaWRkZW4uICovXG4gIENPTlNUUlVDVE9SID0gXCJfX29yaWdpbmFsXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29sbGVjdGVkIHBhcmFtZXRlciBtZXRhZGF0YSBmb3IgY29uZmlndXJlZCBkZWNvcmF0b3JzLiAqL1xuICBQQVJBTUVURVJTID0gXCJwYXJhbWV0ZXJzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS4gKi9cbiAgREVTSUdOX1RZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIHJlY29yZGVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcy4gKi9cbiAgREVTSUdOX1BBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgYSBtZXRob2QncyByZXR1cm4gdHlwZS4gKi9cbiAgREVTSUdOX1JFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBtZXRhZGF0YSBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBkZWZhdWx0IG1ldGFkYXRhIHNoYXBlIHVzZWQgd2hlbiBpbml0aWFsaXNpbmcgbmV3IG1ldGFkYXRhIGVudHJpZXMgZm9yIGEgbW9kZWwuXG4gKiBAdHlwZSB7bW9kdWxlOmRlY29yYXRpb24uQmFzaWNNZXRhZGF0YTxhbnk+fVxuICogQGNvbnN0IERlZmF1bHRNZXRhZGF0YVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TWV0YWRhdGE6IEJhc2ljTWV0YWRhdGE8YW55PiA9IHtcbiAgW0RlY29yYXRpb25LZXlzLlBST1BFUlRJRVNdOiBbXSxcbn0gYXMgdW5rbm93biBhcyBCYXNpY01ldGFkYXRhPGFueT47XG4iLCJpbXBvcnQgeyBCYXNpY01ldGFkYXRhLCBDb25zdHJ1Y3RvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cywgT2JqZWN0S2V5U3BsaXR0ZXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCBnaXZlbiBhIHBhdGguXG4gKiBAc3VtbWFyeSBXYWxrcyBhbiBvYmplY3Qgc3RydWN0dXJlIHVzaW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIHJldHVybnMgdGhlIHZhbHVlIGF0IHRoYXQgbG9jYXRpb24gb3IgYHVuZGVmaW5lZGAgaWYgYW55IGtleSBpcyBtaXNzaW5nLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IHRvIHRyYXZlcnNlIGZvciB0aGUgbG9va3VwLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggU3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggdG8gdGhlIGRlc2lyZWQgdmFsdWUgKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBEZWxpbWl0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cy5cbiAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IFZhbHVlIHJlc29sdmVkIGF0IHRoZSBnaXZlbiBwYXRoIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGZvdW5kLlxuICogQGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIGdldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICogICBDLT4+RjogKG9iaiwgcGF0aCwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIEYtPj5POiBhY2Nlc3MgY3VycmVudFtrZXldXG4gKiAgICAgYWx0IG1pc3Npbmcgb3IgbnVsbGlzaFxuICogICAgICAgRi0tPj5DOiByZXR1cm4gdW5kZWZpbmVkXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBGLS0+PkM6IHJldHVybiBmaW5hbCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICBzcGxpdHRlcjogc3RyaW5nID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgYSBuZXN0ZWQgdmFsdWUgb24gYW4gb2JqZWN0IGdpdmVuIGEgcGF0aC5cbiAqIEBzdW1tYXJ5IFRyYXZlcnNlcyBvciBjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzIGZvbGxvd2luZyBhIHNwbGl0dGVyLWRlbGltaXRlZCBwYXRoIGFuZCBhc3NpZ25zIHRoZSBwcm92aWRlZCB2YWx1ZSBhdCB0aGUgZGVzdGluYXRpb24ga2V5LlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IHRvIG11dGF0ZSB3aGlsZSBkcmlsbGluZyBpbnRvIG5lc3RlZCBrZXlzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggU3BsaXR0ZXItZGVsaW1pdGVkIGRlc3RpbmF0aW9uIHBhdGggKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzcGxpdHRlcj1PYmplY3RLZXlTcGxpdHRlcl0gRGVsaW1pdGVyIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHBhdGggc2VnbWVudHMuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIHNldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICogICBDLT4+RjogKG9iaiwgcGF0aCwgdmFsdWUsIHNwbGl0dGVyKVxuICogICBGLT4+Rjogc3BsaXQgcGF0aCBpbnRvIGtleXNcbiAqICAgbG9vcCBmb3IgZWFjaCBrZXlcbiAqICAgICBhbHQga2V5IG1pc3NpbmdcbiAqICAgICAgIEYtPj5POiBjcmVhdGUgaW50ZXJtZWRpYXRlIG9iamVjdFxuICogICAgIGVsc2Uga2V5IGV4aXN0c1xuICogICAgICAgRi0+Pk86IGRlc2NlbmQgaW50byBleGlzdGluZyBvYmplY3RcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+Qzogdm9pZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyXG4pOiB2b2lkIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnQ6IFJlY29yZDxhbnksIGFueT4gPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgaWYgKFxuICAgICAgY3VycmVudFtrZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIlxuICAgICkge1xuICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICBjdXJyZW50W2xhc3RLZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWxpemVkIHJ1bnRpbWUgbWV0YWRhdGEgc3RvcmUgYm91bmQgdG8gY29uc3RydWN0b3JzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdXRpbGl0aWVzIHRvIHJlYWQgYW5kIHdyaXRlIHN0cnVjdHVyZWQgbWV0YWRhdGEgZm9yIGNsYXNzZXMgYW5kIHRoZWlyIG1lbWJlcnMsIHdpdGggb3B0aW9uYWwgbWlycm9yaW5nIG9udG8gdGhlIGNvbnN0cnVjdG9yIHZpYSBhIHdlbGwta25vd24gc3ltYm9sIGtleS4gU3VwcG9ydHMgbmVzdGVkIGtleSBwYXRocyB1c2luZyBhIGNvbmZpZ3VyYWJsZSBzcGxpdHRlciBhbmQgb2ZmZXJzIGJvdGggaW5zdGFuY2UgYW5kIHN0YXRpYyBBUElzLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhlIG1ldGFkYXRhIGJlbG9uZ3MgdG8uXG4gKiBAdGVtcGxhdGUgTUVUQSBFeHRlbmRzIEJhc2ljTWV0YWRhdGE8TT4gcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXI9RGVmYXVsdEZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgaWRlbnRpZmllciBhcHBsaWVkIHdoZW4gaW5zdGFudGlhdGluZyBoZWxwZXIgYnVpbGRlcnMuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYW5kIHJlYWQgbWV0YWRhdGEgZm9yIGEgY2xhc3NcbiAqIGNsYXNzIFVzZXIgeyBuYW1lITogc3RyaW5nIH1cbiAqIE1ldGFkYXRhLnNldChVc2VyLCBcImRlc2NyaXB0aW9uLmNsYXNzXCIsIFwiQSB1c2VyIG1vZGVsXCIpO1xuICogTWV0YWRhdGEuc2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIsIFN0cmluZyk7XG4gKiBjb25zdCBkZXNjID0gTWV0YWRhdGEuZ2V0KFVzZXIsIFwiZGVzY3JpcHRpb24uY2xhc3NcIik7IC8vIFwiQSB1c2VyIG1vZGVsXCJcbiAqIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKFVzZXIsIFwibmFtZVwiKTsgLy8gU3RyaW5nXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29uc3RydWN0b3JcbiAqICAgcGFydGljaXBhbnQgUyBhcyBNZXRhZGF0YSAoc3RhdGljKVxuICogICBDLT4+Uzogc2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIsIFN0cmluZylcbiAqICAgQy0+PlM6IGdldChVc2VyLCBcInByb3BlcnRpZXMubmFtZVwiKVxuICogICBTLS0+PkM6IFN0cmluZ1xuICovXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluLW1lbW9yeSBzdG9yYWdlIG9mIG1ldGFkYXRhIGJ5IGNvbnN0cnVjdG9yIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBNYXBzIGEgU3ltYm9sIGRlcml2ZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgdG8gaXRzIG1ldGFkYXRhIG9iamVjdCwgZW5hYmxpbmcgZWZmaWNpZW50IGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9tZXRhZGF0YTogUmVjb3JkPHN5bWJvbCwgYW55PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGF0aCBkZWxpbWl0ZXIgZm9yIG5lc3RlZCBtZXRhZGF0YSBrZXlzXG4gICAqIEBzdW1tYXJ5IFVzZWQgYnkgZ2V0L3NldCBvcGVyYXRpb25zIHRvIG5hdmlnYXRlIG5lc3RlZCBzdHJ1Y3R1cmVzLCBkZWZhdWx0cyB0byBPYmplY3RLZXlTcGxpdHRlci5cbiAgICovXG4gIHN0YXRpYyBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN5bWJvbCBrZXkgdXNlZCB0byBtaXJyb3IgbWV0YWRhdGEgb24gdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFdoZW4gbWlycm9yaW5nIGlzIGVuYWJsZWQsIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgZGVmaW5lZCBvbiB0aGUgY29uc3RydWN0b3IgdW5kZXIgdGhpcyBub24tZW51bWVyYWJsZSBrZXkuXG4gICAqL1xuICBzdGF0aWMgYmFzZUtleSA9IERlY29yYXRpb25LZXlzLlJFRkxFQ1Q7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBtZXRhZGF0YSBpcyBtaXJyb3JlZCBvbnRvIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgZGVmaW5lZCBvbiB0aGUgY29uc3RydWN0b3IgdW5kZXIgdGhlIG5vbi1lbnVtZXJhYmxlIGJhc2VLZXkuXG4gICAqL1xuICBzdGF0aWMgbWlycm9yOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgU3ltYm9sPE0+KG9iajogQ29uc3RydWN0b3I8TT4pIHtcbiAgICByZXR1cm4gU3ltYm9sLmZvcihbb2JqLnRvU3RyaW5nKCksIG9iai5uYW1lXS5qb2luKFwiIC0gXCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMga25vd24gcHJvcGVydHkga2V5cyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSByZWNvcmRlZCB0eXBlIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgcHJvcGVydHkgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHJldHVybiB7c3RyaW5nW118dW5kZWZpbmVkfSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvciBgdW5kZWZpbmVkYCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgcHJvcGVydGllcyhtb2RlbDogQ29uc3RydWN0b3IpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3RzIGtub3duIG1ldGhvZHMgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSBhbmQgcmV0dXJucyB0aGUgbWV0aG9kIG5hbWVzIHRoYXQgaGF2ZSByZWNvcmRlZCBzaWduYXR1cmUgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIG1ldGhvZCBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIG1ldGhvZCBuYW1lcyBvciBgdW5kZWZpbmVkYCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgbWV0aG9kcyhtb2RlbDogQ29uc3RydWN0b3IpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsLCBEZWNvcmF0aW9uS2V5cy5NRVRIT0RTKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgYSBjbGFzcyBvciBhIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCB0aGUgZGVzY3JpcHRpb24gc3RvcmVkIHVuZGVyIHRoZSBtZXRhZGF0YSBcImRlc2NyaXB0aW9uXCIgbWFwLiBJZiBhIHByb3BlcnR5IGtleSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgcHJvcGVydHkncyBkZXNjcmlwdGlvbjsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgZGVzY3JpcHRpb24gaXMgYmVpbmcgcmV0cmlldmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BdIE9wdGlvbmFsIHByb3BlcnR5IGtleSAodHlwZWQgYXMgYGtleW9mIE1gKSBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIGRlc2NyaXB0aW9uLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfSBEZXNjcmlwdGlvbiB0ZXh0IGlmIHByZXNlbnQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHN0YXRpYyBkZXNjcmlwdGlvbjxNPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcHJvcD86IGtleW9mIE1cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTiwgcHJvcCA/IHByb3AgOiBEZWNvcmF0aW9uS2V5cy5DTEFTU10uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgcGFyYW1zIGZvciBhIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBtZXRob2RzLjxwcm9wPi5kZXNpZ246cGFyYW10eXBlc2AgdG8gcmV0dXJuIHRoZSBwYXJhbWV0ZXIgY29uc3RydWN0b3JzIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igb3duaW5nIHRoZSBtZXRob2QgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqIEByZXR1cm4ge2FueVtdfHVuZGVmaW5lZH0gQXJyYXkgb2YgY29uc3RydWN0b3IgcmVmZXJlbmNlcyBkZXNjcmliaW5nIGVhY2ggcGFyYW1ldGVyIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyBwYXJhbXM8TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+LCBwcm9wOiBzdHJpbmcpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwgRGVjb3JhdGlvbktleXMuREVTSUdOX1BBUkFNU10uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNpbmdsZSByZWNvcmRlZCBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IExvb2tzIHVwIHRoZSBwYXJhbWV0ZXIgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBpbmRleCwgZW5mb3JjaW5nIGJvdW5kcyBhbmQgcmV0dXJuaW5nIHRoZSBjb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoYXQgYXJndW1lbnQuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciBvd25pbmcgdGhlIG1ldGhvZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcGFyYW1ldGVyIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSBwYXJhbWV0ZXIgb3IgYHVuZGVmaW5lZGAgaWYgbm90IHJlY29yZGVkLlxuICAgKi9cbiAgc3RhdGljIHBhcmFtPE0+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBwcm9wOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zKG1vZGVsLCBwcm9wKTtcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoaW5kZXggPiBwYXJhbXMubGVuZ3RoIC0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhcmFtZXRlciBpbmRleCAke2luZGV4fSBvdXQgb2YgcmFuZ2UgZm9yICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhcmFtc1tpbmRleF07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgcmV0dXJuIHR5cGUgZm9yIGEgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYG1ldGhvZHMuPHByb3A+LmRlc2lnbjpyZXR1cm50eXBlYCB0byByZXR1cm4gdGhlIHJldHVybiB0eXBlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgbWV0aG9kIG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHJldHVybiB0eXBlIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSByZXR1cm4gdHlwZSBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBzdGF0aWMgcmV0dXJuPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgcHJvcDogc3RyaW5nKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLCBwcm9wLCBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUkVUVVJOXS5qb2luKFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCBkZXNpZ24gdHlwZSBmb3IgYSBwcm9wZXJ0eS5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBwcm9wZXJ0aWVzLjxwcm9wPmAgdG8gcmV0dXJuIHRoZSBjb25zdHJ1Y3RvciByZWNvcmRlZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0eSBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lIHdob3NlIHR5cGUgbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3Rvcnx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHByb3BlcnR5IHR5cGUgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3RvciwgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcF0uam9pbih0aGlzLnNwbGl0dGVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBjYW5vbmljYWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBtb2RlbCBoYW5kbGUuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHN0b3JlZCBjb25zdHJ1Y3RvciByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvdmlkZWQgbW9kZWwgaXMgYSBwcm94eSBvciByZWR1Y2VkIHZhbHVlLiBGYWxscyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCB3aGVuIG5vIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGhhcyBiZWVuIHJlY29yZGVkIHlldC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgTW9kZWwgdXNlZCB3aGVuIHJlY29yZGluZyBtZXRhZGF0YS5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8TT58dW5kZWZpbmVkfSBDYW5vbmljYWwgY29uc3RydWN0b3IgaWYgc3RvcmVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBzdGF0aWMgY29uc3RyPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBtb2RlbFtEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIGFzXG4gICAgICB8IENvbnN0cnVjdG9yPE0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZC5cbiAgICogQHJldHVybiB7TUVUQXx1bmRlZmluZWR9IE1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0PE0sIE1FVEEgZXh0ZW5kcyBCYXNpY01ldGFkYXRhPE0+ID0gQmFzaWNNZXRhZGF0YTxNPj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IE1FVEEgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOZXN0ZWQga2V5IHBhdGggdG8gZmV0Y2ggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICogQHJldHVybiB7TUVUQXwqfHVuZGVmaW5lZH0gTWV0YWRhdGEgb2JqZWN0LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yLCBrZXk6IHN0cmluZyk6IGFueTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT58c3RyaW5nfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZCBvciBhIHByZS1yZXNvbHZlZCBzeW1ib2wgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIE9wdGlvbmFsIG5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtNRVRBfCp8dW5kZWZpbmVkfSBNZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleT86IHN0cmluZykge1xuICAgIGlmIChrZXkgPT09IERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SKSByZXR1cm4gdGhpcy5jb25zdHIobW9kZWwpO1xuICAgIGNvbnN0IHJlc29sdmVkTW9kZWwgPSB0aGlzLmNvbnN0cihtb2RlbCkgfHwgbW9kZWw7XG4gICAgY29uc3QgY29uc3RydWN0b3JzID0gdGhpcy5jb2xsZWN0Q29uc3RydWN0b3JDaGFpbihyZXNvbHZlZE1vZGVsKTtcbiAgICBpZiAoY29uc3RydWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tTeW1ib2wgPSBTeW1ib2wuZm9yKHJlc29sdmVkTW9kZWwudG9TdHJpbmcoKSk7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lckdldChmYWxsYmFja1N5bWJvbCwga2V5KTtcbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGVkVmFsdWVzID0gY29uc3RydWN0b3JzXG4gICAgICAubWFwKChjdG9yKSA9PiB0aGlzLmlubmVyR2V0KHRoaXMuU3ltYm9sKGN0b3IpLCBrZXkpKVxuICAgICAgLmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGNvbGxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5tZXJnZU1ldGFkYXRhQ2hhaW4oY29sbGVjdGVkVmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIHN0b3JlZCB1bmRlciBhIHN5bWJvbCBrZXkuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGhlbHBlciB0aGF0IHJlc29sdmVzIGFuZCBvcHRpb25hbGx5IGRyaWxscyBpbnRvIHRoZSBpbi1tZW1vcnkgbWV0YWRhdGEgbWFwIGZvciB0aGUgcHJvdmlkZWQgc3ltYm9sIGFuZCBrZXkgcGF0aC5cbiAgICogQHBhcmFtIHtzeW1ib2x9IHN5bWJvbCBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBidWNrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gW2tleV0gT3B0aW9uYWwgbmVzdGVkIGtleSByZWZlcmVuY2luZyBhIHNwZWNpZmljIG1ldGFkYXRhIGVudHJ5LlxuICAgKiBAcmV0dXJuIHthbnl9IFN0b3JlZCBtZXRhZGF0YSBvYmplY3Qgb3IgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBrZXksIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5uZXJHZXQoc3ltYm9sOiBzeW1ib2wsIGtleT86IHN0cmluZyB8IHN5bWJvbCkge1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gZ2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdGhpcy5zcGxpdHRlcik7XG4gICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF1ba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBmb3IgYSBjb25zdHJ1Y3Rvciwgb3JkZXJlZCBmcm9tIGJhc2UgdG8gbW9zdC1zcGVjaWZpYyBjbGFzcy5cbiAgICogQHN1bW1hcnkgV2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBzdGFydGluZyBmcm9tIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciB1bnRpbCByZWFjaGluZyBGdW5jdGlvbi9PYmplY3QgYW5kIHJldHVybnMgdGhlIGNvbGxlY3RlZCBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIENvbnN0cnVjdG9yIHdob3NlIGNoYWluIHNob3VsZCBiZSBjb2xsZWN0ZWQuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yW119IEFycmF5IG9mIGNvbnN0cnVjdG9ycyBvcmRlcmVkIGZyb20gYmFzZSB0byBsZWFmLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY29sbGVjdENvbnN0cnVjdG9yQ2hhaW4obW9kZWw6IENvbnN0cnVjdG9yKTogQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgY2hhaW46IENvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG5cbiAgICB3aGlsZSAodHlwZW9mIGN1cnJlbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgICAgY2hhaW4ucHVzaChjdXJyZW50IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudCA9PT0gRnVuY3Rpb24gfHwgcGFyZW50ID09PSBPYmplY3QpIGJyZWFrO1xuICAgICAgY3VycmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhaW4ucmV2ZXJzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgbWV0YWRhdGEgdmFsdWVzIGNvbGxlY3RlZCBhY3Jvc3MgdGhlIGluaGVyaXRhbmNlIGNoYWluLlxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIGRlZXAgbWVyZ2UgZm9yIHBsYWluIG9iamVjdHMgd2hpbGUgbGV0dGluZyBub24tb2JqZWN0IHZhbHVlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMgdG8gcHJlc2VydmUgY2hpbGQgbWV0YWRhdGEgcHJlY2VkZW5jZS5cbiAgICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIE1ldGFkYXRhIHZhbHVlcyBnYXRoZXJlZCBmcm9tIGJhc2UgdG8gY2hpbGQuXG4gICAqIEByZXR1cm4ge2FueX0gQWdncmVnYXRlZCBtZXRhZGF0YSB2YWx1ZSByZXNwZWN0aW5nIGluaGVyaXRhbmNlIHByZWNlZGVuY2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtZXJnZU1ldGFkYXRhQ2hhaW4odmFsdWVzOiBhbnlbXSkge1xuICAgIGxldCBhY2M6IGFueSA9IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoYWNjID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjID0gdGhpcy5jbG9uZU1ldGFkYXRhVmFsdWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhY2MpICYmIHRoaXMuaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgYWNjID0gdGhpcy5tZXJnZVBsYWluT2JqZWN0cyhcbiAgICAgICAgICBhY2MgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhY2MgPSB0aGlzLmNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvZHVjZXMgYSBkZWVwIGNsb25lIG9mIGEgbWV0YWRhdGEgdmFsdWUgd2hlbiBuZWNlc3NhcnkuXG4gICAqIEBzdW1tYXJ5IEFycmF5cyBhcmUgc2hhbGxvdy1jbG9uZWQsIHBsYWluIG9iamVjdHMgYXJlIGRlZXAtY2xvbmVkLCBhbmQgcHJpbWl0aXZlL2Z1bmN0aW9uIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBjbG9uZS5cbiAgICogQHJldHVybiB7YW55fSBDbG9uZWQgbWV0YWRhdGEgdmFsdWUgcHJldmVudGluZyBtdXRhdGlvbiBvZiB0aGUgYmFja2luZyBzdG9yZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gWy4uLnZhbHVlXTtcbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSlcbiAgICAgIHJldHVybiB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKHt9LCB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZXBseSBtZXJnZXMgdHdvIHBsYWluIG1ldGFkYXRhIG9iamVjdHMuXG4gICAqIEBzdW1tYXJ5IFJlY3Vyc2l2ZWx5IG1lcmdlcyBuZXN0ZWQgcGxhaW4gb2JqZWN0cyB3aGlsZSBjbG9uaW5nIGFycmF5czsgdmFsdWVzIGZyb20gYHNvdXJjZWAgb3ZlcnJpZGUgdGhvc2UgZnJvbSBgdGFyZ2V0YCB3aGVuIGNvbmZsaWN0cyBvY2N1ci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgQmFzZSBvYmplY3QgdG8gbWVyZ2UgaW50by5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzb3VyY2UgT2JqZWN0IHByb3ZpZGluZyBvdmVycmlkaW5nIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBOZXdseSBtZXJnZWQgbWV0YWRhdGEgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbWVyZ2VQbGFpbk9iamVjdHMoXG4gICAgdGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHNvdXJjZTogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLnRhcmdldCB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gcmVzdWx0W2tleV07XG5cbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc291cmNlVmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5pc1BsYWluT2JqZWN0KHRhcmdldFZhbHVlKVxuICAgICAgICAgID8gdGhpcy5tZXJnZVBsYWluT2JqZWN0cyhcbiAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICAgICAgICAgc291cmNlVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdGhpcy5tZXJnZVBsYWluT2JqZWN0cyh7fSwgc291cmNlVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBbLi4uc291cmNlVmFsdWVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2VWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCBzdWl0YWJsZSBmb3IgZGVlcCBtZXJnaW5nLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIGFycmF5cyBhbmQgbnVsbCBhcmUgZXhjbHVkZWQgd2hpbGUgYWNjZXB0aW5nIG9iamVjdHMgY3JlYXRlZCB2aWEgbGl0ZXJhbC9jbGFzcyBzeW50YXguXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQbGFpbk9iamVjdCh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gICAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXcml0ZXMgbWV0YWRhdGEgdW5kZXIgYSBzeW1ib2wga2V5LlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBoZWxwZXIgdGhhdCBlbnN1cmVzIHRoZSBtZXRhZGF0YSBidWNrZXQgZXhpc3RzIGZvciB0aGUgcHJvdmlkZWQgc3ltYm9sIGFuZCBwZXJzaXN0cyB0aGUgZ2l2ZW4gdmFsdWUsIGRyaWxsaW5nIGludG8gbmVzdGVkIHN0cnVjdHVyZXMgd2hlbiB0aGUga2V5IGlzIGEgc3RyaW5nIHBhdGguXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBzeW1ib2wgU3ltYm9sIHJlcHJlc2VudGluZyB0aGUgbWV0YWRhdGEgYnVja2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleSBOZXN0ZWQga2V5IHBhdGggb3IgZGlyZWN0IHN5bWJvbCB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgbWV0YWRhdGEgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSBwZXJzaXN0ZWQgaW4gdGhlIG1ldGFkYXRhIHN0b3JlLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5uZXJTZXQoc3ltYm9sOiBzeW1ib2wsIGtleTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdID0ge30gYXMgYW55O1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKTtcbiAgICB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV3JpdGVzIGEgbWV0YWRhdGEgdmFsdWUgYXQgYSBnaXZlbiBuZXN0ZWQga2V5IHBhdGguXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhlIG1ldGFkYXRhIHJlY29yZCBleGlzdHMgZm9yIHRoZSBjb25zdHJ1Y3RvciwgbWlycm9ycyBpdCBvbiB0aGUgY29uc3RydWN0b3Igd2hlbiBlbmFibGVkLCBhbmQgc2V0cyB0aGUgcHJvdmlkZWQgdmFsdWUgb24gdGhlIG5lc3RlZCBrZXkgcGF0aCB1c2luZyB0aGUgY29uZmlndXJlZCBzcGxpdHRlci5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPnxzdHJpbmd9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB0byB3aGljaCB0aGUgbWV0YWRhdGEgYmVsb25ncyBvciBhIGRpcmVjdCBpZGVudGlmaWVyIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOZXN0ZWQga2V5IHBhdGggYXQgd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsdWUgdG8gc3RvcmUgaW4gdGhlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3IgfCBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGtleSA9PT0gRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbW9kZWwgIT09IFwic3RyaW5nXCIpIG1vZGVsID0gdGhpcy5jb25zdHIobW9kZWwpIHx8IG1vZGVsO1xuICAgIGNvbnN0IHN5bWJvbCA9XG4gICAgICB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBTeW1ib2wuZm9yKG1vZGVsKSA6IHRoaXMuU3ltYm9sKG1vZGVsKTtcbiAgICB0aGlzLmlubmVyU2V0KHN5bWJvbCwga2V5LCB2YWx1ZSk7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiICYmXG4gICAgICBNZXRhZGF0YS5taXJyb3IgJiZcbiAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHRoaXMuYmFzZUtleSlcbiAgICApIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgdGhpcy5iYXNlS2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcnkgYW5kIGl0cyB2ZXJzaW9uLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHZlcnNpb24gc3RyaW5nIGZvciBhbiBpbnRlZ3JhdGluZyBsaWJyYXJ5IHVuZGVyIHRoZSBzaGFyZWQgbGlicmFyaWVzIG1ldGFkYXRhIHN5bWJvbCwgcHJldmVudGluZyBkdXBsaWNhdGUgcmVnaXN0cmF0aW9ucyBmb3IgdGhlIHNhbWUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlicmFyeSBQYWNrYWdlIG5hbWUgb3IgaWRlbnRpZmllciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gU2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaWJyYXJ5LlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxpYnJhcnkgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyTGlicmFyeShsaWJyYXJ5OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoRGVjb3JhdGlvbktleXMuTElCUkFSSUVTKTtcbiAgICBjb25zdCBsaWIgPSB0aGlzLmlubmVyR2V0KHN5bWJvbCwgbGlicmFyeSk7XG4gICAgaWYgKGxpYilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExpYnJhcnkgYWxyZWFkeSAke2xpYnJhcnl9IHJlZ2lzdGVyZWQgd2l0aCB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgICApO1xuICAgIHRoaXMuaW5uZXJTZXQoc3ltYm9sLCBsaWJyYXJ5LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMgcmVnaXN0ZXJlZCBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcmllcy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgaW4tbWVtb3J5IG1hcCBvZiBsaWJyYXJ5IGlkZW50aWZpZXJzIHRvIHNlbWFudGljIHZlcnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRGVjb3JhdGlvbiBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gTWFwIG9mIHJlZ2lzdGVyZWQgbGlicmFyeSBpZGVudGlmaWVycyB0byB0aGVpciB2ZXJzaW9uIHN0cmluZ3MuXG4gICAqL1xuICBzdGF0aWMgbGlicmFyaWVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoRGVjb3JhdGlvbktleXMuTElCUkFSSUVTKTtcbiAgICByZXR1cm4gdGhpcy5pbm5lckdldChzeW1ib2wpIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBKb2lucyBwYXRoIHNlZ21lbnRzIHVzaW5nIHRoZSBjdXJyZW50IHNwbGl0dGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgbmVzdGVkIG1ldGFkYXRhIGtleSBieSBjb25jYXRlbmF0aW5nIHN0cmluZyBzZWdtZW50cyB3aXRoIHRoZSBjb25maWd1cmVkIHNwbGl0dGVyIGZvciB1c2Ugd2l0aCB0aGUgbWV0YWRhdGEgc3RvcmUuXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBzdHJzIEtleSBzZWdtZW50cyB0byBqb2luIGludG8gYSBmdWxsIG1ldGFkYXRhIHBhdGguXG4gICAqIEByZXR1cm4ge3N0cmluZ30gU3BsaXR0ZXItam9pbmVkIG1ldGFkYXRhIGtleS5cbiAgICovXG4gIHN0YXRpYyBrZXkoLi4uc3Ryczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gc3Rycy5qb2luKHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgcmVzb2x2ZXIgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IGRlZmF1bHQgZmxhdm91ci5cbiAqIEBzdW1tYXJ5IFJlc29sdmVzIHRoZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldCBieSBhbHdheXMgcmV0dXJuaW5nIHRoZSBsaWJyYXJ5J3MgYERlZmF1bHRGbGF2b3VyYCB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCBiZWluZyBkZWNvcmF0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJlc29sdmVkIGZsYXZvdXIgaWRlbnRpZmllci5cbiAqIEBmdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaW9uIHR5cGUgY292ZXJpbmcgc3VwcG9ydGVkIGRlY29yYXRvciBraW5kcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IG9mIHRoZSBzdGFuZGFyZCBUeXBlU2NyaXB0IGRlY29yYXRvciBzaWduYXR1cmVzIChjbGFzcywgcHJvcGVydHksIG9yIG1ldGhvZCksIGVuYWJsaW5nIGZsZXhpYmxlIHJlZ2lzdHJhdGlvbiBhbmQgYXBwbGljYXRpb24gd2l0aGluIHRoZSBEZWNvcmF0aW9uIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JUeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvclR5cGVzID1cbiAgfCBDbGFzc0RlY29yYXRvclxuICB8IFByb3BlcnR5RGVjb3JhdG9yXG4gIHwgTWV0aG9kRGVjb3JhdG9yO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIGEgZGVjb3JhdG9yIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyYml0cmFyeSBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBjb25jcmV0ZSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYmUgYXBwbGllZCB0byBhIHRhcmdldC5cbiAqIEB0ZW1wbGF0ZSBBXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRmFjdG9yeSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gRGVjb3JhdG9yVHlwZXM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFyZ3VtZW50IGJ1bmRsZSBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeS5cbiAqIEBzdW1tYXJ5IE9iamVjdCBmb3JtIHVzZWQgdG8gZGVmZXIgZGVjb3JhdG9yIGNyZWF0aW9uLCBjYXJyeWluZyBib3RoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnQgbGlzdCB0byBiZSBpbnZva2VkIGxhdGVyIGR1cmluZyBhcHBsaWNhdGlvbi5cbiAqIEB0eXBlRGVmIERlY29yYXRvckZhY3RvcnlBcmdzXG4gKiBAcHJvcGVydHkge0RlY29yYXRvckZhY3Rvcnl9IGRlY29yYXRvciBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBkZWNvcmF0b3Igd2hlbiBpbnZva2VkLlxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyBMaXN0IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBkZWNvcmF0b3IgZmFjdG9yeS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5QXJncyA9IHtcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JGYWN0b3J5O1xuICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaW9uIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYSByZWFkeS10by1hcHBseSBkZWNvcmF0b3Igb3IgYSBmYWN0b3J5IHdpdGggYXJndW1lbnRzLlxuICogQHN1bW1hcnkgQWxsb3dzIHJlZ2lzdGVyaW5nIGRlY29yYXRvcnMgaW4gdHdvIGZvcm1zOiBhcyBkaXJlY3QgZGVjb3JhdG9yIGZ1bmN0aW9ucyBvciBhcyBkZWZlcnJlZCBmYWN0b3JpZXMgcGFpcmVkIHdpdGggdGhlaXIgYXJndW1lbnQgbGlzdHMgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24uXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JEYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvclR5cGVzIHwgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG5leHBvcnQgdHlwZSBFeHRlbmREZWNvcmF0b3JEYXRhID1cbiAgfCBEZWNvcmF0b3JUeXBlc1xuICB8IE9taXQ8RGVjb3JhdG9yRmFjdG9yeUFyZ3MsIFwiYXJnc1wiPjtcbnR5cGUgU3RvcmVkRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvckRhdGEgfCBFeHRlbmREZWNvcmF0b3JEYXRhO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBkZWNvcmF0b3IgbWFuYWdlbWVudCBjbGFzcyB0aGF0IGhhbmRsZXMgZmxhdm91cmVkIGRlY29yYXRvcnMuXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuIEl0IHN1cHBvcnRzIHJlZ2lzdGVyaW5nLCBleHRlbmRpbmcsIGFuZCBhcHBseWluZyBkZWNvcmF0b3JzIHdpdGggY29udGV4dC1hd2FyZSBmbGF2b3VyIHJlc29sdXRpb24sIGFsbG93aW5nIGZyYW1ld29yay1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgYSBjb25zaXN0ZW50IEFQSS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGRlY29yYXRvciAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXI9RGVmYXVsdEZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgcGFyYW1ldGVyIGZvciB0aGUgZGVjb3JhdG9yIGNvbnRleHQuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgZGVjb3JhdGlvbiBmb3IgJ2NvbXBvbmVudCcgd2l0aCBkZWZhdWx0IGZsYXZvdXJcbiAqIGNvbnN0IGNvbXBvbmVudERlY29yYXRvciA9IG5ldyBEZWNvcmF0aW9uKClcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZShjdXN0b21Db21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGZsYXZvdXJlZCBkZWNvcmF0aW9uXG4gKiBjb25zdCB2dWVDb21wb25lbnQgPSBuZXcgRGVjb3JhdGlvbigndnVlJylcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZSh2dWVDb21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIEFwcGx5IHRoZSBkZWNvcmF0aW9uXG4gKiBAY29tcG9uZW50RGVjb3JhdG9yXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7fVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdGlvblxuICogICBwYXJ0aWNpcGFudCBSIGFzIEZsYXZvdXJSZXNvbHZlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIERlY29yYXRvckZhY3RvcnlcbiAqXG4gKiAgIEMtPj5EOiBuZXcgRGVjb3JhdGlvbihmbGF2b3VyKVxuICogICBDLT4+RDogZm9yKGtleSlcbiAqICAgQy0+PkQ6IGRlZmluZShkZWNvcmF0b3JzKVxuICogICBELT4+RDogcmVnaXN0ZXIoa2V5LCBmbGF2b3VyLCBkZWNvcmF0b3JzKVxuICogICBELT4+RjogZGVjb3JhdG9yRmFjdG9yeShrZXksIGZsYXZvdXIpXG4gKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAqICAgUi0tPj5GOiByZXNvbHZlZCBmbGF2b3VyXG4gKiAgIEYtPj5GOiBhcHBseSBkZWNvcmF0b3JzXG4gKiAgIEYtLT4+QzogZGVjb3JhdGVkIHRhcmdldFxuICovXG5leHBvcnQgY2xhc3MgRGVjb3JhdGlvbiBpbXBsZW1lbnRzIElEZWNvcmF0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1hcCBvZiByZWdpc3RlcmVkIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyBhbGwgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzIG9yZ2FuaXNlZCBieSBrZXkgYW5kIGZsYXZvdXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PFN0b3JlZERlY29yYXRvckRhdGE+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXQuXG4gICAqIEBzdW1tYXJ5IFJlc29sdmVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgZmxhdm91ciBmb3IgYSBnaXZlbiB0YXJnZXQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmbGF2b3VyUmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlciA9IGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBhZGRpdGlvbmFsIGRlY29yYXRvcnMuXG4gICAqL1xuICBwcml2YXRlIGV4dHJhcz86IFNldDxTdG9yZWREZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVjb3JhdG9yIGtleS5cbiAgICovXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmxhdm91cjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBrZXkgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXIuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpc2VzIGEgbmV3IGRlY29yYXRpb24gY2hhaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBJZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBkZWNvcmF0b3JzIHdpdGggYWRkb24gc3VwcG9ydC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYWRkb249ZmFsc2VdIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWNvcmF0b3JzIGFyZSBhZGRpdGl2ZSBleHRyYXMuXG4gICAqIEBwYXJhbSB7Li4uRGVjb3JhdG9yRGF0YX0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIHJlZ2lzdGVyIGZvciB0aGUgY29uZmlndXJlZCBrZXkuXG4gICAqIEByZXR1cm4ge3RoaXN9IEN1cnJlbnQgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0ZShcbiAgICBhZGRvbjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIC4uLmRlY29yYXRvcnM6IFN0b3JlZERlY29yYXRvckRhdGFbXVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5IG11c3QgYmUgcHJvdmlkZWQgYmVmb3JlIGRlY29yYXRvcnMgY2FuIGJlIGFkZGVkXCIpO1xuICAgIGlmIChcbiAgICAgICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpICYmXG4gICAgICAhYWRkb24gJiZcbiAgICAgIHRoaXMuZmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXJcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTXVzdCBwcm92aWRlIG92ZXJyaWRlcyBvciBhZGRvbnMgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGRlY2FmJ3MgZGVjb3JhdG9yc1wiXG4gICAgICApO1xuICAgICh0aGlzIGFzIGFueSlbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdID0gbmV3IFNldChbXG4gICAgICAuLi4odGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgYmFzZSBkZWNvcmF0b3JzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7Li4uRGVjb3JhdG9yRGF0YX0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIGRlZmluZS5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJFbmR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGZpbmlzaGluZyB0aGUgY2hhaW4gKGFsc28gaW1wbGVtZW50cyBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkKS5cbiAgICovXG4gIGRlZmluZShcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICBpZiAoXG4gICAgICBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IHR5cGVvZiBkID09PSBcIm9iamVjdFwiKSAmJlxuICAgICAgZGVjb3JhdG9ycy5sZW5ndGggIT09IDFcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXaGVuIHVzaW5nIGFuIG92ZXJyaWRhYmxlIGRlY29yYXRvciwgb25seSBvbmUgaXMgYWxsb3dlZGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUoZmFsc2UsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGV4aXN0aW5nIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7Li4uRGVjb3JhdG9yRGF0YX0gZGVjb3JhdG9ycyBBZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gcmVnaXN0ZXIgYXMgYWRkb25zLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yLlxuICAgKi9cbiAgZXh0ZW5kKC4uLmRlY29yYXRvcnM6IEV4dGVuZERlY29yYXRvckRhdGFbXSk6IERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4gdHlwZW9mIGQgPT09IFwib2JqZWN0XCIpICYmXG4gICAgICBkZWNvcmF0b3JzLmxlbmd0aCAhPT0gMVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdoZW4gZXh0ZW5kaW5nIHVzaW5nIGFuIG92ZXJyaWRhYmxlIGRlY29yYXRvciwgb25seSBvbmUgaXMgYWxsb3dlZGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgY29udGV4dC1hd2FyZSBkZWNvcmF0b3IgZm9yIGEga2V5L2ZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IFByb2R1Y2VzIGEgZGVjb3JhdG9yIGZ1bmN0aW9uIGJvdW5kIHRvIHRoZSBwcm92aWRlZCBrZXkgYW5kIGZsYXZvdXIuIFRoZSByZXN1bHRpbmcgZGVjb3JhdG9yIHJlc29sdmVzIHRoZSBhY3R1YWwgZGVjb3JhdG9ycyB0byBhcHBseSBhdCBpbnZvY2F0aW9uIHRpbWUgYmFzZWQgb24gdGhlIHRhcmdldCdzIHJlc29sdmVkIGZsYXZvdXIgYW5kIHRoZSByZWdpc3RlcmVkIGJhc2UgYW5kIGV4dHJhIGRlY29yYXRvcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdGlvbiBrZXkgdXNlZCB0byBsb29rIHVwIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmPURlZmF1bHRGbGF2b3VyXSBFeHBsaWNpdCBmbGF2b3VyIHRvIGJpbmQgdGhlIGZhY3RvcnkgdG8uXG4gICAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgdGhlIHJlc29sdmVkIGRlY29yYXRvcnMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBEZWNvcmF0aW9uIChidWlsZGVyKVxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgZGVjb3JhdG9yRmFjdG9yeShrZXksIGYpXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBmbGF2b3VyUmVzb2x2ZXJcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFwcGxpZWQgRGVjb3JhdG9yc1xuICAgKiAgIFUtPj5COiBkZWZpbmUoKS9leHRlbmQoKSBhbmQgYXBwbHkoKVxuICAgKiAgIEItPj5GOiBjcmVhdGUgY29udGV4dCBkZWNvcmF0b3JcbiAgICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gICAqICAgUi0tPj5GOiBmbGF2b3VyXG4gICAqICAgRi0+PkE6IGNvbGxlY3QgYmFzZSArIGV4dHJhc1xuICAgKiAgIGxvb3AgZWFjaCBkZWNvcmF0b3JcbiAgICogICAgIEEtPj5VOiBpbnZva2UgZGVjb3JhdG9yKHRhcmdldCwga2V5PywgZGVzYz8pXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBmdW5jdGlvbiBjb250ZXh0RGVjb3JhdG9yKFxuICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICAgKSB7XG4gICAgICBjb25zdCBmbGF2b3VyID0gRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIodGFyZ2V0KTtcbiAgICAgIGNvbnN0IGNhY2hlID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV07XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IGNhY2hlW2ZsYXZvdXJdXG4gICAgICAgID8gY2FjaGVbZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcblxuICAgICAgaWYgKFxuICAgICAgICBjYWNoZSAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXSAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMuc2l6ZVxuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW0RlZmF1bHRGbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlRGVjb3JhdG9yc0xpc3QgPSBbLi4uKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnZhbHVlcygpIDogW10pXTtcblxuICAgICAgY29uc3QgZGVmYXVsdERlY29yYXRvcnNMaXN0ID0gW1xuICAgICAgICAuLi4oY2FjaGVbRGVmYXVsdEZsYXZvdXJdPy5kZWNvcmF0b3JzIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBiYXNlQXJnc0J5SW5kZXggPSBiYXNlRGVjb3JhdG9yc0xpc3QucmVkdWNlKFxuICAgICAgICAoYWNjdW0sIGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJhcmdzXCIgaW4gKGVudHJ5IGFzIGFueSkgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGVudHJ5IGFzIGFueSkuYXJncylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjY3VtW2luZGV4XSA9IChlbnRyeSBhcyBhbnkpLmFyZ3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPG51bWJlciwgYW55W10+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWZhdWx0QXJnc0J5SW5kZXggPSBkZWZhdWx0RGVjb3JhdG9yc0xpc3QucmVkdWNlKFxuICAgICAgICAoYWNjdW0sIGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJhcmdzXCIgaW4gKGVudHJ5IGFzIGFueSkgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGVudHJ5IGFzIGFueSkuYXJncylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjY3VtW2luZGV4XSA9IChlbnRyeSBhcyBhbnkpLmFyZ3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPG51bWJlciwgYW55W10+XG4gICAgICApO1xuXG4gICAgICBjb25zdCB0b0FwcGx5ID0gW1xuICAgICAgICAuLi5iYXNlRGVjb3JhdG9yc0xpc3QsXG4gICAgICAgIC4uLihleHRyYXMgPyBleHRyYXMudmFsdWVzKCkgOiBbXSksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBiYXNlTGVuZ3RoID0gYmFzZURlY29yYXRvcnNMaXN0Lmxlbmd0aDtcblxuICAgICAgcmV0dXJuIHRvQXBwbHkucmVkdWNlKFxuICAgICAgICAoXywgZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkKSB7XG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkIGFzIGFueTtcbiAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlSW5kZXggPSBpbmRleCA8IGJhc2VMZW5ndGggPyBpbmRleCA6IDA7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICAgICAgICAgIFwiYXJnc1wiIGluIGVudHJ5ICYmIEFycmF5LmlzQXJyYXkoZW50cnkuYXJncylcbiAgICAgICAgICAgICAgICAgID8gZW50cnkuYXJnc1xuICAgICAgICAgICAgICAgICAgOiAoYmFzZUFyZ3NCeUluZGV4W2NhbmRpZGF0ZUluZGV4XSA/P1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QXJnc0J5SW5kZXhbY2FuZGlkYXRlSW5kZXhdID8/XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBcmdzQnlJbmRleFswXSA/P1xuICAgICAgICAgICAgICAgICAgICBbXSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeS5kZWNvcmF0b3IoLi4uYXJncykgYXMgYW55KShcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICAgIHJldHVybiAoZCBhcyBhbnkpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRlY29yYXRvciB0eXBlOiAke3R5cGVvZiBkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yIH1cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvbi5cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gR2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvbiByZWFkeSBmb3IgYXBwbGljYXRpb24uXG4gICAqL1xuICBhcHBseSgpOiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKSA9PiBhbnkge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgY29uc3QgZXhpc3RpbmdEZWNvcmF0b3JzID1cbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1t0aGlzLmtleV0/Llt0aGlzLmZsYXZvdXJdPy5kZWNvcmF0b3JzO1xuICAgIGNvbnN0IGRlY29yYXRvcnNUb1JlZ2lzdGVyID1cbiAgICAgIHRoaXMuZGVjb3JhdG9ycyB8fCBleGlzdGluZ0RlY29yYXRvcnMgfHwgbmV3IFNldDxEZWNvcmF0b3JEYXRhPigpO1xuXG4gICAgRGVjb3JhdGlvbi5yZWdpc3RlcihcbiAgICAgIHRoaXMua2V5LFxuICAgICAgdGhpcy5mbGF2b3VyLFxuICAgICAgZGVjb3JhdG9yc1RvUmVnaXN0ZXIsXG4gICAgICB0aGlzLmV4dHJhc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRvciBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyLlxuICAgKiBAcGFyYW0ge1NldDxEZWNvcmF0b3JEYXRhPn0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9ycyByZWdpc3RlcmVkIGZvciB0aGUga2V5LlxuICAgKiBAcGFyYW0ge1NldDxEZWNvcmF0b3JEYXRhPn0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgYXMgZmxhdm91ci1zcGVjaWZpYyBhZGRvbnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPixcbiAgICBleHRyYXM/OiBTZXQ8U3RvcmVkRGVjb3JhdG9yRGF0YT5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvcmF0b3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGVjb3JhdG9ycyBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBmbGF2b3VyIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuXG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSkgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gPSB7fTtcbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdKVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gPSB7fTtcbiAgICBpZiAoZGVjb3JhdG9ycykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgaWYgKGV4dHJhcykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzID0gZXh0cmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBnbG9iYWwgZmxhdm91ciByZXNvbHZlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzLlxuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vycy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRGbGF2b3VyUmVzb2x2ZXIocmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlcikge1xuICAgIERlY29yYXRpb24uZmxhdm91clJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIHN0YXRpYyBlbnRyeSB0byBzdGFydCBhIGRlY29yYXRpb24gYnVpbGRlci5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBEZWNvcmF0aW9uIGluc3RhbmNlIGFuZCBpbml0aWF0ZXMgdGhlIGJ1aWxkZXIgY2hhaW4gd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRpb24ga2V5IHRvIGNvbmZpZ3VyZS5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nIGRlZmluaXRpb25zLlxuICAgKi9cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIGEgYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBmbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBtZXRob2QgdG8gYmVnaW4gYSBEZWNvcmF0aW9uIGJ1aWxkZXIgY2hhaW4gYm91bmQgdG8gdGhlIGdpdmVuIGZsYXZvdXIgaWRlbnRpZmllciwgYWxsb3dpbmcgcmVnaXN0cmF0aW9uIG9mIGZsYXZvdXItc3BlY2lmaWMgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRmxhdm91ciBuYW1lIHRvIGJpbmQgdG8gdGhlIGJ1aWxkZXIuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyU3RhcnR9IEJ1aWxkZXIgc3RhcnQgaW50ZXJmYWNlIHRvIGNvbnRpbnVlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhL01ldGFkYXRhXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCIuL2RlY29yYXRpb24vRGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBc3NpZ25zIGFyYml0cmFyeSBtZXRhZGF0YSB0byBhIHRhcmdldCB1c2luZyBhIHN0cmluZyBrZXkuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHN0b3JlcyBhIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjZW50cmFsIG1ldGFkYXRhIHN0b3JlIGZvciB0aGUgcHJvdmlkZWQgY2xhc3Mgb3IgbWVtYmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRhcmdldC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBzdG9yZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LlxuICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgd3JpdGVzIHRoZSBtZXRhZGF0YSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gbWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gbWV0YWRhdGEoXG4gICAgbW9kZWw6IGFueSxcblxuICAgIHByb3A/OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IgfCBudW1iZXJcbiAgKSB7XG4gICAgTWV0YWRhdGEuc2V0KHByb3AgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsLCBrZXksIHZhbHVlKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FwdHVyZXMgYW5kIHN0b3JlcyBhIHByb3BlcnR5J3MgZGVzaWduIHR5cGUuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHJlYWRzIHRoZSByZWZsZWN0ZWQgYGRlc2lnbjp0eXBlYCBmb3IgYSBwcm9wZXJ0eSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtZXRhZGF0YSBzdG9yZSB1bmRlciB0aGUgcHJvcGVydGllcyBtYXAuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgcHJvcGVydHkncyB0eXBlIG1ldGFkYXRhIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcCgpIHtcbiAgZnVuY3Rpb24gaW5uZXJQcm9wKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBpbm5lclByb3AobW9kZWw6IG9iamVjdCwgcHJvcD86IGFueSkge1xuICAgICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9UWVBFLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgcHJvcFxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3ApLFxuICAgICAgICBkZXNpZ25UeXBlXG4gICAgICApKG1vZGVsLCBwcm9wKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGlubmVyUHJvcCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhcHR1cmVzIGEgc2luZ2xlIHBhcmFtZXRlciB0eXBlIGZvciB0aGUgZGVjb3JhdGVkIG1ldGhvZC5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgZW5zdXJlcyB0aGUgbWV0aG9kIG1ldGFkYXRhIGlzIGluaXRpYWxpc2VkIGFuZCBzdG9yZXMgdGhlIHJlZmxlY3RlZCBwYXJhbWV0ZXIgY29uc3RydWN0b3IgYXQgdGhlIHByb3ZpZGVkIGluZGV4LlxuICogQHJldHVybiB7UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBwYXJhbWV0ZXIgdHlwZSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gcGFyYW1cbiAqIEBjYXRlZ29yeSBQYXJhbWV0ZXIgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBQIGFzIHBhcmFtKClcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNZXRhZGF0YVxuICogICBVLT4+UDogcGFyYW0oKSh0YXJnZXQsIGtleSwgaW5kZXgpXG4gKiAgIFAtPj5VOiBtZXRob2QoKSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcilcbiAqICAgUC0+Pk06IHBhcmFtcyhjb25zdHJ1Y3Rvciwga2V5KVxuICogICBNLS0+PlA6IHBhcmFtZXRlciBjb25zdHJ1Y3RvcnNbXVxuICogICBQLT4+TTogc2V0KG1ldGhvZHMua2V5LmluZGV4LCBjb25zdHJ1Y3RvcilcbiAqICAgUC0tPj5VOiBwYXJhbWV0ZXIgcmVjb3JkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcmFtKCkge1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYW0oXG4gICAgbW9kZWw6IG9iamVjdCxcbiAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgaW5kZXg6IG51bWJlclxuICApIHtcbiAgICBpZiAoIXByb3ApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBAcGFyYW0gZGVjb3JhdG9yIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gbWV0aG9kc2ApO1xuICAgIG1ldGhvZCgpKG1vZGVsLCBwcm9wLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1vZGVsLCBwcm9wKSk7XG4gICAgY29uc3QgcGFyYW1UcGVzID0gTWV0YWRhdGEucGFyYW1zKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSwgcHJvcCBhcyBzdHJpbmcpO1xuICAgIGlmICghcGFyYW1UcGVzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHBhcmFtZXRlciB0eXBlcyBmb3IgJHtTdHJpbmcocHJvcCl9YCk7XG4gICAgaWYgKGluZGV4ID49IHBhcmFtVHBlcy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQYXJhbWV0ZXIgaW5kZXggJHtpbmRleH0gb3V0IG9mIHJhbmdlIGZvciAke1N0cmluZyhwcm9wKX1gXG4gICAgICApO1xuICAgIG1ldGFkYXRhKFxuICAgICAgTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AgYXMgc3RyaW5nLCBpbmRleC50b1N0cmluZygpKSxcbiAgICAgIHBhcmFtVHBlc1tpbmRleF1cbiAgICApKG1vZGVsLCBwcm9wKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBhIHBhcmFtZXRlciBkZWNvcmF0b3Igd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgZGVmYXVsdCBgcGFyYW0oKWAgZGVjb3JhdG9yIGFuZCBhdWdtZW50cyB0aGUgc3RvcmVkIG1ldGFkYXRhIHdpdGggYW4gYXJiaXRyYXJ5IGtleS92YWx1ZSBwYWlyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSBwZXJzaXN0ZWQgdW5kZXIgdGhlIGdpdmVuIGtleS5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyBib3RoIHRoZSBwYXJhbWV0ZXIgZGVzaWduIHR5cGUgYW5kIGFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gKiBAZnVuY3Rpb24gcGFyYW1NZXRhZGF0YVxuICogQGNhdGVnb3J5IFBhcmFtZXRlciBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhKHRhcmdldDogYW55LCBwcm9wOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwYXJhbSgpLFxuICAgICAgbWV0YWRhdGEoTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AsIGtleSksIHZhbHVlKVxuICAgICkodGFyZ2V0LCBwcm9wLCBpbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlY29yZHMgbWV0aG9kIGRlc2lnbi10aW1lIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYXB0dXJlcyBhIG1ldGhvZCdzIHJlZmxlY3RlZCBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlcywgc3RvcmluZyB0aGVtIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBtZXRhZGF0YSBrZXlzIHNvIHRoZXkgY2FuIGJlIGluc3BlY3RlZCBhdCBydW50aW1lLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBwZXJzaXN0cyB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlIGluZm9ybWF0aW9uIGludG8gdGhlIG1ldGFkYXRhIHN0b3JlIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBtZXRob2RcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAqICAgcGFydGljaXBhbnQgRiBhcyBtZXRob2QoKVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKiAgIFUtPj5GOiBtZXRob2QoKSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcilcbiAqICAgRi0+PlU6IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoZGVzaWduOnBhcmFtdHlwZXMpXG4gKiAgIEYtPj5VOiBSZWZsZWN0LmdldE93bk1ldGFkYXRhKGRlc2lnbjpyZXR1cm50eXBlKVxuICogICBGLT4+TTogc2V0KG1ldGhvZHMua2V5LmRlc2lnbjpwYXJhbXR5cGVzLCBwYXJhbXMpXG4gKiAgIEYtPj5NOiBzZXQobWV0aG9kcy5rZXkuZGVzaWduOnJldHVybnR5cGUsIHJldHVyblR5cGUpXG4gKiAgIEYtLT4+VTogZGVjb3JhdGVkIGZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1ldGhvZChvYmo6IGFueSwgcHJvcD86IGFueSwgZGVzY3JpcHRvcj86IGFueSkge1xuICAgIGNvbnN0IGRlc2lnblBhcmFtcyA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TLFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICk7XG4gICAgY29uc3QgZGVzaWduUmV0dXJuID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk4sXG4gICAgICBvYmosXG4gICAgICBwcm9wXG4gICAgKTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLk1FVEhPRFMsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TXG4gICAgICAgICksXG4gICAgICAgIGRlc2lnblBhcmFtc1xuICAgICAgKSxcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuTUVUSE9EUyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk5cbiAgICAgICAgKSxcbiAgICAgICAgZGVzaWduUmV0dXJuXG4gICAgICApXG4gICAgKShvYmosIHByb3AsIGRlc2NyaXB0b3IpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGFwcGxpZXMgbXVsdGlwbGUgZGVjb3JhdG9ycyB0byBhIHNpbmdsZSB0YXJnZXQuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY29tcG9zaXRlIGRlY29yYXRvciB0aGF0IGFwcGxpZXMgbXVsdGlwbGUgZGVjb3JhdG9ycyBpbiBzZXF1ZW5jZSwgY29ycmVjdGx5IGhhbmRsaW5nIGNsYXNzLCBtZXRob2QsIHByb3BlcnR5LCBhbmQgcGFyYW1ldGVyIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FycmF5PENsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3I+fSBkZWNvcmF0b3JzIENvbGxlY3Rpb24gb2YgZGVjb3JhdG9ycyB0byBhcHBseS5cbiAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYWxsIHByb3ZpZGVkIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldC5cbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBBIGFzIGFwcGx5KC4uLmRlY29yYXRvcnMpXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIFUtPj5BOiBnZXQgZGVjb3JhdG9yKC4uLmRlY29yYXRvcnMpXG4gKiAgIEEtPj5VOiByZXR1cm5zICh0YXJnZXQsIGtleT8sIGRlc2M/KSA9PiB2b2lkXG4gKiAgIFUtPj5BOiBpbnZva2Ugb24gdGFyZ2V0XG4gKiAgIGxvb3AgZm9yIGVhY2ggZGVjb3JhdG9yXG4gKiAgICAgQS0+PkQ6IGludm9rZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgdHlwZVxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseShcbiAgLi4uZGVjb3JhdG9yczogQXJyYXk8XG4gICAgQ2xhc3NEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IFBhcmFtZXRlckRlY29yYXRvclxuICA+XG4pIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZyB8IHN5bWJvbCB8IHVua25vd24sXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciB8IG51bWJlclxuICApID0+IHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgKGRlY29yYXRvciBhcyBDbGFzc0RlY29yYXRvcikodGFyZ2V0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAoZGVjb3JhdG9yIGFzIE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yKShcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgIGRlc2NyaXB0b3IgYXMgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcHJvcGVydHkgbWV0YWRhdGEgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2UgZmFjdG9yeSB0aGF0IGNvbWJpbmVzIGBtZXRhZGF0YShrZXksIHZhbHVlKWAgYW5kIGBwcm9wKClgIHRvIGJvdGggc2V0IGFuIGFyYml0cmFyeSBtZXRhZGF0YSBrZXkgYW5kIHJlY29yZCB0aGUgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTWV0YWRhdGEga2V5IHRvIHNldCBmb3IgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBrZXkuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgYW5kIGNhcHR1cmVzIHRoZSBwcm9wZXJ0eSdzIHR5cGUuXG4gKiBAZnVuY3Rpb24gcHJvcE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShrZXksIHZhbHVlKSwgcHJvcCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1ldGhvZCBtZXRhZGF0YSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBmYWN0b3J5IHRoYXQgY29tYmluZXMgYG1ldGFkYXRhKGtleSwgdmFsdWUpYCBhbmQgYG1ldGhvZCgpYCB0byBib3RoIHNldCBhbiBhcmJpdHJhcnkgbWV0YWRhdGEga2V5IGFuZCByZWNvcmQgdGhlIG1ldGhvZCdzIGRlc2lnbiByZXR1cm4gYW5kIHBhcmFtIHR5cGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gc2V0IGZvciB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgTWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGtleS5cbiAqIEByZXR1cm4ge01ldGhvZERlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgYW5kIGNhcHR1cmVzIHRoZSBtZXRob2QncyBzaWduYXR1cmUgbWV0YWRhdGEuXG4gKiBAZnVuY3Rpb24gbWV0aG9kTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kTWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKGtleSwgdmFsdWUpLCBtZXRob2QoKSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEF0dGFjaGVzIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gdG8gYSBjbGFzcyBvciBtZW1iZXIuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHN0b3JlcyBhIHRleHR1YWwgZGVzY3JpcHRpb24gaW4gdGhlIG1ldGFkYXRhIHN0b3JlIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdGlvbiBrZXkgZm9yIGEgY2xhc3Mgb3IgaXRzIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2MgRGVzY3JpcHRpdmUgdGV4dCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgY2xhc3Mgb3IgcHJvcGVydHkuXG4gKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHJlY29yZHMgdGhlIGRlc2NyaXB0aW9uIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBkZXNjcmlwdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb24oZGVzYzogc3RyaW5nKSB7XG4gIGZ1bmN0aW9uIGlubmVyRGVzY3JpcHRpb24oZGVzYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyRGVzY3JpcHRpb24oXG4gICAgICBvcmlnaW5hbDogYW55LFxuICAgICAgcHJvcD86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBhbnlcbiAgICApIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgICAgW1xuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OLFxuICAgICAgICAgIHByb3AgPyBwcm9wLnRvU3RyaW5nKCkgOiBEZWNvcmF0aW9uS2V5cy5DTEFTUyxcbiAgICAgICAgXS5qb2luKE1ldGFkYXRhLnNwbGl0dGVyKSxcbiAgICAgICAgZGVzY1xuICAgICAgKShvcmlnaW5hbCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5uZXJEZXNjcmlwdGlvbixcbiAgICAgIGFyZ3M6IFtkZXNjXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gUm9vdCBlbnRyeSBwb2ludCBmb3IgdGhlIGRlY29yYXRpb24gcGFja2FnZS5cbiAqIEBzdW1tYXJ5IFJlLWV4cG9ydHMgdGhlIGJ1aWxkZXIgQVBJLCBkZWNvcmF0b3IgaGVscGVycywgbWV0YWRhdGEgdXRpbGl0aWVzLCBhbmQgc2hhcmVkIGNvbnN0YW50cyBzbyBjb25zdW1lcnMgY2FuIGltcG9ydCB7QGxpbmsgRGVjb3JhdGlvbn0sIHtAbGluayBNZXRhZGF0YX0sIHtAbGluayBEZWNvcmF0aW9uS2V5c30sIGFuZCB7QGxpbmsgRGVmYXVsdEZsYXZvdXJ9IGZyb20gYSBzaW5nbGUgc3VyZmFjZS5cbiAqIEBtb2R1bGUgZGVjb3JhdGlvblxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEvaW5kZXhcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWV0YWRhdGFcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGRlY29yYXRpb24gcGFja2FnZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgcmVnaXN0ZXJlZCB0aHJvdWdoIHtAbGluayBNZXRhZGF0YS5yZWdpc3RlckxpYnJhcnl9LlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCIsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUE7Ozs7OztBQU1HO0FBQ0ksTUFBTSxjQUFjLEdBQUc7QUFFOUI7Ozs7OztBQU1HO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRztBQUVqQzs7Ozs7OztBQU9HO0lBQ1M7QUFBWixDQUFBLFVBQVksY0FBYyxFQUFBOztBQUV4QixJQUFBLGNBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxXQUF1Qjs7QUFFdkIsSUFBQSxjQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBK0I7O0FBRS9CLElBQUEsY0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCOztBQUV6QixJQUFBLGNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjs7QUFFbkIsSUFBQSxjQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFFZixJQUFBLGNBQUEsQ0FBQSxhQUFBLENBQUEsR0FBQSxhQUEyQjs7QUFFM0IsSUFBQSxjQUFBLENBQUEsYUFBQSxDQUFBLEdBQUEsWUFBMEI7O0FBRTFCLElBQUEsY0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCOztBQUV6QixJQUFBLGNBQUEsQ0FBQSxhQUFBLENBQUEsR0FBQSxhQUEyQjs7QUFFM0IsSUFBQSxjQUFBLENBQUEsZUFBQSxDQUFBLEdBQUEsbUJBQW1DOztBQUVuQyxJQUFBLGNBQUEsQ0FBQSxlQUFBLENBQUEsR0FBQSxtQkFBbUM7QUFDckMsQ0FBQyxFQXZCVyxj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
977
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21ldGFkYXRhL01ldGFkYXRhLnRzIiwiLi4vc3JjL2RlY29yYXRpb24vRGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2ljTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZsYXZvdXIgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvciBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBmYWxsYmFjayBmbGF2b3VyIHVzZWQgd2hlbiBubyBzcGVjaWZpYyB2YWx1ZSBpcyBwcm92aWRlZCwgZW5zdXJpbmcgY29uc2lzdGVudCBkZWNvcmF0b3Igc2VsZWN0aW9uIGFjcm9zcyB0aGUgbGlicmFyeS5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAY29uc3QgRGVmYXVsdEZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEZsYXZvdXIgPSBcImRlY2FmXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoYXJhY3RlciB1c2VkIHRvIHNwbGl0IG5lc3RlZCBtZXRhZGF0YSBrZXlzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVsaW1pdGVyIGFwcGxpZWQgYnkgdGhlIG1ldGFkYXRhIHN0b3JlIHdoZW4gdHJhdmVyc2luZyBuZXN0ZWQgb2JqZWN0IHBhdGhzIGZvciByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBPYmplY3RLZXlTcGxpdHRlclxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSB0b2tlbiByZWdpc3RyeSBmb3IgdGhlIGRlY29yYXRpb24gc3lzdGVtLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUga2V5cyB1c2VkIGR1cmluZyByZWZsZWN0aW9uIGFuZCBtZXRhZGF0YSBzdG9yYWdlIGZvciBjbGFzc2VzLCBwcm9wZXJ0aWVzLCBtZXRob2RzLCBkZXNjcmlwdGlvbnMsIGFuZCByZWdpc3RlcmVkIGxpYnJhcmllcy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBjb25zdCBEZWNvcmF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIERlY29yYXRpb25LZXlzIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIGJ1Y2tldCBmb3IgZGVjb3JhdGlvbi1hd2FyZSBsaWJyYXJ5IHJlZ2lzdHJhdGlvbnMuICovXG4gIExJQlJBUklFUyA9IFwibGlicmFyaWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBrZXkgbWlycm9yZWQgb24gY29uc3RydWN0b3JzIHRoYXQgaG9sZHMgcnVudGltZSBtZXRhZGF0YS4gKi9cbiAgUkVGTEVDVCA9IGBfXyR7RGVmYXVsdEZsYXZvdXJ9YCxcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb250YWluZXIgb2YgcmVmbGVjdGVkIHByb3BlcnR5IG1ldGFkYXRhIGZvciBhIG1vZGVsLiAqL1xuICBQUk9QRVJUSUVTID0gXCJwcm9wZXJ0aWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29udGFpbmVyIG9mIHJlZmxlY3RlZCBtZXRob2QgbWV0YWRhdGEgZm9yIGEgbW9kZWwuICovXG4gIE1FVEhPRFMgPSBcIm1ldGhvZHNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgdW5kZXIgd2hpY2ggdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBpcyBwZXJzaXN0ZWQuICovXG4gIENMQVNTID0gXCJjbGFzc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBmb3IgY2xhc3NlcyBhbmQgbWVtYmVycy4gKi9cbiAgREVTQ1JJUFRJT04gPSBcImRlc2NyaXB0aW9uXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBzbG90IHRyYWNraW5nIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciB3aGVuIG92ZXJyaWRkZW4uICovXG4gIENPTlNUUlVDVE9SID0gXCJfX29yaWdpbmFsXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29sbGVjdGVkIHBhcmFtZXRlciBtZXRhZGF0YSBmb3IgY29uZmlndXJlZCBkZWNvcmF0b3JzLiAqL1xuICBQQVJBTUVURVJTID0gXCJwYXJhbWV0ZXJzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS4gKi9cbiAgREVTSUdOX1RZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIHJlY29yZGVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcy4gKi9cbiAgREVTSUdOX1BBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgYSBtZXRob2QncyByZXR1cm4gdHlwZS4gKi9cbiAgREVTSUdOX1JFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBtZXRhZGF0YSBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBkZWZhdWx0IG1ldGFkYXRhIHNoYXBlIHVzZWQgd2hlbiBpbml0aWFsaXNpbmcgbmV3IG1ldGFkYXRhIGVudHJpZXMgZm9yIGEgbW9kZWwuXG4gKiBAdHlwZSB7bW9kdWxlOmRlY29yYXRpb24uQmFzaWNNZXRhZGF0YTxhbnk+fVxuICogQGNvbnN0IERlZmF1bHRNZXRhZGF0YVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TWV0YWRhdGE6IEJhc2ljTWV0YWRhdGE8YW55PiA9IHtcbiAgW0RlY29yYXRpb25LZXlzLlBST1BFUlRJRVNdOiBbXSxcbn0gYXMgdW5rbm93biBhcyBCYXNpY01ldGFkYXRhPGFueT47XG4iLCJpbXBvcnQgeyBCYXNpY01ldGFkYXRhLCBDb25zdHJ1Y3RvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cywgT2JqZWN0S2V5U3BsaXR0ZXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCBnaXZlbiBhIHBhdGguXG4gKiBAc3VtbWFyeSBXYWxrcyBhbiBvYmplY3Qgc3RydWN0dXJlIHVzaW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIHJldHVybnMgdGhlIHZhbHVlIGF0IHRoYXQgbG9jYXRpb24gb3IgYHVuZGVmaW5lZGAgaWYgYW55IGtleSBpcyBtaXNzaW5nLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IHRvIHRyYXZlcnNlIGZvciB0aGUgbG9va3VwLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggU3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggdG8gdGhlIGRlc2lyZWQgdmFsdWUgKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBEZWxpbWl0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cy5cbiAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IFZhbHVlIHJlc29sdmVkIGF0IHRoZSBnaXZlbiBwYXRoIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGZvdW5kLlxuICogQGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIGdldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICogICBDLT4+RjogKG9iaiwgcGF0aCwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIEYtPj5POiBhY2Nlc3MgY3VycmVudFtrZXldXG4gKiAgICAgYWx0IG1pc3Npbmcgb3IgbnVsbGlzaFxuICogICAgICAgRi0tPj5DOiByZXR1cm4gdW5kZWZpbmVkXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBGLS0+PkM6IHJldHVybiBmaW5hbCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICBzcGxpdHRlcjogc3RyaW5nID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgYSBuZXN0ZWQgdmFsdWUgb24gYW4gb2JqZWN0IGdpdmVuIGEgcGF0aC5cbiAqIEBzdW1tYXJ5IFRyYXZlcnNlcyBvciBjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzIGZvbGxvd2luZyBhIHNwbGl0dGVyLWRlbGltaXRlZCBwYXRoIGFuZCBhc3NpZ25zIHRoZSBwcm92aWRlZCB2YWx1ZSBhdCB0aGUgZGVzdGluYXRpb24ga2V5LlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IHRvIG11dGF0ZSB3aGlsZSBkcmlsbGluZyBpbnRvIG5lc3RlZCBrZXlzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggU3BsaXR0ZXItZGVsaW1pdGVkIGRlc3RpbmF0aW9uIHBhdGggKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzcGxpdHRlcj1PYmplY3RLZXlTcGxpdHRlcl0gRGVsaW1pdGVyIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHBhdGggc2VnbWVudHMuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIHNldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICogICBDLT4+RjogKG9iaiwgcGF0aCwgdmFsdWUsIHNwbGl0dGVyKVxuICogICBGLT4+Rjogc3BsaXQgcGF0aCBpbnRvIGtleXNcbiAqICAgbG9vcCBmb3IgZWFjaCBrZXlcbiAqICAgICBhbHQga2V5IG1pc3NpbmdcbiAqICAgICAgIEYtPj5POiBjcmVhdGUgaW50ZXJtZWRpYXRlIG9iamVjdFxuICogICAgIGVsc2Uga2V5IGV4aXN0c1xuICogICAgICAgRi0+Pk86IGRlc2NlbmQgaW50byBleGlzdGluZyBvYmplY3RcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+Qzogdm9pZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyXG4pOiB2b2lkIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnQ6IFJlY29yZDxhbnksIGFueT4gPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgaWYgKFxuICAgICAgY3VycmVudFtrZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIlxuICAgICkge1xuICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICBjdXJyZW50W2xhc3RLZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWxpemVkIHJ1bnRpbWUgbWV0YWRhdGEgc3RvcmUgYm91bmQgdG8gY29uc3RydWN0b3JzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdXRpbGl0aWVzIHRvIHJlYWQgYW5kIHdyaXRlIHN0cnVjdHVyZWQgbWV0YWRhdGEgZm9yIGNsYXNzZXMgYW5kIHRoZWlyIG1lbWJlcnMsIHdpdGggb3B0aW9uYWwgbWlycm9yaW5nIG9udG8gdGhlIGNvbnN0cnVjdG9yIHZpYSBhIHdlbGwta25vd24gc3ltYm9sIGtleS4gU3VwcG9ydHMgbmVzdGVkIGtleSBwYXRocyB1c2luZyBhIGNvbmZpZ3VyYWJsZSBzcGxpdHRlciBhbmQgb2ZmZXJzIGJvdGggaW5zdGFuY2UgYW5kIHN0YXRpYyBBUElzLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhlIG1ldGFkYXRhIGJlbG9uZ3MgdG8uXG4gKiBAdGVtcGxhdGUgTUVUQSBFeHRlbmRzIEJhc2ljTWV0YWRhdGE8TT4gcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXI9RGVmYXVsdEZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgaWRlbnRpZmllciBhcHBsaWVkIHdoZW4gaW5zdGFudGlhdGluZyBoZWxwZXIgYnVpbGRlcnMuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYW5kIHJlYWQgbWV0YWRhdGEgZm9yIGEgY2xhc3NcbiAqIGNsYXNzIFVzZXIgeyBuYW1lITogc3RyaW5nIH1cbiAqIE1ldGFkYXRhLnNldChVc2VyLCBcImRlc2NyaXB0aW9uLmNsYXNzXCIsIFwiQSB1c2VyIG1vZGVsXCIpO1xuICogTWV0YWRhdGEuc2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIsIFN0cmluZyk7XG4gKiBjb25zdCBkZXNjID0gTWV0YWRhdGEuZ2V0KFVzZXIsIFwiZGVzY3JpcHRpb24uY2xhc3NcIik7IC8vIFwiQSB1c2VyIG1vZGVsXCJcbiAqIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKFVzZXIsIFwibmFtZVwiKTsgLy8gU3RyaW5nXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29uc3RydWN0b3JcbiAqICAgcGFydGljaXBhbnQgUyBhcyBNZXRhZGF0YSAoc3RhdGljKVxuICogICBDLT4+Uzogc2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIsIFN0cmluZylcbiAqICAgQy0+PlM6IGdldChVc2VyLCBcInByb3BlcnRpZXMubmFtZVwiKVxuICogICBTLS0+PkM6IFN0cmluZ1xuICovXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluLW1lbW9yeSBzdG9yYWdlIG9mIG1ldGFkYXRhIGJ5IGNvbnN0cnVjdG9yIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBNYXBzIGEgU3ltYm9sIGRlcml2ZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgdG8gaXRzIG1ldGFkYXRhIG9iamVjdCwgZW5hYmxpbmcgZWZmaWNpZW50IGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9tZXRhZGF0YTogUmVjb3JkPHN5bWJvbCwgYW55PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGF0aCBkZWxpbWl0ZXIgZm9yIG5lc3RlZCBtZXRhZGF0YSBrZXlzXG4gICAqIEBzdW1tYXJ5IFVzZWQgYnkgZ2V0L3NldCBvcGVyYXRpb25zIHRvIG5hdmlnYXRlIG5lc3RlZCBzdHJ1Y3R1cmVzLCBkZWZhdWx0cyB0byBPYmplY3RLZXlTcGxpdHRlci5cbiAgICovXG4gIHN0YXRpYyBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN5bWJvbCBrZXkgdXNlZCB0byBtaXJyb3IgbWV0YWRhdGEgb24gdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFdoZW4gbWlycm9yaW5nIGlzIGVuYWJsZWQsIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgZGVmaW5lZCBvbiB0aGUgY29uc3RydWN0b3IgdW5kZXIgdGhpcyBub24tZW51bWVyYWJsZSBrZXkuXG4gICAqL1xuICBzdGF0aWMgYmFzZUtleSA9IERlY29yYXRpb25LZXlzLlJFRkxFQ1Q7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBtZXRhZGF0YSBpcyBtaXJyb3JlZCBvbnRvIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgZGVmaW5lZCBvbiB0aGUgY29uc3RydWN0b3IgdW5kZXIgdGhlIG5vbi1lbnVtZXJhYmxlIGJhc2VLZXkuXG4gICAqL1xuICBzdGF0aWMgbWlycm9yOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgU3ltYm9sPE0+KG9iajogQ29uc3RydWN0b3I8TT4pIHtcbiAgICByZXR1cm4gU3ltYm9sLmZvcihbb2JqLnRvU3RyaW5nKCksIG9iai5uYW1lXS5qb2luKFwiIC0gXCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMga25vd24gcHJvcGVydHkga2V5cyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSByZWNvcmRlZCB0eXBlIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgcHJvcGVydHkgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHJldHVybiB7c3RyaW5nW118dW5kZWZpbmVkfSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvciBgdW5kZWZpbmVkYCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgcHJvcGVydGllcyhtb2RlbDogQ29uc3RydWN0b3IpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3RzIGtub3duIG1ldGhvZHMgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSBhbmQgcmV0dXJucyB0aGUgbWV0aG9kIG5hbWVzIHRoYXQgaGF2ZSByZWNvcmRlZCBzaWduYXR1cmUgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIG1ldGhvZCBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIG1ldGhvZCBuYW1lcyBvciBgdW5kZWZpbmVkYCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgbWV0aG9kcyhtb2RlbDogQ29uc3RydWN0b3IpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsLCBEZWNvcmF0aW9uS2V5cy5NRVRIT0RTKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgYSBjbGFzcyBvciBhIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCB0aGUgZGVzY3JpcHRpb24gc3RvcmVkIHVuZGVyIHRoZSBtZXRhZGF0YSBcImRlc2NyaXB0aW9uXCIgbWFwLiBJZiBhIHByb3BlcnR5IGtleSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgcHJvcGVydHkncyBkZXNjcmlwdGlvbjsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgZGVzY3JpcHRpb24gaXMgYmVpbmcgcmV0cmlldmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BdIE9wdGlvbmFsIHByb3BlcnR5IGtleSAodHlwZWQgYXMgYGtleW9mIE1gKSBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIGRlc2NyaXB0aW9uLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfSBEZXNjcmlwdGlvbiB0ZXh0IGlmIHByZXNlbnQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHN0YXRpYyBkZXNjcmlwdGlvbjxNPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcHJvcD86IGtleW9mIE1cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTiwgcHJvcCA/IHByb3AgOiBEZWNvcmF0aW9uS2V5cy5DTEFTU10uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgcGFyYW1zIGZvciBhIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBtZXRob2RzLjxwcm9wPi5kZXNpZ246cGFyYW10eXBlc2AgdG8gcmV0dXJuIHRoZSBwYXJhbWV0ZXIgY29uc3RydWN0b3JzIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igb3duaW5nIHRoZSBtZXRob2QgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqIEByZXR1cm4ge2FueVtdfHVuZGVmaW5lZH0gQXJyYXkgb2YgY29uc3RydWN0b3IgcmVmZXJlbmNlcyBkZXNjcmliaW5nIGVhY2ggcGFyYW1ldGVyIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyBwYXJhbXM8TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+LCBwcm9wOiBzdHJpbmcpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwgRGVjb3JhdGlvbktleXMuREVTSUdOX1BBUkFNU10uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNpbmdsZSByZWNvcmRlZCBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IExvb2tzIHVwIHRoZSBwYXJhbWV0ZXIgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBpbmRleCwgZW5mb3JjaW5nIGJvdW5kcyBhbmQgcmV0dXJuaW5nIHRoZSBjb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoYXQgYXJndW1lbnQuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciBvd25pbmcgdGhlIG1ldGhvZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcGFyYW1ldGVyIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSBwYXJhbWV0ZXIgb3IgYHVuZGVmaW5lZGAgaWYgbm90IHJlY29yZGVkLlxuICAgKi9cbiAgc3RhdGljIHBhcmFtPE0+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBwcm9wOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zKG1vZGVsLCBwcm9wKTtcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoaW5kZXggPiBwYXJhbXMubGVuZ3RoIC0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhcmFtZXRlciBpbmRleCAke2luZGV4fSBvdXQgb2YgcmFuZ2UgZm9yICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhcmFtc1tpbmRleF07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgcmV0dXJuIHR5cGUgZm9yIGEgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYG1ldGhvZHMuPHByb3A+LmRlc2lnbjpyZXR1cm50eXBlYCB0byByZXR1cm4gdGhlIHJldHVybiB0eXBlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgbWV0aG9kIG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHJldHVybiB0eXBlIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSByZXR1cm4gdHlwZSBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBzdGF0aWMgcmV0dXJuPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgcHJvcDogc3RyaW5nKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLCBwcm9wLCBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUkVUVVJOXS5qb2luKFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCBkZXNpZ24gdHlwZSBmb3IgYSBwcm9wZXJ0eS5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBwcm9wZXJ0aWVzLjxwcm9wPmAgdG8gcmV0dXJuIHRoZSBjb25zdHJ1Y3RvciByZWNvcmRlZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0eSBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lIHdob3NlIHR5cGUgbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3Rvcnx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHByb3BlcnR5IHR5cGUgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3RvciwgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcF0uam9pbih0aGlzLnNwbGl0dGVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBjYW5vbmljYWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBtb2RlbCBoYW5kbGUgYW5kIG1ldGFkYXRhLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBzdG9yZWQgY29uc3RydWN0b3IgcmVmZXJlbmNlIHdoZW4gdGhlIHByb3ZpZGVkIG1vZGVsIGlzIGEgcHJveHkgb3IgcmVkdWNlZCB2YWx1ZS4gRmFsbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgbW9kZWwgd2hlbiBubyBjb25zdHJ1Y3RvciBtZXRhZGF0YSBoYXMgYmVlbiByZWNvcmRlZCB5ZXQuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIE1vZGVsIHVzZWQgd2hlbiByZWNvcmRpbmcgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPE0+fSBDYW5vbmljYWwgY29uc3RydWN0b3IgaWYgc3RvcmVkLCBvdGhlcndpc2UgdGhlIHByb3ZpZGVkIG9uZWAuXG4gICAqL1xuICBzdGF0aWMgY29uc3RyPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPik6IENvbnN0cnVjdG9yPE0+IHtcbiAgICByZXR1cm4gbW9kZWxbRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZC5cbiAgICogQHJldHVybiB7TUVUQXx1bmRlZmluZWR9IE1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0PE0sIE1FVEEgZXh0ZW5kcyBCYXNpY01ldGFkYXRhPE0+ID0gQmFzaWNNZXRhZGF0YTxNPj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IE1FVEEgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOZXN0ZWQga2V5IHBhdGggdG8gZmV0Y2ggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICogQHJldHVybiB7TUVUQXwqfHVuZGVmaW5lZH0gTWV0YWRhdGEgb2JqZWN0LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yLCBrZXk6IHN0cmluZyk6IGFueTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT58c3RyaW5nfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZCBvciBhIHByZS1yZXNvbHZlZCBzeW1ib2wgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIE9wdGlvbmFsIG5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtNRVRBfCp8dW5kZWZpbmVkfSBNZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleT86IHN0cmluZykge1xuICAgIGlmIChrZXkgPT09IERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SKSByZXR1cm4gdGhpcy5jb25zdHIobW9kZWwpO1xuICAgIGNvbnN0IHJlc29sdmVkTW9kZWwgPSB0aGlzLmNvbnN0cihtb2RlbCk7XG4gICAgY29uc3QgY29uc3RydWN0b3JzID0gdGhpcy5jb2xsZWN0Q29uc3RydWN0b3JDaGFpbihyZXNvbHZlZE1vZGVsKTtcbiAgICBpZiAoY29uc3RydWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tTeW1ib2wgPSBTeW1ib2wuZm9yKHJlc29sdmVkTW9kZWwudG9TdHJpbmcoKSk7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lckdldChmYWxsYmFja1N5bWJvbCwga2V5KTtcbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGVkVmFsdWVzID0gY29uc3RydWN0b3JzXG4gICAgICAubWFwKChjdG9yKSA9PiB0aGlzLmlubmVyR2V0KHRoaXMuU3ltYm9sKGN0b3IpLCBrZXkpKVxuICAgICAgLmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGNvbGxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5tZXJnZU1ldGFkYXRhQ2hhaW4oY29sbGVjdGVkVmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIHN0b3JlZCB1bmRlciBhIHN5bWJvbCBrZXkuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGhlbHBlciB0aGF0IHJlc29sdmVzIGFuZCBvcHRpb25hbGx5IGRyaWxscyBpbnRvIHRoZSBpbi1tZW1vcnkgbWV0YWRhdGEgbWFwIGZvciB0aGUgcHJvdmlkZWQgc3ltYm9sIGFuZCBrZXkgcGF0aC5cbiAgICogQHBhcmFtIHtzeW1ib2x9IHN5bWJvbCBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBidWNrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gW2tleV0gT3B0aW9uYWwgbmVzdGVkIGtleSByZWZlcmVuY2luZyBhIHNwZWNpZmljIG1ldGFkYXRhIGVudHJ5LlxuICAgKiBAcmV0dXJuIHthbnl9IFN0b3JlZCBtZXRhZGF0YSBvYmplY3Qgb3IgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBrZXksIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5uZXJHZXQoc3ltYm9sOiBzeW1ib2wsIGtleT86IHN0cmluZyB8IHN5bWJvbCkge1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gZ2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdGhpcy5zcGxpdHRlcik7XG4gICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF1ba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBmb3IgYSBjb25zdHJ1Y3Rvciwgb3JkZXJlZCBmcm9tIGJhc2UgdG8gbW9zdC1zcGVjaWZpYyBjbGFzcy5cbiAgICogQHN1bW1hcnkgV2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBzdGFydGluZyBmcm9tIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciB1bnRpbCByZWFjaGluZyBGdW5jdGlvbi9PYmplY3QgYW5kIHJldHVybnMgdGhlIGNvbGxlY3RlZCBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIENvbnN0cnVjdG9yIHdob3NlIGNoYWluIHNob3VsZCBiZSBjb2xsZWN0ZWQuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yW119IEFycmF5IG9mIGNvbnN0cnVjdG9ycyBvcmRlcmVkIGZyb20gYmFzZSB0byBsZWFmLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY29sbGVjdENvbnN0cnVjdG9yQ2hhaW4obW9kZWw6IENvbnN0cnVjdG9yKTogQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgY2hhaW46IENvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG5cbiAgICB3aGlsZSAodHlwZW9mIGN1cnJlbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgICAgY2hhaW4ucHVzaChjdXJyZW50IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudCA9PT0gRnVuY3Rpb24gfHwgcGFyZW50ID09PSBPYmplY3QpIGJyZWFrO1xuICAgICAgY3VycmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhaW4ucmV2ZXJzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgbWV0YWRhdGEgdmFsdWVzIGNvbGxlY3RlZCBhY3Jvc3MgdGhlIGluaGVyaXRhbmNlIGNoYWluLlxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIGRlZXAgbWVyZ2UgZm9yIHBsYWluIG9iamVjdHMgd2hpbGUgbGV0dGluZyBub24tb2JqZWN0IHZhbHVlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMgdG8gcHJlc2VydmUgY2hpbGQgbWV0YWRhdGEgcHJlY2VkZW5jZS5cbiAgICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIE1ldGFkYXRhIHZhbHVlcyBnYXRoZXJlZCBmcm9tIGJhc2UgdG8gY2hpbGQuXG4gICAqIEByZXR1cm4ge2FueX0gQWdncmVnYXRlZCBtZXRhZGF0YSB2YWx1ZSByZXNwZWN0aW5nIGluaGVyaXRhbmNlIHByZWNlZGVuY2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtZXJnZU1ldGFkYXRhQ2hhaW4odmFsdWVzOiBhbnlbXSkge1xuICAgIGxldCBhY2M6IGFueSA9IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoYWNjID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjID0gdGhpcy5jbG9uZU1ldGFkYXRhVmFsdWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhY2MpICYmIHRoaXMuaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgYWNjID0gdGhpcy5tZXJnZVBsYWluT2JqZWN0cyhcbiAgICAgICAgICBhY2MgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhY2MgPSB0aGlzLmNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvZHVjZXMgYSBkZWVwIGNsb25lIG9mIGEgbWV0YWRhdGEgdmFsdWUgd2hlbiBuZWNlc3NhcnkuXG4gICAqIEBzdW1tYXJ5IEFycmF5cyBhcmUgc2hhbGxvdy1jbG9uZWQsIHBsYWluIG9iamVjdHMgYXJlIGRlZXAtY2xvbmVkLCBhbmQgcHJpbWl0aXZlL2Z1bmN0aW9uIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBjbG9uZS5cbiAgICogQHJldHVybiB7YW55fSBDbG9uZWQgbWV0YWRhdGEgdmFsdWUgcHJldmVudGluZyBtdXRhdGlvbiBvZiB0aGUgYmFja2luZyBzdG9yZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gWy4uLnZhbHVlXTtcbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSlcbiAgICAgIHJldHVybiB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKHt9LCB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZXBseSBtZXJnZXMgdHdvIHBsYWluIG1ldGFkYXRhIG9iamVjdHMuXG4gICAqIEBzdW1tYXJ5IFJlY3Vyc2l2ZWx5IG1lcmdlcyBuZXN0ZWQgcGxhaW4gb2JqZWN0cyB3aGlsZSBjbG9uaW5nIGFycmF5czsgdmFsdWVzIGZyb20gYHNvdXJjZWAgb3ZlcnJpZGUgdGhvc2UgZnJvbSBgdGFyZ2V0YCB3aGVuIGNvbmZsaWN0cyBvY2N1ci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgQmFzZSBvYmplY3QgdG8gbWVyZ2UgaW50by5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzb3VyY2UgT2JqZWN0IHByb3ZpZGluZyBvdmVycmlkaW5nIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBOZXdseSBtZXJnZWQgbWV0YWRhdGEgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbWVyZ2VQbGFpbk9iamVjdHMoXG4gICAgdGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHNvdXJjZTogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLnRhcmdldCB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gcmVzdWx0W2tleV07XG5cbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc291cmNlVmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5pc1BsYWluT2JqZWN0KHRhcmdldFZhbHVlKVxuICAgICAgICAgID8gdGhpcy5tZXJnZVBsYWluT2JqZWN0cyhcbiAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICAgICAgICAgc291cmNlVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdGhpcy5tZXJnZVBsYWluT2JqZWN0cyh7fSwgc291cmNlVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBbLi4uc291cmNlVmFsdWVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2VWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCBzdWl0YWJsZSBmb3IgZGVlcCBtZXJnaW5nLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIGFycmF5cyBhbmQgbnVsbCBhcmUgZXhjbHVkZWQgd2hpbGUgYWNjZXB0aW5nIG9iamVjdHMgY3JlYXRlZCB2aWEgbGl0ZXJhbC9jbGFzcyBzeW50YXguXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQbGFpbk9iamVjdCh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gICAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXcml0ZXMgbWV0YWRhdGEgdW5kZXIgYSBzeW1ib2wga2V5LlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBoZWxwZXIgdGhhdCBlbnN1cmVzIHRoZSBtZXRhZGF0YSBidWNrZXQgZXhpc3RzIGZvciB0aGUgcHJvdmlkZWQgc3ltYm9sIGFuZCBwZXJzaXN0cyB0aGUgZ2l2ZW4gdmFsdWUsIGRyaWxsaW5nIGludG8gbmVzdGVkIHN0cnVjdHVyZXMgd2hlbiB0aGUga2V5IGlzIGEgc3RyaW5nIHBhdGguXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBzeW1ib2wgU3ltYm9sIHJlcHJlc2VudGluZyB0aGUgbWV0YWRhdGEgYnVja2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleSBOZXN0ZWQga2V5IHBhdGggb3IgZGlyZWN0IHN5bWJvbCB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgbWV0YWRhdGEgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSBwZXJzaXN0ZWQgaW4gdGhlIG1ldGFkYXRhIHN0b3JlLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5uZXJTZXQoc3ltYm9sOiBzeW1ib2wsIGtleTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdID0ge30gYXMgYW55O1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKTtcbiAgICB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV3JpdGVzIGEgbWV0YWRhdGEgdmFsdWUgYXQgYSBnaXZlbiBuZXN0ZWQga2V5IHBhdGguXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhlIG1ldGFkYXRhIHJlY29yZCBleGlzdHMgZm9yIHRoZSBjb25zdHJ1Y3RvciwgbWlycm9ycyBpdCBvbiB0aGUgY29uc3RydWN0b3Igd2hlbiBlbmFibGVkLCBhbmQgc2V0cyB0aGUgcHJvdmlkZWQgdmFsdWUgb24gdGhlIG5lc3RlZCBrZXkgcGF0aCB1c2luZyB0aGUgY29uZmlndXJlZCBzcGxpdHRlci5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPnxzdHJpbmd9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB0byB3aGljaCB0aGUgbWV0YWRhdGEgYmVsb25ncyBvciBhIGRpcmVjdCBpZGVudGlmaWVyIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOZXN0ZWQga2V5IHBhdGggYXQgd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsdWUgdG8gc3RvcmUgaW4gdGhlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3IgfCBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGtleSA9PT0gRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbW9kZWwgIT09IFwic3RyaW5nXCIpIG1vZGVsID0gdGhpcy5jb25zdHIobW9kZWwpIHx8IG1vZGVsO1xuICAgIGNvbnN0IHN5bWJvbCA9XG4gICAgICB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBTeW1ib2wuZm9yKG1vZGVsKSA6IHRoaXMuU3ltYm9sKG1vZGVsKTtcbiAgICB0aGlzLmlubmVyU2V0KHN5bWJvbCwga2V5LCB2YWx1ZSk7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiICYmXG4gICAgICBNZXRhZGF0YS5taXJyb3IgJiZcbiAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHRoaXMuYmFzZUtleSlcbiAgICApIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgdGhpcy5iYXNlS2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcnkgYW5kIGl0cyB2ZXJzaW9uLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHZlcnNpb24gc3RyaW5nIGZvciBhbiBpbnRlZ3JhdGluZyBsaWJyYXJ5IHVuZGVyIHRoZSBzaGFyZWQgbGlicmFyaWVzIG1ldGFkYXRhIHN5bWJvbCwgcHJldmVudGluZyBkdXBsaWNhdGUgcmVnaXN0cmF0aW9ucyBmb3IgdGhlIHNhbWUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlicmFyeSBQYWNrYWdlIG5hbWUgb3IgaWRlbnRpZmllciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gU2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaWJyYXJ5LlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxpYnJhcnkgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyTGlicmFyeShsaWJyYXJ5OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoRGVjb3JhdGlvbktleXMuTElCUkFSSUVTKTtcbiAgICBjb25zdCBsaWIgPSB0aGlzLmlubmVyR2V0KHN5bWJvbCwgbGlicmFyeSk7XG4gICAgaWYgKGxpYilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExpYnJhcnkgYWxyZWFkeSAke2xpYnJhcnl9IHJlZ2lzdGVyZWQgd2l0aCB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgICApO1xuICAgIHRoaXMuaW5uZXJTZXQoc3ltYm9sLCBsaWJyYXJ5LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMgcmVnaXN0ZXJlZCBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcmllcy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgaW4tbWVtb3J5IG1hcCBvZiBsaWJyYXJ5IGlkZW50aWZpZXJzIHRvIHNlbWFudGljIHZlcnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRGVjb3JhdGlvbiBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gTWFwIG9mIHJlZ2lzdGVyZWQgbGlicmFyeSBpZGVudGlmaWVycyB0byB0aGVpciB2ZXJzaW9uIHN0cmluZ3MuXG4gICAqL1xuICBzdGF0aWMgbGlicmFyaWVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoRGVjb3JhdGlvbktleXMuTElCUkFSSUVTKTtcbiAgICByZXR1cm4gdGhpcy5pbm5lckdldChzeW1ib2wpIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBKb2lucyBwYXRoIHNlZ21lbnRzIHVzaW5nIHRoZSBjdXJyZW50IHNwbGl0dGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgbmVzdGVkIG1ldGFkYXRhIGtleSBieSBjb25jYXRlbmF0aW5nIHN0cmluZyBzZWdtZW50cyB3aXRoIHRoZSBjb25maWd1cmVkIHNwbGl0dGVyIGZvciB1c2Ugd2l0aCB0aGUgbWV0YWRhdGEgc3RvcmUuXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBzdHJzIEtleSBzZWdtZW50cyB0byBqb2luIGludG8gYSBmdWxsIG1ldGFkYXRhIHBhdGguXG4gICAqIEByZXR1cm4ge3N0cmluZ30gU3BsaXR0ZXItam9pbmVkIG1ldGFkYXRhIGtleS5cbiAgICovXG4gIHN0YXRpYyBrZXkoLi4uc3Ryczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gc3Rycy5qb2luKHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgcmVzb2x2ZXIgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IGRlZmF1bHQgZmxhdm91ci5cbiAqIEBzdW1tYXJ5IFJlc29sdmVzIHRoZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldCBieSBhbHdheXMgcmV0dXJuaW5nIHRoZSBsaWJyYXJ5J3MgYERlZmF1bHRGbGF2b3VyYCB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCBiZWluZyBkZWNvcmF0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJlc29sdmVkIGZsYXZvdXIgaWRlbnRpZmllci5cbiAqIEBmdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaW9uIHR5cGUgY292ZXJpbmcgc3VwcG9ydGVkIGRlY29yYXRvciBraW5kcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IG9mIHRoZSBzdGFuZGFyZCBUeXBlU2NyaXB0IGRlY29yYXRvciBzaWduYXR1cmVzIChjbGFzcywgcHJvcGVydHksIG9yIG1ldGhvZCksIGVuYWJsaW5nIGZsZXhpYmxlIHJlZ2lzdHJhdGlvbiBhbmQgYXBwbGljYXRpb24gd2l0aGluIHRoZSBEZWNvcmF0aW9uIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JUeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvclR5cGVzID1cbiAgfCBDbGFzc0RlY29yYXRvclxuICB8IFByb3BlcnR5RGVjb3JhdG9yXG4gIHwgTWV0aG9kRGVjb3JhdG9yO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIGEgZGVjb3JhdG9yIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyYml0cmFyeSBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBjb25jcmV0ZSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYmUgYXBwbGllZCB0byBhIHRhcmdldC5cbiAqIEB0ZW1wbGF0ZSBBXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRmFjdG9yeSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gRGVjb3JhdG9yVHlwZXM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFyZ3VtZW50IGJ1bmRsZSBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeS5cbiAqIEBzdW1tYXJ5IE9iamVjdCBmb3JtIHVzZWQgdG8gZGVmZXIgZGVjb3JhdG9yIGNyZWF0aW9uLCBjYXJyeWluZyBib3RoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnQgbGlzdCB0byBiZSBpbnZva2VkIGxhdGVyIGR1cmluZyBhcHBsaWNhdGlvbi5cbiAqIEB0eXBlRGVmIERlY29yYXRvckZhY3RvcnlBcmdzXG4gKiBAcHJvcGVydHkge0RlY29yYXRvckZhY3Rvcnl9IGRlY29yYXRvciBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBkZWNvcmF0b3Igd2hlbiBpbnZva2VkLlxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyBMaXN0IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBkZWNvcmF0b3IgZmFjdG9yeS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5QXJncyA9IHtcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JGYWN0b3J5O1xuICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaW9uIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYSByZWFkeS10by1hcHBseSBkZWNvcmF0b3Igb3IgYSBmYWN0b3J5IHdpdGggYXJndW1lbnRzLlxuICogQHN1bW1hcnkgQWxsb3dzIHJlZ2lzdGVyaW5nIGRlY29yYXRvcnMgaW4gdHdvIGZvcm1zOiBhcyBkaXJlY3QgZGVjb3JhdG9yIGZ1bmN0aW9ucyBvciBhcyBkZWZlcnJlZCBmYWN0b3JpZXMgcGFpcmVkIHdpdGggdGhlaXIgYXJndW1lbnQgbGlzdHMgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24uXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JEYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvclR5cGVzIHwgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG5leHBvcnQgdHlwZSBFeHRlbmREZWNvcmF0b3JEYXRhID1cbiAgfCBEZWNvcmF0b3JUeXBlc1xuICB8IE9taXQ8RGVjb3JhdG9yRmFjdG9yeUFyZ3MsIFwiYXJnc1wiPjtcbnR5cGUgU3RvcmVkRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvckRhdGEgfCBFeHRlbmREZWNvcmF0b3JEYXRhO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBkZWNvcmF0b3IgbWFuYWdlbWVudCBjbGFzcyB0aGF0IGhhbmRsZXMgZmxhdm91cmVkIGRlY29yYXRvcnMuXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuIEl0IHN1cHBvcnRzIHJlZ2lzdGVyaW5nLCBleHRlbmRpbmcsIGFuZCBhcHBseWluZyBkZWNvcmF0b3JzIHdpdGggY29udGV4dC1hd2FyZSBmbGF2b3VyIHJlc29sdXRpb24sIGFsbG93aW5nIGZyYW1ld29yay1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgYSBjb25zaXN0ZW50IEFQSS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGRlY29yYXRvciAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXI9RGVmYXVsdEZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgcGFyYW1ldGVyIGZvciB0aGUgZGVjb3JhdG9yIGNvbnRleHQuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgZGVjb3JhdGlvbiBmb3IgJ2NvbXBvbmVudCcgd2l0aCBkZWZhdWx0IGZsYXZvdXJcbiAqIGNvbnN0IGNvbXBvbmVudERlY29yYXRvciA9IG5ldyBEZWNvcmF0aW9uKClcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZShjdXN0b21Db21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGZsYXZvdXJlZCBkZWNvcmF0aW9uXG4gKiBjb25zdCB2dWVDb21wb25lbnQgPSBuZXcgRGVjb3JhdGlvbigndnVlJylcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZSh2dWVDb21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIEFwcGx5IHRoZSBkZWNvcmF0aW9uXG4gKiBAY29tcG9uZW50RGVjb3JhdG9yXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7fVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdGlvblxuICogICBwYXJ0aWNpcGFudCBSIGFzIEZsYXZvdXJSZXNvbHZlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIERlY29yYXRvckZhY3RvcnlcbiAqXG4gKiAgIEMtPj5EOiBuZXcgRGVjb3JhdGlvbihmbGF2b3VyKVxuICogICBDLT4+RDogZm9yKGtleSlcbiAqICAgQy0+PkQ6IGRlZmluZShkZWNvcmF0b3JzKVxuICogICBELT4+RDogcmVnaXN0ZXIoa2V5LCBmbGF2b3VyLCBkZWNvcmF0b3JzKVxuICogICBELT4+RjogZGVjb3JhdG9yRmFjdG9yeShrZXksIGZsYXZvdXIpXG4gKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAqICAgUi0tPj5GOiByZXNvbHZlZCBmbGF2b3VyXG4gKiAgIEYtPj5GOiBhcHBseSBkZWNvcmF0b3JzXG4gKiAgIEYtLT4+QzogZGVjb3JhdGVkIHRhcmdldFxuICovXG5leHBvcnQgY2xhc3MgRGVjb3JhdGlvbiBpbXBsZW1lbnRzIElEZWNvcmF0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1hcCBvZiByZWdpc3RlcmVkIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyBhbGwgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzIG9yZ2FuaXNlZCBieSBrZXkgYW5kIGZsYXZvdXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PFN0b3JlZERlY29yYXRvckRhdGE+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXQuXG4gICAqIEBzdW1tYXJ5IFJlc29sdmVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgZmxhdm91ciBmb3IgYSBnaXZlbiB0YXJnZXQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmbGF2b3VyUmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlciA9IGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBhZGRpdGlvbmFsIGRlY29yYXRvcnMuXG4gICAqL1xuICBwcml2YXRlIGV4dHJhcz86IFNldDxTdG9yZWREZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVjb3JhdG9yIGtleS5cbiAgICovXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmxhdm91cjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBrZXkgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXIuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpc2VzIGEgbmV3IGRlY29yYXRpb24gY2hhaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBJZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBkZWNvcmF0b3JzIHdpdGggYWRkb24gc3VwcG9ydC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYWRkb249ZmFsc2VdIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWNvcmF0b3JzIGFyZSBhZGRpdGl2ZSBleHRyYXMuXG4gICAqIEBwYXJhbSB7Li4uRGVjb3JhdG9yRGF0YX0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIHJlZ2lzdGVyIGZvciB0aGUgY29uZmlndXJlZCBrZXkuXG4gICAqIEByZXR1cm4ge3RoaXN9IEN1cnJlbnQgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0ZShcbiAgICBhZGRvbjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIC4uLmRlY29yYXRvcnM6IFN0b3JlZERlY29yYXRvckRhdGFbXVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5IG11c3QgYmUgcHJvdmlkZWQgYmVmb3JlIGRlY29yYXRvcnMgY2FuIGJlIGFkZGVkXCIpO1xuICAgIGlmIChcbiAgICAgICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpICYmXG4gICAgICAhYWRkb24gJiZcbiAgICAgIHRoaXMuZmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXJcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTXVzdCBwcm92aWRlIG92ZXJyaWRlcyBvciBhZGRvbnMgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGRlY2FmJ3MgZGVjb3JhdG9yc1wiXG4gICAgICApO1xuICAgICh0aGlzIGFzIGFueSlbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdID0gbmV3IFNldChbXG4gICAgICAuLi4odGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgYmFzZSBkZWNvcmF0b3JzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7Li4uRGVjb3JhdG9yRGF0YX0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIGRlZmluZS5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJFbmR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGZpbmlzaGluZyB0aGUgY2hhaW4gKGFsc28gaW1wbGVtZW50cyBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkKS5cbiAgICovXG4gIGRlZmluZShcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICBpZiAoXG4gICAgICBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IHR5cGVvZiBkID09PSBcIm9iamVjdFwiKSAmJlxuICAgICAgZGVjb3JhdG9ycy5sZW5ndGggIT09IDFcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXaGVuIHVzaW5nIGFuIG92ZXJyaWRhYmxlIGRlY29yYXRvciwgb25seSBvbmUgaXMgYWxsb3dlZGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUoZmFsc2UsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGV4aXN0aW5nIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7Li4uRGVjb3JhdG9yRGF0YX0gZGVjb3JhdG9ycyBBZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gcmVnaXN0ZXIgYXMgYWRkb25zLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yLlxuICAgKi9cbiAgZXh0ZW5kKC4uLmRlY29yYXRvcnM6IEV4dGVuZERlY29yYXRvckRhdGFbXSk6IERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4gdHlwZW9mIGQgPT09IFwib2JqZWN0XCIpICYmXG4gICAgICBkZWNvcmF0b3JzLmxlbmd0aCAhPT0gMVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdoZW4gZXh0ZW5kaW5nIHVzaW5nIGFuIG92ZXJyaWRhYmxlIGRlY29yYXRvciwgb25seSBvbmUgaXMgYWxsb3dlZGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgY29udGV4dC1hd2FyZSBkZWNvcmF0b3IgZm9yIGEga2V5L2ZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IFByb2R1Y2VzIGEgZGVjb3JhdG9yIGZ1bmN0aW9uIGJvdW5kIHRvIHRoZSBwcm92aWRlZCBrZXkgYW5kIGZsYXZvdXIuIFRoZSByZXN1bHRpbmcgZGVjb3JhdG9yIHJlc29sdmVzIHRoZSBhY3R1YWwgZGVjb3JhdG9ycyB0byBhcHBseSBhdCBpbnZvY2F0aW9uIHRpbWUgYmFzZWQgb24gdGhlIHRhcmdldCdzIHJlc29sdmVkIGZsYXZvdXIgYW5kIHRoZSByZWdpc3RlcmVkIGJhc2UgYW5kIGV4dHJhIGRlY29yYXRvcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdGlvbiBrZXkgdXNlZCB0byBsb29rIHVwIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmPURlZmF1bHRGbGF2b3VyXSBFeHBsaWNpdCBmbGF2b3VyIHRvIGJpbmQgdGhlIGZhY3RvcnkgdG8uXG4gICAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgdGhlIHJlc29sdmVkIGRlY29yYXRvcnMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBEZWNvcmF0aW9uIChidWlsZGVyKVxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgZGVjb3JhdG9yRmFjdG9yeShrZXksIGYpXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBmbGF2b3VyUmVzb2x2ZXJcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFwcGxpZWQgRGVjb3JhdG9yc1xuICAgKiAgIFUtPj5COiBkZWZpbmUoKS9leHRlbmQoKSBhbmQgYXBwbHkoKVxuICAgKiAgIEItPj5GOiBjcmVhdGUgY29udGV4dCBkZWNvcmF0b3JcbiAgICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gICAqICAgUi0tPj5GOiBmbGF2b3VyXG4gICAqICAgRi0+PkE6IGNvbGxlY3QgYmFzZSArIGV4dHJhc1xuICAgKiAgIGxvb3AgZWFjaCBkZWNvcmF0b3JcbiAgICogICAgIEEtPj5VOiBpbnZva2UgZGVjb3JhdG9yKHRhcmdldCwga2V5PywgZGVzYz8pXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBmdW5jdGlvbiBjb250ZXh0RGVjb3JhdG9yKFxuICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICAgKSB7XG4gICAgICBjb25zdCBmbGF2b3VyID0gRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIodGFyZ2V0KTtcbiAgICAgIGNvbnN0IGNhY2hlID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV07XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IGNhY2hlW2ZsYXZvdXJdXG4gICAgICAgID8gY2FjaGVbZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcblxuICAgICAgaWYgKFxuICAgICAgICBjYWNoZSAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXSAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMuc2l6ZVxuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW0RlZmF1bHRGbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlRGVjb3JhdG9yc0xpc3QgPSBbLi4uKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnZhbHVlcygpIDogW10pXTtcblxuICAgICAgY29uc3QgZGVmYXVsdERlY29yYXRvcnNMaXN0ID0gW1xuICAgICAgICAuLi4oY2FjaGVbRGVmYXVsdEZsYXZvdXJdPy5kZWNvcmF0b3JzIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBiYXNlQXJnc0J5SW5kZXggPSBiYXNlRGVjb3JhdG9yc0xpc3QucmVkdWNlKFxuICAgICAgICAoYWNjdW0sIGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJhcmdzXCIgaW4gKGVudHJ5IGFzIGFueSkgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGVudHJ5IGFzIGFueSkuYXJncylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjY3VtW2luZGV4XSA9IChlbnRyeSBhcyBhbnkpLmFyZ3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPG51bWJlciwgYW55W10+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWZhdWx0QXJnc0J5SW5kZXggPSBkZWZhdWx0RGVjb3JhdG9yc0xpc3QucmVkdWNlKFxuICAgICAgICAoYWNjdW0sIGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJhcmdzXCIgaW4gKGVudHJ5IGFzIGFueSkgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGVudHJ5IGFzIGFueSkuYXJncylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjY3VtW2luZGV4XSA9IChlbnRyeSBhcyBhbnkpLmFyZ3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPG51bWJlciwgYW55W10+XG4gICAgICApO1xuXG4gICAgICBjb25zdCB0b0FwcGx5ID0gW1xuICAgICAgICAuLi5iYXNlRGVjb3JhdG9yc0xpc3QsXG4gICAgICAgIC4uLihleHRyYXMgPyBleHRyYXMudmFsdWVzKCkgOiBbXSksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBiYXNlTGVuZ3RoID0gYmFzZURlY29yYXRvcnNMaXN0Lmxlbmd0aDtcblxuICAgICAgcmV0dXJuIHRvQXBwbHkucmVkdWNlKFxuICAgICAgICAoXywgZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkKSB7XG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkIGFzIGFueTtcbiAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlSW5kZXggPSBpbmRleCA8IGJhc2VMZW5ndGggPyBpbmRleCA6IDA7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICAgICAgICAgIFwiYXJnc1wiIGluIGVudHJ5ICYmIEFycmF5LmlzQXJyYXkoZW50cnkuYXJncylcbiAgICAgICAgICAgICAgICAgID8gZW50cnkuYXJnc1xuICAgICAgICAgICAgICAgICAgOiAoYmFzZUFyZ3NCeUluZGV4W2NhbmRpZGF0ZUluZGV4XSA/P1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QXJnc0J5SW5kZXhbY2FuZGlkYXRlSW5kZXhdID8/XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBcmdzQnlJbmRleFswXSA/P1xuICAgICAgICAgICAgICAgICAgICBbXSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeS5kZWNvcmF0b3IoLi4uYXJncykgYXMgYW55KShcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICAgIHJldHVybiAoZCBhcyBhbnkpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRlY29yYXRvciB0eXBlOiAke3R5cGVvZiBkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yIH1cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvbi5cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gR2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvbiByZWFkeSBmb3IgYXBwbGljYXRpb24uXG4gICAqL1xuICBhcHBseSgpOiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKSA9PiBhbnkge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgY29uc3QgZXhpc3RpbmdEZWNvcmF0b3JzID1cbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1t0aGlzLmtleV0/Llt0aGlzLmZsYXZvdXJdPy5kZWNvcmF0b3JzO1xuICAgIGNvbnN0IGRlY29yYXRvcnNUb1JlZ2lzdGVyID1cbiAgICAgIHRoaXMuZGVjb3JhdG9ycyB8fCBleGlzdGluZ0RlY29yYXRvcnMgfHwgbmV3IFNldDxEZWNvcmF0b3JEYXRhPigpO1xuXG4gICAgRGVjb3JhdGlvbi5yZWdpc3RlcihcbiAgICAgIHRoaXMua2V5LFxuICAgICAgdGhpcy5mbGF2b3VyLFxuICAgICAgZGVjb3JhdG9yc1RvUmVnaXN0ZXIsXG4gICAgICB0aGlzLmV4dHJhc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRvciBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyLlxuICAgKiBAcGFyYW0ge1NldDxEZWNvcmF0b3JEYXRhPn0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9ycyByZWdpc3RlcmVkIGZvciB0aGUga2V5LlxuICAgKiBAcGFyYW0ge1NldDxEZWNvcmF0b3JEYXRhPn0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgYXMgZmxhdm91ci1zcGVjaWZpYyBhZGRvbnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPixcbiAgICBleHRyYXM/OiBTZXQ8U3RvcmVkRGVjb3JhdG9yRGF0YT5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvcmF0b3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGVjb3JhdG9ycyBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBmbGF2b3VyIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuXG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSkgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gPSB7fTtcbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdKVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gPSB7fTtcbiAgICBpZiAoZGVjb3JhdG9ycykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgaWYgKGV4dHJhcykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzID0gZXh0cmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBnbG9iYWwgZmxhdm91ciByZXNvbHZlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzLlxuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vycy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRGbGF2b3VyUmVzb2x2ZXIocmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlcikge1xuICAgIERlY29yYXRpb24uZmxhdm91clJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIHN0YXRpYyBlbnRyeSB0byBzdGFydCBhIGRlY29yYXRpb24gYnVpbGRlci5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBEZWNvcmF0aW9uIGluc3RhbmNlIGFuZCBpbml0aWF0ZXMgdGhlIGJ1aWxkZXIgY2hhaW4gd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRpb24ga2V5IHRvIGNvbmZpZ3VyZS5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nIGRlZmluaXRpb25zLlxuICAgKi9cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIGEgYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBmbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBtZXRob2QgdG8gYmVnaW4gYSBEZWNvcmF0aW9uIGJ1aWxkZXIgY2hhaW4gYm91bmQgdG8gdGhlIGdpdmVuIGZsYXZvdXIgaWRlbnRpZmllciwgYWxsb3dpbmcgcmVnaXN0cmF0aW9uIG9mIGZsYXZvdXItc3BlY2lmaWMgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRmxhdm91ciBuYW1lIHRvIGJpbmQgdG8gdGhlIGJ1aWxkZXIuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyU3RhcnR9IEJ1aWxkZXIgc3RhcnQgaW50ZXJmYWNlIHRvIGNvbnRpbnVlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhL01ldGFkYXRhXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCIuL2RlY29yYXRpb24vRGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBc3NpZ25zIGFyYml0cmFyeSBtZXRhZGF0YSB0byBhIHRhcmdldCB1c2luZyBhIHN0cmluZyBrZXkuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHN0b3JlcyBhIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjZW50cmFsIG1ldGFkYXRhIHN0b3JlIGZvciB0aGUgcHJvdmlkZWQgY2xhc3Mgb3IgbWVtYmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRhcmdldC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBzdG9yZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LlxuICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgd3JpdGVzIHRoZSBtZXRhZGF0YSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gbWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gbWV0YWRhdGEoXG4gICAgbW9kZWw6IGFueSxcblxuICAgIHByb3A/OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IgfCBudW1iZXJcbiAgKSB7XG4gICAgTWV0YWRhdGEuc2V0KHByb3AgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsLCBrZXksIHZhbHVlKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FwdHVyZXMgYW5kIHN0b3JlcyBhIHByb3BlcnR5J3MgZGVzaWduIHR5cGUuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHJlYWRzIHRoZSByZWZsZWN0ZWQgYGRlc2lnbjp0eXBlYCBmb3IgYSBwcm9wZXJ0eSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtZXRhZGF0YSBzdG9yZSB1bmRlciB0aGUgcHJvcGVydGllcyBtYXAuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgcHJvcGVydHkncyB0eXBlIG1ldGFkYXRhIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcCgpIHtcbiAgZnVuY3Rpb24gaW5uZXJQcm9wKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBpbm5lclByb3AobW9kZWw6IG9iamVjdCwgcHJvcD86IGFueSkge1xuICAgICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9UWVBFLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgcHJvcFxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3ApLFxuICAgICAgICBkZXNpZ25UeXBlXG4gICAgICApKG1vZGVsLCBwcm9wKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGlubmVyUHJvcCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhcHR1cmVzIGEgc2luZ2xlIHBhcmFtZXRlciB0eXBlIGZvciB0aGUgZGVjb3JhdGVkIG1ldGhvZC5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgZW5zdXJlcyB0aGUgbWV0aG9kIG1ldGFkYXRhIGlzIGluaXRpYWxpc2VkIGFuZCBzdG9yZXMgdGhlIHJlZmxlY3RlZCBwYXJhbWV0ZXIgY29uc3RydWN0b3IgYXQgdGhlIHByb3ZpZGVkIGluZGV4LlxuICogQHJldHVybiB7UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBwYXJhbWV0ZXIgdHlwZSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gcGFyYW1cbiAqIEBjYXRlZ29yeSBQYXJhbWV0ZXIgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBQIGFzIHBhcmFtKClcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNZXRhZGF0YVxuICogICBVLT4+UDogcGFyYW0oKSh0YXJnZXQsIGtleSwgaW5kZXgpXG4gKiAgIFAtPj5VOiBtZXRob2QoKSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcilcbiAqICAgUC0+Pk06IHBhcmFtcyhjb25zdHJ1Y3Rvciwga2V5KVxuICogICBNLS0+PlA6IHBhcmFtZXRlciBjb25zdHJ1Y3RvcnNbXVxuICogICBQLT4+TTogc2V0KG1ldGhvZHMua2V5LmluZGV4LCBjb25zdHJ1Y3RvcilcbiAqICAgUC0tPj5VOiBwYXJhbWV0ZXIgcmVjb3JkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcmFtKCkge1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYW0oXG4gICAgbW9kZWw6IG9iamVjdCxcbiAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgaW5kZXg6IG51bWJlclxuICApIHtcbiAgICBpZiAoIXByb3ApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBAcGFyYW0gZGVjb3JhdG9yIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gbWV0aG9kc2ApO1xuICAgIG1ldGhvZCgpKG1vZGVsLCBwcm9wLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1vZGVsLCBwcm9wKSk7XG4gICAgY29uc3QgcGFyYW1UcGVzID0gTWV0YWRhdGEucGFyYW1zKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSwgcHJvcCBhcyBzdHJpbmcpO1xuICAgIGlmICghcGFyYW1UcGVzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHBhcmFtZXRlciB0eXBlcyBmb3IgJHtTdHJpbmcocHJvcCl9YCk7XG4gICAgaWYgKGluZGV4ID49IHBhcmFtVHBlcy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQYXJhbWV0ZXIgaW5kZXggJHtpbmRleH0gb3V0IG9mIHJhbmdlIGZvciAke1N0cmluZyhwcm9wKX1gXG4gICAgICApO1xuICAgIG1ldGFkYXRhKFxuICAgICAgTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AgYXMgc3RyaW5nLCBpbmRleC50b1N0cmluZygpKSxcbiAgICAgIHBhcmFtVHBlc1tpbmRleF1cbiAgICApKG1vZGVsLCBwcm9wKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBhIHBhcmFtZXRlciBkZWNvcmF0b3Igd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgZGVmYXVsdCBgcGFyYW0oKWAgZGVjb3JhdG9yIGFuZCBhdWdtZW50cyB0aGUgc3RvcmVkIG1ldGFkYXRhIHdpdGggYW4gYXJiaXRyYXJ5IGtleS92YWx1ZSBwYWlyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSBwZXJzaXN0ZWQgdW5kZXIgdGhlIGdpdmVuIGtleS5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyBib3RoIHRoZSBwYXJhbWV0ZXIgZGVzaWduIHR5cGUgYW5kIGFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gKiBAZnVuY3Rpb24gcGFyYW1NZXRhZGF0YVxuICogQGNhdGVnb3J5IFBhcmFtZXRlciBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhKHRhcmdldDogYW55LCBwcm9wOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwYXJhbSgpLFxuICAgICAgbWV0YWRhdGEoTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AsIGtleSksIHZhbHVlKVxuICAgICkodGFyZ2V0LCBwcm9wLCBpbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlY29yZHMgbWV0aG9kIGRlc2lnbi10aW1lIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYXB0dXJlcyBhIG1ldGhvZCdzIHJlZmxlY3RlZCBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlcywgc3RvcmluZyB0aGVtIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBtZXRhZGF0YSBrZXlzIHNvIHRoZXkgY2FuIGJlIGluc3BlY3RlZCBhdCBydW50aW1lLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBwZXJzaXN0cyB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlIGluZm9ybWF0aW9uIGludG8gdGhlIG1ldGFkYXRhIHN0b3JlIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBtZXRob2RcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAqICAgcGFydGljaXBhbnQgRiBhcyBtZXRob2QoKVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKiAgIFUtPj5GOiBtZXRob2QoKSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcilcbiAqICAgRi0+PlU6IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoZGVzaWduOnBhcmFtdHlwZXMpXG4gKiAgIEYtPj5VOiBSZWZsZWN0LmdldE93bk1ldGFkYXRhKGRlc2lnbjpyZXR1cm50eXBlKVxuICogICBGLT4+TTogc2V0KG1ldGhvZHMua2V5LmRlc2lnbjpwYXJhbXR5cGVzLCBwYXJhbXMpXG4gKiAgIEYtPj5NOiBzZXQobWV0aG9kcy5rZXkuZGVzaWduOnJldHVybnR5cGUsIHJldHVyblR5cGUpXG4gKiAgIEYtLT4+VTogZGVjb3JhdGVkIGZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1ldGhvZChvYmo6IGFueSwgcHJvcD86IGFueSwgZGVzY3JpcHRvcj86IGFueSkge1xuICAgIGNvbnN0IGRlc2lnblBhcmFtcyA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TLFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICk7XG4gICAgY29uc3QgZGVzaWduUmV0dXJuID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk4sXG4gICAgICBvYmosXG4gICAgICBwcm9wXG4gICAgKTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLk1FVEhPRFMsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TXG4gICAgICAgICksXG4gICAgICAgIGRlc2lnblBhcmFtc1xuICAgICAgKSxcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuTUVUSE9EUyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk5cbiAgICAgICAgKSxcbiAgICAgICAgZGVzaWduUmV0dXJuXG4gICAgICApXG4gICAgKShvYmosIHByb3AsIGRlc2NyaXB0b3IpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGFwcGxpZXMgbXVsdGlwbGUgZGVjb3JhdG9ycyB0byBhIHNpbmdsZSB0YXJnZXQuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY29tcG9zaXRlIGRlY29yYXRvciB0aGF0IGFwcGxpZXMgbXVsdGlwbGUgZGVjb3JhdG9ycyBpbiBzZXF1ZW5jZSwgY29ycmVjdGx5IGhhbmRsaW5nIGNsYXNzLCBtZXRob2QsIHByb3BlcnR5LCBhbmQgcGFyYW1ldGVyIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FycmF5PENsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3I+fSBkZWNvcmF0b3JzIENvbGxlY3Rpb24gb2YgZGVjb3JhdG9ycyB0byBhcHBseS5cbiAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYWxsIHByb3ZpZGVkIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldC5cbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBBIGFzIGFwcGx5KC4uLmRlY29yYXRvcnMpXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIFUtPj5BOiBnZXQgZGVjb3JhdG9yKC4uLmRlY29yYXRvcnMpXG4gKiAgIEEtPj5VOiByZXR1cm5zICh0YXJnZXQsIGtleT8sIGRlc2M/KSA9PiB2b2lkXG4gKiAgIFUtPj5BOiBpbnZva2Ugb24gdGFyZ2V0XG4gKiAgIGxvb3AgZm9yIGVhY2ggZGVjb3JhdG9yXG4gKiAgICAgQS0+PkQ6IGludm9rZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgdHlwZVxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseShcbiAgLi4uZGVjb3JhdG9yczogQXJyYXk8XG4gICAgQ2xhc3NEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IFBhcmFtZXRlckRlY29yYXRvclxuICA+XG4pIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZyB8IHN5bWJvbCB8IHVua25vd24sXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciB8IG51bWJlclxuICApID0+IHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgKGRlY29yYXRvciBhcyBDbGFzc0RlY29yYXRvcikodGFyZ2V0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAoZGVjb3JhdG9yIGFzIE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yKShcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgIGRlc2NyaXB0b3IgYXMgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcHJvcGVydHkgbWV0YWRhdGEgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2UgZmFjdG9yeSB0aGF0IGNvbWJpbmVzIGBtZXRhZGF0YShrZXksIHZhbHVlKWAgYW5kIGBwcm9wKClgIHRvIGJvdGggc2V0IGFuIGFyYml0cmFyeSBtZXRhZGF0YSBrZXkgYW5kIHJlY29yZCB0aGUgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTWV0YWRhdGEga2V5IHRvIHNldCBmb3IgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBrZXkuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgYW5kIGNhcHR1cmVzIHRoZSBwcm9wZXJ0eSdzIHR5cGUuXG4gKiBAZnVuY3Rpb24gcHJvcE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShrZXksIHZhbHVlKSwgcHJvcCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1ldGhvZCBtZXRhZGF0YSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBmYWN0b3J5IHRoYXQgY29tYmluZXMgYG1ldGFkYXRhKGtleSwgdmFsdWUpYCBhbmQgYG1ldGhvZCgpYCB0byBib3RoIHNldCBhbiBhcmJpdHJhcnkgbWV0YWRhdGEga2V5IGFuZCByZWNvcmQgdGhlIG1ldGhvZCdzIGRlc2lnbiByZXR1cm4gYW5kIHBhcmFtIHR5cGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gc2V0IGZvciB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgTWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGtleS5cbiAqIEByZXR1cm4ge01ldGhvZERlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgYW5kIGNhcHR1cmVzIHRoZSBtZXRob2QncyBzaWduYXR1cmUgbWV0YWRhdGEuXG4gKiBAZnVuY3Rpb24gbWV0aG9kTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kTWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKGtleSwgdmFsdWUpLCBtZXRob2QoKSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEF0dGFjaGVzIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gdG8gYSBjbGFzcyBvciBtZW1iZXIuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHN0b3JlcyBhIHRleHR1YWwgZGVzY3JpcHRpb24gaW4gdGhlIG1ldGFkYXRhIHN0b3JlIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdGlvbiBrZXkgZm9yIGEgY2xhc3Mgb3IgaXRzIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2MgRGVzY3JpcHRpdmUgdGV4dCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgY2xhc3Mgb3IgcHJvcGVydHkuXG4gKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHJlY29yZHMgdGhlIGRlc2NyaXB0aW9uIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBkZXNjcmlwdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb24oZGVzYzogc3RyaW5nKSB7XG4gIGZ1bmN0aW9uIGlubmVyRGVzY3JpcHRpb24oZGVzYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyRGVzY3JpcHRpb24oXG4gICAgICBvcmlnaW5hbDogYW55LFxuICAgICAgcHJvcD86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBhbnlcbiAgICApIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgICAgW1xuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OLFxuICAgICAgICAgIHByb3AgPyBwcm9wLnRvU3RyaW5nKCkgOiBEZWNvcmF0aW9uS2V5cy5DTEFTUyxcbiAgICAgICAgXS5qb2luKE1ldGFkYXRhLnNwbGl0dGVyKSxcbiAgICAgICAgZGVzY1xuICAgICAgKShvcmlnaW5hbCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5uZXJEZXNjcmlwdGlvbixcbiAgICAgIGFyZ3M6IFtkZXNjXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gUm9vdCBlbnRyeSBwb2ludCBmb3IgdGhlIGRlY29yYXRpb24gcGFja2FnZS5cbiAqIEBzdW1tYXJ5IFJlLWV4cG9ydHMgdGhlIGJ1aWxkZXIgQVBJLCBkZWNvcmF0b3IgaGVscGVycywgbWV0YWRhdGEgdXRpbGl0aWVzLCBhbmQgc2hhcmVkIGNvbnN0YW50cyBzbyBjb25zdW1lcnMgY2FuIGltcG9ydCB7QGxpbmsgRGVjb3JhdGlvbn0sIHtAbGluayBNZXRhZGF0YX0sIHtAbGluayBEZWNvcmF0aW9uS2V5c30sIGFuZCB7QGxpbmsgRGVmYXVsdEZsYXZvdXJ9IGZyb20gYSBzaW5nbGUgc3VyZmFjZS5cbiAqIEBtb2R1bGUgZGVjb3JhdGlvblxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEvaW5kZXhcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWV0YWRhdGFcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGRlY29yYXRpb24gcGFja2FnZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgcmVnaXN0ZXJlZCB0aHJvdWdoIHtAbGluayBNZXRhZGF0YS5yZWdpc3RlckxpYnJhcnl9LlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCIsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUE7Ozs7OztBQU1HO0FBQ0ksTUFBTSxjQUFjLEdBQUc7QUFFOUI7Ozs7OztBQU1HO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRztBQUVqQzs7Ozs7OztBQU9HO0lBQ1M7QUFBWixDQUFBLFVBQVksY0FBYyxFQUFBOztBQUV4QixJQUFBLGNBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxXQUF1Qjs7QUFFdkIsSUFBQSxjQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBK0I7O0FBRS9CLElBQUEsY0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCOztBQUV6QixJQUFBLGNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjs7QUFFbkIsSUFBQSxjQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFFZixJQUFBLGNBQUEsQ0FBQSxhQUFBLENBQUEsR0FBQSxhQUEyQjs7QUFFM0IsSUFBQSxjQUFBLENBQUEsYUFBQSxDQUFBLEdBQUEsWUFBMEI7O0FBRTFCLElBQUEsY0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCOztBQUV6QixJQUFBLGNBQUEsQ0FBQSxhQUFBLENBQUEsR0FBQSxhQUEyQjs7QUFFM0IsSUFBQSxjQUFBLENBQUEsZUFBQSxDQUFBLEdBQUEsbUJBQW1DOztBQUVuQyxJQUFBLGNBQUEsQ0FBQSxlQUFBLENBQUEsR0FBQSxtQkFBbUM7QUFDckMsQ0FBQyxFQXZCVyxjQUFjLEtBQWQsY0FBYyxHQXVCekIs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
@@ -14,4 +14,4 @@ export * from "./decorators";
14
14
  * @const VERSION
15
15
  * @memberOf module:decoration
16
16
  */
17
- export declare const VERSION = "0.0.18";
17
+ export declare const VERSION = "0.0.19";
package/lib/esm/index.js CHANGED
@@ -15,6 +15,6 @@ export * from "./decorators.js";
15
15
  * @const VERSION
16
16
  * @memberOf module:decoration
17
17
  */
18
- export const VERSION = "0.0.18";
18
+ export const VERSION = "0.0.19";
19
19
  Metadata.registerLibrary("@decaf-ts/decoration", VERSION);
20
20
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsNEJBQXlCO0FBRTVDLHNDQUE2QjtBQUM3QixvQ0FBMkI7QUFDM0IsK0JBQTRCO0FBQzVCLGdDQUE2QjtBQUU3Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBRXJDLFFBQVEsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSb290IGVudHJ5IHBvaW50IGZvciB0aGUgZGVjb3JhdGlvbiBwYWNrYWdlLlxuICogQHN1bW1hcnkgUmUtZXhwb3J0cyB0aGUgYnVpbGRlciBBUEksIGRlY29yYXRvciBoZWxwZXJzLCBtZXRhZGF0YSB1dGlsaXRpZXMsIGFuZCBzaGFyZWQgY29uc3RhbnRzIHNvIGNvbnN1bWVycyBjYW4gaW1wb3J0IHtAbGluayBEZWNvcmF0aW9ufSwge0BsaW5rIE1ldGFkYXRhfSwge0BsaW5rIERlY29yYXRpb25LZXlzfSwgYW5kIHtAbGluayBEZWZhdWx0Rmxhdm91cn0gZnJvbSBhIHNpbmdsZSBzdXJmYWNlLlxuICogQG1vZHVsZSBkZWNvcmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS9pbmRleFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZGVjb3JhdGlvbiBwYWNrYWdlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIHN0cmluZyByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIE1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeX0uXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIiwgVkVSU0lPTik7XG4iXX0=
@@ -158,13 +158,13 @@ export declare class Metadata {
158
158
  */
159
159
  static type(model: Constructor, prop: string): any;
160
160
  /**
161
- * @description Resolves the canonical constructor associated with the provided model handle.
161
+ * @description Resolves the canonical constructor associated with the provided model handle and metadata.
162
162
  * @summary Returns the stored constructor reference when the provided model is a proxy or reduced value. Falls back to the original model when no constructor metadata has been recorded yet.
163
163
  * @template M
164
164
  * @param {Constructor<M>} model Model used when recording metadata.
165
- * @return {Constructor<M>|undefined} Canonical constructor if stored, otherwise `undefined`.
165
+ * @return {Constructor<M>} Canonical constructor if stored, otherwise the provided one`.
166
166
  */
167
- static constr<M>(model: Constructor<M>): Constructor<M> | undefined;
167
+ static constr<M>(model: Constructor<M>): Constructor<M>;
168
168
  /**
169
169
  * @description Retrieves metadata for a model or a specific key within it.
170
170
  * @summary When called with a constructor only, returns the entire metadata object associated with the model. When a key path is provided, returns the value stored at that nested key.