@dbx-tools/appkit-mastra 0.9.31 → 0.9.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/plugin.js CHANGED
@@ -62,7 +62,7 @@ import { buildMcpServer } from "./mcp.js";
62
62
  import { createMemoryBuilder, createServicePrincipalPool, needsLakebase } from "./memory.js";
63
63
  import { logFeedback, resolveFeedbackEnabled } from "./mlflow.js";
64
64
  import { resolveDefaultModelId } from "./model.js";
65
- import { buildObservability } from "./observability.js";
65
+ import { buildObservability, configureOtelPropagation } from "./observability.js";
66
66
  import { provisionRemoteSkills } from "./remote-skills.js";
67
67
  import { attachRoutePatchMiddleware, createRequestContext, isMastraRequestAllowed, MastraServer, } from "./server.js";
68
68
  import { resolveServingConfig } from "./serving.js";
@@ -196,6 +196,7 @@ export class MastraPlugin extends Plugin {
196
196
  // Wait until sibling plugins (e.g. `lakebase`) finish `setup()` so
197
197
  // the lakebase pool is valid when storage/memory are enabled.
198
198
  this.context?.onLifecycle("setup:complete", async () => {
199
+ configureOtelPropagation();
199
200
  this.applyLakebaseAutoDefaults();
200
201
  await this.buildAgentAndServer();
201
202
  });
@@ -1107,4 +1108,4 @@ function parseStatementLimit(raw) {
1107
1108
  * ```
1108
1109
  */
1109
1110
  export const mastra = toPlugin(MastraPlugin);
1110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEdBS1AsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFHOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG9CQUFvQixHQUVyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2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QUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEdBQVk7SUFDdkMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiB0aGF0IGJ1aWxkcyBvbmUgb3IgbW9yZSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZXMgYW5kXG4gKiBtb3VudHMgdGhlIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlci4gQ2xpZW50cyBkcml2ZSB0aGUgY29udmVyc2F0aW9uXG4gKiBvdmVyIHRoZSBzdGFuZGFyZCBNYXN0cmEgYWdlbnQgc3RyZWFtIChgQG1hc3RyYS9jbGllbnQtanNgJ3NcbiAqIGBnZXRBZ2VudChpZCkuc3RyZWFtKClgKSwgc28gdGhlcmUncyBubyBiZXNwb2tlIGNoYXQgdHJhbnNwb3J0IHRvXG4gKiBrZWVwIGluIHN5bmMuXG4gKlxuICogLSBBZ2VudHM6IHJlZ2lzdGVyZWQgdGhyb3VnaCBgY29uZmlnLmFnZW50c2AgYXQgcGx1Z2luIGNyZWF0aW9uXG4gKiAgICh7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSkuIEVhY2ggZW50cnkncyBgdG9vbHNgIGZpZWxkIGFjY2VwdHNcbiAqICAgZWl0aGVyIGEgcGxhaW4gcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2sgdGhhdCBnZXRzXG4gKiAgIGEgdHlwZWQgc2libGluZy1wbHVnaW4gaW5kZXggKHtAbGluayBNYXN0cmFQbHVnaW5zfSkuIE9taXRcbiAqICAgYGNvbmZpZy5hZ2VudHNgIHRvIGdldCBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdC5cbiAqIC0gTW9kZWw6IGVhY2ggYWdlbnQgY2FsbCByZXNvbHZlcyBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgdmlhXG4gKiAgIHtAbGluayBidWlsZE1vZGVsfSBmcm9tIGAuL21vZGVsLmpzYC4gUGVyLWFnZW50IGBtb2RlbGAgb3ZlcnJpZGVzXG4gKiAgIChgQWdlbnRDb25maWdbXCJtb2RlbFwiXWAgb3IgYSBgbW9kZWxJZGAgc3RyaW5nKSBmbG93IHRocm91Z2hcbiAqICAge0BsaW5rIGJ1aWxkQWdlbnRzfS5cbiAqIC0gTWVtb3J5IC8gc3RvcmFnZTogcGVyLWFnZW50LCBidWlsdCBieSB7QGxpbmsgY3JlYXRlTWVtb3J5QnVpbGRlcn1cbiAqICAgZnJvbSBgLi9tZW1vcnkuanNgLiBCb3RoIGF1dG8tZGVmYXVsdCB0byBgdHJ1ZWAgd2hlbiB0aGVcbiAqICAgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCAodW5sZXNzIHRoZSBjYWxsZXIgcGFzc2VkXG4gKiAgIGBmYWxzZWAgb3IgYSBjdXN0b20gY29uZmlnKS4gU3RvcmFnZSBuYW1lc3BhY2VzIHBlciBhZ2VudCB2aWFcbiAqICAge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHBlciBhZ2VudDsgdGhlIHZlY3RvciBzdG9yZSBpcyBhIHNpbmdsZVxuICogICBzaGFyZWQgc2luZ2xldG9uIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqIC0gU2VydmVyOiB0aGUgRXhwcmVzcyBzdWJhcHAgd2lyaW5nIGxpdmVzIGluIGAuL3NlcnZlci5qc2AuXG4gKiAtIEhUVFA6IEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4gdW5kZXIgYC9hcGkvbWFzdHJhYC4gQWxvbmdzaWRlIHRoZVxuICogICBNYXN0cmEgYWdlbnQgcm91dGVzLCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBgL3JvdXRlL2hpc3RvcnlgXG4gKiAgIChsb2FkICsgY2xlYXIgYSB0aHJlYWQncyBtZXNzYWdlcyksIGAvcm91dGUvdGhyZWFkc2AgKGxpc3QgdGhlXG4gKiAgIGNhbGxlcidzIGNvbnZlcnNhdGlvbnMgKyBkZWxldGUgb25lKSwgYC9tb2RlbHNgLCBgL2RlZmF1bHQtbW9kZWxgLFxuICogICBgL3N1Z2dlc3Rpb25zYCwgYC9yb3V0ZS9mZWVkYmFja2AgKGxvZyBhIHRodW1icyAvIGNvbW1lbnQgdG8gTUxmbG93XG4gKiAgIHdoZW4gZmVlZGJhY2sgaXMgZW5hYmxlZCksIGFuZCB0aGUgZ2VuZXJpYyBgL2VtYmVkLzp0eXBlLzppZGBcbiAqICAgcmVzb2x2ZXIgZm9yIGlubGluZSBjaGFydCAvIGRhdGEgbWFya2Vycy4gRWFjaCBpcyByZWdpc3RlcmVkIHRocm91Z2hcbiAqICAgQXBwS2l0J3MgYHJvdXRlKClgIHNvIGl0IGxhbmRzIGluIHRoZSBwbHVnaW4ncyBlbmRwb2ludCBtYXAsIGFuZFxuICogICBldmVyeSBvdXRib3VuZCBjYWxsIG9uZSBtYWtlcyBydW5zIHRocm91Z2ggYGV4ZWN1dGUoKWAgKHNlZVxuICogICBgLi9kZWZhdWx0cy5qc2ApLiBUaGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2Agc3VyZmFjZSBpcyBnYXRlZFxuICogICBieSBgY29uZmlnLmFwaUFjY2Vzc2AgKGRlZmF1bHQgYFwic2NvcGVkXCJgKTogb25seSBhZ2VudCBpbmZlcmVuY2UsXG4gKiAgIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhlIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZClcbiAqICAgTUNQIGFyZSBkaXNwYXRjaGVkIHRvIE1hc3RyYTsgYWRtaW4gLyBtdXRhdGluZyAvIGJ1bGstZXhwb3J0IHJvdXRlc1xuICogICBhcmUgcmVmdXNlZCB3aXRoIGA0MDNgLiBTZWUge0BsaW5rIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWR9LlxuICogLSBNQ1A6IG9wdCBpbiB3aXRoIGBjb25maWcubWNwYCB0byBleHBvc2UgdGhlIGFnZW50cyAoYW5kIG9wdGlvbmFsbHlcbiAqICAgdG9vbHMpIGFzIGEgTWFzdHJhIGBNQ1BTZXJ2ZXJgLiBJdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBgTWFzdHJhYFxuICogICBpbnN0YW5jZSB2aWEgYG1jcFNlcnZlcnNgLCBzbyBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXMgdGhlIHN0b2NrXG4gKiAgIE1DUCB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIHVuZGVyIHRoZSBtb3VudC4gU2VlXG4gKiAgIGAuL21jcC5qc2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZW5pZSxcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgdG9QbHVnaW4sXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IG1vZGVsQ2F0YWxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZmVlZGJhY2ssXG4gIHJvdXRlcyxcbiAgdHlwZSBDaGFydCxcbiAgdHlwZSBNYXN0cmFDbGllbnRDb25maWcsXG4gIHR5cGUgTWFzdHJhRmVlZGJhY2tSZXF1ZXN0LFxuICB0eXBlIFN0YXRlbWVudERhdGEsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGRpc3BsYXksIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IE1hc3RyYSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IFBvb2wgfSBmcm9tIFwicGdcIjtcblxuaW1wb3J0IHsgYnVpbGRBZ2VudHMsIEZBTExCQUNLX0FHRU5UX0lELCB0eXBlIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBmZXRjaENoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IGFnZW50Q2hhdFJvdXRlcyB9IGZyb20gXCIuL2NoYXQudHNcIjtcbmltcG9ydCB7XG4gIGF0dHJpYnV0ZWRVc2VySWQsXG4gIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQsXG4gIE1BU1RSQV9DT05GSUdfU0NIRU1BLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBjaGFydEZldGNoRGVmYXVsdHMsXG4gIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsXG4gIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMsXG4gIHN0YXRlbWVudERhdGFEZWZhdWx0cyxcbn0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHtcbiAgcmVxdWVzdFVzZXJJZCxcbiAgcmVzb2x2ZUlkZW50aXR5TW9kZSxcbiAgdXNlU2VydmljZVByaW5jaXBhbCxcbiAgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUsXG59IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1jcFNlcnZlciwgdHlwZSBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL21jcC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5QnVpbGRlciwgY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2wsIG5lZWRzTGFrZWJhc2UgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGxvZ0ZlZWRiYWNrLCByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRGVmYXVsdE1vZGVsSWQgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgYnVpbGRPYnNlcnZhYmlsaXR5IH0gZnJvbSBcIi4vb2JzZXJ2YWJpbGl0eS50c1wiO1xuaW1wb3J0IHsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzIH0gZnJvbSBcIi4vcmVtb3RlLXNraWxscy50c1wiO1xuaW1wb3J0IHtcbiAgYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0LFxuICBpc01hc3RyYVJlcXVlc3RBbGxvd2VkLFxuICBNYXN0cmFTZXJ2ZXIsXG59IGZyb20gXCIuL3NlcnZlci50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudERhdGEsIFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3RhdGVtZW50LnRzXCI7XG5pbXBvcnQgeyBhdHRhY2hDaGF0VHVyblRyYWNlSW8gfSBmcm9tIFwiLi90cmFjZS1pby50c1wiO1xuaW1wb3J0IHsgaW52YWxpZEZpZWxkcyB9IGZyb20gXCIuL3ZhbGlkYXRpb24udHNcIjtcblxuY29uc3QgR0VOSUVfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGdlbmllKS5wbHVnaW4ubWFuaWZlc3Q7XG5jb25zdCBMQUtFQkFTRV9NQU5JRkVTVCA9IHBsdWdpblJlZ2lzdHJ5LmRhdGEobGFrZWJhc2UpLnBsdWdpbi5tYW5pZmVzdDtcblxuLyoqXG4gKiBCdWRnZXQgZm9yIGRyYWluaW5nIHRoZSBtZW1vcnkgc2VydmljZS1wcmluY2lwYWwgcG9vbCBvbiBzaHV0ZG93bi4gV2VsbFxuICogaW5zaWRlIEFwcEtpdCdzIDE1cyBncmFjZWZ1bC1zaHV0ZG93biB3aW5kb3csIHNvIGEgc3R1Y2sgY29ubmVjdGlvbiBjYW5cbiAqIG5ldmVyIGJlIHdoYXQgaG9sZHMgdGhlIHByb2Nlc3Mgb3Blbi5cbiAqL1xuY29uc3QgUE9PTF9EUkFJTl9USU1FT1VUX01TID0gNV8wMDA7XG5cbi8qKiBDZWlsaW5nIG9uIHRoZSBgP3RpbWVvdXRNcz1gIGxvbmctcG9sbCBidWRnZXQgYSBjbGllbnQgbWF5IHJlcXVlc3QuICovXG5jb25zdCBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSB3aGVuIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWUgY2FuJ3QgYmUgcmVhZC4gKi9cbmNvbnN0IE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSA9IFwiQ291bGQgbm90IHJlYWQgdGhlIHdvcmtzcGFjZSdzIG1vZGVsIGNhdGFsb2d1ZVwiO1xuXG4vKiogU3RhYmxlIGNsaWVudCBtZXNzYWdlIGZvciBhIGZlZWRiYWNrIGJvZHkgdGhhdCBmYWlscyBzY2hlbWEgdmFsaWRhdGlvbi4gKi9cbmNvbnN0IElOVkFMSURfRkVFREJBQ0tfTUVTU0FHRSA9IFwiSW52YWxpZCBmZWVkYmFjayByZXF1ZXN0XCI7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2UgZm9yIHN0YXRlbWVudCByZXN1bHQgc2V0cywgbWF0Y2hpbmcgdGhlIGNoYXJ0IGNhY2hlJ3MgZm9ybS4gKi9cbmNvbnN0IFNUQVRFTUVOVF9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1hc3RyYTpzdGF0ZW1lbnRcIjtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGBtYXN0cmFgKSB0aGF0IGhvc3RzIE1hc3RyYSBhZ2VudHNcbiAqIHdpdGggb3B0aW9uYWwgTGFrZWJhc2UtYmFja2VkIG1lbW9yeSBhbmQgQUkgU0RLIGNoYXQgcm91dGVzIHVuZGVyXG4gKiB0aGUgcGx1Z2luIG1vdW50ICh0eXBpY2FsbHkgYC9hcGkvbWFzdHJhYCkuXG4gKlxuICogQGV4YW1wbGUgUmVnaXN0ZXIgdGhlIHBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgbGFrZWJhc2UgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBjcmVhdGVBZ2VudCwgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIC8vIGBsYWtlYmFzZWAgZmlyc3Q6IHJlZ2lzdGVyaW5nIGl0IGF1dG8tZW5hYmxlcyBNYXN0cmEgc3RvcmFnZSArIG1lbW9yeS5cbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBsYWtlYmFzZSgpLFxuICogICAgIG1hc3RyYSh7XG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEISB9LFxuICogICAgICAgYWdlbnRzOiBjcmVhdGVBZ2VudCh7XG4gKiAgICAgICAgIG5hbWU6IFwiYW5hbHlzdFwiLFxuICogICAgICAgICBpbnN0cnVjdGlvbnM6IFwiWW91IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgcmV2ZW51ZSBhbmQgcmV0dXJucy5cIixcbiAqICAgICAgICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgICAgICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLmdlbmllPy50b29sa2l0KCkpIH07XG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9KSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgUmVhZCB0aGUgYWdlbnRzIGJhY2sgb2ZmIHRoZSBBcHBLaXQgaW5zdGFuY2VcbiAqIGBgYHRzXG4gKiBjb25zdCBhZ2VudElkcyA9IGFwcC5tYXN0cmEubGlzdCgpO1xuICogY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgYXBwLm1hc3RyYS5saXN0TW9kZWxzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVBsdWdpbiBleHRlbmRzIFBsdWdpbjxNYXN0cmFQbHVnaW5Db25maWc+IHtcbiAgLy8gQW5ub3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYHNhdGlzZmllc2A6IHRoZSBjb25maWcgc2NoZW1hJ3MgdHlwZSBjb21lc1xuICAvLyBmcm9tIGBAdHlwZXMvanNvbi1zY2hlbWFgLCB3aGljaCB0aGlzIHBhY2thZ2UgZG9lcyBub3QgZGVwZW5kIG9uLCBzbyBhblxuICAvLyBpbmZlcnJlZCBtYW5pZmVzdCB0eXBlIGNhbm5vdCBiZSBuYW1lZCBpbiB0aGUgZW1pdHRlZCBkZWNsYXJhdGlvbi4gVGhlXG4gIC8vIGBQbHVnaW5NYW5pZmVzdDxcIm1hc3RyYVwiPmAgcGFyYW1ldGVyIHN0aWxsIGNhcnJpZXMgdGhlIGxpdGVyYWwgbmFtZSBpbnRvXG4gIC8vIGB0b1BsdWdpbigpYCdzIGZhY3RvcnkgdHlwZS5cbiAgc3RhdGljIG1hbmlmZXN0OiBQbHVnaW5NYW5pZmVzdDxcIm1hc3RyYVwiPiA9IHtcbiAgICBuYW1lOiBcIm1hc3RyYVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIk1hc3RyYVwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCdWlsZHMgYSBNYXN0cmEgQWdlbnQgd2l0aCB1c2VyLXNjb3BlZCB3b3Jrc3BhY2UgYXV0aCAoYXNVc2VyKSBcIiArXG4gICAgICBcImFuZCBvcHRpb25hbCBQb3N0Z3Jlcy1iYWNrZWQgTWFzdHJhIE1lbW9yeSB2aWEgdGhlIGBsYWtlYmFzZWAgcGx1Z2luLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW1xuICAgICAgICAvLyBSZXVzZSB0aGUgR2VuaWUgc3BhY2UtaWQgYmluZGluZyBkZWNsYXJlZCBieSBBcHBLaXQncyBgZ2VuaWVgXG4gICAgICAgIC8vIG1hbmlmZXN0IHNvIHRoZSByZXNvdXJjZS1iaW5kaW5nIHNoYXBlIGlzIGlkZW50aWNhbCB0byBBcHBLaXQncyBhbmRcbiAgICAgICAgLy8gYW4gZXhpc3RpbmcgYGFwcC55YW1sYCAvIGBnZW5pZSh7IHNwYWNlcyB9KWAgd2lyaW5nIGtlZXBzIHdvcmtpbmcuXG4gICAgICAgIC8vIFRoZSBidWlsdC1pbiBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2hcbiAgICAgICAgLy8gYEBkYngtdG9vbHMvZ2VuaWVgLCBzbyBvbmx5IHRoZSBiaW5kaW5nIGlzIHNoYXJlZCwgbm90IHRoZSBwbHVnaW4nc1xuICAgICAgICAvLyB0b29scy5cbiAgICAgICAgLi4uR0VOSUVfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgICAuLi5MQUtFQkFTRV9NQU5JRkVTVC5yZXNvdXJjZXMucmVxdWlyZWQsXG4gICAgICBdLFxuICAgIH0sXG4gICAgY29uZmlnOiB7IHNjaGVtYTogTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSxcbiAgfTtcblxuICAvKipcbiAgICogVGlnaHRlbiByZXNvdXJjZSByZXF1aXJlbWVudHMgYmFzZWQgb24gd2hpY2ggZmVhdHVyZXMgYXJlIGVuYWJsZWQuXG4gICAqIEFwcEtpdCBjYWxscyB0aGlzIGF0IHJlZ2lzdHJhdGlvbiB0aW1lIChjb25maWctYXdhcmUpIHNvIGRpc2FibGVkXG4gICAqIGZlYXR1cmVzIGRvbid0IHN1cmZhY2UgdGhlaXIgcmVzb3VyY2UgYXNrcyB0byB0aGUgaG9zdCBhcHAuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHJlc291cmNlczogUmVzb3VyY2VSZXF1aXJlbWVudFtdID0gW107XG4gICAgY29uc3QgZW5hYmxlZE1hbmlmZXN0czogUGx1Z2luTWFuaWZlc3Q8c3RyaW5nPltdID0gW107XG5cbiAgICBpZiAobmVlZHNMYWtlYmFzZShjb25maWcpKSB7XG4gICAgICBlbmFibGVkTWFuaWZlc3RzLnB1c2goTEFLRUJBU0VfTUFOSUZFU1QpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG0gb2YgZW5hYmxlZE1hbmlmZXN0cykge1xuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBtLnJlc291cmNlcy5yZXF1aXJlZCkge1xuICAgICAgICByZXNvdXJjZXMucHVzaCh7IC4uLnJlc291cmNlLCByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlcztcbiAgfVxuXG4gIHByaXZhdGUgbG9nZ2VyID0gbG9nLmxvZ2dlcih0aGlzKTtcbiAgcHJpdmF0ZSBidWlsdDogQnVpbHRBZ2VudHMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmE6IE1hc3RyYSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYUFwcDogZXhwcmVzcy5FeHByZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhU2VydmVyOiBNYXN0cmFTZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCBNQ1Agc2VydmVyIGV4cG9zaW5nIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIC8gdG9vbHMsIG9yXG4gICAqIGBudWxsYCB3aGVuIGBjb25maWcubWNwYCBpcyBkaXNhYmxlZCAodGhlIGRlZmF1bHQpLiBCdWlsdCBpblxuICAgKiB7QGxpbmsgYnVpbGRBZ2VudEFuZFNlcnZlcn0gYW5kIHJlZ2lzdGVyZWQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgbWNwOiBSZXNvbHZlZE1jcCB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogUmVzb2x2ZWQge0BsaW5rIE1hc3RyYUlkZW50aXR5TW9kZX06IHRoZSBpZGVudGl0eSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrc1xuICAgKiBjYWxscyBydW4gYXMuIFJlYWQgb25jZSBhdCBzZXR1cCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGUgYXBwXG4gICAqIGJvb3QgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IHJlcXVlc3QsIGFuZCBzbyBldmVyeSByZXF1ZXN0IGFncmVlcy5cbiAgICovXG4gIHByaXZhdGUgaWRlbnRpdHlNb2RlOiBNYXN0cmFJZGVudGl0eU1vZGUgPSBcInVzZXJcIjtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBzZXJ2aWNlLXByaW5jaXBhbCBMYWtlYmFzZSBwb29sIGJhY2tpbmcgTWFzdHJhIG1lbW9yeSAvXG4gICAqIHN0b3JhZ2UuIEJ1aWx0IG9uY2UgaW4ge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IChvdXRzaWRlIGFueVxuICAgKiBgYXNVc2VyYCBzY29wZSwgc28gaXQgbmV2ZXIgaW5oZXJpdHMgYSByZXF1ZXN0J3MgT0JPIGlkZW50aXR5KSBhbmRcbiAgICogZHJhaW5lZCBpbiB7QGxpbmsgc2h1dGRvd259LiBgbnVsbGAgdW50aWwgc2V0dXAgcnVucyBvciB3aGVuXG4gICAqIExha2ViYXNlIGlzbid0IG5lZWRlZC5cbiAgICovXG4gIHByaXZhdGUgc2VydmljZVByaW5jaXBhbFBvb2w6IFBvb2wgfCBudWxsID0gbnVsbDtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBpZGVudGl0eSBtb2RlIHVwIGZyb250IHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZVxuICAgIC8vIGFwcCBib290IHdpdGggYSBjbGVhciBtZXNzYWdlIHJhdGhlciB0aGFuIDUwMC1pbmcgdGhlIGZpcnN0IGNoYXQgcmVxdWVzdC5cbiAgICB0aGlzLmlkZW50aXR5TW9kZSA9IHJlc29sdmVJZGVudGl0eU1vZGUodGhpcy5jb25maWcuZ2VuaWVJZGVudGl0eSk7XG4gICAgLy8gV2FpdCB1bnRpbCBzaWJsaW5nIHBsdWdpbnMgKGUuZy4gYGxha2ViYXNlYCkgZmluaXNoIGBzZXR1cCgpYCBzb1xuICAgIC8vIHRoZSBsYWtlYmFzZSBwb29sIGlzIHZhbGlkIHdoZW4gc3RvcmFnZS9tZW1vcnkgYXJlIGVuYWJsZWQuXG4gICAgdGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZShcInNldHVwOmNvbXBsZXRlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEFnZW50QW5kU2VydmVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrcyBjYWxscyBzaG91bGQgcnVuIHRocm91Z2ggZm9yXG4gICAqIGByZXFgLCBob25vcmluZyB7QGxpbmsgaWRlbnRpdHlNb2RlfS5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudC4gSW4gYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2BcbiAgICogdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpbiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lXG4gICAqIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm4gQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZVxuICAgKiBoZWxwZXIgY292ZXJzIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIHRoZSBjaGF0IHBhdGggbWFrZXMgKHNlcnZpbmcgY2F0YWxvZ3VlLFxuICAgKiBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAgdmlhIHRoZSBkaXNwYXRjaGVkIGFnZW50IHR1cm4sIHN0YXRlbWVudCBmZXRjaCxcbiAgICogZmVlZGJhY2spLCBzbyB0aGUgaWRlbnRpdHkgZGVjaXNpb24gbGl2ZXMgaW4gb25lIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY29wZWRTZWxmKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcSkgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLCBhdXRvLWVuYWJsZSBgc3RvcmFnZWBcbiAgICogYW5kIGBtZW1vcnlgIHVubGVzcyB0aGUgY2FsbGVyIG9wdGVkIG91dCBleHBsaWNpdGx5IChgZmFsc2VgIG9yIGFcbiAgICogY3VzdG9tIGNvbmZpZyBvYmplY3QpLiBSdW4gYWZ0ZXIgYHNldHVwOmNvbXBsZXRlYCBzbyB0aGUgbG9va3VwXG4gICAqIGlzIHJlbGlhYmxlOiBhbnkgcGx1Z2luIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBzeW5jaHJvbm91c2x5IGlzXG4gICAqIGFscmVhZHkgaW4gdGhlIHJlZ2lzdHJ5IGJ5IHRoZSB0aW1lIHRoaXMgZmlyZXMuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGFrZWJhc2UgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghaGFzTGFrZWJhc2UpIHJldHVybjtcbiAgICBpZiAodGhpcy5jb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5zdG9yYWdlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5ID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLm1lbW9yeSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRHJhaW4gdGhlIG1lbW9yeSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sLiBJZGVtcG90ZW50OiB0aGUgaGFuZGxlIGlzXG4gICAqIGNsZWFyZWQgYmVmb3JlIHRoZSBkcmFpbiBzdGFydHMsIHNvIGEgc2Vjb25kIGNhbGwgaXMgYSBuby1vcCBhbmQgYVxuICAgKiBsYXRlciBgc2V0dXAoKWAgcmVidWlsZHMgdGhlIHBvb2wuIEJvdW5kZWQgYnlcbiAgICoge0BsaW5rIFBPT0xfRFJBSU5fVElNRU9VVF9NU30gdG8gc3RheSB3ZWxsIGluc2lkZSB0aGUgMTVzIGdyYWNlZnVsXG4gICAqIHNodXRkb3duIGJ1ZGdldC5cbiAgICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sO1xuICAgIGlmICghcG9vbCkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIpO1xuICAgIC8vIFRoZSBidWRnZXQgdGltZXIgaXMgY2FuY2VsbGVkIG9uIHRoZSB3YXkgb3V0IHNvIGEgZHJhaW4gdGhhdCBmaW5pc2hlZFxuICAgIC8vIGVhcmx5IGNhbm5vdCBob2xkIHRoZSBldmVudCBsb29wIG9wZW4gZm9yIHRoZSByZXN0IG9mIHRoZSB3aW5kb3cuXG4gICAgY29uc3QgYnVkZ2V0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Bvb2wuZW5kKCksIGFzeW5jVXRpbHMuc2xlZXAoUE9PTF9EUkFJTl9USU1FT1VUX01TLCBidWRnZXQuc2lnbmFsKV0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJlcnJvciBjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnVkZ2V0LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrLiBBcHBLaXQncyBncmFjZWZ1bCBzaHV0ZG93biBjYWxscyB0aGlzIGhvb2tcbiAgICogc3luY2hyb25vdXNseSBhbmQgbmV2ZXIgYXdhaXRzIHtAbGluayBzaHV0ZG93bn0sIHNvIHRoZSBwb29sIGRyYWluIGlzXG4gICAqIHN0YXJ0ZWQgaGVyZSB0b287IGl0IGNhbm5vdCBiZSBhd2FpdGVkIGZyb20gYSBgdm9pZGAgaG9vaywgYW5kXG4gICAqIHtAbGluayBzaHV0ZG93bn0gaXMgaWRlbXBvdGVudCBzbyB0aGUgZHVwbGljYXRlIGNhbGwgaXMgZnJlZS5cbiAgICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSWRzIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBNYXRjaGVzXG4gICAgICAgKiBBcHBLaXQgYGFnZW50cy5saXN0KClgIHNvIGNhbGxlcnMgY2FuIGl0ZXJhdGUgdGhlIHJlZ2lzdHJ5IHRoZVxuICAgICAgICogc2FtZSB3YXkgdW5kZXIgYm90aCBwbHVnaW5zLlxuICAgICAgICovXG4gICAgICBsaXN0OiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIC8qKlxuICAgICAgICogTG9vayB1cCBhIHJlZ2lzdGVyZWQgYWdlbnQgYnkgaWQuIFJldHVybnMgYG51bGxgIChub3RcbiAgICAgICAqIHVuZGVmaW5lZCkgd2hlbiB1bmtub3duIHNvIGNhbGwgc2l0ZXMgY2FuIGVhcmx5LXJldHVybiB3aXRob3V0XG4gICAgICAgKiBhIHNlcGFyYXRlIGBpbmAgY2hlY2suXG4gICAgICAgKi9cbiAgICAgIGdldDogKGlkOiBzdHJpbmcpOiBBZ2VudCB8IG51bGwgPT4gdGhpcy5idWlsdD8uYWdlbnRzW2lkXSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYWdlbnQgdGhlIGNsaWVudCBjb252ZXJzZXMgd2l0aCB3aGVuIGl0IGRvZXNuJ3QgbmFtZSBvbmUuXG4gICAgICAgKiBSZXNvbHZlcyB0byBgY29uZmlnLmRlZmF1bHRBZ2VudGAsIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlkLCBvclxuICAgICAgICogdGhlIGJ1aWx0LWluIGBkZWZhdWx0YCBmYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgZ2V0RGVmYXVsdDogKCk6IEFnZW50IHwgbnVsbCA9PlxuICAgICAgICAodGhpcy5idWlsdCAmJiB0aGlzLmJ1aWx0LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXSkgPz8gbnVsbCxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcyAoYSBUZWFtcyBhY3Rpdml0eSBvbiBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50LCBhXG4gICAgICAgKiBzY2hlZHVsZWQgam9iKS5cbiAgICAgICAqXG4gICAgICAgKiBNYXN0cmEncyB1c2VyLXNjb3BlZCB0b29scyAtIGBhc2tfZ2VuaWVgIG1vc3QgdmlzaWJseSAtIHJlYWQgdGhlIEFwcEtpdFxuICAgICAgICogdXNlciBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCwgd2hpY2ggb25seSB0aGUgSFRUUCBtaWRkbGV3YXJlIHN0YW1wcy5cbiAgICAgICAqIENhbGxpbmcgYGFnZW50LmdlbmVyYXRlYCB3aXRoIGEgcmF3IHByb21wdCB0aGVyZWZvcmUgYW5zd2VycyBcInRoZSBkYXRhXG4gICAgICAgKiBzb3VyY2UgaXMgdW5yZWFjaGFibGVcIiB3aGVyZSB0aGUgY2hhdCByb3V0ZXMgYW5zd2VyIHdpdGggcmVhbCBkYXRhLlxuICAgICAgICogUGFzc2luZyB0aGlzIGFzIGByZXF1ZXN0Q29udGV4dGAgY2xvc2VzIHRoYXQgZ2FwLCBzbyBhbiBvdXQtb2YtYmFuZCB0dXJuXG4gICAgICAgKiBoYXMgZXhhY3RseSB0aGUgY2FwYWJpbGl0aWVzIGEgY2hhdCB0dXJuIGhhcy5cbiAgICAgICAqXG4gICAgICAgKiBNdXN0IGJlIGNhbGxlZCBJTlNJREUgYW4gYGFzVXNlcihyZXEpYCBzY29wZSB0byBpbmhlcml0IHRoZSBjYWxsZXInc1xuICAgICAgICogT0JPIGlkZW50aXR5OyBvdXRzaWRlIG9uZSBpdCByZXNvbHZlcyB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZVJlcXVlc3RDb250ZXh0OiAoXG4gICAgICAgIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiA9PiBjcmVhdGVSZXF1ZXN0Q29udGV4dChvcHRpb25zKSxcbiAgICAgIC8qKlxuICAgICAgICogTUNQIGVuZHBvaW50IGluZm8gd2hlbiBgY29uZmlnLm1jcGAgaXMgZW5hYmxlZCwgZWxzZSBgbnVsbGAuXG4gICAgICAgKiBTdHJlYW1hYmxlIEhUVFAgaXMgYGh0dHBgOyB0aGUgU1NFIHBhaXIgaXMgdGhlIGxlZ2FjeSB0cmFuc3BvcnQuXG4gICAgICAgKlxuICAgICAgICogRWFjaCBwYXRoIGlzIGdpdmVuIHR3aWNlOiBtb3VudC1yZWxhdGl2ZSAoYGh0dHBQYXRoYCwgYHNzZVBhdGhgLFxuICAgICAgICogYG1lc3NhZ2VQYXRoYCkgZm9yIGFueXRoaW5nIHRoYXQgYWxyZWFkeSBrbm93cyB3aGVyZSB0aGUgcGx1Z2luIGlzXG4gICAgICAgKiBtb3VudGVkLCBhbmQgYWJzb2x1dGUgKGBodHRwYCwgYHNzZWAsIGBtZXNzYWdlc2ApIGZvciBNQ1AgY2xpZW50cyxcbiAgICAgICAqIHdoaWNoIHRha2UgYSBzaW5nbGUgVVJMIGFuZCBjYW5ub3QgY29tcG9zZSBvbmUuIFRoZSBhYnNvbHV0ZSBmb3JtIGlzXG4gICAgICAgKiBidWlsdCBmcm9tIHtAbGluayBiYXNlUGF0aH0sIHNvIGl0IGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUgYnV0XG4gICAgICAgKiBzdGlsbCBhc3N1bWVzIEFwcEtpdCdzIGRlZmF1bHQgYC9hcGkvPG5hbWU+YCBtb3VudC5cbiAgICAgICAqL1xuICAgICAgZ2V0TWNwOiAoKToge1xuICAgICAgICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAgICAgICBodHRwUGF0aDogc3RyaW5nO1xuICAgICAgICBzc2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIGh0dHA6IHN0cmluZztcbiAgICAgICAgc3NlOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbCA9PlxuICAgICAgICB0aGlzLm1jcFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzZXJ2ZXJJZDogdGhpcy5tY3Auc2VydmVySWQsXG4gICAgICAgICAgICAgIGh0dHBQYXRoOiB0aGlzLm1jcC5odHRwUGF0aCxcbiAgICAgICAgICAgICAgc3NlUGF0aDogdGhpcy5tY3Auc3NlUGF0aCxcbiAgICAgICAgICAgICAgbWVzc2FnZVBhdGg6IHRoaXMubWNwLm1lc3NhZ2VQYXRoLFxuICAgICAgICAgICAgICBodHRwOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCxcbiAgICAgICAgICAgICAgc3NlOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3Auc3NlUGF0aH1gLFxuICAgICAgICAgICAgICBtZXNzYWdlczogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLm1lc3NhZ2VQYXRofWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLyoqIEV4cHJlc3Mgc3ViYXBwIE1hc3RyYSBpcyBtb3VudGVkIG9uOyBtb3N0bHkgZm9yIHRlc3RzLiAqL1xuICAgICAgZ2V0TWFzdHJhU2VydmVyOiAoKSA9PiB0aGlzLm1hc3RyYVNlcnZlcixcbiAgICAgIC8qKlxuICAgICAgICogRmV0Y2ggdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIChjYWNoZWQpLiBTYW1lXG4gICAgICAgKiBwYXlsb2FkIHRoZSBgR0VUIC9tb2RlbHNgIHJvdXRlIHJldHVybnM7IHN1cmZhY2VkIGhlcmUgc29cbiAgICAgICAqIG90aGVyIHBsdWdpbnMgLyBzY3JpcHRzIGNhbiBpbnRyb3NwZWN0IHRoZSBjYXRhbG9ndWUgd2l0aG91dFxuICAgICAgICogYW4gSFRUUCByb3VuZC10cmlwLiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yXG4gICAgICAgKiBPQk8gc2NvcGluZyBhdXRvbWF0aWNhbGx5LiBUaHJvd3Mgd2hlbiB0aGUgbGlzdGluZyBmYWlscywgc2luY2VcbiAgICAgICAqIHRoZXJlIGlzIG5vIHN0YXR1cyBjb2RlIHRvIGhhbmQgYmFjayBvbiB0aGlzIHN1cmZhY2UuXG4gICAgICAgKi9cbiAgICAgIGxpc3RNb2RlbHM6ICgpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4gPT4gdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3NcbiAgICAgICAqIGBDYWNoZU1hbmFnZXJgLiBVc2VmdWwgaW4gdGVzdHMgb3IgcmlnaHQgYWZ0ZXIgYW4gYWRtaW5cbiAgICAgICAqIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQgYW5kIGRvZXNuJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgVFRMLlxuICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBgQ2FjaGVNYW5hZ2VyLmRlbGV0ZWAvYGNsZWFyYCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBjbGVhck1vZGVsc0NhY2hlOiAoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGhvc3QpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWJzb2x1dGUgbW91bnQgdGhpcyBwbHVnaW4ncyByb3V0ZXMgYW5zd2VyIG9uLiBBcHBLaXQgbW91bnRzIGV2ZXJ5IHBsdWdpblxuICAgKiBhdCBgL2FwaS88cGx1Z2luLm5hbWU+YCBhbmQgYHRoaXMubmFtZWAgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSxcbiAgICogc28gdGhlIHBlci1yb3V0ZSBzZWdtZW50cyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgaGFuZyBvZmYgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7dGhpcy5uYW1lfWA7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFB1Ymxpc2hpbmcgYGJhc2VQYXRoYCBpcyBlbm91Z2ggZm9yIHRoZSBjbGllbnQgdG8gc3RheSBjb3JyZWN0IHVuZGVyIGFcbiAgICAvLyBjdXN0b20gbW91bnQgaWQ6IHRoZSBwZXItcm91dGUgc2VnbWVudHMgYXJlIGZpeGVkXG4gICAgLy8gKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGFuZCB0aGUgY2xpZW50IChgTWFzdHJhUGx1Z2luQ2xpZW50YCkgZGVyaXZlc1xuICAgIC8vIGV2ZXJ5IGVuZHBvaW50IGZyb20gYGJhc2VQYXRoYC5cbiAgICAvLyBSZXR1cm4gd2lkZW5zIHRvIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgdG8gc2F0aXNmeSB0aGVcbiAgICAvLyBiYXNlLWNsYXNzIHNpZ25hdHVyZTsgY29uc3VtZXJzIHJlYWQgaXQgdGhyb3VnaCB0aGUgdHlwZWRcbiAgICAvLyBgTWFzdHJhQ2xpZW50Q29uZmlnYCBzaGFwZSB2aWEgYHVzZVBsdWdpbkNsaWVudENvbmZpZzwuLi4+KC4uLilgLlxuICAgIGNvbnN0IGNvbmZpZzogTWFzdHJhQ2xpZW50Q29uZmlnID0ge1xuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lELFxuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgLy8gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBjaGF0IHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlblxuICAgICAgLy8gdGhlIGFwcCwgc28gYSBVSSB0aGF0IGhpZGVzIGNoYXQgYmVoaW5kIGFuIE9CTy10b2tlbiBwcm9iZSBzaG91bGQgc2hvd1xuICAgICAgLy8gaXQgcmVnYXJkbGVzcy4gYFwidXNlclwiYCBtb2RlIGtlZXBzIHRoZSBPQk8tZ2F0ZWQgYmVoYXZpb3IuXG4gICAgICBjaGF0QWx3YXlzQXZhaWxhYmxlOiB0aGlzLmlkZW50aXR5TW9kZSA9PT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbmZpZyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdXNlciBmZWVkYmFjayBjYW4gYmUgbG9nZ2VkIHRvIE1MZmxvdy4gRGVsZWdhdGVzIHRvXG4gICAqIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfSBzbyB0aGUgY2xpZW50LWNvbmZpZyBmbGFnIGFuZCB0aGVcbiAgICogZmVlZGJhY2sgcm91dGUgc2hhcmUgdGhlIHNhbWUgZ2F0ZSBhcyB0aGUgc2VydmVyJ3MgdHJhY2UtaWQgaGVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmZWVkYmFja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVGZWVkYmFja0VuYWJsZWQodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJGZWVkYmFja1JvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXIpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIFVSTCBhbGlhc2VzIGZvciBNYXN0cmEncyBNQ1AgdHJhbnNwb3J0cy4gKi9cbiAgcHJpdmF0ZSByZWdpc3Rlck1jcFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBFeHBvc2UgdGhlIE1DUCB0cmFuc3BvcnQgYXQgdGhlIGNsZWFuIGAvbWNwYCAocGx1cyB0aGUgbGVnYWN5XG4gICAgLy8gYC9zc2VgICsgYC9tZXNzYWdlc2ApIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIGBAbWFzdHJhL2V4cHJlc3NgXG4gICAgLy8gbW91bnRzIE1DUCB1bmRlciBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YCwgYW5kIHRoZSBzZXJ2ZXJJZFxuICAgIC8vIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSwgc28gdGhlIHJhdyByb3V0ZSByZWFkc1xuICAgIC8vIGAvYXBpL21hc3RyYS9tY3AvbWFzdHJhL21jcGAgKGRvdWJsZWQgc2VnbWVudCkuIFRoaXMgcnVucyBiZWZvcmVcbiAgICAvLyB0aGUgY2F0Y2gtYWxsIGFuZCByZXdyaXRlcyB0aGUgYWxpYXMgdG8gdGhlIHVuZGVybHlpbmcgcm91dGUsIHNvXG4gICAgLy8gdGhlIHB1YmxpYyBwYXRoIGlzIGp1c3QgYC9hcGkvPHBsdWdpbj4vbWNwYDsgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIC8vIChlLmcuIHRoZSBTU0UgYHNlc3Npb25JZGApIGlzIHByZXNlcnZlZC5cbiAgICAvL1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiBpdCByZXdyaXRlcyB0aGUgVVJMIGZvciByb3V0ZXNcbiAgICAvLyBgQG1hc3RyYS9leHByZXNzYCBvd25zIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gaW5zdGVhZCBvZiBhbnN3ZXJpbmcgdGhlXG4gICAgLy8gcmVxdWVzdCwgd2hpY2ggYFJvdXRlQ29uZmlnYCBoYXMgbm8gc2hhcGUgZm9yLlxuICAgIHJvdXRlci51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tY3BSb3V0ZUFsaWFzKHJlcS5wYXRoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlcS51cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgIHJlcS51cmwgPSBxID49IDAgPyB0YXJnZXQgKyByZXEudXJsLnNsaWNlKHEpIDogdGFyZ2V0O1xuICAgICAgfVxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIG1vZGVsIGNhdGFsb2d1ZSBhbmQgcGVyLWFnZW50IGRlZmF1bHQtbW9kZWwgcm91dGVzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvbW9kZWxzYCBleHBvc2VzIHRoZSBjYWNoZWQgZW5kcG9pbnQgbGlzdCBzbyBjbGllbnRzIGNhblxuICAgIC8vIHBvcHVsYXRlIG1vZGVsIHBpY2tlcnMsIHZhbGlkYXRlIGA/bW9kZWw9YCBjaG9pY2VzLCBldGMuIE11c3RcbiAgICAvLyBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2F0Y2gtYWxsIHRoYXQgZm9yd2FyZHMgZXZlcnl0aGluZyB0b1xuICAgIC8vIHRoZSBNYXN0cmEgc3ViYXBwLlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1vZGVsc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubW9kZWxzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcIm1vZGVsc1wiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IGVuZHBvaW50czogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvZGVmYXVsdC1tb2RlbGAgKGFuZCBgL2RlZmF1bHQtbW9kZWwvOmFnZW50SWRgKSByZXBvcnRzIHdoYXQgYW5cbiAgICAvLyB1bnBpbm5lZCB0dXJuIHdpbGwgdXNlLiBBIGNvbmZpZ3VyZWQgc3RyaW5nIGlzIHJldHVybmVkIGRpcmVjdGx5OyBhblxuICAgIC8vIGF1dG9tYXRpYyBkZWZhdWx0IHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVFxuICAgIC8vIChvciBnZW5lcmFsIGNoYXQgZmFsbGJhY2spIGZyb20gdGhlIHNhbWUgT0JPLXNjb3BlZCBsaXZlIGNhdGFsb2d1ZSBhc1xuICAgIC8vIGAvbW9kZWxzYDsgYSBjdXN0b20gZHluYW1pYyByZXNvbHZlciByZW1haW5zIG51bGwgYmVjYXVzZSBpdCBpcyBjYWxsLXRpbWVcbiAgICAvLyBhcHBsaWNhdGlvbiBjb2RlLlxuICAgIGNvbnN0IGhhbmRsZURlZmF1bHRNb2RlbCA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFnZW50SWQpO1xuICAgICAgaWYgKHJlcXVlc3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5idWlsdD8uYWdlbnRzW3JlcXVlc3RlZF0pIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogdGhpcy51bmtub3duQWdlbnRNZXNzYWdlKHJlcXVlc3RlZCkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZW50SWQgPSByZXF1ZXN0ZWQgPz8gdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG4gICAgICBjb25zdCBpbnRlbnQgPSB0aGlzLmJ1aWx0Py5kZWZhdWx0TW9kZWxzW2FnZW50SWRdO1xuICAgICAgbGV0IG1vZGVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiY29uZmlndXJlZFwiKSB7XG4gICAgICAgIG1vZGVsID0gaW50ZW50Lm1vZGVsO1xuICAgICAgfSBlbHNlIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImRlZmF1bHQtbW9kZWxcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtb2RlbCA9IHJlc29sdmVEZWZhdWx0TW9kZWxJZCh0aGlzLmNvbmZpZywgcmVzdWx0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXMuanNvbih7XG4gICAgICAgIGFnZW50SWQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBkaXNwbGF5TmFtZTogbW9kZWwgPyBkaXNwbGF5LnRvTW9kZWxEaXNwbGF5TmFtZShtb2RlbCkgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWx9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2VuZXJpYyBjaGFydCBhbmQgc3RhdGVtZW50IGVtYmVkIHJlc29sdmVyLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCBpcyB0aGUgc2luZ2xlIHJlc29sdmVyIGZvciBldmVyeSBlbWJlZFxuICAgIC8vIG1hcmtlciB0aGUgYWdlbnQgZW1pdHMgaW4gcHJvc2UgKGBbY2hhcnQ6PGlkPl1gLFxuICAgIC8vIGBbZGF0YTo8aWQ+XWAsIC4uLikuIGA6dHlwZWAgc2VsZWN0cyBhIHJlc29sdmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0cnkgYmVsb3c7IGA6aWRgIGlzIHRoYXQgcmVzb2x2ZXIncyBsb29rdXAga2V5LiBUaGVcbiAgICAvLyBncmFtbWFyIChzZWUgYG1hcmtlci50c2ApIGlzIHR5cGUtYWdub3N0aWMgb24gcHVycG9zZSAtIG5ld1xuICAgIC8vIGVtYmVkIGtpbmRzIGFyZSBhZGRlZCBieSByZWdpc3RlcmluZyBhIHJlc29sdmVyIGhlcmUsIHdpdGggbm9cbiAgICAvLyBjbGllbnQgb3IgZ3JhbW1hciBjaGFuZ2UuXG4gICAgLy9cbiAgICAvLyBTdGF0dXMgY29kZXM6XG4gICAgLy8gICAtIDIwMCB3aXRoIHRoZSByZXNvbHZlcidzIEpTT04gYm9keSB3aGVuIHRoZSBpZCByZXNvbHZlcy5cbiAgICAvLyAgIC0gNDA0IHdoZW4gYDp0eXBlYCBpc24ndCByZWdpc3RlcmVkICh1bnN1cHBvcnRlZCBlbWJlZFxuICAgIC8vICAgICB0eXBlKSBPUiBhIHJlZ2lzdGVyZWQgcmVzb2x2ZXIgY2FuJ3QgZmluZCBgOmlkYCAodW5rbm93blxuICAgIC8vICAgICAvIGV4cGlyZWQgLSBlLmcuIGEgY2hhcnQgcGFzdCBpdHMgMWggVFRMIG9yIGEgZmFicmljYXRlZFxuICAgIC8vICAgICBpZCB0aGUgbW9kZWwgbmV2ZXIgbWludGVkKS5cbiAgICAvLyAgIC0gNDAwIHdoZW4gYDppZGAgaXMgZW1wdHkuXG4gICAgLy9cbiAgICAvLyBQZXItdHlwZSBxdWVyeSBrbm9icyBhbmQgYmVoYXZpb3I6XG4gICAgLy8gICAtIGBjaGFydGA6IGxvbmctcG9sbHMgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeVxuICAgIC8vICAgICBzZXR0bGVzIChgcmVzdWx0YCAvIGBlcnJvcmApIG9yIHRoZSBidWRnZXQgZWxhcHNlcyAodGhlblxuICAgIC8vICAgICByZXR1cm5zIHRoZSBzdGlsbC1wcm9jZXNzaW5nIGVudHJ5IHRvIHBvbGwgYWdhaW4pLlxuICAgIC8vICAgICBgP3RpbWVvdXRNcz08bj5gIChkZWZhdWx0IDYwcywgY2FwcGVkIDVtaW4pIHR1bmVzIGl0LlxuICAgIC8vICAgLSBgZGF0YWA6IG9uZSBPQk8tc2NvcGVkIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2guXG4gICAgLy8gICAgIGA/bGltaXQ9PG4+YCBjYXBzIHJvd3MgKGNsYW1wZWQgdG8gU1RBVEVNRU5UX1JPV19DQVApLlxuICAgIC8vXG4gICAgLy8gQnVpbHQgb25jZSAodGhpcyBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgb25jZSkgYW5kIGtleWVkIGJ5IHRoZVxuICAgIC8vIHJhdyBgOnR5cGVgIHRva2VuLiBFYWNoIHJlc29sdmVyIGdldHMgdGhlIHJlcXVlc3QgKGZvciBxdWVyeVxuICAgIC8vIHBhcnNpbmcgKyBPQk8gc2NvcGluZykgYW5kIGFuIGBBYm9ydFNpZ25hbGAgYnJpZGdlZCBvZmYgdGhlXG4gICAgLy8gY29ubmVjdGlvbiBgY2xvc2VgIGV2ZW50IHNvIGEgbG9uZy1wb2xsIHVuYmxvY2tzIHRoZSBpbnN0YW50XG4gICAgLy8gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gYHVuZGVmaW5lZGAgZnJvbSBhIHJlc29sdmVyIG1hcHMgdG8gYVxuICAgIC8vIGNsZWFuIDQwNDsgdGhyb3duIGVycm9ycyBidWJibGUgdGhyb3VnaCBgbmV4dChlcnIpYC5cbiAgICBjb25zdCBlbWJlZFJlc29sdmVyczogUmVjb3JkPHN0cmluZywgRW1iZWRSZXNvbHZlcj4gPSB7XG4gICAgICBjaGFydDogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBwYXJzZVRpbWVvdXRNcyhyZXEucXVlcnkudGltZW91dE1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoQ2hhcnRFbnRyeShyZXEsIGlkLCB7XG4gICAgICAgICAgLi4uKHRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGRhdGE6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZVN0YXRlbWVudExpbWl0KHJlcS5xdWVyeS5saW1pdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN0YXRlbWVudChpZCwge1xuICAgICAgICAgIC4uLihsaW1pdCAhPT0gdW5kZWZpbmVkID8geyBsaW1pdCB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJlbWJlZFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZW1iZWR9Lzp0eXBlLzppZGAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50eXBlKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBpZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5pZCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSBlbWJlZFJlc29sdmVyc1t0eXBlXTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOnVuc3VwcG9ydGVkXCIsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYHVuc3VwcG9ydGVkIGVtYmVkIHR5cGU6ICR7dHlwZX1gIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOmludmFsaWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IFwiaWQgaXMgcmVxdWlyZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwcmVzcydzIGByZXFgIHByZWRhdGVzIGBBYm9ydFNpZ25hbGA7IGJyaWRnZSB0aGUgYGNsb3NlYFxuICAgICAgICAvLyBldmVudCBvbnRvIGFuIGBBYm9ydENvbnRyb2xsZXJgIHNvIGEgY2xvc2VkIGNvbm5lY3Rpb25cbiAgICAgICAgLy8gdW5ibG9ja3MgYW55IGxvbmctcG9sbCBpbW1lZGlhdGVseSBhbmQgZnJlZXMgdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gdGhyZWFkLiBUaGUgbGlzdGVuZXIgaXMgR0MnZCB3aXRoIHRoZSByZXF1ZXN0IG9uIG5vcm1hbFxuICAgICAgICAvLyBjb21wbGV0aW9uLlxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICByZXEub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlKHJlcSwgaWQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBgZW1iZWQ6JHt0eXBlfWAsIGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgJHt0eXBlfSBlbWJlZGApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEEgY2FjaGUgbWlzcyBpcyBzZWN1cml0eS1kZWxpYmVyYXRlbHkgYW1iaWd1b3VzOiB1bmtub3duLCBleHBpcmVkLFxuICAgICAgICAgIC8vIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHkgYWxsIG1hcCB0byB0aGUgc2FtZSA0MDQuIExvZyB0aGVcbiAgICAgICAgICAvLyBvcGFxdWUgaWQgYW5kIHRob3NlIHBvc3NpYmxlIGNhdXNlcyBzbyBhIGZhYnJpY2F0ZWQgbWFya2VyIGlzXG4gICAgICAgICAgLy8gZGlhZ25vc2FibGUgZnJvbSB0aGUgc2VydmVyIHdpdGhvdXQgZGlzY2xvc2luZyB3aGljaCBjYXVzZSBhcHBsaWVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGVtYmVkOiR7dHlwZX06bm90LWZvdW5kYCwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bmtub3duLCBleHBpcmVkLCBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYCR7dHlwZX0gbm90IGZvdW5kYCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBkZWZhdWx0IGFuZCBhZ2VudC1xdWFsaWZpZWQgc3VnZ2VzdGlvbiByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJTdWdnZXN0aW9uUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL3N1Z2dlc3Rpb25zYCAoYW5kIGAvc3VnZ2VzdGlvbnMvOmFnZW50SWRgKSByZXR1cm5zIHRoZVxuICAgIC8vIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgZm9yIHRoZSBhZ2VudCdzIEdlbmllIHNwYWNlKHMpIC0gdGhlXG4gICAgLy8gYXV0aG9yLWNvbmZpZ3VyZWQgYHNhbXBsZV9xdWVzdGlvbnNgLCBzdXJmYWNlZCBhcyBvbmUtdGFwXG4gICAgLy8gcHJvbXB0cyBvbiB0aGUgY2hhdCBlbXB0eSBzdGF0ZS4gUmV0dXJucyBgeyBxdWVzdGlvbnM6IFtdIH1gXG4gICAgLy8gd2hlbiBubyBHZW5pZSBzcGFjZSBpcyB3aXJlZCBzbyB0aGUgY2xpZW50IHJlbmRlcnMgYSBiYXJlXG4gICAgLy8gZW1wdHkgc3RhdGUgKG5vIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cykuIFRoZSBgOmFnZW50SWRgXG4gICAgLy8gc2VnbWVudCBpcyBhY2NlcHRlZCBmb3IgVVJMIHN5bW1ldHJ5IHdpdGggdGhlIGNoYXQgLyBoaXN0b3J5XG4gICAgLy8gcm91dGVzOyBHZW5pZSBzcGFjZXMgYXJlIHJlc29sdmVkIHBlci1wbHVnaW4sIG5vdCBwZXItYWdlbnQsXG4gICAgLy8gc28gaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4gT0JPLXNjb3BlZCBsaWtlIHRoZSBvdGhlclxuICAgIC8vIGRhdGEgcm91dGVzIHNvIHRoZSBzcGFjZSBsb29rdXAgcnVucyBhcyB0aGUgY2FsbGluZyB1c2VyLlxuICAgIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVxLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3VnZ2VzdGlvbnMoY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIC8vIFN1Z2dlc3Rpb25zIGFyZSBhIG5vbi1jcml0aWNhbCBlbmhhbmNlbWVudDsgYSBsb29rdXAgZmFpbHVyZSBzaG91bGRcbiAgICAgICAgLy8gbGVhdmUgdGhlIGNoYXQgdXNhYmxlIHdpdGggYSBiYXJlIGVtcHR5IHN0YXRlIHJhdGhlciB0aGFuIHN1cmZhY2luZ1xuICAgICAgICAvLyB0aGUgdXBzdHJlYW0gc3RhdHVzLiBMb2cgYW5kIGRlZ3JhZGUuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczplcnJvclwiLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiBbXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5kYXRhIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5zdWdnZXN0aW9uc30vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgTUxmbG93IGZlZWRiYWNrIHN1Ym1pc3Npb24gd2hlbiBjb25maWd1cmVkLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYFBPU1QgL3JvdXRlL2ZlZWRiYWNrYCBsb2dzIGEgdGh1bWJzIC8gY29tbWVudCBhc3Nlc3NtZW50IGFnYWluc3RcbiAgICAvLyBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgKHRoZSBgdHJhY2VJZGAgdGhlIGNsaWVudCBjYXB0dXJlZCBmcm9tIHRoZVxuICAgIC8vIHN0cmVhbSByZXNwb25zZSdzIHRyYWNlLWlkIGhlYWRlcikuIFJlZ2lzdGVyZWQgb24gdGhlIEFwcEtpdFxuICAgIC8vIHJvdXRlciAobGlrZSBgL21vZGVsc2ApIHJhdGhlciB0aGFuIHRoZSBNYXN0cmEgc3ViYXBwIHNvIGl0IHJ1bnNcbiAgICAvLyB1bmRlciB0aGUgc2FtZSBPQk8gc2NvcGUgLSB0aGUgZmVlZGJhY2sgaXMgYXR0cmlidXRlZCB0byB0aGVcbiAgICAvLyBzaWduZWQtaW4gdXNlci4gUmV0dXJucyA0MDQgd2hlbiBmZWVkYmFjayBpcyBkaXNhYmxlZCBzbyB0aGVcbiAgICAvLyBjbGllbnQgdHJlYXRzIHRoZSBjYXBhYmlsaXR5IGFzIGFic2VudDsgNDAwIG9uIGEgbWFsZm9ybWVkIGJvZHkuXG4gICAgLy8gQSByZWNvcmRlZCBhc3Nlc3NtZW50IHlpZWxkcyBgeyBvazogdHJ1ZSB9YDsgYSBzb2Z0IGZhaWx1cmUgKG1vc3RcbiAgICAvLyBvZnRlbiB0aGUgdHJhY2UgaGFzbid0IGZpbmlzaGVkIGV4cG9ydGluZyB0byBNTGZsb3cgeWV0KSB5aWVsZHNcbiAgICAvLyBgeyBvazogZmFsc2UgfWAgd2l0aG91dCBhIDV4eCBzbyB0aGUgVUkgY2FuIHByb21wdCBhIHJldHJ5LlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImZlZWRiYWNrXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZmVlZGJhY2ssXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGZlZWRiYWNrLk1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgLy8gQSBab2QgaXNzdWUgc3RyaW5nIHF1b3RlcyB0aGUgcmVjZWl2ZWQgYm9keSBiYWNrLCBzbyBvbmx5IHRoZVxuICAgICAgICAgIC8vIG9mZmVuZGluZyBmaWVsZCBuYW1lcyB0cmF2ZWw7IHRoZSBmdWxsIGlzc3VlIGxpc3QgaXMgbG9nZ2VkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmZWVkYmFjazppbnZhbGlkXCIsIHsgZXJyb3I6IHBhcnNlZC5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UsXG4gICAgICAgICAgICBmaWVsZHM6IGludmFsaWRGaWVsZHMocGFyc2VkLmVycm9yKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubG9nRmVlZGJhY2socGFyc2VkLmRhdGEpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZmVlZGJhY2tcIiwgXCJGZWVkYmFjayBjb3VsZCBub3QgYmUgcmVjb3JkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9IHJlc3VsdC5kYXRhO1xuICAgICAgICByZXMuanNvbih7XG4gICAgICAgICAgb2s6IGFzc2Vzc21lbnRJZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLihhc3Nlc3NtZW50SWQgPyB7IGFzc2Vzc21lbnRJZCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIGdhdGVkIE1hc3RyYSBjYXRjaC1hbGwgYWZ0ZXIgZXZlcnkgZXhwbGljaXQgcm91dGUuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogdGhpcyBpcyB0aGUgY2F0Y2gtYWxsIHRoYXQgaGFuZHNcbiAgICAvLyBldmVyeSByZW1haW5pbmcgbWV0aG9kIC8gcGF0aCBwYWlyIHRvIHRoZSBNYXN0cmEgc3ViLWFwcCwgc28gaXQgaGFzIG5vXG4gICAgLy8gc2luZ2xlIG1ldGhvZCBvciBwYXRoIHRvIHJlZ2lzdGVyIHVuZGVyLlxuICAgIHJvdXRlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWFzdHJhQXBwKSByZXR1cm4gcmVzLnN0YXR1cyg1MDMpLmVuZCgpO1xuICAgICAgLy8gR2F0ZSB0aGUgc3RvY2sgTWFzdHJhIHN1cmZhY2UgYmVmb3JlIGRpc3BhdGNoLiBJbiB0aGUgZGVmYXVsdFxuICAgICAgLy8gXCJzY29wZWRcIiBtb2RlIG9ubHkgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICAgIC8vIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCByZWFjaCBNYXN0cmE7XG4gICAgICAvLyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzIGFyZSByZWZ1c2VkIGhlcmUuIGByZXEucGF0aGBcbiAgICAgIC8vIGlzIG1vdW50LXJlbGF0aXZlIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIFNlZSBgc2VydmVyLnRzYC5cbiAgICAgIGlmIChcbiAgICAgICAgIWlzTWFzdHJhUmVxdWVzdEFsbG93ZWQocmVxLm1ldGhvZCwgcmVxLnBhdGgsIHtcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgICAgIC8vIFJlZmxlY3QgdGhlICpyZXNvbHZlZCogTUNQIHN0YXRlLCBub3QgcmF3IGBjb25maWcubWNwYDogTUNQIGlzXG4gICAgICAgICAgLy8gb24gYnkgZGVmYXVsdCAoYGNvbmZpZy5tY3BgIHVuZGVmaW5lZCksIHNvIGdhdGUgb24gd2hldGhlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2ZXIgd2FzIGFjdHVhbGx5IGJ1aWx0IGFuZCBtb3VudGVkLlxuICAgICAgICAgIG1jcEVuYWJsZWQ6IHRoaXMubWNwICE9PSBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwiRW5kcG9pbnQgbm90IGV4cG9zZWQgdG8gdGhlIGNsaWVudCAoYXBpQWNjZXNzPXNjb3BlZClcIiB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggdGhyb3VnaCBhIHJlYWwgbWV0aG9kLCBOT1QgdGhlIGBtYXN0cmFBcHBgIHByb3BlcnR5LiBUaGVcbiAgICAgIC8vIEFwcEtpdCBgYXNVc2VyKHJlcSlgIHByb3h5IHdyYXBzIGZ1bmN0aW9uLXZhbHVlZCBwcm9wcyB3aXRoXG4gICAgICAvLyBgdmFsdWUuYmluZCh0YXJnZXQpYC4gYG1hc3RyYUFwcGAgaXMgYW4gZXhwcmVzcyBhcHAgd2hvc2UgYC5iaW5kYCBpc1xuICAgICAgLy8gdGhlIEhUVFAgQklORCByb3V0ZSByZWdpc3RyYXIgKGV4cHJlc3MgZGVmaW5lcyBhIG1ldGhvZCBwZXIgSFRUUCB2ZXJiLFxuICAgICAgLy8gYW5kIEJJTkQgaXMgb25lKSwgbm90IGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgLSBzbyBiaW5kaW5nIGl0IHRocm91Z2hcbiAgICAgIC8vIHRoZSBwcm94eSByZWdpc3RlcnMgYSBib2d1cyByb3V0ZSBhbmQgY3Jhc2hlcyBgcGF0aFRvUmVnZXhwYFxuICAgICAgLy8gKFwicGF0aCBtdXN0IGJlIGEgc3RyaW5nIC4uLlwiKS4gVGhpcyBvbmx5IG1hbmlmZXN0cyBpbiBwcm9kdWN0aW9uIHdoZXJlXG4gICAgICAvLyBhbiBPQk8gdG9rZW4gbWFrZXMgYHNjb3BlZFNlbGZgIHJldHVybiB0aGUgcHJveHkuIGBkaXNwYXRjaE1hc3RyYWBcbiAgICAgIC8vIGlzIGEgcGxhaW4gbWV0aG9kIChpdHMgYC5iaW5kYCBpcyB0aGUgbm9ybWFsIG9uZSkgYW5kIGludm9rZXNcbiAgICAgIC8vIGB0aGlzLm1hc3RyYUFwcGAgb2ZmIHRoZSByZWFsIHRhcmdldCwga2VlcGluZyB0aGUgT0JPIHNjb3BlIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5kaXNwYXRjaE1hc3RyYShyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IG9udG8gdGhlIHJlc3BvbnNlOiB0aGUgc3RhdHVzIHRoZVxuICAgKiBleGVjdXRpb24gcGlwZWxpbmUgcmVzb2x2ZWQsIHBhaXJlZCB3aXRoIGBjbGllbnRNZXNzYWdlYCByYXRoZXIgdGhhbiB0aGVcbiAgICogcmVzdWx0J3Mgb3duIHRleHQsIHdoaWNoIGNhbiBjYXJyeSB1cHN0cmVhbSBkZXRhaWwuIFRoZSBmdWxsIG1lc3NhZ2UgaXNcbiAgICogbG9nZ2VkIHVuZGVyIGA8b3BlcmF0aW9uPjplcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIHNlbmRGYWlsdXJlKFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXN1bHQ6IHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGNsaWVudE1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIud2FybihgJHtvcGVyYXRpb259OmVycm9yYCwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHJlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXMpLmpzb24oeyBlcnJvcjogY2xpZW50TWVzc2FnZSB9KTtcbiAgfVxuXG4gIC8qKiA0MDQgYm9keSBmb3IgYSByZXF1ZXN0IG5hbWluZyBhbiBhZ2VudCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuICovXG4gIHByaXZhdGUgdW5rbm93bkFnZW50TWVzc2FnZShhZ2VudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pO1xuICAgIHJldHVybiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cIi4gUmVnaXN0ZXJlZCBhZ2VudHM6ICR7cmVnaXN0ZXJlZC5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIE1hc3RyYSBleHByZXNzIHN1Yi1hcHAuIEV4aXN0cyBhcyBhIG1ldGhvZCAoaW5zdGVhZCBvZiByZWFkaW5nXG4gICAqIGB0aGlzLm1hc3RyYUFwcGAgdGhyb3VnaCB0aGUgYGFzVXNlcihyZXEpYCBwcm94eSBhdCB0aGUgY2FsbCBzaXRlKSBzbyB0aGVcbiAgICogcHJveHkgYmluZHMgdGhpcyBwbGFpbiBtZXRob2QgLSB3aG9zZSBgLmJpbmRgIGlzIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGBcbiAgICogLSByYXRoZXIgdGhhbiB0aGUgZXhwcmVzcyBhcHAsIHdob3NlIGAuYmluZGAgaXMgdGhlIEhUVFAgQklORCByb3V0ZVxuICAgKiByZWdpc3RyYXIgKHNlZSB0aGUgbm90ZSBpbiBgaW5qZWN0Um91dGVzYCkuIFJ1bnMgaW5zaWRlIHRoZSB1c2VyIHNjb3BlIHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTyBjbGllbnQgZm9yIHRoZSBhZ2VudC9tb2RlbFxuICAgKiByZXNvbHZlcnMuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWFzdHJhKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0cmFBcHAhKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBjbGVhbiwgbW91bnQtcmVsYXRpdmUgTUNQIGFsaWFzIHBhdGggdG8gdGhlIHVuZGVybHlpbmdcbiAgICogYEBtYXN0cmEvZXhwcmVzc2Agcm91dGUuIFJldHVybnMgYG51bGxgIHdoZW4gTUNQIGlzIG9mZiBvciB0aGUgcGF0aFxuICAgKiBpc24ndCBhbiBhbGlhcy4gQ29sbGFwc2VzIHRoZSBzdG9jayBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YFxuICAgKiBsYXlvdXQgKHNlcnZlcklkIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSkgZG93biB0byBgL21jcGAsXG4gICAqIGAvc3NlYCwgYW5kIGAvbWVzc2FnZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3BSb3V0ZUFsaWFzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tY3ApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkID0gdGhpcy5tY3Auc2VydmVySWQ7XG4gICAgaWYgKHBhdGggPT09IFwiL21jcFwiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWNwYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvc3NlXCIpIHJldHVybiBgL21jcC8ke2lkfS9zc2VgO1xuICAgIGlmIChwYXRoID09PSBcIi9tZXNzYWdlc1wiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWVzc2FnZXNgO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvc3VnZ2VzdGlvbnNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIEdlbmllIHNwYWNlcyBhbmQgbWVyZ2VzXG4gICAqIHRoZWlyIGN1cmF0ZWQgYHNhbXBsZV9xdWVzdGlvbnNgIChzZWUge0BsaW5rIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zfSkuXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIEdlbmllIHNwYWNlIGlzIGNvbmZpZ3VyZWQgc28gdGhlIGNsaWVudFxuICAgKiBzaG93cyBhIGJhcmUgZW1wdHkgc3RhdGUgaW5zdGVhZCBvZiBidWlsdC1pbiBleGFtcGxlIHByb21wdHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3VnZ2VzdGlvbnMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmdbXT4+IHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXModGhpcy5jb25maWcsIHRoaXMuY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogW10gfTtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKHNpZ25hbCwgZXhlY3V0ZVNpZ25hbCk7XG4gICAgICByZXR1cm4gY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMoe1xuICAgICAgICBzcGFjZXMsXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9yb3V0ZS9mZWVkYmFja2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZVxuICAgKiBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlXG4gICAqIE9CTy1zY29wZWQgY2xpZW50IGFuZCB0aGUgYXNzZXNzbWVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW5cbiAgICogdXNlciAodGhlaXIgZW1haWwgLyBpZCBhcyB0aGUgYXNzZXNzbWVudCBzb3VyY2UpLiBSZXR1cm5zIHRoZVxuICAgKiBjcmVhdGVkIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgb24gYSBzb2Z0IGZhaWx1cmVcbiAgICogKHNlZSB7QGxpbmsgbG9nRmVlZGJhY2t9IGluIGAuL21sZmxvdy5qc2ApLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2dGZWVkYmFjayhcbiAgICBmZWVkYmFjazogTWFzdHJhRmVlZGJhY2tSZXF1ZXN0LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmcgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHNvdXJjZUlkID1cbiAgICAgIFwidXNlckVtYWlsXCIgaW4gY3R4ICYmIGN0eC51c2VyRW1haWxcbiAgICAgICAgPyBjdHgudXNlckVtYWlsXG4gICAgICAgIDogXCJ1c2VySWRcIiBpbiBjdHhcbiAgICAgICAgICA/IGN0eC51c2VySWRcbiAgICAgICAgICA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAoKSA9PlxuICAgICAgICBsb2dGZWVkYmFjayhjdHguY2xpZW50LCB7XG4gICAgICAgICAgLi4uZmVlZGJhY2ssXG4gICAgICAgICAgLi4uKHNvdXJjZUlkID8geyBzb3VyY2VJZCB9IDoge30pLFxuICAgICAgICB9KSxcbiAgICAgIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBkYXRhYCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvZGF0YS86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAgICogY2xpZW50LCB0aGVuIHJldXNlcyB0aGUgc2FtZSBgZmV0Y2hTdGF0ZW1lbnREYXRhYCBwaXBlbGluZVxuICAgKiB0aGUgYGdldF9zdGF0ZW1lbnRgIHRvb2wgcnVucyBzbyB0aGUgTExNIGFuZCB0aGUgVUkgc2VlIHRoZVxuICAgKiBleGFjdCBzYW1lIHNoYXBlIGZvciB0aGUgc2FtZSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGRhdGEgZm9yIHVwc3RyZWFtIDQwNHMgc28gdGhlIHJvdXRlIGNhbiBtYXAgdGhlbVxuICAgKiB0byBhIGNsZWFuIEhUVFAgNDA0OyBhbnkgb3RoZXIgZmFpbHVyZSBjb21lcyBiYWNrIGFzIGEgbm9uLWBva2AgcmVzdWx0XG4gICAqIGNhcnJ5aW5nIHRoZSBzdGF0dXMgdG8gYW5zd2VyIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3RhdGVtZW50KFxuICAgIHN0YXRlbWVudElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTdGF0ZW1lbnREYXRhIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihvcHRpb25zLmxpbWl0ID8/IFNUQVRFTUVOVF9ST1dfQ0FQLCBTVEFURU1FTlRfUk9XX0NBUCk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnREYXRhKGNsaWVudCwgc3RhdGVtZW50SWQsIHtcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUaGUgRGF0YWJyaWNrcyBTREsgdGhyb3dzIG9uIDQwNDsgc3VyZmFjZSBhcyBgdW5kZWZpbmVkYFxuICAgICAgICAgIC8vIHNvIHRoZSByb3V0ZSBtYXBzIHRvIGEgY2xlYW4gSFRUUCA0MDQgaW5zdGVhZCBvZiBhIDUwMC5cbiAgICAgICAgICBpZiAoZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LFxuICAgICAgICAgIC8vIE5hbWVzcGFjZWQgc28gdGhlIGtleSBjYW4ndCBjb2xsaWRlIHdpdGggYW5vdGhlciBjYWNoZSBzaGFyaW5nIHRoZVxuICAgICAgICAgIC8vIG1hbmFnZXIsIGFuZCBrZXllZCBvbiBgbGltaXRgIGJlY2F1c2UgdGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgLy8gcGF5bG9hZC5cbiAgICAgICAgICBjYWNoZToge1xuICAgICAgICAgICAgLi4uc3RhdGVtZW50RGF0YURlZmF1bHRzLmRlZmF1bHQuY2FjaGUsXG4gICAgICAgICAgICBjYWNoZUtleTogW1NUQVRFTUVOVF9DQUNIRV9OQU1FU1BBQ0UsIHN0YXRlbWVudElkLCBsaW1pdF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgY2hhcnRgIGVtYmVkIHJlc29sdmVyXG4gICAqIChgR0VUIC9lbWJlZC9jaGFydC86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gdGhlXG4gICAqIGxvb2t1cCBpcyBuYW1lc3BhY2VkIHRvIHRoZSBjYWxsaW5nIGlkZW50aXR5OiBhIGNoYXJ0IG1pbnRlZCBmb3IgYW5vdGhlclxuICAgKiB1c2VyIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZCwgYW5kIHRoZSByb3V0ZSBhbnN3ZXJzIDQwNC5cbiAgICpcbiAgICogVGhlIGtleSBpcyBidWlsdCBmcm9tIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSAtIHRoZSBzYW1lIHJ1bGUgdGhhdCBuYW1lZFxuICAgKiB0aGUgaWRlbnRpdHkgdGhlIGNoYXJ0IHdhcyB3cml0dGVuIHVuZGVyIC0gcmF0aGVyIHRoYW4gZnJvbSB0aGUgYW1iaWVudFxuICAgKiBleGVjdXRpb24gY29udGV4dCBhbG9uZS4gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBhbWJpZW50IGNvbnRleHQgaXNcbiAgICogdGhlIFNQIGZvciBldmVyeSBjYWxsZXIsIHNvIGtleWluZyBvZmYgaXQgYWxvbmUgbWlzc2VkIGV2ZXJ5IGNoYXJ0IHRoZVxuICAgKiB0dXJuIGhhZCB3cml0dGVuIHVuZGVyIHRoZSBmb3J3YXJkZWQgdXNlciBhbmQgdGhlIFVJIHNob3dlZCBlYWNoIG9uZSBhc1xuICAgKiBleHBpcmVkLiBgcmVxYCBpcyByZWFkIGluc2lkZSB0aGUgbWV0aG9kLCBub3QgYXQgdGhlIGNhbGwgc2l0ZSwgc28gdGhlXG4gICAqIGV4ZWN1dGlvbiBjb250ZXh0IGlzIHRoZSBzY29wZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYXJ0RW50cnkoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgY2hhcnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdGltZW91dE1zPzogbnVtYmVyOyBzaWduYWw6IEFib3J0U2lnbmFsIH0sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PENoYXJ0IHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IHVzZXJLZXkgPSBhdHRyaWJ1dGVkVXNlcklkKGdldEV4ZWN1dGlvbkNvbnRleHQoKSwgcmVxdWVzdFVzZXJJZChyZXEpKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKGV4ZWN1dGVTaWduYWwpID0+XG4gICAgICAgIGZldGNoQ2hhcnQoY2hhcnRJZCwge1xuICAgICAgICAgIHVzZXJLZXksXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNczogb3B0aW9ucy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWw6IGFzeW5jVXRpbHMuY29tYmluZUFib3J0U2lnbmFscyhvcHRpb25zLnNpZ25hbCwgZXhlY3V0ZVNpZ25hbCkgPz8gb3B0aW9ucy5zaWduYWwsXG4gICAgICAgIH0pLFxuICAgICAgY2hhcnRGZXRjaERlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9tb2RlbHNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0XG4gICAqIHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8tc2NvcGVkXG4gICAqIGNsaWVudCBhbmQgdGhlIGNhdGFsb2d1ZSByZWZsZWN0cyB3aGF0IHRoZSBjYWxsZXIgY2FuIGludm9rZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdE1vZGVsc1Jlc3VsdCgpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgY29uc3QgY2xpZW50ID0gY29udGV4dC5jbGllbnQ7XG4gICAgICBjb25zdCBjYWNoZUlkZW50aXR5ID0gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChjb250ZXh0KTtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgICAgcmV0dXJuIG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHtcbiAgICAgICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gICAgICAgIGNhY2hlSWRlbnRpdHksXG4gICAgICB9KTtcbiAgICB9LCBtb2RlbENhdGFsb2d1ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgbGlzdE1vZGVsc2AgZXhwb3J0LiBUaGUgcHJvZ3JhbW1hdGljIHN1cmZhY2VcbiAgICogY2FycmllcyBubyBzdGF0dXMgY29kZSwgc28gYSBmYWlsZWQgZXhlY3V0aW9uIGJlY29tZXMgYSB0aHJvdyB3aXRoIGFcbiAgICogc3RhYmxlIG1lc3NhZ2U7IHRoZSByb3V0ZXMgYnJhbmNoIG9uIHRoZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgIHRoaXMubG9nZ2VyLndhcm4oXCJsaXN0TW9kZWxzOmVycm9yXCIsIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRBZ2VudEFuZFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQZXItYWdlbnQgbWVtb3J5IGZhY3RvcnkuIFdoZW4gYW55IHN0b3JhZ2UgLyBtZW1vcnkgc2V0dGluZyBuZWVkc1xuICAgIC8vIFBvc3RncmVzLCBzdGFuZCB1cCBhIGRlZGljYXRlZCBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIGZpcnN0IHNvXG4gICAgLy8gbWVtb3J5IGFjdHMgYXMgdGhlIGFwcCBTUCAob3duZXIgb2YgdGhlIGBtYXN0cmFfKmAgc2NoZW1hcyksXG4gICAgLy8gbmV2ZXIgdGhlIHBlci1yZXF1ZXN0IE9CTyBpZGVudGl0eSB0aGUgY2hhdCB0dXJuIHJ1bnMgdW5kZXIuXG4gICAgLy8gYGdldFBnQ29uZmlnKClgIGlzIHJlYWQgaGVyZSwgb3V0c2lkZSBhbnkgYGFzVXNlcmAgc2NvcGUsIHNvIGl0XG4gICAgLy8gcmV0dXJucyB0aGUgU1AgY29ubmVjdGlvbiB0YXJnZXQgKyB0b2tlbiByZWZyZXNoIHBsdXMgYW55XG4gICAgLy8gYGxha2ViYXNlKHsgcG9vbCB9KWAgb3ZlcnJpZGVzOyBgcmVxdWlyZWAgdHVybnMgYSBtaXNzaW5nXG4gICAgLy8gc2libGluZyBpbnRvIGEgY2xlYXIgd2lyaW5nIGVycm9yLiBUaGUgYnVpbGRlciBjYWNoZXMgdGhlIHNoYXJlZFxuICAgIC8vIGBQZ1ZlY3RvcmAgc2luZ2xldG9uIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLiBTZWVcbiAgICAvLyBgLi9tZW1vcnkuanNgLlxuICAgIGlmIChuZWVkc0xha2ViYXNlKHRoaXMuY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3BQZ0NvbmZpZyA9IHBsdWdpblJlZ2lzdHJ5XG4gICAgICAgIC5yZXF1aXJlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UsIHRoaXMuY29uZmlnKVxuICAgICAgICAuZXhwb3J0cygpXG4gICAgICAgIC5nZXRQZ0NvbmZpZygpO1xuICAgICAgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCA9IGF3YWl0IGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sKHNwUGdDb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBtZW1vcnlCdWlsZGVyID0gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbFxuICAgICAgPyBjcmVhdGVNZW1vcnlCdWlsZGVyKHRoaXMuY29uZmlnLCB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCBldmVyeSBhZ2VudCBkZWNsYXJlZCBpbiBgY29uZmlnLmFnZW50c2AgKG9yIHRoZSBidWlsdC1pblxuICAgIC8vIGZhbGxiYWNrIHdoZW4gbm9uZSBhcmUgZGVjbGFyZWQpLiBFYWNoIGFnZW50J3MgYG1vZGVsYCByZXNvbHZlc1xuICAgIC8vIHdvcmtzcGFjZSBVUkwgKyBiZWFyZXIgYXQgY2FsbCB0aW1lIHNvIGNvbmN1cnJlbnQgcmVxdWVzdHMgZ2V0XG4gICAgLy8gZGlzdGluY3QgdXNlciBpZGVudGl0aWVzOyB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBhcm91bmRcbiAgICAvLyBgaGFuZGxlQ2hhdGAgaXMgd2hhdCBsZXRzIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybiB0aGVcbiAgICAvLyByaWdodCB1c2VyIGluc2lkZSB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gTWF0ZXJpYWxpemUgYW55IHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIE9OQ0UgYXQgc3RhcnR1cC4gUnVuc1xuICAgIC8vIG91dHNpZGUgYSByZXF1ZXN0IHNjb3BlLCBzbyBpdCB1c2VzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwncyBjbGllbnRcbiAgICAvLyBhbmQgZGVmYXVsdHMgdG8gdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlOyBhIHNvdXJjZVxuICAgIC8vIHRoYXQgbGFuZHMgb24gYSBsb2NhbCB0ZW1wIGRpciAobm8gd3JpdGFibGUgd29ya3NwYWNlKSBpcyBmb2xkZWQgaW50b1xuICAgIC8vIGV2ZXJ5IGRlZmF1bHQtd29ya3NwYWNlIGFnZW50IHZpYSBgZXh0cmFTa2lsbFBhdGhzYC5cbiAgICBjb25zdCBwcm92aXNpb25lZCA9IGF3YWl0IHByb3Zpc2lvblJlbW90ZVNraWxscyh0aGlzLmNvbmZpZy5yZW1vdGVTa2lsbHMpO1xuICAgIGlmIChwcm92aXNpb25lZC5za2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGxzIGNvbmZpZ3VyZWRcIiwge1xuICAgICAgICBza2lsbHM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgICAgIGRhdGFicmlja3NCYXNlUGF0aDogcHJvdmlzaW9uZWQuZGF0YWJyaWNrc0Jhc2VQYXRoLFxuICAgICAgICBsb2NhbFNraWxsUGF0aHM6IHByb3Zpc2lvbmVkLmxvY2FsU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWx0ID0gYXdhaXQgYnVpbGRBZ2VudHMoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIG1lbW9yeUJ1aWxkZXIsXG4gICAgICBsb2c6IHRoaXMubG9nZ2VyLFxuICAgICAgZXh0cmFTa2lsbFBhdGhzOiBwcm92aXNpb25lZC5sb2NhbFNraWxsUGF0aHMsXG4gICAgfSk7XG5cbiAgICAvLyBgbWFzdHJhLnNlcnZlci5hcGlSb3V0ZXNgIGlzIG9ubHkgaG9ub3JlZCBieSBNYXN0cmEncyBzdGFuZGFsb25lXG4gICAgLy8gZGV2IHNlcnZlci4gU2luY2Ugd2UncmUgaG9zdGluZyBNYXN0cmEgaW5zaWRlIG91ciBvd24gRXhwcmVzc1xuICAgIC8vIHN1YmFwcCB2aWEgYEBtYXN0cmEvZXhwcmVzc2AsIGN1c3RvbSByb3V0ZXMgbXVzdCBiZSBwYXNzZWQgdG9cbiAgICAvLyB0aGUgYE1hc3RyYVNlcnZlcmAgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgLy9cbiAgICAvLyBgc3RvcmFnZWAgaGVyZSBpcyAqTWFzdHJhLWluc3RhbmNlLWxldmVsKiBhbmQgcGVyc2lzdHMgd29ya2Zsb3dcbiAgICAvLyBzbmFwc2hvdHMgKHdoZXJlIHN1c3BlbmRlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGxzIGxpdmUpLlxuICAgIC8vIEl0J3Mgc2VwYXJhdGUgZnJvbSBlYWNoIGFnZW50J3MgYE1lbW9yeS5zdG9yYWdlYCwgd2hpY2ggb25seVxuICAgIC8vIGNvdmVycyB0aHJlYWQgLyBtZXNzYWdlIGhpc3RvcnkuIFdpdGhvdXQgaXQsXG4gICAgLy8gYGFnZW50LnJlc3VtZVN0cmVhbSgpYCBlcnJvcnMgd2l0aCBcImNvdWxkIG5vdCBmaW5kIGEgc3VzcGVuZGVkXG4gICAgLy8gcnVuXCIgYW5kIHRoZSBhcHByb3ZhbCBVSSBoYW5ncyBhZnRlciB0aGUgdXNlciBjbGlja3MgQXBwcm92ZS5cbiAgICBjb25zdCBpbnN0YW5jZVN0b3JhZ2UgPSBtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKTtcbiAgICAvLyBXaXJlIE1hc3RyYSdzIHRyYWNlciBpbnRvIEFwcEtpdCdzIGdsb2JhbCBPVGVsIHBpcGVsaW5lIHZpYVxuICAgIC8vIGBAbWFzdHJhL290ZWwtYnJpZGdlYC4gTWFzdHJhIHNwYW5zIGJlY29tZSBuYXRpdmUgT1RlbCBzcGFucyBvblxuICAgIC8vIHdoYXRldmVyIHRyYWNlciBwcm92aWRlciBgVGVsZW1ldHJ5TWFuYWdlcmAgcmVnaXN0ZXJlZCBkdXJpbmdcbiAgICAvLyBgY3JlYXRlQXBwYCwgc28gdGhlIE9UTFAgZW5kcG9pbnQgLyBoZWFkZXJzIC8gc2FtcGxpbmcgYXJlXG4gICAgLy8gZW52LWRyaXZlbiBhbmQgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgQXBwS2l0IHBsdWdpbi5cbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5ID0gYXdhaXQgYnVpbGRPYnNlcnZhYmlsaXR5KHtcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLm5hbWUsXG4gICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuICAgIC8vIE9wdGlvbmFsIE1DUCBleHBvc3VyZTogYnVpbGQgYSBNYXN0cmEgTUNQIHNlcnZlciBmcm9tIHRoZVxuICAgIC8vIHJlZ2lzdGVyZWQgYWdlbnRzIChhbmQsIG9wdC1pbiwgdGhlIGFtYmllbnQgdG9vbHMpIGFuZCByZWdpc3RlclxuICAgIC8vIGl0IG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2sgTUNQXG4gICAgLy8gdHJhbnNwb3J0IHJvdXRlcyAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBvZmYgYG1jcFNlcnZlcnNgLCBzbyB0aGVcbiAgICAvLyBjYXRjaC1hbGwgZGlzcGF0Y2ggYmVsb3cgYWxyZWFkeSByb3V0ZXMgTUNQIHJlcXVlc3RzIHVuZGVyIE9CTyAtXG4gICAgLy8gbm8gYmVzcG9rZSByb3V0ZSBuZWVkZWQuIFNlZSBgLi9tY3AuanNgLlxuICAgIHRoaXMubWNwID0gYnVpbGRNY3BTZXJ2ZXIoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBNYXN0cmFQbHVnaW4ubWFuaWZlc3QuZGlzcGxheU5hbWUsXG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgYW1iaWVudFRvb2xzOiB0aGlzLmJ1aWx0LmFtYmllbnRUb29scyxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYSA9IG5ldyBNYXN0cmEoe1xuICAgICAgYWdlbnRzOiB0aGlzLmJ1aWx0LmFnZW50cyxcbiAgICAgIC4uLihpbnN0YW5jZVN0b3JhZ2UgPyB7IHN0b3JhZ2U6IGluc3RhbmNlU3RvcmFnZSB9IDoge30pLFxuICAgICAgLi4uKG9ic2VydmFiaWxpdHkgPyB7IG9ic2VydmFiaWxpdHkgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLm1jcCA/IHsgbWNwU2VydmVyczogeyBbdGhpcy5tY3Auc2VydmVySWRdOiB0aGlzLm1jcC5zZXJ2ZXIgfSB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhQXBwID0gZXhwcmVzcygpO1xuICAgIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKHRoaXMubWFzdHJhQXBwKTtcbiAgICAvLyBTdGFtcCBjaGF0IHJlcXVlc3QvcmVzcG9uc2Ugb250byB0aGUgSFRUUCByb290IHNwYW4gc28gTUxmbG93J3NcbiAgICAvLyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IGNhbiBzdXJmYWNlIHRoZW0gKE1hc3RyYSdzIG93blxuICAgIC8vIGBtYXN0cmEuYWdlbnRfcnVuLipgIGF0dHJpYnV0ZXMgc2l0IG9uIGEgY2hpbGQgc3BhbiB0aGUgdmlld1xuICAgIC8vIG5ldmVyIHJlYWRzKS4gTXVzdCBydW4gYmVmb3JlIGBNYXN0cmFTZXJ2ZXIuaW5pdGAgc28gdGhlIGxheWVyXG4gICAgLy8gc2l0cyBhaGVhZCBvZiB0aGUgYWdlbnQgcm91dGVzLlxuICAgIGF0dGFjaENoYXRUdXJuVHJhY2VJbyh0aGlzLm1hc3RyYUFwcCk7XG4gICAgdGhpcy5tYXN0cmFTZXJ2ZXIgPSBuZXcgTWFzdHJhU2VydmVyKHRoaXMuY29uZmlnLCB7XG4gICAgICBhcHA6IHRoaXMubWFzdHJhQXBwLFxuICAgICAgbWFzdHJhOiB0aGlzLm1hc3RyYSxcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICAgIGN1c3RvbUFwaVJvdXRlczogYWdlbnRDaGF0Um91dGVzKCksXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5tYXN0cmFTZXJ2ZXIuaW5pdCgpO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBhZ2VudHM6IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQuYWdlbnRzKSxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZCxcbiAgICAgIGFwaUFjY2VzczogdGhpcy5jb25maWcuYXBpQWNjZXNzID8/IFwic2NvcGVkXCIsXG4gICAgICBtY3A6IHRoaXMubWNwID8gYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLmh0dHBQYXRofWAgOiBcIm9mZlwiLFxuICAgICAgbGFrZWJhc2U6IG1lbW9yeUJ1aWxkZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgb2JzZXJ2YWJpbGl0eTogb2JzZXJ2YWJpbGl0eSAhPT0gdW5kZWZpbmVkID8gXCJtbGZsb3dcIiA6IFwib2ZmXCIsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3Igb25lIGVtYmVkIGA8dHlwZT5gIGJlaGluZCB0aGUgZ2VuZXJpY1xuICogYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCByb3V0ZS4gUmV0dXJucyB0aGUgSlNPTiBib2R5IHRvIHNlbmQgb25cbiAqIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIHRvIHNpZ25hbCBhIDQwNCAodW5rbm93biAvIGV4cGlyZWQgaWQpLlxuICogYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cyBzbyBsb25nLXBvbGxpbmdcbiAqIHJlc29sdmVycyAoZS5nLiBgY2hhcnRgKSB1bmJsb2NrIGltbWVkaWF0ZWx5LlxuICovXG50eXBlIEVtYmVkUmVzb2x2ZXIgPSAoXG4gIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICBpZDogc3RyaW5nLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx1bmtub3duPj47XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/dGltZW91dE1zPTxuPmAgcXVlcnkgcGFyYW1ldGVyIGZyb20gYVxuICogYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgcG9zaXRpdmUgaW50ZWdlciB1cFxuICogdG8ge0BsaW5rIE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVN9IChjbGFtcGVkKSBhbmQgcmVqZWN0cyBldmVyeXRoaW5nIGVsc2VcbiAqIGFzIGB1bmRlZmluZWRgIHNvIHtAbGluayBmZXRjaENoYXJ0fSBmYWxscyBiYWNrIHRvIGl0cyBkZWZhdWx0LlxuICogRXhwcmVzcyBwcm9kdWNlcyBgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRgOyB3ZSBub3JtYWxpemVcbiAqIHRvIHRoZSBmaXJzdCBzY2FsYXIgYmVmb3JlIHBhcnNpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGltZW91dE1zKHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLmZsb29yKG4pLCBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD9saW1pdD08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2RhdGEvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VyIGFuZCBsZXRzIHRoZSByb3V0ZSBjbGFtcCB0byBgU1RBVEVNRU5UX1JPV19DQVBgO1xuICogcmVqZWN0cyBhbnl0aGluZyBlbHNlIGFzIGB1bmRlZmluZWRgIHNvIHRoZSByb3V0ZSBmYWxscyBiYWNrXG4gKiB0byB0aGUgc2VydmVyLXNpZGUgY2FwLlxuICovXG5mdW5jdGlvbiBwYXJzZVN0YXRlbWVudExpbWl0KHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguZmxvb3Iobik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIE1hc3RyYSBwbHVnaW4gb24gYW4gQXBwS2l0IGFwcC4gTW91bnRzIHRoZSBhZ2VudHMsIHRoZVxuICogYC9yb3V0ZS8qYCBjaGF0IHN1cmZhY2UsIGFuZCAodW5sZXNzIGRpc2FibGVkKSB0aGUgTUNQIHRyYW5zcG9ydCB1bmRlclxuICogYC9hcGkvbWFzdHJhYC5cbiAqXG4gKiBAZXhhbXBsZSBNaW5pbWFsIGFwcFxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBObyBgYWdlbnRzYDogYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gKiAvLyBjaGF0IGVuZHBvaW50IHdvcmtzIG91dCBvZiB0aGUgYm94LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW21hc3RyYSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFR3byBhZ2VudHMsIGEgcGlubmVkIG1vZGVsLCBhbmQgR2VuaWVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZGVmYXVsdE1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgICAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBzYWxlczogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJvcmRlcnMsIHJldHVybnNcIiB9IH0sXG4gKiAgICAgICBhZ2VudHM6IHtcbiAqICAgICAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBzYWxlcy5cIixcbiAqICAgICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgIH0pLFxuICogICAgICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIllvdSBleHBsYWluIHRoZSBhbmFseXN0J3MgYW5zd2Vycy5cIiB9KSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbWFzdHJhID0gdG9QbHVnaW4oTWFzdHJhUGx1Z2luKTtcbiJdfQ==
1111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEdBS1AsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFHOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG9CQUFvQixHQUVyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2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QUcsQ0FBQztJQUM1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CLENBQUMsR0FBWTtJQUN2QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgYnVpbGRzIG9uZSBvciBtb3JlIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlcyBhbmRcbiAqIG1vdW50cyB0aGUgYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVyLiBDbGllbnRzIGRyaXZlIHRoZSBjb252ZXJzYXRpb25cbiAqIG92ZXIgdGhlIHN0YW5kYXJkIE1hc3RyYSBhZ2VudCBzdHJlYW0gKGBAbWFzdHJhL2NsaWVudC1qc2Anc1xuICogYGdldEFnZW50KGlkKS5zdHJlYW0oKWApLCBzbyB0aGVyZSdzIG5vIGJlc3Bva2UgY2hhdCB0cmFuc3BvcnQgdG9cbiAqIGtlZXAgaW4gc3luYy5cbiAqXG4gKiAtIEFnZW50czogcmVnaXN0ZXJlZCB0aHJvdWdoIGBjb25maWcuYWdlbnRzYCBhdCBwbHVnaW4gY3JlYXRpb25cbiAqICAgKHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259KS4gRWFjaCBlbnRyeSdzIGB0b29sc2AgZmllbGQgYWNjZXB0c1xuICogICBlaXRoZXIgYSBwbGFpbiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjayB0aGF0IGdldHNcbiAqICAgYSB0eXBlZCBzaWJsaW5nLXBsdWdpbiBpbmRleCAoe0BsaW5rIE1hc3RyYVBsdWdpbnN9KS4gT21pdFxuICogICBgY29uZmlnLmFnZW50c2AgdG8gZ2V0IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0LlxuICogLSBNb2RlbDogZWFjaCBhZ2VudCBjYWxsIHJlc29sdmVzIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCB2aWFcbiAqICAge0BsaW5rIGJ1aWxkTW9kZWx9IGZyb20gYC4vbW9kZWwuanNgLiBQZXItYWdlbnQgYG1vZGVsYCBvdmVycmlkZXNcbiAqICAgKGBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdYCBvciBhIGBtb2RlbElkYCBzdHJpbmcpIGZsb3cgdGhyb3VnaFxuICogICB7QGxpbmsgYnVpbGRBZ2VudHN9LlxuICogLSBNZW1vcnkgLyBzdG9yYWdlOiBwZXItYWdlbnQsIGJ1aWx0IGJ5IHtAbGluayBjcmVhdGVNZW1vcnlCdWlsZGVyfVxuICogICBmcm9tIGAuL21lbW9yeS5qc2AuIEJvdGggYXV0by1kZWZhdWx0IHRvIGB0cnVlYCB3aGVuIHRoZVxuICogICBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkICh1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWRcbiAqICAgYGZhbHNlYCBvciBhIGN1c3RvbSBjb25maWcpLiBTdG9yYWdlIG5hbWVzcGFjZXMgcGVyIGFnZW50IHZpYVxuICogICB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gcGVyIGFnZW50OyB0aGUgdmVjdG9yIHN0b3JlIGlzIGEgc2luZ2xlXG4gKiAgIHNoYXJlZCBzaW5nbGV0b24gYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICogLSBTZXJ2ZXI6IHRoZSBFeHByZXNzIHN1YmFwcCB3aXJpbmcgbGl2ZXMgaW4gYC4vc2VydmVyLmpzYC5cbiAqIC0gSFRUUDogQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbiB1bmRlciBgL2FwaS9tYXN0cmFgLiBBbG9uZ3NpZGUgdGhlXG4gKiAgIE1hc3RyYSBhZ2VudCByb3V0ZXMsIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGAvcm91dGUvaGlzdG9yeWBcbiAqICAgKGxvYWQgKyBjbGVhciBhIHRocmVhZCdzIG1lc3NhZ2VzKSwgYC9yb3V0ZS90aHJlYWRzYCAobGlzdCB0aGVcbiAqICAgY2FsbGVyJ3MgY29udmVyc2F0aW9ucyArIGRlbGV0ZSBvbmUpLCBgL21vZGVsc2AsIGAvZGVmYXVsdC1tb2RlbGAsXG4gKiAgIGAvc3VnZ2VzdGlvbnNgLCBgL3JvdXRlL2ZlZWRiYWNrYCAobG9nIGEgdGh1bWJzIC8gY29tbWVudCB0byBNTGZsb3dcbiAqICAgd2hlbiBmZWVkYmFjayBpcyBlbmFibGVkKSwgYW5kIHRoZSBnZW5lcmljIGAvZW1iZWQvOnR5cGUvOmlkYFxuICogICByZXNvbHZlciBmb3IgaW5saW5lIGNoYXJ0IC8gZGF0YSBtYXJrZXJzLiBFYWNoIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuICogICBBcHBLaXQncyBgcm91dGUoKWAgc28gaXQgbGFuZHMgaW4gdGhlIHBsdWdpbidzIGVuZHBvaW50IG1hcCwgYW5kXG4gKiAgIGV2ZXJ5IG91dGJvdW5kIGNhbGwgb25lIG1ha2VzIHJ1bnMgdGhyb3VnaCBgZXhlY3V0ZSgpYCAoc2VlXG4gKiAgIGAuL2RlZmF1bHRzLmpzYCkuIFRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdXJmYWNlIGlzIGdhdGVkXG4gKiAgIGJ5IGBjb25maWcuYXBpQWNjZXNzYCAoZGVmYXVsdCBgXCJzY29wZWRcImApOiBvbmx5IGFnZW50IGluZmVyZW5jZSxcbiAqICAgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGUgYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKVxuICogICBNQ1AgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhOyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzXG4gKiAgIGFyZSByZWZ1c2VkIHdpdGggYDQwM2AuIFNlZSB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uXG4gKiAtIE1DUDogb3B0IGluIHdpdGggYGNvbmZpZy5tY3BgIHRvIGV4cG9zZSB0aGUgYWdlbnRzIChhbmQgb3B0aW9uYWxseVxuICogICB0b29scykgYXMgYSBNYXN0cmEgYE1DUFNlcnZlcmAuIEl0IGlzIHJlZ2lzdGVyZWQgb24gdGhlIGBNYXN0cmFgXG4gKiAgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHNvIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2tcbiAqICAgTUNQIHRyYW5zcG9ydCByb3V0ZXMgKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdW5kZXIgdGhlIG1vdW50LiBTZWVcbiAqICAgYC4vbWNwLmpzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbW9kZWxDYXRhbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmZWVkYmFjayxcbiAgcm91dGVzLFxuICB0eXBlIENoYXJ0LFxuICB0eXBlIE1hc3RyYUNsaWVudENvbmZpZyxcbiAgdHlwZSBNYXN0cmFGZWVkYmFja1JlcXVlc3QsXG4gIHR5cGUgU3RhdGVtZW50RGF0YSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgZGlzcGxheSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBidWlsZEFnZW50cywgRkFMTEJBQ0tfQUdFTlRfSUQsIHR5cGUgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGZldGNoQ2hhcnQgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHsgYWdlbnRDaGF0Um91dGVzIH0gZnJvbSBcIi4vY2hhdC50c1wiO1xuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgZXhlY3V0aW9uQ29udGV4dFVzZXJJZCxcbiAgTUFTVFJBX0NPTkZJR19TQ0hFTUEsXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyxcbiAgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyxcbiAgc3RhdGVtZW50RGF0YURlZmF1bHRzLFxufSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQge1xuICByZXF1ZXN0VXNlcklkLFxuICByZXNvbHZlSWRlbnRpdHlNb2RlLFxuICB1c2VTZXJ2aWNlUHJpbmNpcGFsLFxuICB0eXBlIE1hc3RyYUlkZW50aXR5TW9kZSxcbn0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTWNwU2VydmVyLCB0eXBlIFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vbWNwLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVNZW1vcnlCdWlsZGVyLCBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbCwgbmVlZHNMYWtlYmFzZSB9IGZyb20gXCIuL21lbW9yeS50c1wiO1xuaW1wb3J0IHsgbG9nRmVlZGJhY2ssIHJlc29sdmVGZWVkYmFja0VuYWJsZWQgfSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7IHJlc29sdmVEZWZhdWx0TW9kZWxJZCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBidWlsZE9ic2VydmFiaWxpdHksIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbiB9IGZyb20gXCIuL29ic2VydmFiaWxpdHkudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvblJlbW90ZVNraWxscyB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcbmltcG9ydCB7XG4gIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlLFxuICBjcmVhdGVSZXF1ZXN0Q29udGV4dCxcbiAgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZCxcbiAgTWFzdHJhU2VydmVyLFxufSBmcm9tIFwiLi9zZXJ2ZXIudHNcIjtcbmltcG9ydCB7IHJlc29sdmVTZXJ2aW5nQ29uZmlnIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhLCBTVEFURU1FTlRfUk9XX0NBUCB9IGZyb20gXCIuL3N0YXRlbWVudC50c1wiO1xuaW1wb3J0IHsgYXR0YWNoQ2hhdFR1cm5UcmFjZUlvIH0gZnJvbSBcIi4vdHJhY2UtaW8udHNcIjtcbmltcG9ydCB7IGludmFsaWRGaWVsZHMgfSBmcm9tIFwiLi92YWxpZGF0aW9uLnRzXCI7XG5cbmNvbnN0IEdFTklFX01BTklGRVNUID0gcGx1Z2luUmVnaXN0cnkuZGF0YShnZW5pZSkucGx1Z2luLm1hbmlmZXN0O1xuY29uc3QgTEFLRUJBU0VfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGxha2ViYXNlKS5wbHVnaW4ubWFuaWZlc3Q7XG5cbi8qKlxuICogQnVkZ2V0IGZvciBkcmFpbmluZyB0aGUgbWVtb3J5IHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgb24gc2h1dGRvd24uIFdlbGxcbiAqIGluc2lkZSBBcHBLaXQncyAxNXMgZ3JhY2VmdWwtc2h1dGRvd24gd2luZG93LCBzbyBhIHN0dWNrIGNvbm5lY3Rpb24gY2FuXG4gKiBuZXZlciBiZSB3aGF0IGhvbGRzIHRoZSBwcm9jZXNzIG9wZW4uXG4gKi9cbmNvbnN0IFBPT0xfRFJBSU5fVElNRU9VVF9NUyA9IDVfMDAwO1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgYD90aW1lb3V0TXM9YCBsb25nLXBvbGwgYnVkZ2V0IGEgY2xpZW50IG1heSByZXF1ZXN0LiAqL1xuY29uc3QgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2Ugd2hlbiB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQuICovXG5jb25zdCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UgPSBcIkNvdWxkIG5vdCByZWFkIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWVcIjtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSBmb3IgYSBmZWVkYmFjayBib2R5IHRoYXQgZmFpbHMgc2NoZW1hIHZhbGlkYXRpb24uICovXG5jb25zdCBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgPSBcIkludmFsaWQgZmVlZGJhY2sgcmVxdWVzdFwiO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlIGZvciBzdGF0ZW1lbnQgcmVzdWx0IHNldHMsIG1hdGNoaW5nIHRoZSBjaGFydCBjYWNoZSdzIGZvcm0uICovXG5jb25zdCBTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6c3RhdGVtZW50XCI7XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgbWFzdHJhYCkgdGhhdCBob3N0cyBNYXN0cmEgYWdlbnRzXG4gKiB3aXRoIG9wdGlvbmFsIExha2ViYXNlLWJhY2tlZCBtZW1vcnkgYW5kIEFJIFNESyBjaGF0IHJvdXRlcyB1bmRlclxuICogdGhlIHBsdWdpbiBtb3VudCAodHlwaWNhbGx5IGAvYXBpL21hc3RyYWApLlxuICpcbiAqIEBleGFtcGxlIFJlZ2lzdGVyIHRoZSBwbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBgbGFrZWJhc2VgIGZpcnN0OiByZWdpc3RlcmluZyBpdCBhdXRvLWVuYWJsZXMgTWFzdHJhIHN0b3JhZ2UgKyBtZW1vcnkuXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCEgfSxcbiAqICAgICAgIGFnZW50czogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICBuYW1lOiBcImFuYWx5c3RcIixcbiAqICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHJldmVudWUgYW5kIHJldHVybnMuXCIsXG4gKiAgICAgICAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICB9LFxuICogICAgICAgfSksXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFJlYWQgdGhlIGFnZW50cyBiYWNrIG9mZiB0aGUgQXBwS2l0IGluc3RhbmNlXG4gKiBgYGB0c1xuICogY29uc3QgYWdlbnRJZHMgPSBhcHAubWFzdHJhLmxpc3QoKTtcbiAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGFwcC5tYXN0cmEubGlzdE1vZGVscygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TWFzdHJhUGx1Z2luQ29uZmlnPiB7XG4gIC8vIEFubm90YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGBzYXRpc2ZpZXNgOiB0aGUgY29uZmlnIHNjaGVtYSdzIHR5cGUgY29tZXNcbiAgLy8gZnJvbSBgQHR5cGVzL2pzb24tc2NoZW1hYCwgd2hpY2ggdGhpcyBwYWNrYWdlIGRvZXMgbm90IGRlcGVuZCBvbiwgc28gYW5cbiAgLy8gaW5mZXJyZWQgbWFuaWZlc3QgdHlwZSBjYW5ub3QgYmUgbmFtZWQgaW4gdGhlIGVtaXR0ZWQgZGVjbGFyYXRpb24uIFRoZVxuICAvLyBgUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj5gIHBhcmFtZXRlciBzdGlsbCBjYXJyaWVzIHRoZSBsaXRlcmFsIG5hbWUgaW50b1xuICAvLyBgdG9QbHVnaW4oKWAncyBmYWN0b3J5IHR5cGUuXG4gIHN0YXRpYyBtYW5pZmVzdDogUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj4gPSB7XG4gICAgbmFtZTogXCJtYXN0cmFcIixcbiAgICBkaXNwbGF5TmFtZTogXCJNYXN0cmFcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQnVpbGRzIGEgTWFzdHJhIEFnZW50IHdpdGggdXNlci1zY29wZWQgd29ya3NwYWNlIGF1dGggKGFzVXNlcikgXCIgK1xuICAgICAgXCJhbmQgb3B0aW9uYWwgUG9zdGdyZXMtYmFja2VkIE1hc3RyYSBNZW1vcnkgdmlhIHRoZSBgbGFrZWJhc2VgIHBsdWdpbi5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtcbiAgICAgICAgLy8gUmV1c2UgdGhlIEdlbmllIHNwYWNlLWlkIGJpbmRpbmcgZGVjbGFyZWQgYnkgQXBwS2l0J3MgYGdlbmllYFxuICAgICAgICAvLyBtYW5pZmVzdCBzbyB0aGUgcmVzb3VyY2UtYmluZGluZyBzaGFwZSBpcyBpZGVudGljYWwgdG8gQXBwS2l0J3MgYW5kXG4gICAgICAgIC8vIGFuIGV4aXN0aW5nIGBhcHAueWFtbGAgLyBgZ2VuaWUoeyBzcGFjZXMgfSlgIHdpcmluZyBrZWVwcyB3b3JraW5nLlxuICAgICAgICAvLyBUaGUgYnVpbHQtaW4gR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoXG4gICAgICAgIC8vIGBAZGJ4LXRvb2xzL2dlbmllYCwgc28gb25seSB0aGUgYmluZGluZyBpcyBzaGFyZWQsIG5vdCB0aGUgcGx1Z2luJ3NcbiAgICAgICAgLy8gdG9vbHMuXG4gICAgICAgIC4uLkdFTklFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgICAgLi4uTEFLRUJBU0VfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IE1BU1RSQV9DT05GSUdfU0NIRU1BIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFRpZ2h0ZW4gcmVzb3VyY2UgcmVxdWlyZW1lbnRzIGJhc2VkIG9uIHdoaWNoIGZlYXR1cmVzIGFyZSBlbmFibGVkLlxuICAgKiBBcHBLaXQgY2FsbHMgdGhpcyBhdCByZWdpc3RyYXRpb24gdGltZSAoY29uZmlnLWF3YXJlKSBzbyBkaXNhYmxlZFxuICAgKiBmZWF0dXJlcyBkb24ndCBzdXJmYWNlIHRoZWlyIHJlc291cmNlIGFza3MgdG8gdGhlIGhvc3QgYXBwLlxuICAgKi9cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlUmVxdWlyZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGVuYWJsZWRNYW5pZmVzdHM6IFBsdWdpbk1hbmlmZXN0PHN0cmluZz5bXSA9IFtdO1xuXG4gICAgaWYgKG5lZWRzTGFrZWJhc2UoY29uZmlnKSkge1xuICAgICAgZW5hYmxlZE1hbmlmZXN0cy5wdXNoKExBS0VCQVNFX01BTklGRVNUKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtIG9mIGVuYWJsZWRNYW5pZmVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgbS5yZXNvdXJjZXMucmVxdWlyZWQpIHtcbiAgICAgICAgcmVzb3VyY2VzLnB1c2goeyAuLi5yZXNvdXJjZSwgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZXM7XG4gIH1cblxuICBwcml2YXRlIGxvZ2dlciA9IGxvZy5sb2dnZXIodGhpcyk7XG4gIHByaXZhdGUgYnVpbHQ6IEJ1aWx0QWdlbnRzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhOiBNYXN0cmEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFBcHA6IGV4cHJlc3MuRXhwcmVzcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYVNlcnZlcjogTWFzdHJhU2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc2luZyB0aGlzIHBsdWdpbidzIGFnZW50cyAvIHRvb2xzLCBvclxuICAgKiBgbnVsbGAgd2hlbiBgY29uZmlnLm1jcGAgaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KS4gQnVpbHQgaW5cbiAgICoge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IGFuZCByZWdpc3RlcmVkIG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIG1jcDogUmVzb2x2ZWRNY3AgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHtAbGluayBNYXN0cmFJZGVudGl0eU1vZGV9OiB0aGUgaWRlbnRpdHkgdGhlIGNoYXQgcGF0aCdzIERhdGFicmlja3NcbiAgICogY2FsbHMgcnVuIGFzLiBSZWFkIG9uY2UgYXQgc2V0dXAgc28gYW4gaW52YWxpZCBgZ2VuaWVJZGVudGl0eWAgZmFpbHMgdGhlIGFwcFxuICAgKiBib290IHJhdGhlciB0aGFuIHRoZSBmaXJzdCByZXF1ZXN0LCBhbmQgc28gZXZlcnkgcmVxdWVzdCBhZ3JlZXMuXG4gICAqL1xuICBwcml2YXRlIGlkZW50aXR5TW9kZTogTWFzdHJhSWRlbnRpdHlNb2RlID0gXCJ1c2VyXCI7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbCBiYWNraW5nIE1hc3RyYSBtZW1vcnkgL1xuICAgKiBzdG9yYWdlLiBCdWlsdCBvbmNlIGluIHtAbGluayBidWlsZEFnZW50QW5kU2VydmVyfSAob3V0c2lkZSBhbnlcbiAgICogYGFzVXNlcmAgc2NvcGUsIHNvIGl0IG5ldmVyIGluaGVyaXRzIGEgcmVxdWVzdCdzIE9CTyBpZGVudGl0eSkgYW5kXG4gICAqIGRyYWluZWQgaW4ge0BsaW5rIHNodXRkb3dufS4gYG51bGxgIHVudGlsIHNldHVwIHJ1bnMgb3Igd2hlblxuICAgKiBMYWtlYmFzZSBpc24ndCBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIHNlcnZpY2VQcmluY2lwYWxQb29sOiBQb29sIHwgbnVsbCA9IG51bGw7XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgaWRlbnRpdHkgbW9kZSB1cCBmcm9udCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGVcbiAgICAvLyBhcHAgYm9vdCB3aXRoIGEgY2xlYXIgbWVzc2FnZSByYXRoZXIgdGhhbiA1MDAtaW5nIHRoZSBmaXJzdCBjaGF0IHJlcXVlc3QuXG4gICAgdGhpcy5pZGVudGl0eU1vZGUgPSByZXNvbHZlSWRlbnRpdHlNb2RlKHRoaXMuY29uZmlnLmdlbmllSWRlbnRpdHkpO1xuICAgIC8vIFdhaXQgdW50aWwgc2libGluZyBwbHVnaW5zIChlLmcuIGBsYWtlYmFzZWApIGZpbmlzaCBgc2V0dXAoKWAgc29cbiAgICAvLyB0aGUgbGFrZWJhc2UgcG9vbCBpcyB2YWxpZCB3aGVuIHN0b3JhZ2UvbWVtb3J5IGFyZSBlbmFibGVkLlxuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEFnZW50QW5kU2VydmVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrcyBjYWxscyBzaG91bGQgcnVuIHRocm91Z2ggZm9yXG4gICAqIGByZXFgLCBob25vcmluZyB7QGxpbmsgaWRlbnRpdHlNb2RlfS5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudC4gSW4gYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2BcbiAgICogdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpbiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lXG4gICAqIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm4gQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZVxuICAgKiBoZWxwZXIgY292ZXJzIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIHRoZSBjaGF0IHBhdGggbWFrZXMgKHNlcnZpbmcgY2F0YWxvZ3VlLFxuICAgKiBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAgdmlhIHRoZSBkaXNwYXRjaGVkIGFnZW50IHR1cm4sIHN0YXRlbWVudCBmZXRjaCxcbiAgICogZmVlZGJhY2spLCBzbyB0aGUgaWRlbnRpdHkgZGVjaXNpb24gbGl2ZXMgaW4gb25lIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY29wZWRTZWxmKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcSkgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLCBhdXRvLWVuYWJsZSBgc3RvcmFnZWBcbiAgICogYW5kIGBtZW1vcnlgIHVubGVzcyB0aGUgY2FsbGVyIG9wdGVkIG91dCBleHBsaWNpdGx5IChgZmFsc2VgIG9yIGFcbiAgICogY3VzdG9tIGNvbmZpZyBvYmplY3QpLiBSdW4gYWZ0ZXIgYHNldHVwOmNvbXBsZXRlYCBzbyB0aGUgbG9va3VwXG4gICAqIGlzIHJlbGlhYmxlOiBhbnkgcGx1Z2luIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBzeW5jaHJvbm91c2x5IGlzXG4gICAqIGFscmVhZHkgaW4gdGhlIHJlZ2lzdHJ5IGJ5IHRoZSB0aW1lIHRoaXMgZmlyZXMuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGFrZWJhc2UgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghaGFzTGFrZWJhc2UpIHJldHVybjtcbiAgICBpZiAodGhpcy5jb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5zdG9yYWdlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5ID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLm1lbW9yeSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRHJhaW4gdGhlIG1lbW9yeSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sLiBJZGVtcG90ZW50OiB0aGUgaGFuZGxlIGlzXG4gICAqIGNsZWFyZWQgYmVmb3JlIHRoZSBkcmFpbiBzdGFydHMsIHNvIGEgc2Vjb25kIGNhbGwgaXMgYSBuby1vcCBhbmQgYVxuICAgKiBsYXRlciBgc2V0dXAoKWAgcmVidWlsZHMgdGhlIHBvb2wuIEJvdW5kZWQgYnlcbiAgICoge0BsaW5rIFBPT0xfRFJBSU5fVElNRU9VVF9NU30gdG8gc3RheSB3ZWxsIGluc2lkZSB0aGUgMTVzIGdyYWNlZnVsXG4gICAqIHNodXRkb3duIGJ1ZGdldC5cbiAgICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sO1xuICAgIGlmICghcG9vbCkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIpO1xuICAgIC8vIFRoZSBidWRnZXQgdGltZXIgaXMgY2FuY2VsbGVkIG9uIHRoZSB3YXkgb3V0IHNvIGEgZHJhaW4gdGhhdCBmaW5pc2hlZFxuICAgIC8vIGVhcmx5IGNhbm5vdCBob2xkIHRoZSBldmVudCBsb29wIG9wZW4gZm9yIHRoZSByZXN0IG9mIHRoZSB3aW5kb3cuXG4gICAgY29uc3QgYnVkZ2V0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Bvb2wuZW5kKCksIGFzeW5jVXRpbHMuc2xlZXAoUE9PTF9EUkFJTl9USU1FT1VUX01TLCBidWRnZXQuc2lnbmFsKV0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJlcnJvciBjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnVkZ2V0LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrLiBBcHBLaXQncyBncmFjZWZ1bCBzaHV0ZG93biBjYWxscyB0aGlzIGhvb2tcbiAgICogc3luY2hyb25vdXNseSBhbmQgbmV2ZXIgYXdhaXRzIHtAbGluayBzaHV0ZG93bn0sIHNvIHRoZSBwb29sIGRyYWluIGlzXG4gICAqIHN0YXJ0ZWQgaGVyZSB0b287IGl0IGNhbm5vdCBiZSBhd2FpdGVkIGZyb20gYSBgdm9pZGAgaG9vaywgYW5kXG4gICAqIHtAbGluayBzaHV0ZG93bn0gaXMgaWRlbXBvdGVudCBzbyB0aGUgZHVwbGljYXRlIGNhbGwgaXMgZnJlZS5cbiAgICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSWRzIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBNYXRjaGVzXG4gICAgICAgKiBBcHBLaXQgYGFnZW50cy5saXN0KClgIHNvIGNhbGxlcnMgY2FuIGl0ZXJhdGUgdGhlIHJlZ2lzdHJ5IHRoZVxuICAgICAgICogc2FtZSB3YXkgdW5kZXIgYm90aCBwbHVnaW5zLlxuICAgICAgICovXG4gICAgICBsaXN0OiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIC8qKlxuICAgICAgICogTG9vayB1cCBhIHJlZ2lzdGVyZWQgYWdlbnQgYnkgaWQuIFJldHVybnMgYG51bGxgIChub3RcbiAgICAgICAqIHVuZGVmaW5lZCkgd2hlbiB1bmtub3duIHNvIGNhbGwgc2l0ZXMgY2FuIGVhcmx5LXJldHVybiB3aXRob3V0XG4gICAgICAgKiBhIHNlcGFyYXRlIGBpbmAgY2hlY2suXG4gICAgICAgKi9cbiAgICAgIGdldDogKGlkOiBzdHJpbmcpOiBBZ2VudCB8IG51bGwgPT4gdGhpcy5idWlsdD8uYWdlbnRzW2lkXSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYWdlbnQgdGhlIGNsaWVudCBjb252ZXJzZXMgd2l0aCB3aGVuIGl0IGRvZXNuJ3QgbmFtZSBvbmUuXG4gICAgICAgKiBSZXNvbHZlcyB0byBgY29uZmlnLmRlZmF1bHRBZ2VudGAsIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlkLCBvclxuICAgICAgICogdGhlIGJ1aWx0LWluIGBkZWZhdWx0YCBmYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgZ2V0RGVmYXVsdDogKCk6IEFnZW50IHwgbnVsbCA9PlxuICAgICAgICAodGhpcy5idWlsdCAmJiB0aGlzLmJ1aWx0LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXSkgPz8gbnVsbCxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcyAoYSBUZWFtcyBhY3Rpdml0eSBvbiBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50LCBhXG4gICAgICAgKiBzY2hlZHVsZWQgam9iKS5cbiAgICAgICAqXG4gICAgICAgKiBNYXN0cmEncyB1c2VyLXNjb3BlZCB0b29scyAtIGBhc2tfZ2VuaWVgIG1vc3QgdmlzaWJseSAtIHJlYWQgdGhlIEFwcEtpdFxuICAgICAgICogdXNlciBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCwgd2hpY2ggb25seSB0aGUgSFRUUCBtaWRkbGV3YXJlIHN0YW1wcy5cbiAgICAgICAqIENhbGxpbmcgYGFnZW50LmdlbmVyYXRlYCB3aXRoIGEgcmF3IHByb21wdCB0aGVyZWZvcmUgYW5zd2VycyBcInRoZSBkYXRhXG4gICAgICAgKiBzb3VyY2UgaXMgdW5yZWFjaGFibGVcIiB3aGVyZSB0aGUgY2hhdCByb3V0ZXMgYW5zd2VyIHdpdGggcmVhbCBkYXRhLlxuICAgICAgICogUGFzc2luZyB0aGlzIGFzIGByZXF1ZXN0Q29udGV4dGAgY2xvc2VzIHRoYXQgZ2FwLCBzbyBhbiBvdXQtb2YtYmFuZCB0dXJuXG4gICAgICAgKiBoYXMgZXhhY3RseSB0aGUgY2FwYWJpbGl0aWVzIGEgY2hhdCB0dXJuIGhhcy5cbiAgICAgICAqXG4gICAgICAgKiBNdXN0IGJlIGNhbGxlZCBJTlNJREUgYW4gYGFzVXNlcihyZXEpYCBzY29wZSB0byBpbmhlcml0IHRoZSBjYWxsZXInc1xuICAgICAgICogT0JPIGlkZW50aXR5OyBvdXRzaWRlIG9uZSBpdCByZXNvbHZlcyB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZVJlcXVlc3RDb250ZXh0OiAoXG4gICAgICAgIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiA9PiBjcmVhdGVSZXF1ZXN0Q29udGV4dChvcHRpb25zKSxcbiAgICAgIC8qKlxuICAgICAgICogTUNQIGVuZHBvaW50IGluZm8gd2hlbiBgY29uZmlnLm1jcGAgaXMgZW5hYmxlZCwgZWxzZSBgbnVsbGAuXG4gICAgICAgKiBTdHJlYW1hYmxlIEhUVFAgaXMgYGh0dHBgOyB0aGUgU1NFIHBhaXIgaXMgdGhlIGxlZ2FjeSB0cmFuc3BvcnQuXG4gICAgICAgKlxuICAgICAgICogRWFjaCBwYXRoIGlzIGdpdmVuIHR3aWNlOiBtb3VudC1yZWxhdGl2ZSAoYGh0dHBQYXRoYCwgYHNzZVBhdGhgLFxuICAgICAgICogYG1lc3NhZ2VQYXRoYCkgZm9yIGFueXRoaW5nIHRoYXQgYWxyZWFkeSBrbm93cyB3aGVyZSB0aGUgcGx1Z2luIGlzXG4gICAgICAgKiBtb3VudGVkLCBhbmQgYWJzb2x1dGUgKGBodHRwYCwgYHNzZWAsIGBtZXNzYWdlc2ApIGZvciBNQ1AgY2xpZW50cyxcbiAgICAgICAqIHdoaWNoIHRha2UgYSBzaW5nbGUgVVJMIGFuZCBjYW5ub3QgY29tcG9zZSBvbmUuIFRoZSBhYnNvbHV0ZSBmb3JtIGlzXG4gICAgICAgKiBidWlsdCBmcm9tIHtAbGluayBiYXNlUGF0aH0sIHNvIGl0IGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUgYnV0XG4gICAgICAgKiBzdGlsbCBhc3N1bWVzIEFwcEtpdCdzIGRlZmF1bHQgYC9hcGkvPG5hbWU+YCBtb3VudC5cbiAgICAgICAqL1xuICAgICAgZ2V0TWNwOiAoKToge1xuICAgICAgICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAgICAgICBodHRwUGF0aDogc3RyaW5nO1xuICAgICAgICBzc2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIGh0dHA6IHN0cmluZztcbiAgICAgICAgc3NlOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbCA9PlxuICAgICAgICB0aGlzLm1jcFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzZXJ2ZXJJZDogdGhpcy5tY3Auc2VydmVySWQsXG4gICAgICAgICAgICAgIGh0dHBQYXRoOiB0aGlzLm1jcC5odHRwUGF0aCxcbiAgICAgICAgICAgICAgc3NlUGF0aDogdGhpcy5tY3Auc3NlUGF0aCxcbiAgICAgICAgICAgICAgbWVzc2FnZVBhdGg6IHRoaXMubWNwLm1lc3NhZ2VQYXRoLFxuICAgICAgICAgICAgICBodHRwOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCxcbiAgICAgICAgICAgICAgc3NlOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3Auc3NlUGF0aH1gLFxuICAgICAgICAgICAgICBtZXNzYWdlczogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLm1lc3NhZ2VQYXRofWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLyoqIEV4cHJlc3Mgc3ViYXBwIE1hc3RyYSBpcyBtb3VudGVkIG9uOyBtb3N0bHkgZm9yIHRlc3RzLiAqL1xuICAgICAgZ2V0TWFzdHJhU2VydmVyOiAoKSA9PiB0aGlzLm1hc3RyYVNlcnZlcixcbiAgICAgIC8qKlxuICAgICAgICogRmV0Y2ggdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIChjYWNoZWQpLiBTYW1lXG4gICAgICAgKiBwYXlsb2FkIHRoZSBgR0VUIC9tb2RlbHNgIHJvdXRlIHJldHVybnM7IHN1cmZhY2VkIGhlcmUgc29cbiAgICAgICAqIG90aGVyIHBsdWdpbnMgLyBzY3JpcHRzIGNhbiBpbnRyb3NwZWN0IHRoZSBjYXRhbG9ndWUgd2l0aG91dFxuICAgICAgICogYW4gSFRUUCByb3VuZC10cmlwLiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yXG4gICAgICAgKiBPQk8gc2NvcGluZyBhdXRvbWF0aWNhbGx5LiBUaHJvd3Mgd2hlbiB0aGUgbGlzdGluZyBmYWlscywgc2luY2VcbiAgICAgICAqIHRoZXJlIGlzIG5vIHN0YXR1cyBjb2RlIHRvIGhhbmQgYmFjayBvbiB0aGlzIHN1cmZhY2UuXG4gICAgICAgKi9cbiAgICAgIGxpc3RNb2RlbHM6ICgpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4gPT4gdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3NcbiAgICAgICAqIGBDYWNoZU1hbmFnZXJgLiBVc2VmdWwgaW4gdGVzdHMgb3IgcmlnaHQgYWZ0ZXIgYW4gYWRtaW5cbiAgICAgICAqIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQgYW5kIGRvZXNuJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgVFRMLlxuICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBgQ2FjaGVNYW5hZ2VyLmRlbGV0ZWAvYGNsZWFyYCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBjbGVhck1vZGVsc0NhY2hlOiAoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGhvc3QpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWJzb2x1dGUgbW91bnQgdGhpcyBwbHVnaW4ncyByb3V0ZXMgYW5zd2VyIG9uLiBBcHBLaXQgbW91bnRzIGV2ZXJ5IHBsdWdpblxuICAgKiBhdCBgL2FwaS88cGx1Z2luLm5hbWU+YCBhbmQgYHRoaXMubmFtZWAgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSxcbiAgICogc28gdGhlIHBlci1yb3V0ZSBzZWdtZW50cyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgaGFuZyBvZmYgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7dGhpcy5uYW1lfWA7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFB1Ymxpc2hpbmcgYGJhc2VQYXRoYCBpcyBlbm91Z2ggZm9yIHRoZSBjbGllbnQgdG8gc3RheSBjb3JyZWN0IHVuZGVyIGFcbiAgICAvLyBjdXN0b20gbW91bnQgaWQ6IHRoZSBwZXItcm91dGUgc2VnbWVudHMgYXJlIGZpeGVkXG4gICAgLy8gKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGFuZCB0aGUgY2xpZW50IChgTWFzdHJhUGx1Z2luQ2xpZW50YCkgZGVyaXZlc1xuICAgIC8vIGV2ZXJ5IGVuZHBvaW50IGZyb20gYGJhc2VQYXRoYC5cbiAgICAvLyBSZXR1cm4gd2lkZW5zIHRvIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgdG8gc2F0aXNmeSB0aGVcbiAgICAvLyBiYXNlLWNsYXNzIHNpZ25hdHVyZTsgY29uc3VtZXJzIHJlYWQgaXQgdGhyb3VnaCB0aGUgdHlwZWRcbiAgICAvLyBgTWFzdHJhQ2xpZW50Q29uZmlnYCBzaGFwZSB2aWEgYHVzZVBsdWdpbkNsaWVudENvbmZpZzwuLi4+KC4uLilgLlxuICAgIGNvbnN0IGNvbmZpZzogTWFzdHJhQ2xpZW50Q29uZmlnID0ge1xuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lELFxuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgLy8gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBjaGF0IHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlblxuICAgICAgLy8gdGhlIGFwcCwgc28gYSBVSSB0aGF0IGhpZGVzIGNoYXQgYmVoaW5kIGFuIE9CTy10b2tlbiBwcm9iZSBzaG91bGQgc2hvd1xuICAgICAgLy8gaXQgcmVnYXJkbGVzcy4gYFwidXNlclwiYCBtb2RlIGtlZXBzIHRoZSBPQk8tZ2F0ZWQgYmVoYXZpb3IuXG4gICAgICBjaGF0QWx3YXlzQXZhaWxhYmxlOiB0aGlzLmlkZW50aXR5TW9kZSA9PT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbmZpZyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdXNlciBmZWVkYmFjayBjYW4gYmUgbG9nZ2VkIHRvIE1MZmxvdy4gRGVsZWdhdGVzIHRvXG4gICAqIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfSBzbyB0aGUgY2xpZW50LWNvbmZpZyBmbGFnIGFuZCB0aGVcbiAgICogZmVlZGJhY2sgcm91dGUgc2hhcmUgdGhlIHNhbWUgZ2F0ZSBhcyB0aGUgc2VydmVyJ3MgdHJhY2UtaWQgaGVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmZWVkYmFja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVGZWVkYmFja0VuYWJsZWQodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJGZWVkYmFja1JvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXIpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIFVSTCBhbGlhc2VzIGZvciBNYXN0cmEncyBNQ1AgdHJhbnNwb3J0cy4gKi9cbiAgcHJpdmF0ZSByZWdpc3Rlck1jcFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBFeHBvc2UgdGhlIE1DUCB0cmFuc3BvcnQgYXQgdGhlIGNsZWFuIGAvbWNwYCAocGx1cyB0aGUgbGVnYWN5XG4gICAgLy8gYC9zc2VgICsgYC9tZXNzYWdlc2ApIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIGBAbWFzdHJhL2V4cHJlc3NgXG4gICAgLy8gbW91bnRzIE1DUCB1bmRlciBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YCwgYW5kIHRoZSBzZXJ2ZXJJZFxuICAgIC8vIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSwgc28gdGhlIHJhdyByb3V0ZSByZWFkc1xuICAgIC8vIGAvYXBpL21hc3RyYS9tY3AvbWFzdHJhL21jcGAgKGRvdWJsZWQgc2VnbWVudCkuIFRoaXMgcnVucyBiZWZvcmVcbiAgICAvLyB0aGUgY2F0Y2gtYWxsIGFuZCByZXdyaXRlcyB0aGUgYWxpYXMgdG8gdGhlIHVuZGVybHlpbmcgcm91dGUsIHNvXG4gICAgLy8gdGhlIHB1YmxpYyBwYXRoIGlzIGp1c3QgYC9hcGkvPHBsdWdpbj4vbWNwYDsgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIC8vIChlLmcuIHRoZSBTU0UgYHNlc3Npb25JZGApIGlzIHByZXNlcnZlZC5cbiAgICAvL1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiBpdCByZXdyaXRlcyB0aGUgVVJMIGZvciByb3V0ZXNcbiAgICAvLyBgQG1hc3RyYS9leHByZXNzYCBvd25zIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gaW5zdGVhZCBvZiBhbnN3ZXJpbmcgdGhlXG4gICAgLy8gcmVxdWVzdCwgd2hpY2ggYFJvdXRlQ29uZmlnYCBoYXMgbm8gc2hhcGUgZm9yLlxuICAgIHJvdXRlci51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tY3BSb3V0ZUFsaWFzKHJlcS5wYXRoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlcS51cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgIHJlcS51cmwgPSBxID49IDAgPyB0YXJnZXQgKyByZXEudXJsLnNsaWNlKHEpIDogdGFyZ2V0O1xuICAgICAgfVxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIG1vZGVsIGNhdGFsb2d1ZSBhbmQgcGVyLWFnZW50IGRlZmF1bHQtbW9kZWwgcm91dGVzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvbW9kZWxzYCBleHBvc2VzIHRoZSBjYWNoZWQgZW5kcG9pbnQgbGlzdCBzbyBjbGllbnRzIGNhblxuICAgIC8vIHBvcHVsYXRlIG1vZGVsIHBpY2tlcnMsIHZhbGlkYXRlIGA/bW9kZWw9YCBjaG9pY2VzLCBldGMuIE11c3RcbiAgICAvLyBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2F0Y2gtYWxsIHRoYXQgZm9yd2FyZHMgZXZlcnl0aGluZyB0b1xuICAgIC8vIHRoZSBNYXN0cmEgc3ViYXBwLlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1vZGVsc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubW9kZWxzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcIm1vZGVsc1wiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IGVuZHBvaW50czogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvZGVmYXVsdC1tb2RlbGAgKGFuZCBgL2RlZmF1bHQtbW9kZWwvOmFnZW50SWRgKSByZXBvcnRzIHdoYXQgYW5cbiAgICAvLyB1bnBpbm5lZCB0dXJuIHdpbGwgdXNlLiBBIGNvbmZpZ3VyZWQgc3RyaW5nIGlzIHJldHVybmVkIGRpcmVjdGx5OyBhblxuICAgIC8vIGF1dG9tYXRpYyBkZWZhdWx0IHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVFxuICAgIC8vIChvciBnZW5lcmFsIGNoYXQgZmFsbGJhY2spIGZyb20gdGhlIHNhbWUgT0JPLXNjb3BlZCBsaXZlIGNhdGFsb2d1ZSBhc1xuICAgIC8vIGAvbW9kZWxzYDsgYSBjdXN0b20gZHluYW1pYyByZXNvbHZlciByZW1haW5zIG51bGwgYmVjYXVzZSBpdCBpcyBjYWxsLXRpbWVcbiAgICAvLyBhcHBsaWNhdGlvbiBjb2RlLlxuICAgIGNvbnN0IGhhbmRsZURlZmF1bHRNb2RlbCA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFnZW50SWQpO1xuICAgICAgaWYgKHJlcXVlc3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5idWlsdD8uYWdlbnRzW3JlcXVlc3RlZF0pIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogdGhpcy51bmtub3duQWdlbnRNZXNzYWdlKHJlcXVlc3RlZCkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZW50SWQgPSByZXF1ZXN0ZWQgPz8gdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG4gICAgICBjb25zdCBpbnRlbnQgPSB0aGlzLmJ1aWx0Py5kZWZhdWx0TW9kZWxzW2FnZW50SWRdO1xuICAgICAgbGV0IG1vZGVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiY29uZmlndXJlZFwiKSB7XG4gICAgICAgIG1vZGVsID0gaW50ZW50Lm1vZGVsO1xuICAgICAgfSBlbHNlIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImRlZmF1bHQtbW9kZWxcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtb2RlbCA9IHJlc29sdmVEZWZhdWx0TW9kZWxJZCh0aGlzLmNvbmZpZywgcmVzdWx0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXMuanNvbih7XG4gICAgICAgIGFnZW50SWQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBkaXNwbGF5TmFtZTogbW9kZWwgPyBkaXNwbGF5LnRvTW9kZWxEaXNwbGF5TmFtZShtb2RlbCkgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWx9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2VuZXJpYyBjaGFydCBhbmQgc3RhdGVtZW50IGVtYmVkIHJlc29sdmVyLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCBpcyB0aGUgc2luZ2xlIHJlc29sdmVyIGZvciBldmVyeSBlbWJlZFxuICAgIC8vIG1hcmtlciB0aGUgYWdlbnQgZW1pdHMgaW4gcHJvc2UgKGBbY2hhcnQ6PGlkPl1gLFxuICAgIC8vIGBbZGF0YTo8aWQ+XWAsIC4uLikuIGA6dHlwZWAgc2VsZWN0cyBhIHJlc29sdmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0cnkgYmVsb3c7IGA6aWRgIGlzIHRoYXQgcmVzb2x2ZXIncyBsb29rdXAga2V5LiBUaGVcbiAgICAvLyBncmFtbWFyIChzZWUgYG1hcmtlci50c2ApIGlzIHR5cGUtYWdub3N0aWMgb24gcHVycG9zZSAtIG5ld1xuICAgIC8vIGVtYmVkIGtpbmRzIGFyZSBhZGRlZCBieSByZWdpc3RlcmluZyBhIHJlc29sdmVyIGhlcmUsIHdpdGggbm9cbiAgICAvLyBjbGllbnQgb3IgZ3JhbW1hciBjaGFuZ2UuXG4gICAgLy9cbiAgICAvLyBTdGF0dXMgY29kZXM6XG4gICAgLy8gICAtIDIwMCB3aXRoIHRoZSByZXNvbHZlcidzIEpTT04gYm9keSB3aGVuIHRoZSBpZCByZXNvbHZlcy5cbiAgICAvLyAgIC0gNDA0IHdoZW4gYDp0eXBlYCBpc24ndCByZWdpc3RlcmVkICh1bnN1cHBvcnRlZCBlbWJlZFxuICAgIC8vICAgICB0eXBlKSBPUiBhIHJlZ2lzdGVyZWQgcmVzb2x2ZXIgY2FuJ3QgZmluZCBgOmlkYCAodW5rbm93blxuICAgIC8vICAgICAvIGV4cGlyZWQgLSBlLmcuIGEgY2hhcnQgcGFzdCBpdHMgMWggVFRMIG9yIGEgZmFicmljYXRlZFxuICAgIC8vICAgICBpZCB0aGUgbW9kZWwgbmV2ZXIgbWludGVkKS5cbiAgICAvLyAgIC0gNDAwIHdoZW4gYDppZGAgaXMgZW1wdHkuXG4gICAgLy9cbiAgICAvLyBQZXItdHlwZSBxdWVyeSBrbm9icyBhbmQgYmVoYXZpb3I6XG4gICAgLy8gICAtIGBjaGFydGA6IGxvbmctcG9sbHMgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeVxuICAgIC8vICAgICBzZXR0bGVzIChgcmVzdWx0YCAvIGBlcnJvcmApIG9yIHRoZSBidWRnZXQgZWxhcHNlcyAodGhlblxuICAgIC8vICAgICByZXR1cm5zIHRoZSBzdGlsbC1wcm9jZXNzaW5nIGVudHJ5IHRvIHBvbGwgYWdhaW4pLlxuICAgIC8vICAgICBgP3RpbWVvdXRNcz08bj5gIChkZWZhdWx0IDYwcywgY2FwcGVkIDVtaW4pIHR1bmVzIGl0LlxuICAgIC8vICAgLSBgZGF0YWA6IG9uZSBPQk8tc2NvcGVkIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2guXG4gICAgLy8gICAgIGA/bGltaXQ9PG4+YCBjYXBzIHJvd3MgKGNsYW1wZWQgdG8gU1RBVEVNRU5UX1JPV19DQVApLlxuICAgIC8vXG4gICAgLy8gQnVpbHQgb25jZSAodGhpcyBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgb25jZSkgYW5kIGtleWVkIGJ5IHRoZVxuICAgIC8vIHJhdyBgOnR5cGVgIHRva2VuLiBFYWNoIHJlc29sdmVyIGdldHMgdGhlIHJlcXVlc3QgKGZvciBxdWVyeVxuICAgIC8vIHBhcnNpbmcgKyBPQk8gc2NvcGluZykgYW5kIGFuIGBBYm9ydFNpZ25hbGAgYnJpZGdlZCBvZmYgdGhlXG4gICAgLy8gY29ubmVjdGlvbiBgY2xvc2VgIGV2ZW50IHNvIGEgbG9uZy1wb2xsIHVuYmxvY2tzIHRoZSBpbnN0YW50XG4gICAgLy8gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gYHVuZGVmaW5lZGAgZnJvbSBhIHJlc29sdmVyIG1hcHMgdG8gYVxuICAgIC8vIGNsZWFuIDQwNDsgdGhyb3duIGVycm9ycyBidWJibGUgdGhyb3VnaCBgbmV4dChlcnIpYC5cbiAgICBjb25zdCBlbWJlZFJlc29sdmVyczogUmVjb3JkPHN0cmluZywgRW1iZWRSZXNvbHZlcj4gPSB7XG4gICAgICBjaGFydDogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBwYXJzZVRpbWVvdXRNcyhyZXEucXVlcnkudGltZW91dE1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoQ2hhcnRFbnRyeShyZXEsIGlkLCB7XG4gICAgICAgICAgLi4uKHRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGRhdGE6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZVN0YXRlbWVudExpbWl0KHJlcS5xdWVyeS5saW1pdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN0YXRlbWVudChpZCwge1xuICAgICAgICAgIC4uLihsaW1pdCAhPT0gdW5kZWZpbmVkID8geyBsaW1pdCB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJlbWJlZFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZW1iZWR9Lzp0eXBlLzppZGAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50eXBlKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBpZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5pZCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSBlbWJlZFJlc29sdmVyc1t0eXBlXTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOnVuc3VwcG9ydGVkXCIsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYHVuc3VwcG9ydGVkIGVtYmVkIHR5cGU6ICR7dHlwZX1gIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOmludmFsaWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IFwiaWQgaXMgcmVxdWlyZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwcmVzcydzIGByZXFgIHByZWRhdGVzIGBBYm9ydFNpZ25hbGA7IGJyaWRnZSB0aGUgYGNsb3NlYFxuICAgICAgICAvLyBldmVudCBvbnRvIGFuIGBBYm9ydENvbnRyb2xsZXJgIHNvIGEgY2xvc2VkIGNvbm5lY3Rpb25cbiAgICAgICAgLy8gdW5ibG9ja3MgYW55IGxvbmctcG9sbCBpbW1lZGlhdGVseSBhbmQgZnJlZXMgdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gdGhyZWFkLiBUaGUgbGlzdGVuZXIgaXMgR0MnZCB3aXRoIHRoZSByZXF1ZXN0IG9uIG5vcm1hbFxuICAgICAgICAvLyBjb21wbGV0aW9uLlxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICByZXEub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlKHJlcSwgaWQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBgZW1iZWQ6JHt0eXBlfWAsIGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgJHt0eXBlfSBlbWJlZGApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEEgY2FjaGUgbWlzcyBpcyBzZWN1cml0eS1kZWxpYmVyYXRlbHkgYW1iaWd1b3VzOiB1bmtub3duLCBleHBpcmVkLFxuICAgICAgICAgIC8vIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHkgYWxsIG1hcCB0byB0aGUgc2FtZSA0MDQuIExvZyB0aGVcbiAgICAgICAgICAvLyBvcGFxdWUgaWQgYW5kIHRob3NlIHBvc3NpYmxlIGNhdXNlcyBzbyBhIGZhYnJpY2F0ZWQgbWFya2VyIGlzXG4gICAgICAgICAgLy8gZGlhZ25vc2FibGUgZnJvbSB0aGUgc2VydmVyIHdpdGhvdXQgZGlzY2xvc2luZyB3aGljaCBjYXVzZSBhcHBsaWVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGVtYmVkOiR7dHlwZX06bm90LWZvdW5kYCwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bmtub3duLCBleHBpcmVkLCBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYCR7dHlwZX0gbm90IGZvdW5kYCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBkZWZhdWx0IGFuZCBhZ2VudC1xdWFsaWZpZWQgc3VnZ2VzdGlvbiByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJTdWdnZXN0aW9uUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL3N1Z2dlc3Rpb25zYCAoYW5kIGAvc3VnZ2VzdGlvbnMvOmFnZW50SWRgKSByZXR1cm5zIHRoZVxuICAgIC8vIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgZm9yIHRoZSBhZ2VudCdzIEdlbmllIHNwYWNlKHMpIC0gdGhlXG4gICAgLy8gYXV0aG9yLWNvbmZpZ3VyZWQgYHNhbXBsZV9xdWVzdGlvbnNgLCBzdXJmYWNlZCBhcyBvbmUtdGFwXG4gICAgLy8gcHJvbXB0cyBvbiB0aGUgY2hhdCBlbXB0eSBzdGF0ZS4gUmV0dXJucyBgeyBxdWVzdGlvbnM6IFtdIH1gXG4gICAgLy8gd2hlbiBubyBHZW5pZSBzcGFjZSBpcyB3aXJlZCBzbyB0aGUgY2xpZW50IHJlbmRlcnMgYSBiYXJlXG4gICAgLy8gZW1wdHkgc3RhdGUgKG5vIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cykuIFRoZSBgOmFnZW50SWRgXG4gICAgLy8gc2VnbWVudCBpcyBhY2NlcHRlZCBmb3IgVVJMIHN5bW1ldHJ5IHdpdGggdGhlIGNoYXQgLyBoaXN0b3J5XG4gICAgLy8gcm91dGVzOyBHZW5pZSBzcGFjZXMgYXJlIHJlc29sdmVkIHBlci1wbHVnaW4sIG5vdCBwZXItYWdlbnQsXG4gICAgLy8gc28gaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4gT0JPLXNjb3BlZCBsaWtlIHRoZSBvdGhlclxuICAgIC8vIGRhdGEgcm91dGVzIHNvIHRoZSBzcGFjZSBsb29rdXAgcnVucyBhcyB0aGUgY2FsbGluZyB1c2VyLlxuICAgIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVxLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3VnZ2VzdGlvbnMoY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIC8vIFN1Z2dlc3Rpb25zIGFyZSBhIG5vbi1jcml0aWNhbCBlbmhhbmNlbWVudDsgYSBsb29rdXAgZmFpbHVyZSBzaG91bGRcbiAgICAgICAgLy8gbGVhdmUgdGhlIGNoYXQgdXNhYmxlIHdpdGggYSBiYXJlIGVtcHR5IHN0YXRlIHJhdGhlciB0aGFuIHN1cmZhY2luZ1xuICAgICAgICAvLyB0aGUgdXBzdHJlYW0gc3RhdHVzLiBMb2cgYW5kIGRlZ3JhZGUuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczplcnJvclwiLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiBbXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5kYXRhIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5zdWdnZXN0aW9uc30vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgTUxmbG93IGZlZWRiYWNrIHN1Ym1pc3Npb24gd2hlbiBjb25maWd1cmVkLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYFBPU1QgL3JvdXRlL2ZlZWRiYWNrYCBsb2dzIGEgdGh1bWJzIC8gY29tbWVudCBhc3Nlc3NtZW50IGFnYWluc3RcbiAgICAvLyBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgKHRoZSBgdHJhY2VJZGAgdGhlIGNsaWVudCBjYXB0dXJlZCBmcm9tIHRoZVxuICAgIC8vIHN0cmVhbSByZXNwb25zZSdzIHRyYWNlLWlkIGhlYWRlcikuIFJlZ2lzdGVyZWQgb24gdGhlIEFwcEtpdFxuICAgIC8vIHJvdXRlciAobGlrZSBgL21vZGVsc2ApIHJhdGhlciB0aGFuIHRoZSBNYXN0cmEgc3ViYXBwIHNvIGl0IHJ1bnNcbiAgICAvLyB1bmRlciB0aGUgc2FtZSBPQk8gc2NvcGUgLSB0aGUgZmVlZGJhY2sgaXMgYXR0cmlidXRlZCB0byB0aGVcbiAgICAvLyBzaWduZWQtaW4gdXNlci4gUmV0dXJucyA0MDQgd2hlbiBmZWVkYmFjayBpcyBkaXNhYmxlZCBzbyB0aGVcbiAgICAvLyBjbGllbnQgdHJlYXRzIHRoZSBjYXBhYmlsaXR5IGFzIGFic2VudDsgNDAwIG9uIGEgbWFsZm9ybWVkIGJvZHkuXG4gICAgLy8gQSByZWNvcmRlZCBhc3Nlc3NtZW50IHlpZWxkcyBgeyBvazogdHJ1ZSB9YDsgYSBzb2Z0IGZhaWx1cmUgKG1vc3RcbiAgICAvLyBvZnRlbiB0aGUgdHJhY2UgaGFzbid0IGZpbmlzaGVkIGV4cG9ydGluZyB0byBNTGZsb3cgeWV0KSB5aWVsZHNcbiAgICAvLyBgeyBvazogZmFsc2UgfWAgd2l0aG91dCBhIDV4eCBzbyB0aGUgVUkgY2FuIHByb21wdCBhIHJldHJ5LlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImZlZWRiYWNrXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZmVlZGJhY2ssXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGZlZWRiYWNrLk1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgLy8gQSBab2QgaXNzdWUgc3RyaW5nIHF1b3RlcyB0aGUgcmVjZWl2ZWQgYm9keSBiYWNrLCBzbyBvbmx5IHRoZVxuICAgICAgICAgIC8vIG9mZmVuZGluZyBmaWVsZCBuYW1lcyB0cmF2ZWw7IHRoZSBmdWxsIGlzc3VlIGxpc3QgaXMgbG9nZ2VkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmZWVkYmFjazppbnZhbGlkXCIsIHsgZXJyb3I6IHBhcnNlZC5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UsXG4gICAgICAgICAgICBmaWVsZHM6IGludmFsaWRGaWVsZHMocGFyc2VkLmVycm9yKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubG9nRmVlZGJhY2socGFyc2VkLmRhdGEpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZmVlZGJhY2tcIiwgXCJGZWVkYmFjayBjb3VsZCBub3QgYmUgcmVjb3JkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9IHJlc3VsdC5kYXRhO1xuICAgICAgICByZXMuanNvbih7XG4gICAgICAgICAgb2s6IGFzc2Vzc21lbnRJZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLihhc3Nlc3NtZW50SWQgPyB7IGFzc2Vzc21lbnRJZCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIGdhdGVkIE1hc3RyYSBjYXRjaC1hbGwgYWZ0ZXIgZXZlcnkgZXhwbGljaXQgcm91dGUuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogdGhpcyBpcyB0aGUgY2F0Y2gtYWxsIHRoYXQgaGFuZHNcbiAgICAvLyBldmVyeSByZW1haW5pbmcgbWV0aG9kIC8gcGF0aCBwYWlyIHRvIHRoZSBNYXN0cmEgc3ViLWFwcCwgc28gaXQgaGFzIG5vXG4gICAgLy8gc2luZ2xlIG1ldGhvZCBvciBwYXRoIHRvIHJlZ2lzdGVyIHVuZGVyLlxuICAgIHJvdXRlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWFzdHJhQXBwKSByZXR1cm4gcmVzLnN0YXR1cyg1MDMpLmVuZCgpO1xuICAgICAgLy8gR2F0ZSB0aGUgc3RvY2sgTWFzdHJhIHN1cmZhY2UgYmVmb3JlIGRpc3BhdGNoLiBJbiB0aGUgZGVmYXVsdFxuICAgICAgLy8gXCJzY29wZWRcIiBtb2RlIG9ubHkgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICAgIC8vIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCByZWFjaCBNYXN0cmE7XG4gICAgICAvLyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzIGFyZSByZWZ1c2VkIGhlcmUuIGByZXEucGF0aGBcbiAgICAgIC8vIGlzIG1vdW50LXJlbGF0aXZlIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIFNlZSBgc2VydmVyLnRzYC5cbiAgICAgIGlmIChcbiAgICAgICAgIWlzTWFzdHJhUmVxdWVzdEFsbG93ZWQocmVxLm1ldGhvZCwgcmVxLnBhdGgsIHtcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgICAgIC8vIFJlZmxlY3QgdGhlICpyZXNvbHZlZCogTUNQIHN0YXRlLCBub3QgcmF3IGBjb25maWcubWNwYDogTUNQIGlzXG4gICAgICAgICAgLy8gb24gYnkgZGVmYXVsdCAoYGNvbmZpZy5tY3BgIHVuZGVmaW5lZCksIHNvIGdhdGUgb24gd2hldGhlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2ZXIgd2FzIGFjdHVhbGx5IGJ1aWx0IGFuZCBtb3VudGVkLlxuICAgICAgICAgIG1jcEVuYWJsZWQ6IHRoaXMubWNwICE9PSBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwiRW5kcG9pbnQgbm90IGV4cG9zZWQgdG8gdGhlIGNsaWVudCAoYXBpQWNjZXNzPXNjb3BlZClcIiB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggdGhyb3VnaCBhIHJlYWwgbWV0aG9kLCBOT1QgdGhlIGBtYXN0cmFBcHBgIHByb3BlcnR5LiBUaGVcbiAgICAgIC8vIEFwcEtpdCBgYXNVc2VyKHJlcSlgIHByb3h5IHdyYXBzIGZ1bmN0aW9uLXZhbHVlZCBwcm9wcyB3aXRoXG4gICAgICAvLyBgdmFsdWUuYmluZCh0YXJnZXQpYC4gYG1hc3RyYUFwcGAgaXMgYW4gZXhwcmVzcyBhcHAgd2hvc2UgYC5iaW5kYCBpc1xuICAgICAgLy8gdGhlIEhUVFAgQklORCByb3V0ZSByZWdpc3RyYXIgKGV4cHJlc3MgZGVmaW5lcyBhIG1ldGhvZCBwZXIgSFRUUCB2ZXJiLFxuICAgICAgLy8gYW5kIEJJTkQgaXMgb25lKSwgbm90IGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgLSBzbyBiaW5kaW5nIGl0IHRocm91Z2hcbiAgICAgIC8vIHRoZSBwcm94eSByZWdpc3RlcnMgYSBib2d1cyByb3V0ZSBhbmQgY3Jhc2hlcyBgcGF0aFRvUmVnZXhwYFxuICAgICAgLy8gKFwicGF0aCBtdXN0IGJlIGEgc3RyaW5nIC4uLlwiKS4gVGhpcyBvbmx5IG1hbmlmZXN0cyBpbiBwcm9kdWN0aW9uIHdoZXJlXG4gICAgICAvLyBhbiBPQk8gdG9rZW4gbWFrZXMgYHNjb3BlZFNlbGZgIHJldHVybiB0aGUgcHJveHkuIGBkaXNwYXRjaE1hc3RyYWBcbiAgICAgIC8vIGlzIGEgcGxhaW4gbWV0aG9kIChpdHMgYC5iaW5kYCBpcyB0aGUgbm9ybWFsIG9uZSkgYW5kIGludm9rZXNcbiAgICAgIC8vIGB0aGlzLm1hc3RyYUFwcGAgb2ZmIHRoZSByZWFsIHRhcmdldCwga2VlcGluZyB0aGUgT0JPIHNjb3BlIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5kaXNwYXRjaE1hc3RyYShyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IG9udG8gdGhlIHJlc3BvbnNlOiB0aGUgc3RhdHVzIHRoZVxuICAgKiBleGVjdXRpb24gcGlwZWxpbmUgcmVzb2x2ZWQsIHBhaXJlZCB3aXRoIGBjbGllbnRNZXNzYWdlYCByYXRoZXIgdGhhbiB0aGVcbiAgICogcmVzdWx0J3Mgb3duIHRleHQsIHdoaWNoIGNhbiBjYXJyeSB1cHN0cmVhbSBkZXRhaWwuIFRoZSBmdWxsIG1lc3NhZ2UgaXNcbiAgICogbG9nZ2VkIHVuZGVyIGA8b3BlcmF0aW9uPjplcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIHNlbmRGYWlsdXJlKFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXN1bHQ6IHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGNsaWVudE1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIud2FybihgJHtvcGVyYXRpb259OmVycm9yYCwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHJlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXMpLmpzb24oeyBlcnJvcjogY2xpZW50TWVzc2FnZSB9KTtcbiAgfVxuXG4gIC8qKiA0MDQgYm9keSBmb3IgYSByZXF1ZXN0IG5hbWluZyBhbiBhZ2VudCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuICovXG4gIHByaXZhdGUgdW5rbm93bkFnZW50TWVzc2FnZShhZ2VudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pO1xuICAgIHJldHVybiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cIi4gUmVnaXN0ZXJlZCBhZ2VudHM6ICR7cmVnaXN0ZXJlZC5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIE1hc3RyYSBleHByZXNzIHN1Yi1hcHAuIEV4aXN0cyBhcyBhIG1ldGhvZCAoaW5zdGVhZCBvZiByZWFkaW5nXG4gICAqIGB0aGlzLm1hc3RyYUFwcGAgdGhyb3VnaCB0aGUgYGFzVXNlcihyZXEpYCBwcm94eSBhdCB0aGUgY2FsbCBzaXRlKSBzbyB0aGVcbiAgICogcHJveHkgYmluZHMgdGhpcyBwbGFpbiBtZXRob2QgLSB3aG9zZSBgLmJpbmRgIGlzIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGBcbiAgICogLSByYXRoZXIgdGhhbiB0aGUgZXhwcmVzcyBhcHAsIHdob3NlIGAuYmluZGAgaXMgdGhlIEhUVFAgQklORCByb3V0ZVxuICAgKiByZWdpc3RyYXIgKHNlZSB0aGUgbm90ZSBpbiBgaW5qZWN0Um91dGVzYCkuIFJ1bnMgaW5zaWRlIHRoZSB1c2VyIHNjb3BlIHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTyBjbGllbnQgZm9yIHRoZSBhZ2VudC9tb2RlbFxuICAgKiByZXNvbHZlcnMuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWFzdHJhKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0cmFBcHAhKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBjbGVhbiwgbW91bnQtcmVsYXRpdmUgTUNQIGFsaWFzIHBhdGggdG8gdGhlIHVuZGVybHlpbmdcbiAgICogYEBtYXN0cmEvZXhwcmVzc2Agcm91dGUuIFJldHVybnMgYG51bGxgIHdoZW4gTUNQIGlzIG9mZiBvciB0aGUgcGF0aFxuICAgKiBpc24ndCBhbiBhbGlhcy4gQ29sbGFwc2VzIHRoZSBzdG9jayBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YFxuICAgKiBsYXlvdXQgKHNlcnZlcklkIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSkgZG93biB0byBgL21jcGAsXG4gICAqIGAvc3NlYCwgYW5kIGAvbWVzc2FnZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3BSb3V0ZUFsaWFzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tY3ApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkID0gdGhpcy5tY3Auc2VydmVySWQ7XG4gICAgaWYgKHBhdGggPT09IFwiL21jcFwiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWNwYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvc3NlXCIpIHJldHVybiBgL21jcC8ke2lkfS9zc2VgO1xuICAgIGlmIChwYXRoID09PSBcIi9tZXNzYWdlc1wiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWVzc2FnZXNgO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvc3VnZ2VzdGlvbnNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIEdlbmllIHNwYWNlcyBhbmQgbWVyZ2VzXG4gICAqIHRoZWlyIGN1cmF0ZWQgYHNhbXBsZV9xdWVzdGlvbnNgIChzZWUge0BsaW5rIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zfSkuXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIEdlbmllIHNwYWNlIGlzIGNvbmZpZ3VyZWQgc28gdGhlIGNsaWVudFxuICAgKiBzaG93cyBhIGJhcmUgZW1wdHkgc3RhdGUgaW5zdGVhZCBvZiBidWlsdC1pbiBleGFtcGxlIHByb21wdHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3VnZ2VzdGlvbnMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmdbXT4+IHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXModGhpcy5jb25maWcsIHRoaXMuY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogW10gfTtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKHNpZ25hbCwgZXhlY3V0ZVNpZ25hbCk7XG4gICAgICByZXR1cm4gY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMoe1xuICAgICAgICBzcGFjZXMsXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9yb3V0ZS9mZWVkYmFja2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZVxuICAgKiBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlXG4gICAqIE9CTy1zY29wZWQgY2xpZW50IGFuZCB0aGUgYXNzZXNzbWVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW5cbiAgICogdXNlciAodGhlaXIgZW1haWwgLyBpZCBhcyB0aGUgYXNzZXNzbWVudCBzb3VyY2UpLiBSZXR1cm5zIHRoZVxuICAgKiBjcmVhdGVkIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgb24gYSBzb2Z0IGZhaWx1cmVcbiAgICogKHNlZSB7QGxpbmsgbG9nRmVlZGJhY2t9IGluIGAuL21sZmxvdy5qc2ApLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2dGZWVkYmFjayhcbiAgICBmZWVkYmFjazogTWFzdHJhRmVlZGJhY2tSZXF1ZXN0LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmcgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHNvdXJjZUlkID1cbiAgICAgIFwidXNlckVtYWlsXCIgaW4gY3R4ICYmIGN0eC51c2VyRW1haWxcbiAgICAgICAgPyBjdHgudXNlckVtYWlsXG4gICAgICAgIDogXCJ1c2VySWRcIiBpbiBjdHhcbiAgICAgICAgICA/IGN0eC51c2VySWRcbiAgICAgICAgICA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAoKSA9PlxuICAgICAgICBsb2dGZWVkYmFjayhjdHguY2xpZW50LCB7XG4gICAgICAgICAgLi4uZmVlZGJhY2ssXG4gICAgICAgICAgLi4uKHNvdXJjZUlkID8geyBzb3VyY2VJZCB9IDoge30pLFxuICAgICAgICB9KSxcbiAgICAgIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBkYXRhYCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvZGF0YS86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAgICogY2xpZW50LCB0aGVuIHJldXNlcyB0aGUgc2FtZSBgZmV0Y2hTdGF0ZW1lbnREYXRhYCBwaXBlbGluZVxuICAgKiB0aGUgYGdldF9zdGF0ZW1lbnRgIHRvb2wgcnVucyBzbyB0aGUgTExNIGFuZCB0aGUgVUkgc2VlIHRoZVxuICAgKiBleGFjdCBzYW1lIHNoYXBlIGZvciB0aGUgc2FtZSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGRhdGEgZm9yIHVwc3RyZWFtIDQwNHMgc28gdGhlIHJvdXRlIGNhbiBtYXAgdGhlbVxuICAgKiB0byBhIGNsZWFuIEhUVFAgNDA0OyBhbnkgb3RoZXIgZmFpbHVyZSBjb21lcyBiYWNrIGFzIGEgbm9uLWBva2AgcmVzdWx0XG4gICAqIGNhcnJ5aW5nIHRoZSBzdGF0dXMgdG8gYW5zd2VyIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3RhdGVtZW50KFxuICAgIHN0YXRlbWVudElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTdGF0ZW1lbnREYXRhIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihvcHRpb25zLmxpbWl0ID8/IFNUQVRFTUVOVF9ST1dfQ0FQLCBTVEFURU1FTlRfUk9XX0NBUCk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnREYXRhKGNsaWVudCwgc3RhdGVtZW50SWQsIHtcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUaGUgRGF0YWJyaWNrcyBTREsgdGhyb3dzIG9uIDQwNDsgc3VyZmFjZSBhcyBgdW5kZWZpbmVkYFxuICAgICAgICAgIC8vIHNvIHRoZSByb3V0ZSBtYXBzIHRvIGEgY2xlYW4gSFRUUCA0MDQgaW5zdGVhZCBvZiBhIDUwMC5cbiAgICAgICAgICBpZiAoZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LFxuICAgICAgICAgIC8vIE5hbWVzcGFjZWQgc28gdGhlIGtleSBjYW4ndCBjb2xsaWRlIHdpdGggYW5vdGhlciBjYWNoZSBzaGFyaW5nIHRoZVxuICAgICAgICAgIC8vIG1hbmFnZXIsIGFuZCBrZXllZCBvbiBgbGltaXRgIGJlY2F1c2UgdGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgLy8gcGF5bG9hZC5cbiAgICAgICAgICBjYWNoZToge1xuICAgICAgICAgICAgLi4uc3RhdGVtZW50RGF0YURlZmF1bHRzLmRlZmF1bHQuY2FjaGUsXG4gICAgICAgICAgICBjYWNoZUtleTogW1NUQVRFTUVOVF9DQUNIRV9OQU1FU1BBQ0UsIHN0YXRlbWVudElkLCBsaW1pdF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgY2hhcnRgIGVtYmVkIHJlc29sdmVyXG4gICAqIChgR0VUIC9lbWJlZC9jaGFydC86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gdGhlXG4gICAqIGxvb2t1cCBpcyBuYW1lc3BhY2VkIHRvIHRoZSBjYWxsaW5nIGlkZW50aXR5OiBhIGNoYXJ0IG1pbnRlZCBmb3IgYW5vdGhlclxuICAgKiB1c2VyIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZCwgYW5kIHRoZSByb3V0ZSBhbnN3ZXJzIDQwNC5cbiAgICpcbiAgICogVGhlIGtleSBpcyBidWlsdCBmcm9tIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSAtIHRoZSBzYW1lIHJ1bGUgdGhhdCBuYW1lZFxuICAgKiB0aGUgaWRlbnRpdHkgdGhlIGNoYXJ0IHdhcyB3cml0dGVuIHVuZGVyIC0gcmF0aGVyIHRoYW4gZnJvbSB0aGUgYW1iaWVudFxuICAgKiBleGVjdXRpb24gY29udGV4dCBhbG9uZS4gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBhbWJpZW50IGNvbnRleHQgaXNcbiAgICogdGhlIFNQIGZvciBldmVyeSBjYWxsZXIsIHNvIGtleWluZyBvZmYgaXQgYWxvbmUgbWlzc2VkIGV2ZXJ5IGNoYXJ0IHRoZVxuICAgKiB0dXJuIGhhZCB3cml0dGVuIHVuZGVyIHRoZSBmb3J3YXJkZWQgdXNlciBhbmQgdGhlIFVJIHNob3dlZCBlYWNoIG9uZSBhc1xuICAgKiBleHBpcmVkLiBgcmVxYCBpcyByZWFkIGluc2lkZSB0aGUgbWV0aG9kLCBub3QgYXQgdGhlIGNhbGwgc2l0ZSwgc28gdGhlXG4gICAqIGV4ZWN1dGlvbiBjb250ZXh0IGlzIHRoZSBzY29wZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYXJ0RW50cnkoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgY2hhcnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdGltZW91dE1zPzogbnVtYmVyOyBzaWduYWw6IEFib3J0U2lnbmFsIH0sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PENoYXJ0IHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IHVzZXJLZXkgPSBhdHRyaWJ1dGVkVXNlcklkKGdldEV4ZWN1dGlvbkNvbnRleHQoKSwgcmVxdWVzdFVzZXJJZChyZXEpKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKGV4ZWN1dGVTaWduYWwpID0+XG4gICAgICAgIGZldGNoQ2hhcnQoY2hhcnRJZCwge1xuICAgICAgICAgIHVzZXJLZXksXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNczogb3B0aW9ucy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWw6IGFzeW5jVXRpbHMuY29tYmluZUFib3J0U2lnbmFscyhvcHRpb25zLnNpZ25hbCwgZXhlY3V0ZVNpZ25hbCkgPz8gb3B0aW9ucy5zaWduYWwsXG4gICAgICAgIH0pLFxuICAgICAgY2hhcnRGZXRjaERlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9tb2RlbHNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0XG4gICAqIHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8tc2NvcGVkXG4gICAqIGNsaWVudCBhbmQgdGhlIGNhdGFsb2d1ZSByZWZsZWN0cyB3aGF0IHRoZSBjYWxsZXIgY2FuIGludm9rZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdE1vZGVsc1Jlc3VsdCgpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgY29uc3QgY2xpZW50ID0gY29udGV4dC5jbGllbnQ7XG4gICAgICBjb25zdCBjYWNoZUlkZW50aXR5ID0gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChjb250ZXh0KTtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgICAgcmV0dXJuIG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHtcbiAgICAgICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gICAgICAgIGNhY2hlSWRlbnRpdHksXG4gICAgICB9KTtcbiAgICB9LCBtb2RlbENhdGFsb2d1ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgbGlzdE1vZGVsc2AgZXhwb3J0LiBUaGUgcHJvZ3JhbW1hdGljIHN1cmZhY2VcbiAgICogY2FycmllcyBubyBzdGF0dXMgY29kZSwgc28gYSBmYWlsZWQgZXhlY3V0aW9uIGJlY29tZXMgYSB0aHJvdyB3aXRoIGFcbiAgICogc3RhYmxlIG1lc3NhZ2U7IHRoZSByb3V0ZXMgYnJhbmNoIG9uIHRoZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgIHRoaXMubG9nZ2VyLndhcm4oXCJsaXN0TW9kZWxzOmVycm9yXCIsIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRBZ2VudEFuZFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQZXItYWdlbnQgbWVtb3J5IGZhY3RvcnkuIFdoZW4gYW55IHN0b3JhZ2UgLyBtZW1vcnkgc2V0dGluZyBuZWVkc1xuICAgIC8vIFBvc3RncmVzLCBzdGFuZCB1cCBhIGRlZGljYXRlZCBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIGZpcnN0IHNvXG4gICAgLy8gbWVtb3J5IGFjdHMgYXMgdGhlIGFwcCBTUCAob3duZXIgb2YgdGhlIGBtYXN0cmFfKmAgc2NoZW1hcyksXG4gICAgLy8gbmV2ZXIgdGhlIHBlci1yZXF1ZXN0IE9CTyBpZGVudGl0eSB0aGUgY2hhdCB0dXJuIHJ1bnMgdW5kZXIuXG4gICAgLy8gYGdldFBnQ29uZmlnKClgIGlzIHJlYWQgaGVyZSwgb3V0c2lkZSBhbnkgYGFzVXNlcmAgc2NvcGUsIHNvIGl0XG4gICAgLy8gcmV0dXJucyB0aGUgU1AgY29ubmVjdGlvbiB0YXJnZXQgKyB0b2tlbiByZWZyZXNoIHBsdXMgYW55XG4gICAgLy8gYGxha2ViYXNlKHsgcG9vbCB9KWAgb3ZlcnJpZGVzOyBgcmVxdWlyZWAgdHVybnMgYSBtaXNzaW5nXG4gICAgLy8gc2libGluZyBpbnRvIGEgY2xlYXIgd2lyaW5nIGVycm9yLiBUaGUgYnVpbGRlciBjYWNoZXMgdGhlIHNoYXJlZFxuICAgIC8vIGBQZ1ZlY3RvcmAgc2luZ2xldG9uIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLiBTZWVcbiAgICAvLyBgLi9tZW1vcnkuanNgLlxuICAgIGlmIChuZWVkc0xha2ViYXNlKHRoaXMuY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3BQZ0NvbmZpZyA9IHBsdWdpblJlZ2lzdHJ5XG4gICAgICAgIC5yZXF1aXJlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UsIHRoaXMuY29uZmlnKVxuICAgICAgICAuZXhwb3J0cygpXG4gICAgICAgIC5nZXRQZ0NvbmZpZygpO1xuICAgICAgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCA9IGF3YWl0IGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sKHNwUGdDb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBtZW1vcnlCdWlsZGVyID0gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbFxuICAgICAgPyBjcmVhdGVNZW1vcnlCdWlsZGVyKHRoaXMuY29uZmlnLCB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCBldmVyeSBhZ2VudCBkZWNsYXJlZCBpbiBgY29uZmlnLmFnZW50c2AgKG9yIHRoZSBidWlsdC1pblxuICAgIC8vIGZhbGxiYWNrIHdoZW4gbm9uZSBhcmUgZGVjbGFyZWQpLiBFYWNoIGFnZW50J3MgYG1vZGVsYCByZXNvbHZlc1xuICAgIC8vIHdvcmtzcGFjZSBVUkwgKyBiZWFyZXIgYXQgY2FsbCB0aW1lIHNvIGNvbmN1cnJlbnQgcmVxdWVzdHMgZ2V0XG4gICAgLy8gZGlzdGluY3QgdXNlciBpZGVudGl0aWVzOyB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBhcm91bmRcbiAgICAvLyBgaGFuZGxlQ2hhdGAgaXMgd2hhdCBsZXRzIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybiB0aGVcbiAgICAvLyByaWdodCB1c2VyIGluc2lkZSB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gTWF0ZXJpYWxpemUgYW55IHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIE9OQ0UgYXQgc3RhcnR1cC4gUnVuc1xuICAgIC8vIG91dHNpZGUgYSByZXF1ZXN0IHNjb3BlLCBzbyBpdCB1c2VzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwncyBjbGllbnRcbiAgICAvLyBhbmQgZGVmYXVsdHMgdG8gdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlOyBhIHNvdXJjZVxuICAgIC8vIHRoYXQgbGFuZHMgb24gYSBsb2NhbCB0ZW1wIGRpciAobm8gd3JpdGFibGUgd29ya3NwYWNlKSBpcyBmb2xkZWQgaW50b1xuICAgIC8vIGV2ZXJ5IGRlZmF1bHQtd29ya3NwYWNlIGFnZW50IHZpYSBgZXh0cmFTa2lsbFBhdGhzYC5cbiAgICBjb25zdCBwcm92aXNpb25lZCA9IGF3YWl0IHByb3Zpc2lvblJlbW90ZVNraWxscyh0aGlzLmNvbmZpZy5yZW1vdGVTa2lsbHMpO1xuICAgIGlmIChwcm92aXNpb25lZC5za2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGxzIGNvbmZpZ3VyZWRcIiwge1xuICAgICAgICBza2lsbHM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgICAgIGRhdGFicmlja3NCYXNlUGF0aDogcHJvdmlzaW9uZWQuZGF0YWJyaWNrc0Jhc2VQYXRoLFxuICAgICAgICBsb2NhbFNraWxsUGF0aHM6IHByb3Zpc2lvbmVkLmxvY2FsU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWx0ID0gYXdhaXQgYnVpbGRBZ2VudHMoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIG1lbW9yeUJ1aWxkZXIsXG4gICAgICBsb2c6IHRoaXMubG9nZ2VyLFxuICAgICAgZXh0cmFTa2lsbFBhdGhzOiBwcm92aXNpb25lZC5sb2NhbFNraWxsUGF0aHMsXG4gICAgfSk7XG5cbiAgICAvLyBgbWFzdHJhLnNlcnZlci5hcGlSb3V0ZXNgIGlzIG9ubHkgaG9ub3JlZCBieSBNYXN0cmEncyBzdGFuZGFsb25lXG4gICAgLy8gZGV2IHNlcnZlci4gU2luY2Ugd2UncmUgaG9zdGluZyBNYXN0cmEgaW5zaWRlIG91ciBvd24gRXhwcmVzc1xuICAgIC8vIHN1YmFwcCB2aWEgYEBtYXN0cmEvZXhwcmVzc2AsIGN1c3RvbSByb3V0ZXMgbXVzdCBiZSBwYXNzZWQgdG9cbiAgICAvLyB0aGUgYE1hc3RyYVNlcnZlcmAgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgLy9cbiAgICAvLyBgc3RvcmFnZWAgaGVyZSBpcyAqTWFzdHJhLWluc3RhbmNlLWxldmVsKiBhbmQgcGVyc2lzdHMgd29ya2Zsb3dcbiAgICAvLyBzbmFwc2hvdHMgKHdoZXJlIHN1c3BlbmRlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGxzIGxpdmUpLlxuICAgIC8vIEl0J3Mgc2VwYXJhdGUgZnJvbSBlYWNoIGFnZW50J3MgYE1lbW9yeS5zdG9yYWdlYCwgd2hpY2ggb25seVxuICAgIC8vIGNvdmVycyB0aHJlYWQgLyBtZXNzYWdlIGhpc3RvcnkuIFdpdGhvdXQgaXQsXG4gICAgLy8gYGFnZW50LnJlc3VtZVN0cmVhbSgpYCBlcnJvcnMgd2l0aCBcImNvdWxkIG5vdCBmaW5kIGEgc3VzcGVuZGVkXG4gICAgLy8gcnVuXCIgYW5kIHRoZSBhcHByb3ZhbCBVSSBoYW5ncyBhZnRlciB0aGUgdXNlciBjbGlja3MgQXBwcm92ZS5cbiAgICBjb25zdCBpbnN0YW5jZVN0b3JhZ2UgPSBtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKTtcbiAgICAvLyBXaXJlIE1hc3RyYSdzIHRyYWNlciBpbnRvIEFwcEtpdCdzIGdsb2JhbCBPVGVsIHBpcGVsaW5lIHZpYVxuICAgIC8vIGBAbWFzdHJhL290ZWwtYnJpZGdlYC4gTWFzdHJhIHNwYW5zIGJlY29tZSBuYXRpdmUgT1RlbCBzcGFucyBvblxuICAgIC8vIHdoYXRldmVyIHRyYWNlciBwcm92aWRlciBgVGVsZW1ldHJ5TWFuYWdlcmAgcmVnaXN0ZXJlZCBkdXJpbmdcbiAgICAvLyBgY3JlYXRlQXBwYCwgc28gdGhlIE9UTFAgZW5kcG9pbnQgLyBoZWFkZXJzIC8gc2FtcGxpbmcgYXJlXG4gICAgLy8gZW52LWRyaXZlbiBhbmQgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgQXBwS2l0IHBsdWdpbi5cbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5ID0gYXdhaXQgYnVpbGRPYnNlcnZhYmlsaXR5KHtcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLm5hbWUsXG4gICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuICAgIC8vIE9wdGlvbmFsIE1DUCBleHBvc3VyZTogYnVpbGQgYSBNYXN0cmEgTUNQIHNlcnZlciBmcm9tIHRoZVxuICAgIC8vIHJlZ2lzdGVyZWQgYWdlbnRzIChhbmQsIG9wdC1pbiwgdGhlIGFtYmllbnQgdG9vbHMpIGFuZCByZWdpc3RlclxuICAgIC8vIGl0IG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2sgTUNQXG4gICAgLy8gdHJhbnNwb3J0IHJvdXRlcyAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBvZmYgYG1jcFNlcnZlcnNgLCBzbyB0aGVcbiAgICAvLyBjYXRjaC1hbGwgZGlzcGF0Y2ggYmVsb3cgYWxyZWFkeSByb3V0ZXMgTUNQIHJlcXVlc3RzIHVuZGVyIE9CTyAtXG4gICAgLy8gbm8gYmVzcG9rZSByb3V0ZSBuZWVkZWQuIFNlZSBgLi9tY3AuanNgLlxuICAgIHRoaXMubWNwID0gYnVpbGRNY3BTZXJ2ZXIoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBNYXN0cmFQbHVnaW4ubWFuaWZlc3QuZGlzcGxheU5hbWUsXG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgYW1iaWVudFRvb2xzOiB0aGlzLmJ1aWx0LmFtYmllbnRUb29scyxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYSA9IG5ldyBNYXN0cmEoe1xuICAgICAgYWdlbnRzOiB0aGlzLmJ1aWx0LmFnZW50cyxcbiAgICAgIC4uLihpbnN0YW5jZVN0b3JhZ2UgPyB7IHN0b3JhZ2U6IGluc3RhbmNlU3RvcmFnZSB9IDoge30pLFxuICAgICAgLi4uKG9ic2VydmFiaWxpdHkgPyB7IG9ic2VydmFiaWxpdHkgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLm1jcCA/IHsgbWNwU2VydmVyczogeyBbdGhpcy5tY3Auc2VydmVySWRdOiB0aGlzLm1jcC5zZXJ2ZXIgfSB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhQXBwID0gZXhwcmVzcygpO1xuICAgIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKHRoaXMubWFzdHJhQXBwKTtcbiAgICAvLyBTdGFtcCBjaGF0IHJlcXVlc3QvcmVzcG9uc2Ugb250byB0aGUgSFRUUCByb290IHNwYW4gc28gTUxmbG93J3NcbiAgICAvLyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IGNhbiBzdXJmYWNlIHRoZW0gKE1hc3RyYSdzIG93blxuICAgIC8vIGBtYXN0cmEuYWdlbnRfcnVuLipgIGF0dHJpYnV0ZXMgc2l0IG9uIGEgY2hpbGQgc3BhbiB0aGUgdmlld1xuICAgIC8vIG5ldmVyIHJlYWRzKS4gTXVzdCBydW4gYmVmb3JlIGBNYXN0cmFTZXJ2ZXIuaW5pdGAgc28gdGhlIGxheWVyXG4gICAgLy8gc2l0cyBhaGVhZCBvZiB0aGUgYWdlbnQgcm91dGVzLlxuICAgIGF0dGFjaENoYXRUdXJuVHJhY2VJbyh0aGlzLm1hc3RyYUFwcCk7XG4gICAgdGhpcy5tYXN0cmFTZXJ2ZXIgPSBuZXcgTWFzdHJhU2VydmVyKHRoaXMuY29uZmlnLCB7XG4gICAgICBhcHA6IHRoaXMubWFzdHJhQXBwLFxuICAgICAgbWFzdHJhOiB0aGlzLm1hc3RyYSxcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICAgIGN1c3RvbUFwaVJvdXRlczogYWdlbnRDaGF0Um91dGVzKCksXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5tYXN0cmFTZXJ2ZXIuaW5pdCgpO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBhZ2VudHM6IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQuYWdlbnRzKSxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZCxcbiAgICAgIGFwaUFjY2VzczogdGhpcy5jb25maWcuYXBpQWNjZXNzID8/IFwic2NvcGVkXCIsXG4gICAgICBtY3A6IHRoaXMubWNwID8gYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLmh0dHBQYXRofWAgOiBcIm9mZlwiLFxuICAgICAgbGFrZWJhc2U6IG1lbW9yeUJ1aWxkZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgb2JzZXJ2YWJpbGl0eTogb2JzZXJ2YWJpbGl0eSAhPT0gdW5kZWZpbmVkID8gXCJtbGZsb3dcIiA6IFwib2ZmXCIsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3Igb25lIGVtYmVkIGA8dHlwZT5gIGJlaGluZCB0aGUgZ2VuZXJpY1xuICogYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCByb3V0ZS4gUmV0dXJucyB0aGUgSlNPTiBib2R5IHRvIHNlbmQgb25cbiAqIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIHRvIHNpZ25hbCBhIDQwNCAodW5rbm93biAvIGV4cGlyZWQgaWQpLlxuICogYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cyBzbyBsb25nLXBvbGxpbmdcbiAqIHJlc29sdmVycyAoZS5nLiBgY2hhcnRgKSB1bmJsb2NrIGltbWVkaWF0ZWx5LlxuICovXG50eXBlIEVtYmVkUmVzb2x2ZXIgPSAoXG4gIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICBpZDogc3RyaW5nLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx1bmtub3duPj47XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/dGltZW91dE1zPTxuPmAgcXVlcnkgcGFyYW1ldGVyIGZyb20gYVxuICogYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgcG9zaXRpdmUgaW50ZWdlciB1cFxuICogdG8ge0BsaW5rIE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVN9IChjbGFtcGVkKSBhbmQgcmVqZWN0cyBldmVyeXRoaW5nIGVsc2VcbiAqIGFzIGB1bmRlZmluZWRgIHNvIHtAbGluayBmZXRjaENoYXJ0fSBmYWxscyBiYWNrIHRvIGl0cyBkZWZhdWx0LlxuICogRXhwcmVzcyBwcm9kdWNlcyBgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRgOyB3ZSBub3JtYWxpemVcbiAqIHRvIHRoZSBmaXJzdCBzY2FsYXIgYmVmb3JlIHBhcnNpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGltZW91dE1zKHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLmZsb29yKG4pLCBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD9saW1pdD08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2RhdGEvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VyIGFuZCBsZXRzIHRoZSByb3V0ZSBjbGFtcCB0byBgU1RBVEVNRU5UX1JPV19DQVBgO1xuICogcmVqZWN0cyBhbnl0aGluZyBlbHNlIGFzIGB1bmRlZmluZWRgIHNvIHRoZSByb3V0ZSBmYWxscyBiYWNrXG4gKiB0byB0aGUgc2VydmVyLXNpZGUgY2FwLlxuICovXG5mdW5jdGlvbiBwYXJzZVN0YXRlbWVudExpbWl0KHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguZmxvb3Iobik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIE1hc3RyYSBwbHVnaW4gb24gYW4gQXBwS2l0IGFwcC4gTW91bnRzIHRoZSBhZ2VudHMsIHRoZVxuICogYC9yb3V0ZS8qYCBjaGF0IHN1cmZhY2UsIGFuZCAodW5sZXNzIGRpc2FibGVkKSB0aGUgTUNQIHRyYW5zcG9ydCB1bmRlclxuICogYC9hcGkvbWFzdHJhYC5cbiAqXG4gKiBAZXhhbXBsZSBNaW5pbWFsIGFwcFxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBObyBgYWdlbnRzYDogYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gKiAvLyBjaGF0IGVuZHBvaW50IHdvcmtzIG91dCBvZiB0aGUgYm94LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW21hc3RyYSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFR3byBhZ2VudHMsIGEgcGlubmVkIG1vZGVsLCBhbmQgR2VuaWVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZGVmYXVsdE1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgICAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBzYWxlczogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJvcmRlcnMsIHJldHVybnNcIiB9IH0sXG4gKiAgICAgICBhZ2VudHM6IHtcbiAqICAgICAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBzYWxlcy5cIixcbiAqICAgICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgIH0pLFxuICogICAgICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIllvdSBleHBsYWluIHRoZSBhbmFseXN0J3MgYW5zd2Vycy5cIiB9KSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbWFzdHJhID0gdG9QbHVnaW4oTWFzdHJhUGx1Z2luKTtcbiJdfQ==