velocious 1.0.587 → 1.0.588

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.
@@ -90,6 +90,15 @@ export type DatabasePoolDebugSnapshot = {
90
90
  * - Pool class name.
91
91
  */
92
92
  poolClass: string;
93
+ /**
94
+ * - Cumulative pool lifecycle telemetry.
95
+ */
96
+ telemetry?: {
97
+ checkoutWaitCount: number;
98
+ checkoutWaitMaxMs: number;
99
+ checkoutWaitTotalMs: number;
100
+ idleReapDisposalCount: number;
101
+ };
93
102
  };
94
103
  /**
95
104
  * Opaque ownership handle for an in-process test shared connection registration.
@@ -130,6 +139,7 @@ export type DatabasePoolDebugSnapshot = {
130
139
  * @property {Array<DatabasePoolPendingCheckoutDebugSnapshot>} [pendingCheckouts] - Waiting checkout snapshots.
131
140
  * @property {number} pendingCheckoutCount - Number of queued checkout requests.
132
141
  * @property {string} poolClass - Pool class name.
142
+ * @property {{checkoutWaitCount: number, checkoutWaitMaxMs: number, checkoutWaitTotalMs: number, idleReapDisposalCount: number}} [telemetry] - Cumulative pool lifecycle telemetry.
133
143
  */
134
144
  export declare const POOL_CONFIGURATION_KEY: unique symbol;
135
145
  declare class VelociousDatabasePoolBase {
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/database/pool/base.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/database/pool/base.js"],"names":[],"mappings":"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"}
@@ -41,6 +41,7 @@ import baseMethodsForward from "./base-methods-forward.js";
41
41
  * @property {Array<DatabasePoolPendingCheckoutDebugSnapshot>} [pendingCheckouts] - Waiting checkout snapshots.
42
42
  * @property {number} pendingCheckoutCount - Number of queued checkout requests.
43
43
  * @property {string} poolClass - Pool class name.
44
+ * @property {{checkoutWaitCount: number, checkoutWaitMaxMs: number, checkoutWaitTotalMs: number, idleReapDisposalCount: number}} [telemetry] - Cumulative pool lifecycle telemetry.
44
45
  */
45
46
  export const POOL_CONFIGURATION_KEY = Symbol("velociousPoolConfigurationKey");
46
47
  /**
@@ -440,4 +441,4 @@ class VelociousDatabasePoolBase {
440
441
  }
441
442
  baseMethodsForward(VelociousDatabasePoolBase);
442
443
  export default VelociousDatabasePoolBase;
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9wb29sL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLHdCQUF3QixDQUFBO0FBQ2xELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sa0JBQWtCLE1BQU0sMkJBQTJCLENBQUE7QUFFMUQ7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUU3RTs7NkRBRTZEO0FBQzdELE1BQU0sTUFBTSxHQUFHO0lBQ2IsV0FBVyxFQUFFLElBQUk7Q0FDbEIsQ0FBQTtBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLO0lBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQTtJQUN0RSxDQUFDO0lBRUQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsTUFBTTthQUNuQixJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxRSxJQUFJLEVBQUU7YUFDTixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxlQUFlLENBQUMsNERBQTRELENBQUMs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TSxxQkFBcUIsR0FBRyx5RkFBeUYsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXBJLE9BQU87WUFDTCxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNoQyxHQUFHLE9BQU87WUFDVixRQUFRLEVBQUUscUJBQXFCLENBQUMsc0JBQXNCLENBQUM7U0FDeEQsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsUUFBUSxLQUFJLENBQUM7Q0FDcEI7QUFFRCxrQkFBa0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO0FBRTdDLGVBQWUseUJBQXlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBiYXNlTWV0aG9kc0ZvcndhcmQgZnJvbSBcIi4vYmFzZS1tZXRob2RzLWZvcndhcmQuanNcIlxuXG4vKipcbiAqIE9wYXF1ZSBvd25lcnNoaXAgaGFuZGxlIGZvciBhbiBpbi1wcm9jZXNzIHRlc3Qgc2hhcmVkIGNvbm5lY3Rpb24gcmVnaXN0cmF0aW9uLlxuICogQHR5cGVkZWYge3tvd25lcjogc3ltYm9sfX0gVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb25cbiAqL1xuXG4vKipcbiAqIENvbm5lY3Rpb25DaGVja291dE9wdGlvbnMgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbm5lY3Rpb25DaGVja291dE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBIdW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgY2hlY2tlZC1vdXQgY29ubmVjdGlvbi5cbiAqL1xuLyoqXG4gKiBDYXB0dXJlZENvbm5lY3Rpb25PcHRpb25zIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDYXB0dXJlZENvbm5lY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUmVzb2x2ZWQgcGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbiBjYXB0dXJlZCBieSB0aGUgY2FsbGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBjaGVja2VkLW91dCBjb25uZWN0aW9uLlxuICovXG4vKipcbiAqIERhdGFiYXNlUG9vbFBlbmRpbmdDaGVja291dERlYnVnU25hcHNob3QgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlUG9vbFBlbmRpbmdDaGVja291dERlYnVnU25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBjaGVja291dE5hbWUgLSBIdW1hbi1yZWFkYWJsZSBjaGVja291dCBuYW1lLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGVucXVldWVkQXQgLSBUaW1lc3RhbXAgd2hlbiB0aGUgY2hlY2tvdXQgc3RhcnRlZCB3YWl0aW5nLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4IC0gUGVuZGluZyBjaGVja291dCBxdWV1ZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gcmVtYWluaW5nVGltZW91dE1zIC0gTWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgY2hlY2tvdXQgdGltZXMgb3V0LCBvciBudWxsIHdoZW4gZGlzYWJsZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleSBuZWVkZWQgYnkgdGhlIGNoZWNrb3V0LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSB0aW1lb3V0QXQgLSBUaW1lc3RhbXAgd2hlbiB0aGUgY2hlY2tvdXQgd2lsbCB0aW1lIG91dCwgb3IgbnVsbCB3aGVuIGRpc2FibGVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSB0aW1lb3V0TWlsbGlzIC0gVGltZW91dCBjb25maWd1cmVkIGZvciB0aGUgY2hlY2tvdXQsIG9yIG51bGwgd2hlbiBkaXNhYmxlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3YWl0aW5nRm9yTXMgLSBNaWxsaXNlY29uZHMgYWxyZWFkeSBzcGVudCB3YWl0aW5nLlxuICovXG4vKipcbiAqIERhdGFiYXNlUG9vbERlYnVnU25hcHNob3QgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlUG9vbERlYnVnU25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBjb25maWd1cmF0aW9uIC0gU2FuaXRpemVkIHJlc29sdmVkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0FycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IGNvbm5lY3Rpb25zIC0gTGl2ZSBjb25uZWN0aW9uIHNuYXBzaG90cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZCAtIE51bWJlciBvZiBpbi1wcm9ncmVzcyBjb25uZWN0aW9uIHNwYXducy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZGxlQ291bnQgLSBOdW1iZXIgb2YgaWRsZSBjb25uZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGlmaWVyIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpblVzZUNvdW50IC0gTnVtYmVyIG9mIGNoZWNrZWQtb3V0IGNvbm5lY3Rpb25zLlxuICogQHByb3BlcnR5IHtBcnJheTxEYXRhYmFzZVBvb2xQZW5kaW5nQ2hlY2tvdXREZWJ1Z1NuYXBzaG90Pn0gW3BlbmRpbmdDaGVja291dHNdIC0gV2FpdGluZyBjaGVja291dCBzbmFwc2hvdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVuZGluZ0NoZWNrb3V0Q291bnQgLSBOdW1iZXIgb2YgcXVldWVkIGNoZWNrb3V0IHJlcXVlc3RzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvb2xDbGFzcyAtIFBvb2wgY2xhc3MgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBPT0xfQ09ORklHVVJBVElPTl9LRVkgPSBTeW1ib2woXCJ2ZWxvY2lvdXNQb29sQ29uZmlndXJhdGlvbktleVwiKVxuXG4vKipcbiAqIFNoYXJlZC5cbiAqIEB0eXBlIHt7Y3VycmVudFBvb2w6IFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2UgfCBudWxsfX0gKi9cbmNvbnN0IHNoYXJlZCA9IHtcbiAgY3VycmVudFBvb2w6IG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIHN0YWJsZSBzdHJpbmdpZnkuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHN0cmluZ2lmeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBzdGFibGVTdHJpbmdpZnkodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGBbJHt2YWx1ZS5tYXAoKGVudHJ5KSA9PiBzdGFibGVTdHJpbmdpZnkoZW50cnkpKS5qb2luKFwiLFwiKX1dYFxuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3RcbiAgICAgIC5rZXlzKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAodmFsdWUpKVxuICAgICAgLnNvcnQoKVxuICAgICAgLm1hcCgoa2V5KSA9PiBgJHtKU09OLnN0cmluZ2lmeShrZXkpfToke3N0YWJsZVN0cmluZ2lmeSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHZhbHVlKVtrZXldKX1gKVxuXG4gICAgcmV0dXJuIGB7JHtlbnRyaWVzLmpvaW4oXCIsXCIpfX1gXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG5cbmNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2Uge1xuICAvKipcbiAgICogV2l0aG91dCBjdXJyZW50IGNvbm5lY3Rpb24gY29udGV4dC5cbiAgICogQHR5cGUge3VuZGVmaW5lZCB8ICgoY2FsbGJhY2s6ICgpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPil9ICovXG4gIF93aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0ID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJ1bnMgY3VycmVudC5cbiAgICogQHJldHVybnMge1ZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2V9IC0gVGhlIGN1cnJlbnQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICBpZiAoIXNoYXJlZC5jdXJyZW50UG9vbCkgdGhyb3cgbmV3IEVycm9yKFwiQSBkYXRhYmFzZSBwb29sIGhhc24ndCBiZWVuIHNldFwiKVxuXG4gICAgcmV0dXJuIHNoYXJlZC5jdXJyZW50UG9vbFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbnkgZ2xvYmFsIGNvbm5lY3Rpb25zIGZvciB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcG9vbC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGNsZWFyR2xvYmFsQ29ubmVjdGlvbnMoY29uZmlndXJhdGlvbikgeyB2b2lkIGNvbmZpZ3VyYXRpb24gfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmlkZW50aWZpZXIgLSBJZGVudGlmaWVyLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGlkZW50aWZpZXJ9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbiB8fCBDb25maWd1cmF0aW9uLmN1cnJlbnQoKVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcbiAgICBpZiAoIWlkZW50aWZpZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIGlkZW50aWZpZXIgd2FzIGdpdmVuXCIpXG5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGVja2luLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gX2Nvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKi9cbiAgY2hlY2tpbihfY29ubmVjdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidjaGVja2luJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoZWNrb3V0LlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbX29wdGlvbnNdIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNoZWNrb3V0LlxuICAgKi9cbiAgY2hlY2tvdXQoX29wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInY2hlY2tvdXQnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGN1cnJlbnQgY29ubmVjdGlvbi5cbiAgICogQGFic3RyYWN0XG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUaGUgY3VycmVudCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0Q3VycmVudENvbm5lY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2dldEN1cnJlbnRDb25uZWN0aW9uJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIHBpbm5lZCB0byB0aGUgY3VycmVudCBjb250ZXh0LCBpZiBhbnkuXG4gICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmZXJzIHRvIGBnZXRDdXJyZW50Q29ubmVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgY3VycmVudCBjb250ZXh0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBnZXRDdXJyZW50Q29udGV4dENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudENvbm5lY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFBpbnMgYSBjb25uZWN0aW9uIHRvIGJlIHJldHVybmVkIHRvIGNhbGxlcnMgdGhhdCBydW4gd2l0aG91dCBhIGNvbm5lY3Rpb24tY29udGV4dFxuICAgKiBwaW4gKHVzZWQgYnkgdGhlIHRlc3QgcnVubmVyIHRvIHNoYXJlIG9uZSBjb25uZWN0aW9uIHdpdGggaW4tcHJvY2VzcyBIVFRQIGhhbmRsZXJzKS5cbiAgICogQmFzZSBwb29scyB0aGF0IGRvIG5vdCB0cmFjayBhc3luYyBjb250ZXh0IGlnbm9yZSBpdDsgYXN5bmMtY29udGV4dCBwb29scyBvdmVycmlkZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gX2Nvbm5lY3Rpb24gLSBTaGFyZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uIHwgdW5kZWZpbmVkfSAtIE9wYXF1ZSByZWdpc3RyYXRpb24gaGFuZGxlIHdoZW4gc3VwcG9ydGVkLlxuICAgKi9cbiAgc2V0VGVzdFNoYXJlZENvbm5lY3Rpb24oX2Nvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHByb3ZpZGVyIHRoYXQgcmVzb2x2ZXMgdGhlIGNvbm5lY3Rpb24gZWxpZ2libGUgZm9yIGluLXByb2Nlc3MgdGVzdCByZXF1ZXN0IHNoYXJpbmcuXG4gICAqIEJhc2UgcG9vbHMgdGhhdCBkbyBub3QgdHJhY2sgYXN5bmMgY29udGV4dCBpZ25vcmUgaXQ7IGFzeW5jLWNvbnRleHQgcG9vbHMgb3ZlcnJpZGUuXG4gICAqIEBwYXJhbSB7KCkgPT4gaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IF9wcm92aWRlciAtIFNoYXJlZCBjb25uZWN0aW9uIHByb3ZpZGVyLlxuICAgKiBAcmV0dXJucyB7VGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb24gfCB1bmRlZmluZWR9IC0gT3BhcXVlIHJlZ2lzdHJhdGlvbiBoYW5kbGUgd2hlbiBzdXBwb3J0ZWQuXG4gICAqL1xuICBzZXRUZXN0U2hhcmVkQ29ubmVjdGlvblByb3ZpZGVyKF9wcm92aWRlcikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHNoYXJlZCBjb25uZWN0aW9uIG9yIHByb3ZpZGVyIHNldCBmb3IgaW4tcHJvY2VzcyB0ZXN0IHJlcXVlc3RzLiBOby1vcCBieSBkZWZhdWx0LlxuICAgKiBXaGVuIGEgcmVnaXN0cmF0aW9uIGlzIHByb3ZpZGVkLCBjbGVhcnMgb25seSBpZiBpdCBpcyBzdGlsbCB0aGUgYWN0aXZlIHJlZ2lzdHJhdGlvbi5cbiAgICogQHBhcmFtIHtUZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbn0gW19yZWdpc3RyYXRpb25dIC0gT3BhcXVlIGhhbmRsZSByZXR1cm5lZCB3aGVuIHRoZSBzaGFyZWQgdmFsdWUgd2FzIHNldC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhclRlc3RTaGFyZWRDb25uZWN0aW9uKF9yZWdpc3RyYXRpb24pIHt9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayBpbnNpZGUgdGhlIHRlc3Qgc2hhcmVkIGNvbm5lY3Rpb24ncyBjb250ZXh0LiBCYXNlIHBvb2xzIHRoYXQgZG8gbm90XG4gICAqIHRyYWNrIGFzeW5jIGNvbnRleHQganVzdCBydW4gdGhlIGNhbGxiYWNrIGFzLWlzOyBhc3luYy1jb250ZXh0IHBvb2xzIG92ZXJyaWRlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7VH0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBydW5XaXRoVGVzdFNoYXJlZENvbm5lY3Rpb24oY2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBjb25uZWN0aW9uIGlzIHBpbm5lZCB0byBhbiBleGVjdXRpb24gY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY3VycmVudCBjb25uZWN0aW9uIGNhbiBiZSByZXVzZWQgYnkgbmVzdGVkIGNvZGUuXG4gICAqL1xuICBoYXNDdXJyZW50Q29ubmVjdGlvbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGhvdXQgY3VycmVudCBjb25uZWN0aW9uIGNvbnRleHQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gVH0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBydW4gd2l0aG91dCA/IGN1cnJlbnQgY29ubmVjdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7VH0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0KGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX3dpdGhvdXRDdXJyZW50Q29ubmVjdGlvbkNvbnRleHQpIHJldHVybiAvKiogQHR5cGUge1R9ICovICh0aGlzLl93aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0KGNhbGxiYWNrKSlcblxuICAgIHJldHVybiBjYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGZvciB0aGUgcG9vbCBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24odGhpcy5pZGVudGlmaWVyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gW2RhdGFiYXNlQ29uZmlndXJhdGlvbl0gLSBSZXNvbHZlZCBjb25maWd1cmF0aW9uIHRvIGlkZW50aWZ5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJldXNlIGtleSBmb3IgdGhlIGN1cnJlbnRseSByZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpKSB7XG4gICAgcmV0dXJuIHN0YWJsZVN0cmluZ2lmeSh7XG4gICAgICBkYXRhYmFzZTogZGF0YWJhc2VDb25maWd1cmF0aW9uLmRhdGFiYXNlLFxuICAgICAgaG9zdDogZGF0YWJhc2VDb25maWd1cmF0aW9uLmhvc3QsXG4gICAgICBuYW1lOiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ubmFtZSxcbiAgICAgIHBvcnQ6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5wb3J0LFxuICAgICAgc2NoZW1hOiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24uc2NoZW1hLFxuICAgICAgc2NoZW1hQ2FjaGU6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5zY2hlbWFDYWNoZSxcbiAgICAgIHNxbENvbmZpZzogZGF0YWJhc2VDb25maWd1cmF0aW9uLnNxbENvbmZpZyxcbiAgICAgIHR5cGU6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi50eXBlLFxuICAgICAgdXNlRGF0YWJhc2U6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi51c2VEYXRhYmFzZSxcbiAgICAgIHVzZXJuYW1lOiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24udXNlcm5hbWVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29ubmVjdGlvbiBtYXRjaGVzIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgY29ubmVjdGlvbiBtYXRjaGVzIGN1cnJlbnQgcmVzb2x2ZWQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGNvbm5lY3Rpb25NYXRjaGVzQ3VycmVudENvbmZpZ3VyYXRpb24oY29ubmVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY29ubmVjdGlvbikgPT09IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGtleSBzdGFtcGVkIG9uIGEgY29ubmVjdGlvbiBhdCBjaGVja291dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENoZWNrZWQtb3V0IGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICovXG4gIGdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY29ubmVjdGlvbikge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25XaXRoUG9vbEtleSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W1BPT0xfQ09ORklHVVJBVElPTl9LRVldPzogc3RyaW5nfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgY29uc3QgcmV1c2VLZXkgPSBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV1cblxuICAgIGlmICghcmV1c2VLZXkpIHRocm93IG5ldyBFcnJvcihcIkRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgbWlzc2luZyBpdHMgY29uZmlndXJhdGlvbiByZXVzZSBrZXlcIilcblxuICAgIHJldHVybiByZXVzZUtleVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBzY2hlbWEgbWV0YWRhdGEgY2FjaGVkIGJ5IHRoaXMgcG9vbCdzIGN1cnJlbnQgY29ubmVjdGlvbi5cbiAgICogUG9vbHMgdGhhdCBrZWVwIG11bHRpcGxlIGNvbm5lY3Rpb25zIGFsaXZlIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGNsZWFyIGV2ZXJ5IGxpdmUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgY2xlYXJTY2hlbWFDYWNoZSgpIHtcbiAgICB0aGlzLl9jbGVhckNvbm5lY3Rpb25TY2hlbWFDYWNoZSh0aGlzLmdldEN1cnJlbnRDb25uZWN0aW9uKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBjb25uZWN0aW9uIHNjaGVtYSBjYWNoZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gd2hvc2UgbG9jYWwgc2NoZW1hIGNhY2hlIHNob3VsZCBiZSBjbGVhcmVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfY2xlYXJDb25uZWN0aW9uU2NoZW1hQ2FjaGUoY29ubmVjdGlvbikge1xuICAgIGNvbm5lY3Rpb24uX2NsZWFyTG9jYWxTY2hlbWFDYWNoZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcmltYXJ5IGtleSB0eXBlLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcHJpbWFyeSBrZXkgdHlwZS5cbiAgICovXG4gIHByaW1hcnlLZXlUeXBlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidwcmltYXJ5S2V5VHlwZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY3VycmVudC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Q3VycmVudCgpIHtcbiAgICBzaGFyZWQuY3VycmVudFBvb2wgPSB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZHJpdmVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZHJpdmVyQ2xhc3MgLSBEcml2ZXIgY2xhc3MuXG4gICAqL1xuICBzZXREcml2ZXJDbGFzcyhkcml2ZXJDbGFzcykge1xuICAgIHRoaXMuZHJpdmVyQ2xhc3MgPSBkcml2ZXJDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3Bhd24gY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIHNwYXduIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJzcGF3bkNvbm5lY3Rpb25cIiwge2lkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uRm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZylcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBjb25uZWN0aW9uIGZvciBhbiBhbHJlYWR5LXJlc29sdmVkIHBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoZSByZXVzZSBpZGVudGl0eSBpcyBkZXJpdmVkIG9ubHkgZnJvbSB0aGF0IGNhcHR1cmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBDYXB0dXJlZCByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gQ29ubmVjdGVkIGFuZCBpZGVudGl0eS1zdGFtcGVkIGRyaXZlci5cbiAgICovXG4gIGFzeW5jIHNwYXduQ29ubmVjdGlvbkZvckNvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uV2l0aENvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25XaXRoUG9vbEtleSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W1BPT0xfQ09ORklHVVJBVElPTl9LRVldPzogc3RyaW5nfX0gKi8gKGNvbm5lY3Rpb24pXG5cbiAgICBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0gPSByZXVzZUtleVxuICAgIGNvbm5lY3Rpb24uc2V0U2NoZW1hQ2FjaGVJbnZhbGlkYXRvcigoKSA9PiB7XG4gICAgICB0aGlzLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNsZWFyU2NoZW1hQ2FjaGVzRm9yUmV1c2VLZXkocmV1c2VLZXkpXG4gICAgfSlcblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGF3biBjb25uZWN0aW9uIHdpdGggY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgc3Bhd24gY29ubmVjdGlvbiB3aXRoIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb25XaXRoQ29uZmlndXJhdGlvbihjb25maWcpIHtcbiAgICBjb25zdCBEcml2ZXJDbGFzcyA9IGNvbmZpZy5kcml2ZXIgfHwgdGhpcy5kcml2ZXJDbGFzc1xuXG4gICAgaWYgKCFEcml2ZXJDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwiTm8gZHJpdmVyIGNsYXNzIHNldCBpbiBkYXRhYmFzZSBwb29sIG9yIGluIGdpdmVuIGNvbmZpZ1wiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBEcml2ZXJDbGFzcyhjb25maWcsIHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNvbm5lY3QoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQ29ubmVjdGlvbkFmdGVyRmFpbGVkQ29ubmVjdChjb25uZWN0aW9uKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgY29ubmVjdGlvbiBhZnRlciBmYWlsZWQgY29ubmVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gdG8gY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZUNvbm5lY3Rpb25BZnRlckZhaWxlZENvbm5lY3QoY29ubmVjdGlvbikge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNsb3NlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBjbG9zZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFmdGVyIGNvbm5lY3QgZmFpbGVkXCIsIHtlcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zIHwgKChhcmc6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+KX0gX29wdGlvbnNPckNhbGxiYWNrIC0gQ2hlY2tvdXQgb3B0aW9ucyBvciBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHsoYXJnOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gW19jYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgd2l0aENvbm5lY3Rpb24oX29wdGlvbnNPckNhbGxiYWNrLCBfY2FsbGJhY2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInd2l0aENvbm5lY3Rpb24nIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gb3BlcmF0aW9uIG9uIGEgZnJlc2hseSBjaGVja2VkLW91dCBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0Nvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IG9wdGlvbnMgLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgb3duZXI6IHN5bWJvbCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhPcGVyYXRpb25Db25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb3duZXIgPSBTeW1ib2woXCJkYXRhYmFzZS1vcGVyYXRpb24tb3duZXJcIilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhDb25uZWN0aW9uKG9wdGlvbnMsIGFzeW5jIChjb25uZWN0aW9uKSA9PiBhd2FpdCBjYWxsYmFjayhjb25uZWN0aW9uLCBvd25lcikpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3b3JrIHRocm91Z2ggYSBwb29sLW93bmVkIGNoZWNrb3V0IGZvciBhbiBpbW11dGFibGUsIGFscmVhZHktcmVzb2x2ZWRcbiAgICogcGh5c2ljYWwgY29uZmlndXJhdGlvbi4gQ29uY3JldGUgcG9vbHMgbXVzdCBwcmVzZXJ2ZSB0aGVpciBjYXBhY2l0eSxcbiAgICogdGltZW91dCwgcXVldWUsIGRlYnVnLCBhbmQgY2xvc2VBbGwgb3duZXJzaGlwIG9uIHRoaXMgcGF0aC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtDYXB0dXJlZENvbm5lY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gQ2FwdHVyZWQgY2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIG93bmVyOiBzeW1ib2wpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3BlcmF0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoQ2FwdHVyZWRPcGVyYXRpb25Db25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgdm9pZCBvcHRpb25zXG4gICAgdm9pZCBjYWxsYmFja1xuICAgIHRocm93IG5ldyBFcnJvcihcIid3aXRoQ2FwdHVyZWRPcGVyYXRpb25Db25uZWN0aW9uJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIG9wZW5DYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIF9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgcmVxdWlyZXMgYSBrZXllZCBzaW5nbGUtY29ubmVjdGlvbiBwb29sXCIpIH1cbiAgYXN5bmMgZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIF9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgcmVxdWlyZXMgYSBrZXllZCBzaW5nbGUtY29ubmVjdGlvbiBwb29sXCIpIH1cbiAgYXN5bmMgY2xvc2VDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIF9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgcmVxdWlyZXMgYSBrZXllZCBzaW5nbGUtY29ubmVjdGlvbiBwb29sXCIpIH1cbiAgYXN5bmMgZGVsZXRlQ2FwdHVyZWREYXRhYmFzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gX2RhdGFiYXNlQ29uZmlndXJhdGlvbikgeyB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCB0ZW5hbnQgU1FMaXRlIGxpZmVjeWNsZSByZXF1aXJlcyBhIGtleWVkIHNpbmdsZS1jb25uZWN0aW9uIHBvb2xcIikgfVxuICBjYXB0dXJlZENvbm5lY3Rpb25JblVzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gX2RhdGFiYXNlQ29uZmlndXJhdGlvbikgeyByZXR1cm4gZmFsc2UgfVxuICBjYXB0dXJlZENvbm5lY3Rpb25IYXNQZW5kaW5nV3JpdGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBfZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSByZXVzYWJsZSBjb25uZWN0aW9uIGV4aXN0cyBmb3IgY29udGV4dHMgd2hlcmUgQXN5bmNMb2NhbFN0b3JhZ2UgaXNuJ3Qgc2V0LlxuICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgY2hlY2tzIG91dCBhIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBnbG9iYWwgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUdsb2JhbENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hlY2tvdXQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRlYnVnIHNuYXBzaG90LlxuICAgKiBAcmV0dXJucyB7RGF0YWJhc2VQb29sRGVidWdTbmFwc2hvdH0gLSBEaWFnbm9zdGljIHNuYXBzaG90IGZvciB0aGlzIHBvb2wuXG4gICAqL1xuICBnZXREZWJ1Z1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmRlYnVnQ29uZmlndXJhdGlvblNuYXBzaG90KCksXG4gICAgICBjb25uZWN0aW9uczogW10sXG4gICAgICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZDogMCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGlkbGVDb3VudDogMCxcbiAgICAgIGluVXNlQ291bnQ6IDAsXG4gICAgICBwZW5kaW5nQ2hlY2tvdXRDb3VudDogMCxcbiAgICAgIHBvb2xDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgY29uZmlndXJhdGlvbiBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBTYW5pdGl6ZWQgcmVzb2x2ZWQgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGRlYnVnQ29uZmlndXJhdGlvblNuYXBzaG90KCkge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlnID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCBwb29sQ29uZmlnID0gZGF0YWJhc2VDb25maWcucG9vbFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFiYXNlOiBkYXRhYmFzZUNvbmZpZy5kYXRhYmFzZSxcbiAgICAgIGRyaXZlcjogZGF0YWJhc2VDb25maWcuZHJpdmVyPy5uYW1lLFxuICAgICAgaG9zdDogZGF0YWJhc2VDb25maWcuaG9zdCxcbiAgICAgIG1pZ3JhdGlvbnM6IGRhdGFiYXNlQ29uZmlnLm1pZ3JhdGlvbnMsXG4gICAgICBuYW1lOiBkYXRhYmFzZUNvbmZpZy5uYW1lLFxuICAgICAgcG9vbDogcG9vbENvbmZpZyA/IHtpZGxlVGltZW91dE1pbGxpczogcG9vbENvbmZpZy5pZGxlVGltZW91dE1pbGxpcywgbWF4OiBwb29sQ29uZmlnLm1heH0gOiB1bmRlZmluZWQsXG4gICAgICBwb3J0OiBkYXRhYmFzZUNvbmZpZy5wb3J0LFxuICAgICAgc2NoZW1hOiBkYXRhYmFzZUNvbmZpZy5zY2hlbWEsXG4gICAgICB0eXBlOiBkYXRhYmFzZUNvbmZpZy50eXBlLFxuICAgICAgdXNlRGF0YWJhc2U6IGRhdGFiYXNlQ29uZmlnLnVzZURhdGFiYXNlLFxuICAgICAgdXNlcm5hbWU6IGRhdGFiYXNlQ29uZmlnLnVzZXJuYW1lXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgY29ubmVjdGlvbiBzbmFwc2hvdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBkZXRhaWxzIC0gRXh0cmEgZGlhZ25vc3RpYyBmaWVsZHMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gQ29ubmVjdGlvbiBkaWFnbm9zdGljIHNuYXBzaG90LlxuICAgKi9cbiAgZGVidWdDb25uZWN0aW9uU25hcHNob3QoY29ubmVjdGlvbiwgZGV0YWlscyA9IHt9KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbldpdGhQb29sS2V5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0/OiBzdHJpbmd9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25uZWN0aW9uLmdldERlYnVnU25hcHNob3QoKSxcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgICByZXVzZUtleTogY29ubmVjdGlvbldpdGhQb29sS2V5W1BPT0xfQ09ORklHVVJBVElPTl9LRVldXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBhbGwgY29ubmVjdGlvbnMgZm9yIHRoaXMgcG9vbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNsb3NlQWxsKCkge31cbn1cblxuYmFzZU1ldGhvZHNGb3J3YXJkKFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2UpXG5cbmV4cG9ydCBkZWZhdWx0IFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2VcbiJdfQ==
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9wb29sL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLHdCQUF3QixDQUFBO0FBQ2xELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sa0JBQWtCLE1BQU0sMkJBQTJCLENBQUE7QUFFMUQ7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7Ozs7Ozs7O0dBV0c7QUFDSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUE7QUFFN0U7OzZEQUU2RDtBQUM3RCxNQUFNLE1BQU0sR0FBRztJQUNiLFdBQVcsRUFBRSxJQUFJO0NBQ2xCLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBSztJQUM1QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDdEUsQ0FBQztJQUVELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLE1BQU07YUFDbkIsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUUsSUFBSSxFQUFFO2FBQ04sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDLDREQUE0RCxDQUFD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QU0scUJBQXFCLEdBQUcseUZBQXlGLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVwSSxPQUFPO1lBQ0wsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEVBQUU7WUFDaEMsR0FBRyxPQUFPO1lBQ1YsUUFBUSxFQUFFLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDO1NBQ3hELENBQUE7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsS0FBSSxDQUFDO0NBQ3BCO0FBRUQsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsQ0FBQTtBQUU3QyxlQUFlLHlCQUF5QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgYmFzZU1ldGhvZHNGb3J3YXJkIGZyb20gXCIuL2Jhc2UtbWV0aG9kcy1mb3J3YXJkLmpzXCJcblxuLyoqXG4gKiBPcGFxdWUgb3duZXJzaGlwIGhhbmRsZSBmb3IgYW4gaW4tcHJvY2VzcyB0ZXN0IHNoYXJlZCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi5cbiAqIEB0eXBlZGVmIHt7b3duZXI6IHN5bWJvbH19IFRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uXG4gKi9cblxuLyoqXG4gKiBDb25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gSHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIGNoZWNrZWQtb3V0IGNvbm5lY3Rpb24uXG4gKi9cbi8qKlxuICogQ2FwdHVyZWRDb25uZWN0aW9uT3B0aW9ucyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQ2FwdHVyZWRDb25uZWN0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIFJlc29sdmVkIHBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gY2FwdHVyZWQgYnkgdGhlIGNhbGxlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBIdW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgY2hlY2tlZC1vdXQgY29ubmVjdGlvbi5cbiAqL1xuLyoqXG4gKiBEYXRhYmFzZVBvb2xQZW5kaW5nQ2hlY2tvdXREZWJ1Z1NuYXBzaG90IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEYXRhYmFzZVBvb2xQZW5kaW5nQ2hlY2tvdXREZWJ1Z1NuYXBzaG90XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gY2hlY2tvdXROYW1lIC0gSHVtYW4tcmVhZGFibGUgY2hlY2tvdXQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnF1ZXVlZEF0IC0gVGltZXN0YW1wIHdoZW4gdGhlIGNoZWNrb3V0IHN0YXJ0ZWQgd2FpdGluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmRleCAtIFBlbmRpbmcgY2hlY2tvdXQgcXVldWUgaW5kZXguXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHJlbWFpbmluZ1RpbWVvdXRNcyAtIE1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGNoZWNrb3V0IHRpbWVzIG91dCwgb3IgbnVsbCB3aGVuIGRpc2FibGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkgbmVlZGVkIGJ5IHRoZSBjaGVja291dC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dEF0IC0gVGltZXN0YW1wIHdoZW4gdGhlIGNoZWNrb3V0IHdpbGwgdGltZSBvdXQsIG9yIG51bGwgd2hlbiBkaXNhYmxlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dE1pbGxpcyAtIFRpbWVvdXQgY29uZmlndXJlZCBmb3IgdGhlIGNoZWNrb3V0LCBvciBudWxsIHdoZW4gZGlzYWJsZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2FpdGluZ0Zvck1zIC0gTWlsbGlzZWNvbmRzIGFscmVhZHkgc3BlbnQgd2FpdGluZy5cbiAqL1xuLyoqXG4gKiBEYXRhYmFzZVBvb2xEZWJ1Z1NuYXBzaG90IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEYXRhYmFzZVBvb2xEZWJ1Z1NuYXBzaG90XG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY29uZmlndXJhdGlvbiAtIFNhbml0aXplZCByZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBjb25uZWN0aW9ucyAtIExpdmUgY29ubmVjdGlvbiBzbmFwc2hvdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29ubmVjdGlvbnNCZWluZ1NwYXduZWQgLSBOdW1iZXIgb2YgaW4tcHJvZ3Jlc3MgY29ubmVjdGlvbiBzcGF3bnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWRsZUNvdW50IC0gTnVtYmVyIG9mIGlkbGUgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpZmllciAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5Vc2VDb3VudCAtIE51bWJlciBvZiBjaGVja2VkLW91dCBjb25uZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8RGF0YWJhc2VQb29sUGVuZGluZ0NoZWNrb3V0RGVidWdTbmFwc2hvdD59IFtwZW5kaW5nQ2hlY2tvdXRzXSAtIFdhaXRpbmcgY2hlY2tvdXQgc25hcHNob3RzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBlbmRpbmdDaGVja291dENvdW50IC0gTnVtYmVyIG9mIHF1ZXVlZCBjaGVja291dCByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwb29sQ2xhc3MgLSBQb29sIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3tjaGVja291dFdhaXRDb3VudDogbnVtYmVyLCBjaGVja291dFdhaXRNYXhNczogbnVtYmVyLCBjaGVja291dFdhaXRUb3RhbE1zOiBudW1iZXIsIGlkbGVSZWFwRGlzcG9zYWxDb3VudDogbnVtYmVyfX0gW3RlbGVtZXRyeV0gLSBDdW11bGF0aXZlIHBvb2wgbGlmZWN5Y2xlIHRlbGVtZXRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBPT0xfQ09ORklHVVJBVElPTl9LRVkgPSBTeW1ib2woXCJ2ZWxvY2lvdXNQb29sQ29uZmlndXJhdGlvbktleVwiKVxuXG4vKipcbiAqIFNoYXJlZC5cbiAqIEB0eXBlIHt7Y3VycmVudFBvb2w6IFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2UgfCBudWxsfX0gKi9cbmNvbnN0IHNoYXJlZCA9IHtcbiAgY3VycmVudFBvb2w6IG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIHN0YWJsZSBzdHJpbmdpZnkuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHN0cmluZ2lmeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBzdGFibGVTdHJpbmdpZnkodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGBbJHt2YWx1ZS5tYXAoKGVudHJ5KSA9PiBzdGFibGVTdHJpbmdpZnkoZW50cnkpKS5qb2luKFwiLFwiKX1dYFxuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3RcbiAgICAgIC5rZXlzKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAodmFsdWUpKVxuICAgICAgLnNvcnQoKVxuICAgICAgLm1hcCgoa2V5KSA9PiBgJHtKU09OLnN0cmluZ2lmeShrZXkpfToke3N0YWJsZVN0cmluZ2lmeSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHZhbHVlKVtrZXldKX1gKVxuXG4gICAgcmV0dXJuIGB7JHtlbnRyaWVzLmpvaW4oXCIsXCIpfX1gXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG5cbmNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2Uge1xuICAvKipcbiAgICogV2l0aG91dCBjdXJyZW50IGNvbm5lY3Rpb24gY29udGV4dC5cbiAgICogQHR5cGUge3VuZGVmaW5lZCB8ICgoY2FsbGJhY2s6ICgpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPil9ICovXG4gIF93aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0ID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJ1bnMgY3VycmVudC5cbiAgICogQHJldHVybnMge1ZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2V9IC0gVGhlIGN1cnJlbnQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICBpZiAoIXNoYXJlZC5jdXJyZW50UG9vbCkgdGhyb3cgbmV3IEVycm9yKFwiQSBkYXRhYmFzZSBwb29sIGhhc24ndCBiZWVuIHNldFwiKVxuXG4gICAgcmV0dXJuIHNoYXJlZC5jdXJyZW50UG9vbFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbnkgZ2xvYmFsIGNvbm5lY3Rpb25zIGZvciB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcG9vbC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGNsZWFyR2xvYmFsQ29ubmVjdGlvbnMoY29uZmlndXJhdGlvbikgeyB2b2lkIGNvbmZpZ3VyYXRpb24gfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmlkZW50aWZpZXIgLSBJZGVudGlmaWVyLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGlkZW50aWZpZXJ9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbiB8fCBDb25maWd1cmF0aW9uLmN1cnJlbnQoKVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcbiAgICBpZiAoIWlkZW50aWZpZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIGlkZW50aWZpZXIgd2FzIGdpdmVuXCIpXG5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGVja2luLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gX2Nvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKi9cbiAgY2hlY2tpbihfY29ubmVjdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidjaGVja2luJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoZWNrb3V0LlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbX29wdGlvbnNdIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNoZWNrb3V0LlxuICAgKi9cbiAgY2hlY2tvdXQoX29wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInY2hlY2tvdXQnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGN1cnJlbnQgY29ubmVjdGlvbi5cbiAgICogQGFic3RyYWN0XG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUaGUgY3VycmVudCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0Q3VycmVudENvbm5lY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2dldEN1cnJlbnRDb25uZWN0aW9uJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIHBpbm5lZCB0byB0aGUgY3VycmVudCBjb250ZXh0LCBpZiBhbnkuXG4gICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmZXJzIHRvIGBnZXRDdXJyZW50Q29ubmVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgY3VycmVudCBjb250ZXh0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBnZXRDdXJyZW50Q29udGV4dENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudENvbm5lY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFBpbnMgYSBjb25uZWN0aW9uIHRvIGJlIHJldHVybmVkIHRvIGNhbGxlcnMgdGhhdCBydW4gd2l0aG91dCBhIGNvbm5lY3Rpb24tY29udGV4dFxuICAgKiBwaW4gKHVzZWQgYnkgdGhlIHRlc3QgcnVubmVyIHRvIHNoYXJlIG9uZSBjb25uZWN0aW9uIHdpdGggaW4tcHJvY2VzcyBIVFRQIGhhbmRsZXJzKS5cbiAgICogQmFzZSBwb29scyB0aGF0IGRvIG5vdCB0cmFjayBhc3luYyBjb250ZXh0IGlnbm9yZSBpdDsgYXN5bmMtY29udGV4dCBwb29scyBvdmVycmlkZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gX2Nvbm5lY3Rpb24gLSBTaGFyZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uIHwgdW5kZWZpbmVkfSAtIE9wYXF1ZSByZWdpc3RyYXRpb24gaGFuZGxlIHdoZW4gc3VwcG9ydGVkLlxuICAgKi9cbiAgc2V0VGVzdFNoYXJlZENvbm5lY3Rpb24oX2Nvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHByb3ZpZGVyIHRoYXQgcmVzb2x2ZXMgdGhlIGNvbm5lY3Rpb24gZWxpZ2libGUgZm9yIGluLXByb2Nlc3MgdGVzdCByZXF1ZXN0IHNoYXJpbmcuXG4gICAqIEJhc2UgcG9vbHMgdGhhdCBkbyBub3QgdHJhY2sgYXN5bmMgY29udGV4dCBpZ25vcmUgaXQ7IGFzeW5jLWNvbnRleHQgcG9vbHMgb3ZlcnJpZGUuXG4gICAqIEBwYXJhbSB7KCkgPT4gaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IF9wcm92aWRlciAtIFNoYXJlZCBjb25uZWN0aW9uIHByb3ZpZGVyLlxuICAgKiBAcmV0dXJucyB7VGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb24gfCB1bmRlZmluZWR9IC0gT3BhcXVlIHJlZ2lzdHJhdGlvbiBoYW5kbGUgd2hlbiBzdXBwb3J0ZWQuXG4gICAqL1xuICBzZXRUZXN0U2hhcmVkQ29ubmVjdGlvblByb3ZpZGVyKF9wcm92aWRlcikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHNoYXJlZCBjb25uZWN0aW9uIG9yIHByb3ZpZGVyIHNldCBmb3IgaW4tcHJvY2VzcyB0ZXN0IHJlcXVlc3RzLiBOby1vcCBieSBkZWZhdWx0LlxuICAgKiBXaGVuIGEgcmVnaXN0cmF0aW9uIGlzIHByb3ZpZGVkLCBjbGVhcnMgb25seSBpZiBpdCBpcyBzdGlsbCB0aGUgYWN0aXZlIHJlZ2lzdHJhdGlvbi5cbiAgICogQHBhcmFtIHtUZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbn0gW19yZWdpc3RyYXRpb25dIC0gT3BhcXVlIGhhbmRsZSByZXR1cm5lZCB3aGVuIHRoZSBzaGFyZWQgdmFsdWUgd2FzIHNldC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhclRlc3RTaGFyZWRDb25uZWN0aW9uKF9yZWdpc3RyYXRpb24pIHt9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayBpbnNpZGUgdGhlIHRlc3Qgc2hhcmVkIGNvbm5lY3Rpb24ncyBjb250ZXh0LiBCYXNlIHBvb2xzIHRoYXQgZG8gbm90XG4gICAqIHRyYWNrIGFzeW5jIGNvbnRleHQganVzdCBydW4gdGhlIGNhbGxiYWNrIGFzLWlzOyBhc3luYy1jb250ZXh0IHBvb2xzIG92ZXJyaWRlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7VH0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBydW5XaXRoVGVzdFNoYXJlZENvbm5lY3Rpb24oY2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBjb25uZWN0aW9uIGlzIHBpbm5lZCB0byBhbiBleGVjdXRpb24gY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY3VycmVudCBjb25uZWN0aW9uIGNhbiBiZSByZXVzZWQgYnkgbmVzdGVkIGNvZGUuXG4gICAqL1xuICBoYXNDdXJyZW50Q29ubmVjdGlvbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGhvdXQgY3VycmVudCBjb25uZWN0aW9uIGNvbnRleHQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gVH0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBydW4gd2l0aG91dCA/IGN1cnJlbnQgY29ubmVjdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7VH0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0KGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX3dpdGhvdXRDdXJyZW50Q29ubmVjdGlvbkNvbnRleHQpIHJldHVybiAvKiogQHR5cGUge1R9ICovICh0aGlzLl93aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0KGNhbGxiYWNrKSlcblxuICAgIHJldHVybiBjYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGZvciB0aGUgcG9vbCBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24odGhpcy5pZGVudGlmaWVyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gW2RhdGFiYXNlQ29uZmlndXJhdGlvbl0gLSBSZXNvbHZlZCBjb25maWd1cmF0aW9uIHRvIGlkZW50aWZ5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJldXNlIGtleSBmb3IgdGhlIGN1cnJlbnRseSByZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpKSB7XG4gICAgcmV0dXJuIHN0YWJsZVN0cmluZ2lmeSh7XG4gICAgICBkYXRhYmFzZTogZGF0YWJhc2VDb25maWd1cmF0aW9uLmRhdGFiYXNlLFxuICAgICAgaG9zdDogZGF0YWJhc2VDb25maWd1cmF0aW9uLmhvc3QsXG4gICAgICBuYW1lOiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ubmFtZSxcbiAgICAgIHBvcnQ6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5wb3J0LFxuICAgICAgc2NoZW1hOiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24uc2NoZW1hLFxuICAgICAgc2NoZW1hQ2FjaGU6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5zY2hlbWFDYWNoZSxcbiAgICAgIHNxbENvbmZpZzogZGF0YWJhc2VDb25maWd1cmF0aW9uLnNxbENvbmZpZyxcbiAgICAgIHR5cGU6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi50eXBlLFxuICAgICAgdXNlRGF0YWJhc2U6IGRhdGFiYXNlQ29uZmlndXJhdGlvbi51c2VEYXRhYmFzZSxcbiAgICAgIHVzZXJuYW1lOiBkYXRhYmFzZUNvbmZpZ3VyYXRpb24udXNlcm5hbWVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29ubmVjdGlvbiBtYXRjaGVzIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgY29ubmVjdGlvbiBtYXRjaGVzIGN1cnJlbnQgcmVzb2x2ZWQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGNvbm5lY3Rpb25NYXRjaGVzQ3VycmVudENvbmZpZ3VyYXRpb24oY29ubmVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY29ubmVjdGlvbikgPT09IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGtleSBzdGFtcGVkIG9uIGEgY29ubmVjdGlvbiBhdCBjaGVja291dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENoZWNrZWQtb3V0IGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICovXG4gIGdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY29ubmVjdGlvbikge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25XaXRoUG9vbEtleSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W1BPT0xfQ09ORklHVVJBVElPTl9LRVldPzogc3RyaW5nfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgY29uc3QgcmV1c2VLZXkgPSBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV1cblxuICAgIGlmICghcmV1c2VLZXkpIHRocm93IG5ldyBFcnJvcihcIkRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgbWlzc2luZyBpdHMgY29uZmlndXJhdGlvbiByZXVzZSBrZXlcIilcblxuICAgIHJldHVybiByZXVzZUtleVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBzY2hlbWEgbWV0YWRhdGEgY2FjaGVkIGJ5IHRoaXMgcG9vbCdzIGN1cnJlbnQgY29ubmVjdGlvbi5cbiAgICogUG9vbHMgdGhhdCBrZWVwIG11bHRpcGxlIGNvbm5lY3Rpb25zIGFsaXZlIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGNsZWFyIGV2ZXJ5IGxpdmUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgY2xlYXJTY2hlbWFDYWNoZSgpIHtcbiAgICB0aGlzLl9jbGVhckNvbm5lY3Rpb25TY2hlbWFDYWNoZSh0aGlzLmdldEN1cnJlbnRDb25uZWN0aW9uKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBjb25uZWN0aW9uIHNjaGVtYSBjYWNoZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gd2hvc2UgbG9jYWwgc2NoZW1hIGNhY2hlIHNob3VsZCBiZSBjbGVhcmVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfY2xlYXJDb25uZWN0aW9uU2NoZW1hQ2FjaGUoY29ubmVjdGlvbikge1xuICAgIGNvbm5lY3Rpb24uX2NsZWFyTG9jYWxTY2hlbWFDYWNoZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcmltYXJ5IGtleSB0eXBlLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcHJpbWFyeSBrZXkgdHlwZS5cbiAgICovXG4gIHByaW1hcnlLZXlUeXBlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidwcmltYXJ5S2V5VHlwZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY3VycmVudC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Q3VycmVudCgpIHtcbiAgICBzaGFyZWQuY3VycmVudFBvb2wgPSB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZHJpdmVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZHJpdmVyQ2xhc3MgLSBEcml2ZXIgY2xhc3MuXG4gICAqL1xuICBzZXREcml2ZXJDbGFzcyhkcml2ZXJDbGFzcykge1xuICAgIHRoaXMuZHJpdmVyQ2xhc3MgPSBkcml2ZXJDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3Bhd24gY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIHNwYXduIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJzcGF3bkNvbm5lY3Rpb25cIiwge2lkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciwgZGF0YWJhc2VDb25maWd9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uRm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZylcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBjb25uZWN0aW9uIGZvciBhbiBhbHJlYWR5LXJlc29sdmVkIHBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoZSByZXVzZSBpZGVudGl0eSBpcyBkZXJpdmVkIG9ubHkgZnJvbSB0aGF0IGNhcHR1cmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBDYXB0dXJlZCByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gQ29ubmVjdGVkIGFuZCBpZGVudGl0eS1zdGFtcGVkIGRyaXZlci5cbiAgICovXG4gIGFzeW5jIHNwYXduQ29ubmVjdGlvbkZvckNvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uV2l0aENvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25XaXRoUG9vbEtleSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W1BPT0xfQ09ORklHVVJBVElPTl9LRVldPzogc3RyaW5nfX0gKi8gKGNvbm5lY3Rpb24pXG5cbiAgICBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0gPSByZXVzZUtleVxuICAgIGNvbm5lY3Rpb24uc2V0U2NoZW1hQ2FjaGVJbnZhbGlkYXRvcigoKSA9PiB7XG4gICAgICB0aGlzLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNsZWFyU2NoZW1hQ2FjaGVzRm9yUmV1c2VLZXkocmV1c2VLZXkpXG4gICAgfSlcblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGF3biBjb25uZWN0aW9uIHdpdGggY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgc3Bhd24gY29ubmVjdGlvbiB3aXRoIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb25XaXRoQ29uZmlndXJhdGlvbihjb25maWcpIHtcbiAgICBjb25zdCBEcml2ZXJDbGFzcyA9IGNvbmZpZy5kcml2ZXIgfHwgdGhpcy5kcml2ZXJDbGFzc1xuXG4gICAgaWYgKCFEcml2ZXJDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwiTm8gZHJpdmVyIGNsYXNzIHNldCBpbiBkYXRhYmFzZSBwb29sIG9yIGluIGdpdmVuIGNvbmZpZ1wiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBEcml2ZXJDbGFzcyhjb25maWcsIHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNvbm5lY3QoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQ29ubmVjdGlvbkFmdGVyRmFpbGVkQ29ubmVjdChjb25uZWN0aW9uKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgY29ubmVjdGlvbiBhZnRlciBmYWlsZWQgY29ubmVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gdG8gY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZUNvbm5lY3Rpb25BZnRlckZhaWxlZENvbm5lY3QoY29ubmVjdGlvbikge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNsb3NlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBjbG9zZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFmdGVyIGNvbm5lY3QgZmFpbGVkXCIsIHtlcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zIHwgKChhcmc6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+KX0gX29wdGlvbnNPckNhbGxiYWNrIC0gQ2hlY2tvdXQgb3B0aW9ucyBvciBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHsoYXJnOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gW19jYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgd2l0aENvbm5lY3Rpb24oX29wdGlvbnNPckNhbGxiYWNrLCBfY2FsbGJhY2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInd2l0aENvbm5lY3Rpb24nIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gb3BlcmF0aW9uIG9uIGEgZnJlc2hseSBjaGVja2VkLW91dCBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0Nvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IG9wdGlvbnMgLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgb3duZXI6IHN5bWJvbCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhPcGVyYXRpb25Db25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb3duZXIgPSBTeW1ib2woXCJkYXRhYmFzZS1vcGVyYXRpb24tb3duZXJcIilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhDb25uZWN0aW9uKG9wdGlvbnMsIGFzeW5jIChjb25uZWN0aW9uKSA9PiBhd2FpdCBjYWxsYmFjayhjb25uZWN0aW9uLCBvd25lcikpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3b3JrIHRocm91Z2ggYSBwb29sLW93bmVkIGNoZWNrb3V0IGZvciBhbiBpbW11dGFibGUsIGFscmVhZHktcmVzb2x2ZWRcbiAgICogcGh5c2ljYWwgY29uZmlndXJhdGlvbi4gQ29uY3JldGUgcG9vbHMgbXVzdCBwcmVzZXJ2ZSB0aGVpciBjYXBhY2l0eSxcbiAgICogdGltZW91dCwgcXVldWUsIGRlYnVnLCBhbmQgY2xvc2VBbGwgb3duZXJzaGlwIG9uIHRoaXMgcGF0aC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtDYXB0dXJlZENvbm5lY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gQ2FwdHVyZWQgY2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIG93bmVyOiBzeW1ib2wpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3BlcmF0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoQ2FwdHVyZWRPcGVyYXRpb25Db25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgdm9pZCBvcHRpb25zXG4gICAgdm9pZCBjYWxsYmFja1xuICAgIHRocm93IG5ldyBFcnJvcihcIid3aXRoQ2FwdHVyZWRPcGVyYXRpb25Db25uZWN0aW9uJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIG9wZW5DYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIF9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgcmVxdWlyZXMgYSBrZXllZCBzaW5nbGUtY29ubmVjdGlvbiBwb29sXCIpIH1cbiAgYXN5bmMgZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIF9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgcmVxdWlyZXMgYSBrZXllZCBzaW5nbGUtY29ubmVjdGlvbiBwb29sXCIpIH1cbiAgYXN5bmMgY2xvc2VDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIF9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgcmVxdWlyZXMgYSBrZXllZCBzaW5nbGUtY29ubmVjdGlvbiBwb29sXCIpIH1cbiAgYXN5bmMgZGVsZXRlQ2FwdHVyZWREYXRhYmFzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gX2RhdGFiYXNlQ29uZmlndXJhdGlvbikgeyB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCB0ZW5hbnQgU1FMaXRlIGxpZmVjeWNsZSByZXF1aXJlcyBhIGtleWVkIHNpbmdsZS1jb25uZWN0aW9uIHBvb2xcIikgfVxuICBjYXB0dXJlZENvbm5lY3Rpb25JblVzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gX2RhdGFiYXNlQ29uZmlndXJhdGlvbikgeyByZXR1cm4gZmFsc2UgfVxuICBjYXB0dXJlZENvbm5lY3Rpb25IYXNQZW5kaW5nV3JpdGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBfZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSByZXVzYWJsZSBjb25uZWN0aW9uIGV4aXN0cyBmb3IgY29udGV4dHMgd2hlcmUgQXN5bmNMb2NhbFN0b3JhZ2UgaXNuJ3Qgc2V0LlxuICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgY2hlY2tzIG91dCBhIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBnbG9iYWwgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUdsb2JhbENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hlY2tvdXQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRlYnVnIHNuYXBzaG90LlxuICAgKiBAcmV0dXJucyB7RGF0YWJhc2VQb29sRGVidWdTbmFwc2hvdH0gLSBEaWFnbm9zdGljIHNuYXBzaG90IGZvciB0aGlzIHBvb2wuXG4gICAqL1xuICBnZXREZWJ1Z1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmRlYnVnQ29uZmlndXJhdGlvblNuYXBzaG90KCksXG4gICAgICBjb25uZWN0aW9uczogW10sXG4gICAgICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZDogMCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGlkbGVDb3VudDogMCxcbiAgICAgIGluVXNlQ291bnQ6IDAsXG4gICAgICBwZW5kaW5nQ2hlY2tvdXRDb3VudDogMCxcbiAgICAgIHBvb2xDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgY29uZmlndXJhdGlvbiBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBTYW5pdGl6ZWQgcmVzb2x2ZWQgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGRlYnVnQ29uZmlndXJhdGlvblNuYXBzaG90KCkge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlnID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCBwb29sQ29uZmlnID0gZGF0YWJhc2VDb25maWcucG9vbFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFiYXNlOiBkYXRhYmFzZUNvbmZpZy5kYXRhYmFzZSxcbiAgICAgIGRyaXZlcjogZGF0YWJhc2VDb25maWcuZHJpdmVyPy5uYW1lLFxuICAgICAgaG9zdDogZGF0YWJhc2VDb25maWcuaG9zdCxcbiAgICAgIG1pZ3JhdGlvbnM6IGRhdGFiYXNlQ29uZmlnLm1pZ3JhdGlvbnMsXG4gICAgICBuYW1lOiBkYXRhYmFzZUNvbmZpZy5uYW1lLFxuICAgICAgcG9vbDogcG9vbENvbmZpZyA/IHtpZGxlVGltZW91dE1pbGxpczogcG9vbENvbmZpZy5pZGxlVGltZW91dE1pbGxpcywgbWF4OiBwb29sQ29uZmlnLm1heH0gOiB1bmRlZmluZWQsXG4gICAgICBwb3J0OiBkYXRhYmFzZUNvbmZpZy5wb3J0LFxuICAgICAgc2NoZW1hOiBkYXRhYmFzZUNvbmZpZy5zY2hlbWEsXG4gICAgICB0eXBlOiBkYXRhYmFzZUNvbmZpZy50eXBlLFxuICAgICAgdXNlRGF0YWJhc2U6IGRhdGFiYXNlQ29uZmlnLnVzZURhdGFiYXNlLFxuICAgICAgdXNlcm5hbWU6IGRhdGFiYXNlQ29uZmlnLnVzZXJuYW1lXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgY29ubmVjdGlvbiBzbmFwc2hvdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBkZXRhaWxzIC0gRXh0cmEgZGlhZ25vc3RpYyBmaWVsZHMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gQ29ubmVjdGlvbiBkaWFnbm9zdGljIHNuYXBzaG90LlxuICAgKi9cbiAgZGVidWdDb25uZWN0aW9uU25hcHNob3QoY29ubmVjdGlvbiwgZGV0YWlscyA9IHt9KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbldpdGhQb29sS2V5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0/OiBzdHJpbmd9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25uZWN0aW9uLmdldERlYnVnU25hcHNob3QoKSxcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgICByZXVzZUtleTogY29ubmVjdGlvbldpdGhQb29sS2V5W1BPT0xfQ09ORklHVVJBVElPTl9LRVldXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBhbGwgY29ubmVjdGlvbnMgZm9yIHRoaXMgcG9vbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNsb3NlQWxsKCkge31cbn1cblxuYmFzZU1ldGhvZHNGb3J3YXJkKFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2UpXG5cbmV4cG9ydCBkZWZhdWx0IFZlbG9jaW91c0RhdGFiYXNlUG9vbEJhc2VcbiJdfQ==
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.587",
6
+ "version": "1.0.588",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -20,6 +20,7 @@
20
20
  "benchmark:insert-multiple-chunking": "node benchmark/insert-multiple-chunking.js",
21
21
  "benchmark:preloader-id-dedup": "node benchmark/preloader-id-dedup.js",
22
22
  "benchmark:mysql-result-row-materialization": "node benchmark/mysql-result-row-materialization.js",
23
+ "benchmark:mysql-pool-idle-reaping": "node benchmark/mysql-pool-idle-reaping.js",
23
24
  "benchmark:query-roundtrip-batching": "node benchmark/query-roundtrip-batching.js",
24
25
  "benchmark:websocket-outbound-queue": "node benchmark/websocket-outbound-queue.js",
25
26
  "benchmark:websocket-frame-buffering": "node benchmark/websocket-frame-buffering.js",
@@ -201,7 +201,7 @@ export default class VelociousDatabaseDriversMysql extends Base{
201
201
  */
202
202
  connectArgs() {
203
203
  const args = this.getArgs()
204
- const forward = ["database", "host", "password"]
204
+ const forward = ["database", "host", "password", "port"]
205
205
 
206
206
  /**
207
207
  * Connect args.
@@ -113,6 +113,14 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
113
113
  */
114
114
  connectionClosePromises = new WeakMap()
115
115
 
116
+ /** Cumulative low-cardinality pool telemetry. */
117
+ telemetry = {
118
+ checkoutWaitCount: 0,
119
+ checkoutWaitMaxMs: 0,
120
+ checkoutWaitTotalMs: 0,
121
+ idleReapDisposalCount: 0
122
+ }
123
+
116
124
  idSeq = 0
117
125
 
118
126
  /**
@@ -559,10 +567,24 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
559
567
  const checkout = this.pendingCheckouts.splice(index, 1)[0]
560
568
 
561
569
  this.clearPendingCheckoutTimeout(checkout)
570
+ this.recordCheckoutWait(checkout)
562
571
 
563
572
  return checkout
564
573
  }
565
574
 
575
+ /**
576
+ * Records a completed queue wait without retaining per-checkout labels or samples.
577
+ * @param {PendingCheckout} checkout - Checkout leaving the pending queue.
578
+ * @returns {void}
579
+ */
580
+ recordCheckoutWait(checkout) {
581
+ const waitedForMs = Math.max(0, Date.now() - checkout.enqueuedAt)
582
+
583
+ this.telemetry.checkoutWaitCount++
584
+ this.telemetry.checkoutWaitTotalMs += waitedForMs
585
+ this.telemetry.checkoutWaitMaxMs = Math.max(this.telemetry.checkoutWaitMaxMs, waitedForMs)
586
+ }
587
+
566
588
  /**
567
589
  * Runs start pending checkout timeout.
568
590
  * @param {PendingCheckout} checkout - Pending checkout to time out.
@@ -1051,7 +1073,8 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
1051
1073
  idleCount: this.connections.length + [...this.lifecycleRetainedConnections.values()].filter((connection) => connection.getIdSeq() === undefined).length,
1052
1074
  inUseCount: Object.keys(this.connectionsInUse).length,
1053
1075
  pendingCheckouts: this.pendingCheckoutDebugSnapshots(now),
1054
- pendingCheckoutCount: this.pendingCheckouts.length
1076
+ pendingCheckoutCount: this.pendingCheckouts.length,
1077
+ telemetry: {...this.telemetry}
1055
1078
  }
1056
1079
  }
1057
1080
 
@@ -1307,6 +1330,7 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
1307
1330
  async closeExpiredIdleConnections(expiredConnections) {
1308
1331
  for (const connection of expiredConnections) {
1309
1332
  await this.closeConnection(connection)
1333
+ this.telemetry.idleReapDisposalCount++
1310
1334
  }
1311
1335
  }
1312
1336
 
@@ -44,6 +44,7 @@ import baseMethodsForward from "./base-methods-forward.js"
44
44
  * @property {Array<DatabasePoolPendingCheckoutDebugSnapshot>} [pendingCheckouts] - Waiting checkout snapshots.
45
45
  * @property {number} pendingCheckoutCount - Number of queued checkout requests.
46
46
  * @property {string} poolClass - Pool class name.
47
+ * @property {{checkoutWaitCount: number, checkoutWaitMaxMs: number, checkoutWaitTotalMs: number, idleReapDisposalCount: number}} [telemetry] - Cumulative pool lifecycle telemetry.
47
48
  */
48
49
  export const POOL_CONFIGURATION_KEY = Symbol("velociousPoolConfigurationKey")
49
50