@dbx-tools/search 0.6.88 → 0.6.89

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/README.md CHANGED
@@ -74,12 +74,12 @@ operations this package does not wrap.
74
74
 
75
75
  ```ts
76
76
  import { createApp, server } from "@databricks/appkit";
77
- import { plugin as searchPlugin, tool as searchToolModule } from "@dbx-tools/search";
77
+ import { plugin as searchPlugin, tool as searchToolApi } from "@dbx-tools/search";
78
78
  import { agents, plugin as mastraPlugin } from "@dbx-tools/appkit-mastra";
79
79
 
80
80
  const support = agents.createAgent({
81
81
  instructions: "Answer from the docs; use `search` to find them.",
82
- tools: () => ({ search: searchToolModule.searchTool() }),
82
+ tools: () => ({ search: searchToolApi.searchTool() }),
83
83
  });
84
84
 
85
85
  await createApp({
package/lib/src/client.js CHANGED
@@ -30,7 +30,7 @@
30
30
  import { ExecutionError, getExecutionContext } from "@databricks/appkit";
31
31
  import { appkit, databricks } from "@dbx-tools/appkit";
32
32
  import { invoke, resolve as modelResolve, serving } from "@dbx-tools/model";
33
- import { async as asyncUtil, json, log, string } from "@dbx-tools/shared-core";
33
+ import { async as sharedAsync, json, log, string } from "@dbx-tools/shared-core";
34
34
  import { ModelClass } from "@dbx-tools/shared-model";
35
35
  import { DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, indexConfigFor, resolveIndexName, } from "./config.js";
36
36
  import { compileFilter, toHits, toQueryType, toRequestColumns, } from "./query.js";
@@ -501,7 +501,7 @@ export class SearchClient {
501
501
  context: { operation: "provision" },
502
502
  });
503
503
  }
504
- await asyncUtil.sleep(5000, signal);
504
+ await sharedAsync.sleep(5000, signal);
505
505
  info = await this.getIndex(name, signal);
506
506
  }
507
507
  return info;
@@ -595,4 +595,4 @@ function defaultWorkspaceClient() {
595
595
  export function createSearchClient(config, workspaceClientFactory, lakebase) {
596
596
  return new SearchClient(config, workspaceClientFactory, lakebase);
597
597
  }
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixHQUVqQixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLE1BQU0sRUFDTixXQUFXLEVBQ1gsZ0JBQWdCLEdBRWpCLE1BQU0sWUFBWSxDQUFDO0FBR3BCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVB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Qy9DLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUMsSUFBSSxHQUFHLEVBQUUsTUFBTTtRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUNuQyx1RUFBdUU7SUFDdkUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUN0QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBNkIsRUFDN0Isc0JBQWtELEVBQ2xELFFBQWdDO0lBRWhDLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc21hbGwsIE1laWxpc2VhcmNoLXNoYXBlZCBjbGllbnQgb3ZlciBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yXG4gKiBTZWFyY2gpLiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtb2R1bGUgaXMgZXJnb25vbWljczogdGhlIERhdGFicmlja3MgU0RLJ3NcbiAqIGB2ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoeyBpbmRleF9uYW1lLCBjb2x1bW5zLCBxdWVyeV90ZXh0LFxuICogcXVlcnlfdHlwZSwgbnVtX3Jlc3VsdHMsIGZpbHRlcnNfanNvbiB9KWAgaXMgcG93ZXJmdWwgYnV0IHZlcmJvc2UsIGFuZCB0aGVcbiAqIHJlc3BvbnNlIGlzIGNvbHVtbmFyLiBUaGlzIGNsaWVudCBoaWRlcyBhbGwgb2YgdGhhdCBiZWhpbmQgdHdvIG9iamVjdHM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNlYXJjaENsaWVudCgpO1xuICogY29uc3QgaW5kZXggPSBjbGllbnQuaW5kZXgoXCJtYWluLnN1cHBvcnQuZG9jc1wiKTtcbiAqIGNvbnN0IHsgaGl0cyB9ID0gYXdhaXQgaW5kZXguc2VhcmNoKFwicmVzZXQgbXkgcGFzc3dvcmRcIiwgeyBsaW1pdDogNSB9KTtcbiAqIGF3YWl0IGluZGV4LmFkZERvY3VtZW50cyhbeyBpZDogXCI0MlwiLCB0aXRsZTogXCJSZXNldFwiLCBib2R5OiBcIi4uLlwiIH1dKTtcbiAqIGBgYFxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUsIHJlc29sdmVzIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmVcbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoZmFsbGluZyBiYWNrIHRvIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IG91dHNpZGVcbiAqIGEgcmVxdWVzdCksIGFuZCByZXR1cm5zIHRoZSBicm93c2VyLXNhZmUgc2hhcGVzIGZyb21cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgLlxuICpcbiAqIEF1dG9jb21wbGV0ZSBpcyBqdXN0IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBgbGltaXRgIGFuZCB0aGUgcmF3IHF1ZXJ5IHRleHQgLVxuICogaHlicmlkIG1vZGUgYWxyZWFkeSBwcmVmaXgtbWF0Y2hlcywgc28gbm8gc2VwYXJhdGUgZW5kcG9pbnQgaXMgbmVlZGVkOyB0aGVcbiAqIHtAbGluayBTZWFyY2hJbmRleC5hdXRvY29tcGxldGV9IGhlbHBlciBpcyBhIHRoaW4sIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQsIGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGludm9rZSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsIHNlcnZpbmcgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgYXN5bmNVdGlsLCBqc29uLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNlYXJjaERvY3VtZW50LFxuICBTZWFyY2hIaXQsXG4gIFNlYXJjaE1vZGUsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVXBzZXJ0UmVzdWx0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX01PREUsXG4gIERFRkFVTFRfUEFHRV9TSVpFLFxuICBERUZBVUxUX1RJTUVPVVRfTVMsXG4gIGluZGV4Q29uZmlnRm9yLFxuICByZXNvbHZlSW5kZXhOYW1lLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vbGFrZWJhc2UudHNcIjtcbmltcG9ydCB7XG4gIGNvbXBpbGVGaWx0ZXIsXG4gIHRvSGl0cyxcbiAgdG9RdWVyeVR5cGUsXG4gIHRvUmVxdWVzdENvbHVtbnMsXG4gIHR5cGUgUXVlcnlSZXNwb25zZUxpa2UsXG59IGZyb20gXCIuL3F1ZXJ5LnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9jbGllbnRcIik7XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGhpdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwYWdlIHNpemUuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgbW9kZSAoaHlicmlkKS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBEZWZhdWx0cyB0byB0aGUgaW5kZXgncyBjb25maWd1cmVkIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEF0dHJpYnV0ZSBmaWx0ZXJzIGFzIGB7IGNvbHVtbjogdmFsdWUgfWAgb3IgYHsgY29sdW1uOiB7IFwiPj1cIjogbiB9IH1gLiAqL1xuICBmaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIERyb3AgaGl0cyBiZWxvdyB0aGlzIHNjb3JlLiAqL1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBJbmRleGVzIHRvIHNlYXJjaC4gRGVmYXVsdHMgdG8gZXZlcnkga25vd24gaW5kZXguICovXG4gIGluZGV4ZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIE1heGltdW0gaGl0cyBwZXIgaW5kZXggYmVmb3JlIG1lcmdpbmcuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleC4gTW9kZWxlZCBvbiBNZWlsaXNlYXJjaCdzIGBjbGllbnQuaW5kZXgodWlkKWA6XG4gKiBgc2VhcmNoYCAvIGBhdXRvY29tcGxldGVgIHJlYWQsIGBhZGREb2N1bWVudHNgIC8gYGRlbGV0ZURvY3VtZW50c2Agd3JpdGUgKHRvXG4gKiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLCBhbmQgYGluZm9gIGZldGNoZXMgdGhlIGxpdmUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEluZGV4IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTZWFyY2hDbGllbnQsXG4gICkge31cblxuICAvKiogU2VhcmNoIHRoaXMgaW5kZXguIFNlZSB7QGxpbmsgU2VhcmNoQ2xpZW50LnNlYXJjaH0uICovXG4gIHNlYXJjaChxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlYXJjaChxdWVyeSwgeyAuLi5vcHRpb25zLCBpbmRleDogdGhpcy5uYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dG9jb21wbGV0ZSBhZ2FpbnN0IHRoaXMgaW5kZXg6IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBkZWZhdWx0IGBsaW1pdGAgYW5kXG4gICAqIHRoZSByYXcgcHJlZml4IGFzIHRoZSBxdWVyeS4gSHlicmlkIG1vZGUgYWxyZWFkeSBoYW5kbGVzIHByZWZpeGVzLCBzbyB0aGlzXG4gICAqIGlzIGEgc2VsZi1kb2N1bWVudGluZyBhbGlhcyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNvZGUgcGF0aC5cbiAgICovXG4gIGF1dG9jb21wbGV0ZShwcmVmaXg6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaChwcmVmaXgsIHsgbGltaXQ6IDUsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXguICovXG4gIGFkZERvY3VtZW50cyhkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRkRG9jdW1lbnRzKHRoaXMubmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleCBieSBwcmltYXJ5IGtleS4gKi9cbiAgZGVsZXRlRG9jdW1lbnRzKGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVEb2N1bWVudHModGhpcy5uYW1lLCBpZHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhpcyBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbiAocHJpbWFyeSBrZXksIGNvbHVtbnMsIHJlYWRpbmVzcykuICovXG4gIGluZm8oc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgdGhpcyAoRGVsdGEgU3luYykgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuICBzeW5jKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnN5bmNJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoaXMgaW5kZXguICovXG4gIGRlbGV0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIHRoaXMgaW5kZXggaWYgaXQgZG9lcyBub3QgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZS4gKi9cbiAgZW5zdXJlKG9wdGlvbnM/OiBDcmVhdGVJbmRleE9wdGlvbnMpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5lbnN1cmVJbmRleCh0aGlzLm5hbWUsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKiBBIHJlc29sdmVkIGxpdmUgaW5kZXggZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHJlYWR5OiBib29sZWFuO1xuICByb3dDb3VudD86IG51bWJlcjtcbiAgLyoqIFRydWUgZm9yIGEgRElSRUNUX0FDQ0VTUyBpbmRleCAoeW91IHN1cHBseSB2ZWN0b3JzOyBxdWVyaWVzIGVtYmVkIGNsaWVudC1zaWRlKS4gKi9cbiAgZGlyZWN0QWNjZXNzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LmNyZWF0ZUluZGV4fSAvIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlSW5kZXh9LlxuICogVGhlIGdvYWwgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudDogbmFtZSBhIHNvdXJjZSB0YWJsZSBhbmQgYVxuICogdGV4dCBjb2x1bW4sIGFuZCBldmVyeXRoaW5nIGVsc2UgLSB0aGUgZW5kcG9pbnQsIHRoZSBlbWJlZGRpbmcgbW9kZWwsIHRoZVxuICogaW5kZXggdHlwZSwgdGhlIHN5bmMgbW9kZSAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBpbmZlcnMgZnJvbSB0aGVcbiAqIHdvcmtzcGFjZSwgb3ZlcnJpZGFibGUgd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUluZGV4T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb3VyY2UgRGVsdGEgdGFibGUgKGNhdGFsb2cuc2NoZW1hLnRhYmxlKSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBQcm92aWRlXG4gICAqIHRoaXMgZm9yIHRoZSBjb21tb24gY2FzZTogRGF0YWJyaWNrcyBjb21wdXRlcyBhbmQgc3luY3MgZW1iZWRkaW5ncyBmcm9tIGl0LlxuICAgKiBPbWl0IGl0IChhbmQgcGFzcyB7QGxpbmsgZW1iZWRkaW5nRGltZW5zaW9ufSkgdG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICAgKiBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZi5cbiAgICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRleHQgY29sdW1uIGVtYmVkZGluZ3MgYXJlIGNvbXB1dGVkIGZyb20gKERlbHRhIFN5bmMpLiBEZWZhdWx0cyB0byB0aGVcbiAgICogZmlyc3Qgb2YgYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgIHByZXNlbnQsIGVsc2UgdGhlIGNhbGxlciBtdXN0IHNldCBpdC5cbiAgICovXG4gIGVtYmVkZGluZ1NvdXJjZUNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gQSBsb29zZSBuYW1lIGlzIGZ1enp5LW1hdGNoZWQ7IHdoZW4gb21pdHRlZCB0aGVcbiAgICogYmVzdCBlbWJlZGRpbmcgZW5kcG9pbnQgaW4gdGhlIHdvcmtzcGFjZSBpcyBjaG9zZW4gKHtAbGluayByZXNvbHZlRW1iZWRkaW5nTW9kZWx9KS5cbiAgICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogVmVjdG9yIFNlYXJjaCBlbmRwb2ludCB0byBob3N0IHRoZSBpbmRleCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIChzZWxmLW1hbmFnZWQgdmVjdG9ycywgbm8gc291cmNlIHRhYmxlKS4gKi9cbiAgZW1iZWRkaW5nRGltZW5zaW9uPzogbnVtYmVyO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGNvbHVtbiB0aGUgdmVjdG9yIGlzIHN0b3JlZCBpbi4gRGVmYXVsdHMgdG8gYGVtYmVkZGluZ2AuICovXG4gIGVtYmVkZGluZ1ZlY3RvckNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4tbmFtZSAtPiB0eXBlIG1hcCB1c2VkIHRvIGJ1aWxkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCdzXG4gICAqIGBzY2hlbWFfanNvbmAgKHR5cGVzOiBgc3RyaW5nYCwgYGludGAsIGBsb25nYCwgYGZsb2F0YCwgYGRvdWJsZWAsXG4gICAqIGBib29sZWFuYCwgYGRhdGVgLCBgdGltZXN0YW1wYCkuIE11c3QgaW5jbHVkZSB0aGUgcHJpbWFyeSBrZXkgYW5kIGFueVxuICAgKiBjb2x1bW5zIHlvdSB1cHNlcnQuIERlZmF1bHRzIHRvIGB7IGlkOiBcInN0cmluZ1wiLCB0ZXh0OiBcInN0cmluZ1wiIH1gLiBUaGVcbiAgICogZW1iZWRkaW5nIHZlY3RvciBjb2x1bW4gaXMgYWRkZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTeW5jIG1vZGUgZm9yIGEgRGVsdGEgU3luYyBpbmRleC4gYFRSSUdHRVJFRGAgKGRlZmF1bHQpIHN5bmNzIG9uIGRlbWFuZDsgYENPTlRJTlVPVVNgIGtlZXBzIGZyZXNoLiAqL1xuICBwaXBlbGluZVR5cGU/OiBcIlRSSUdHRVJFRFwiIHwgXCJDT05USU5VT1VTXCI7XG4gIC8qKiBFeHRyYSBjb2x1bW5zIHRvIHN5bmMgYWxvbmdzaWRlIHRoZSBlbWJlZGRpbmcgc291cmNlIChEZWx0YSBTeW5jKS4gKi9cbiAgY29sdW1uc1RvU3luYz86IHN0cmluZ1tdO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlRW5kcG9pbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVFbmRwb2ludE9wdGlvbnMge1xuICAvKiogV2FpdCBmb3IgdGhlIGVuZHBvaW50IHRvIGNvbWUgb25saW5lIGJlZm9yZSByZXR1cm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5wcm92aXNpb259IC0gYSBvbmUtY2FsbCBcIm1ha2UgdGhpcyBpbmRleCByZWFsXG4gKiBhbmQgc2VhcmNoYWJsZVwiIHVzZWQgYXQgYm9vdCBvciBpbiBhIHNlZWQgc2NyaXB0LiBJdCBlbnN1cmVzIHRoZSBlbmRwb2ludCxcbiAqIGVuc3VyZXMgdGhlIGluZGV4LCBhbmQgKG9wdGlvbmFsbHkpIHNlZWRzIGRvY3VtZW50cyB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25PcHRpb25zIGV4dGVuZHMgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGhhcyBubyByb3dzIHlldC4gU2tpcHBlZCBpZiBpdCBhbHJlYWR5IGhhcyBkYXRhLiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSBlbmRwb2ludCBBTkQgaW5kZXggdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZyAobmVlZGVkXG4gICAqIGJlZm9yZSBzZWVkaW5nKS4gRGVmYXVsdHMgdG8gdHJ1ZS4gRW5kcG9pbnQgY3JlYXRpb24gY2FuIHRha2UgbWFueSBtaW51dGVzLlxuICAgKi9cbiAgd2FpdD86IGJvb2xlYW47XG4gIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciByZWFkaW5lc3MgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gMjAgbWludXRlcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBBSSBTZWFyY2ggY2xpZW50LiBDb25zdHJ1Y3QgaXQgd2l0aCB7QGxpbmsgY3JlYXRlU2VhcmNoQ2xpZW50fSAod2hpY2hcbiAqIHJlYWRzIGEgcmVzb2x2ZWQgY29uZmlnKSBvciBkaXJlY3RseSBmb3Igb25lLW9mZiB1c2UuIEFsbCByZWFkcyByZXNvbHZlIHRoZVxuICogT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnID0ge1xuICAgICAgaW5kZXhlczogW10sXG4gICAgICBwYWdlU2l6ZTogREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBtb2RlOiBERUZBVUxUX01PREUsXG4gICAgICBiYXNlUGF0aDogXCIvYXBpL3NlYXJjaFwiLFxuICAgICAgdGltZW91dE1zOiBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICBhbGxvd1dyaXRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlQ2xpZW50RmFjdG9yeTogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSA9IGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQsXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgTGFrZWJhc2UgZnVsbC10ZXh0IEZBTExCQUNLIGJhY2tlbmQuIFByZXNlbnQgb25seSB3aGVuIG5vIFZlY3RvclxuICAgICAqIFNlYXJjaCBlbmRwb2ludCBpcyBjb25maWd1cmVkIGJ1dCBhIExha2ViYXNlIHBvb2wgaXMgYXZhaWxhYmxlOyB3aGVuIHNldCxcbiAgICAgKiBzZWFyY2ggLyBwcm92aXNpb24gLyB3cml0ZSBvcGVyYXRpb25zIGRlbGVnYXRlIHRvIGl0IGFuZCByZXR1cm4gdGhlIGV4YWN0XG4gICAgICogc2FtZSBzaGFwZXMsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSBjYW4gdGVsbCB3aGljaCBiYWNrZW5kIGFuc3dlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQsXG4gICkge31cblxuICAvKiogVHJ1ZSB3aGVuIHRoaXMgY2xpZW50IGlzIGFuc3dlcmluZyBvdXQgb2YgdGhlIExha2ViYXNlIGZhbGxiYWNrIGJhY2tlbmQuICovXG4gIGdldCB1c2VzTGFrZWJhc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFrZWJhc2UgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXggKGJ5IGZ1bGwgVUMgbmFtZSBvciBjb25maWd1cmVkIGFsaWFzKS4gKi9cbiAgaW5kZXgocmVmZXJlbmNlOiBzdHJpbmcpOiBTZWFyY2hJbmRleCB7XG4gICAgY29uc3QgbmFtZSA9IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlO1xuICAgIHJldHVybiBuZXcgU2VhcmNoSW5kZXgobmFtZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG9uZSBpbmRleC4gYGluZGV4YCBtYXkgYmUgYSBmdWxsIFVDIG5hbWUsIGEgY29uZmlndXJlZCBhbGlhcywgb3JcbiAgICogb21pdHRlZCB0byB1c2UgdGhlIGRlZmF1bHQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdC5cbiAgICovXG4gIGFzeW5jIHNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgJiB7IGluZGV4Pzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgb3B0aW9ucy5pbmRleCk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInNlYXJjaFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFrZWJhc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmxha2ViYXNlLnNlYXJjaChuYW1lLCB0ZXh0LCB7XG4gICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgICAgICAuLi4ob3B0aW9ucy5zY29yZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyBzY29yZVRocmVzaG9sZDogb3B0aW9ucy5zY29yZVRocmVzaG9sZCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBrbm93biA9IGluZGV4Q29uZmlnRm9yKHRoaXMuY29uZmlnLCBuYW1lKTtcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0ga25vd24/LnByaW1hcnlLZXk7XG4gICAgY29uc3QgY29sdW1ucyA9IHRvUmVxdWVzdENvbHVtbnMoXG4gICAgICBvcHRpb25zLmNvbHVtbnMsXG4gICAgICBrbm93bj8uY29sdW1ucyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgcHJpbWFyeUtleSxcbiAgICApO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGUgPz8gdGhpcy5jb25maWcubW9kZTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPz8gdGhpcy5jb25maWcucGFnZVNpemU7XG5cbiAgICAvLyBEYXRhYnJpY2tzIG9ubHkgbWFuYWdlcyBlbWJlZGRpbmdzIGZvciBEZWx0YSBTeW5jIGluZGV4ZXMsIHNvIGEgcXVlcnlcbiAgICAvLyBhZ2FpbnN0IGEgRElSRUNUX0FDQ0VTUyBpbmRleCBtdXN0IGNhcnJ5IGEgcXVlcnkgVkVDVE9SLCBub3QgdGV4dC4gRW1iZWRcbiAgICAvLyB0aGUgcXVlcnkgY2xpZW50LXNpZGUgaW4gdGhhdCBjYXNlICh0aGUgaW5kZXggdHlwZSBpcyBjYWNoZWQgYWZ0ZXIgdGhlXG4gICAgLy8gZmlyc3QgbG9va3VwIHNvIHRoaXMgY29zdHMgb25lIGV4dHJhIGNhbGwgcGVyIGluZGV4LCBub3QgcGVyIHNlYXJjaCkuXG4gICAgY29uc3QgZGlyZWN0QWNjZXNzID0gYXdhaXQgdGhpcy5pc0RpcmVjdEFjY2VzcyhuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgY29uc3QgcXVlcnlWZWN0b3IgPSBkaXJlY3RBY2Nlc3NcbiAgICAgID8gKGF3YWl0IHRoaXMuZW1iZWQoW3RleHRdLCB0aGlzLmNvbmZpZy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKVswXVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcInNlYXJjaFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgcmV0dXJuIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRleF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgLi4uKHF1ZXJ5VmVjdG9yID8geyBxdWVyeV92ZWN0b3I6IHF1ZXJ5VmVjdG9yIH0gOiB7IHF1ZXJ5X3RleHQ6IHRleHQgfSksXG4gICAgICAgICAgcXVlcnlfdHlwZTogdG9RdWVyeVR5cGUobW9kZSksXG4gICAgICAgICAgbnVtX3Jlc3VsdHM6IGxpbWl0LFxuICAgICAgICAgIC4uLihjb21waWxlRmlsdGVyKG9wdGlvbnMuZmlsdGVyKSA/IHsgZmlsdGVyc19qc29uOiBjb21waWxlRmlsdGVyKG9wdGlvbnMuZmlsdGVyKSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBzY29yZV90aHJlc2hvbGQ6IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaGl0cyA9IHRvSGl0cyhyZXNwb25zZSBhcyBRdWVyeVJlc3BvbnNlTGlrZSwgcHJpbWFyeUtleSk7XG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGluZGV4OiBuYW1lLCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBDYWNoZSBvZiBpbmRleC1uYW1lIC0+IGlzLURJUkVDVF9BQ0NFU1MsIHNvIGEgc2VhcmNoIGVtYmVkcyBpdHMgcXVlcnkgb25seSB3aGVuIG5lZWRlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3RBY2Nlc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gIC8qKiBXaGV0aGVyIGFuIGluZGV4IGlzIERJUkVDVF9BQ0NFU1MgKG1lbW9pemVkKTsgYSBsb29rdXAgZmFpbHVyZSBhc3N1bWVzIERlbHRhIFN5bmMuICovXG4gIHByaXZhdGUgYXN5bmMgaXNEaXJlY3RBY2Nlc3MobmFtZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZGlyZWN0QWNjZXNzQ2FjaGUuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5mby5kaXJlY3RBY2Nlc3MgPz8gZmFsc2U7XG4gICAgICB0aGlzLmRpcmVjdEFjY2Vzc0NhY2hlLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgc2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lIHRvICR7b3BlcmF0aW9ufWAsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb24gfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKiogRmV0Y2ggYW4gaW5kZXgncyBsaXZlIGRlZmluaXRpb24uICovXG4gIGFzeW5jIGdldEluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJnZXRJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5nZXRJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWMgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGVjID0gaW5kZXguZGVsdGFfc3luY19pbmRleF9zcGVjID8/IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYztcbiAgICAvLyBEZWx0YSBTeW5jIHN1cmZhY2VzIGl0cyBlbWJlZGRpbmcgc291cmNlIGNvbHVtbnMgZGlyZWN0bHk7IGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IGNhcnJpZXMgaXRzIGNvbHVtbnMgaW4gc2NoZW1hX2pzb24gKG1pbnVzIHRoZSB2ZWN0b3IgY29sdW1uKS5cbiAgICBsZXQgY29sdW1ucyA9IChzcGVjPy5lbWJlZGRpbmdfc291cmNlX2NvbHVtbnMgPz8gW10pLm1hcCgoYykgPT4gYy5uYW1lID8/IFwiXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzY2hlbWFKc29uID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5zY2hlbWFfanNvbjtcbiAgICBpZiAoZGlyZWN0QWNjZXNzICYmIHNjaGVtYUpzb24pIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGpzb24ucGFyc2VSZWNvcmQoc2NoZW1hSnNvbikgPz8ge307XG4gICAgICBjb25zdCB2ZWN0b3JOYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIChpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LmVtYmVkZGluZ192ZWN0b3JfY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpXG4gICAgICAgICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoYykgPT4gIXZlY3Rvck5hbWVzLmhhcyhjKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpbmRleC5uYW1lID8/IG5hbWUsXG4gICAgICAuLi4oaW5kZXguZW5kcG9pbnRfbmFtZSA/IHsgZW5kcG9pbnQ6IGluZGV4LmVuZHBvaW50X25hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihpbmRleC5wcmltYXJ5X2tleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeV9rZXkgfSA6IHt9KSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByZWFkeTogaW5kZXguc3RhdHVzPy5yZWFkeSA/PyBmYWxzZSxcbiAgICAgIC4uLihpbmRleC5zdGF0dXM/LmluZGV4ZWRfcm93X2NvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHJvd0NvdW50OiBpbmRleC5zdGF0dXMuaW5kZXhlZF9yb3dfY291bnQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkaXJlY3RBY2Nlc3MgPyB7IGRpcmVjdEFjY2VzczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImFkZERvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2UuYWRkRG9jdW1lbnRzKFxuICAgICAgICBuYW1lLFxuICAgICAgICBkb2N1bWVudHMsXG4gICAgICAgIHRoaXMuY29uZmlnLmVuc3VyZU9uU2V0dXA/LnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImFkZERvY3VtZW50c1wiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy51cHNlcnREYXRhVmVjdG9ySW5kZXgoXG4gICAgICAgIHsgaW5kZXhfbmFtZTogbmFtZSwgaW5wdXRzX2pzb246IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50cykgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBpbmRleDogbmFtZSwgY291bnQ6IGRvY3VtZW50cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gYSBkaXJlY3QtYWNjZXNzIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBkZWxldGVEb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2UuZGVsZXRlRG9jdW1lbnRzKG5hbWUsIGlkcywgc2lnbmFsKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZURhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBwcmltYXJ5X2tleXM6IGlkcy5tYXAoU3RyaW5nKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZW1iZWRkaW5nIGVuZHBvaW50IGlkIGZvciBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXguIFJldXNlc1xuICAgKiB0aGUgbW9kZWwgcmVzb2x2ZXI6IGEgY29uZmlndXJlZCAvIHBhc3NlZCBuYW1lIGlzIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGVcbiAgICogbGl2ZSBjYXRhbG9ndWUsIG90aGVyd2lzZSB0aGUgaGlnaGVzdC1yYW5rZWQgZW1iZWRkaW5nIGVuZHBvaW50IGlzIGNob3Nlbi5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVFbWJlZGRpbmdNb2RlbChyZXF1ZXN0ZWQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwbGljaXQgPSBzdHJpbmcudHJpbVRvTnVsbChyZXF1ZXN0ZWQgPz8gdGhpcy5jb25maWcuZW1iZWRkaW5nTW9kZWwpO1xuICAgIC8vIEFuIGV4cGxpY2l0IG5hbWUgdGhhdCBhbHJlYWR5IGxvb2tzIGxpa2UgYW4gZW5kcG9pbnQgaWQgKG5vIHdoaXRlc3BhY2UpXG4gICAgLy8gaXMgdXNlZCB2ZXJiYXRpbSAtIG5vIG5lZWQgdG8gZmV0Y2ggYW5kIGZ1enp5LW1hdGNoIHRoZSBsaXZlIGNhdGFsb2d1ZS5cbiAgICAvLyBBIGdlbnVpbmVseSBsb29zZSBuYW1lIChlLmcuIFwiZ3RlIGxhcmdlXCIpIHN0aWxsIHJlc29sdmVzIGFnYWluc3QgaXQuXG4gICAgaWYgKGV4cGxpY2l0ICYmICEvXFxzLy50ZXN0KGV4cGxpY2l0KSkgcmV0dXJuIGV4cGxpY2l0O1xuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJyZXNvbHZlRW1iZWRkaW5nTW9kZWxcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgc2VydmluZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QpO1xuICAgICAgY29uc3QgeyBtb2RlbElkIH0gPSBtb2RlbFJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywge1xuICAgICAgICAuLi4oZXhwbGljaXQgPyB7IGV4cGxpY2l0IH0gOiB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RyaW5nLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWQgdGV4dCB2aWEgYSBEYXRhYnJpY2tzIGVtYmVkZGluZyBzZXJ2aW5nIGVuZHBvaW50LCByZXR1cm5pbmcgb25lXG4gICAqIHZlY3RvciBwZXIgaW5wdXQuIFVzZWQgdG8gc2VlZCBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYW5kIHRvIHR1cm4gYSBzZWFyY2hcbiAgICogcXVlcnkgaW50byBhIHF1ZXJ5IHZlY3RvciAtIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhXG4gICAqIFN5bmMgaW5kZXhlcywgc28gYSBkaXJlY3QtYWNjZXNzIGluZGV4IChubyBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlKSBuZWVkc1xuICAgKiB0aGUgY2xpZW50IHRvIGVtYmVkIG9uIHdyaXRlIGFuZCBvbiBxdWVyeS4gVGhlIGVuZHBvaW50IGlzIHJlc29sdmVkIHRoZVxuICAgKiBzYW1lIHdheSBhcyBmb3IgaW5kZXggY3JlYXRpb24gd2hlbiBub3QgbmFtZWQuXG4gICAqL1xuICBhc3luYyBlbWJlZCh0ZXh0czogc3RyaW5nW10sIG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyW11bXT4ge1xuICAgIGlmICh0ZXh0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsIHRvIGVtYmVkIHRleHRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImVtYmVkXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVybCA9IGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCBlbmRwb2ludCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMsIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IHRleHRzIH0pLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYHNlYXJjaDogZW1iZWRkaW5nIGVuZHBvaW50ICR7ZW5kcG9pbnR9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRhdGE/OiBBcnJheTx7IGVtYmVkZGluZzogbnVtYmVyW10gfT4gfTtcbiAgICAgIGNvbnN0IHZlY3RvcnMgPSAoYm9keS5kYXRhID8/IFtdKS5tYXAoKHJvdykgPT4gcm93LmVtYmVkZGluZyk7XG4gICAgICBpZiAodmVjdG9ycy5sZW5ndGggIT09IHRleHRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGVtYmVkZGluZyByZXNwb25zZSBkaWQgbm90IG1hdGNoIHRoZSBpbnB1dCBjb3VudFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZWN0b3JzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZWN0b3IgZGltZW5zaW9uIGEgbW9kZWwgcHJvZHVjZXMgKGVtYmVkcyBhIHByb2JlIHN0cmluZyBvbmNlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZGRpbmdEaW1lbnNpb24obW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBbdmVjdG9yXSA9IGF3YWl0IHRoaXMuZW1iZWQoW1wiZGltZW5zaW9uIHByb2JlXCJdLCBtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIXZlY3RvciB8fCB2ZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGVtYmVkZGluZyBkaW1lbnNpb25cIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvci5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEFJIFNlYXJjaCBpbmRleCB3aXRoIGFzIGxpdHRsZSBjZXJlbW9ueSBhcyBwb3NzaWJsZS4gVHdvIHNoYXBlczpcbiAgICpcbiAgICogICAtICoqRGVsdGEgU3luYyoqICh0aGUgZGVmYXVsdCk6IHBhc3MgYHNvdXJjZVRhYmxlYDsgRGF0YWJyaWNrcyBjb21wdXRlc1xuICAgKiAgICAgZW1iZWRkaW5ncyBmcm9tIHRoZSB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVGhlXG4gICAqICAgICBlbWJlZGRpbmcgbW9kZWwgaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSB3aGVuIG5vdCBuYW1lZC5cbiAgICogICAtICoqRGlyZWN0IEFjY2VzcyoqOiBvbWl0IGBzb3VyY2VUYWJsZWAgYW5kIHBhc3MgYGVtYmVkZGluZ0RpbWVuc2lvbmA7XG4gICAqICAgICB5b3Ugd3JpdGUgdmVjdG9ycyB5b3Vyc2VsZiB2aWEge0BsaW5rIGFkZERvY3VtZW50c30uXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBpbmZlcnM6IHRoZSBlbmRwb2ludCBmcm9tIHRoZSBwbHVnaW4gY29uZmlnLCB0aGUgcHJpbWFyeVxuICAgKiBrZXkgKGBpZGApLCB0aGUgdGV4dCBjb2x1bW4gKGB0ZXh0YCAvIGBjb250ZW50YCAvIGBib2R5YCksIGFuZCB0aGUgdmVjdG9yXG4gICAqIGNvbHVtbiAoYGVtYmVkZGluZ2ApLiBSZXR1cm5zIHRoZSBjcmVhdGVkIGluZGV4J3Mge0BsaW5rIEluZGV4SW5mb30uXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogbm8gVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBjb25maWd1cmVkOyBwYXNzIGBlbmRwb2ludGAgb3Igc2V0IGl0IG9uIHRoZSBwbHVnaW5cIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBvcHRpb25zLnByaW1hcnlLZXkgPz8gXCJpZFwiO1xuICAgIGNvbnN0IGRpcmVjdCA9ICFvcHRpb25zLnNvdXJjZVRhYmxlO1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG5cbiAgICAvLyBEZWx0YSBTeW5jIGxldHMgRGF0YWJyaWNrcyBlbWJlZCBhIHNvdXJjZSBjb2x1bW4sIHNvIGl0IG5lZWRzIGFuIGVtYmVkZGluZ1xuICAgIC8vIG1vZGVsLiBBIGRpcmVjdC1hY2Nlc3MgaW5kZXggc3RvcmVzIHZlY3RvcnMgWU9VIHN1cHBseSAoRGF0YWJyaWNrcyBvbmx5XG4gICAgLy8gc3VwcG9ydHMgbWFuYWdlZCBlbWJlZGRpbmdzIG9uIERlbHRhIFN5bmMpLCBzbyBpdCBuZWVkcyBhIGRpbWVuc2lvbjsgd2VcbiAgICAvLyByZXNvbHZlIG9uZSBmcm9tIHRoZSBlbWJlZGRpbmcgbW9kZWwgd2hlbiBub3QgZ2l2ZW4gc28gYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggc3RpbGwgd29ya3Mgd2l0aCB6ZXJvIGV4dHJhIGNvbmZpZyAoZW1iZWQgdmlhIGBlbWJlZCgpYCBvbiBzZWVkICtcbiAgICAvLyBxdWVyeSAtIHNlZSBgcHJvdmlzaW9uYCAvIGBzZWFyY2hgKS5cbiAgICBjb25zdCBlbWJlZGRpbmdNb2RlbCA9XG4gICAgICAoYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwob3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWJlZGRpbmdNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsOyBwYXNzIGBlbWJlZGRpbmdNb2RlbGBcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICBvcHRpb25zLmVtYmVkZGluZ0RpbWVuc2lvbiA/PyAoYXdhaXQgdGhpcy5lbWJlZGRpbmdEaW1lbnNpb24oZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsXG4gICAgICBbc291cmNlQ29sdW1uXTogXCJzdHJpbmdcIixcbiAgICAgIC4uLihvcHRpb25zLnNjaGVtYSA/PyB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpcmVjdFNwZWMgPSB7XG4gICAgICBkaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM6IHtcbiAgICAgICAgZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zOiBbeyBuYW1lOiB2ZWN0b3JDb2x1bW4sIGVtYmVkZGluZ19kaW1lbnNpb246IGRpbWVuc2lvbiB9XSxcbiAgICAgICAgc2NoZW1hX2pzb246IEpTT04uc3RyaW5naWZ5KHsgLi4uc2NoZW1hLCBbdmVjdG9yQ29sdW1uXTogYGFycmF5PGZsb2F0PmAgfSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJjcmVhdGVJbmRleFwiLCBvcHRpb25zLnNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmNyZWF0ZUluZGV4KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCxcbiAgICAgICAgICBwcmltYXJ5X2tleTogcHJpbWFyeUtleSxcbiAgICAgICAgICBpbmRleF90eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgICAgICAgIC4uLihkaXJlY3RcbiAgICAgICAgICAgID8gZGlyZWN0U3BlY1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc3luY19pbmRleF9zcGVjOiB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VfdGFibGU6IG9wdGlvbnMuc291cmNlVGFibGUsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV90eXBlOiBvcHRpb25zLnBpcGVsaW5lVHlwZSA/PyBcIlRSSUdHRVJFRFwiLFxuICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogc291cmNlQ29sdW1uLCBlbWJlZGRpbmdfbW9kZWxfZW5kcG9pbnRfbmFtZTogZW1iZWRkaW5nTW9kZWwgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zVG9TeW5jICYmIG9wdGlvbnMuY29sdW1uc1RvU3luYy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8geyBjb2x1bW5zX3RvX3N5bmM6IG9wdGlvbnMuY29sdW1uc1RvU3luYyB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7XG4gICAgICBpbmRleDogbmFtZSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZVxuICAgKiBleGlzdGluZyBvbmUuIElkZW1wb3RlbnQgLSBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdCB0byBndWFyYW50ZWUgYW5cbiAgICogaW5kZXggaXMgcHJlc2VudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFuIGluZGV4IGV4aXN0cywgaXMgb25saW5lLCBhbmQgKG9wdGlvbmFsbHkpIGhvbGRzIHNlZWQgZGF0YSAtIHRoZVxuICAgKiBcIndpcmUgdXAgYSByZWFsIGluZGV4IG9uIGJvb3RcIiBwYXRoLiBJZGVtcG90ZW50IGFuZCBjaGVhcCB0byBjYWxsIGV2ZXJ5XG4gICAqIGJvb3Q6IGl0IGNyZWF0ZXMgdGhlIGVuZHBvaW50IGFuZCBpbmRleCBvbmx5IGlmIG1pc3NpbmcsIHdhaXRzIGZvciB0aGVtIHRvXG4gICAqIGNvbWUgb25saW5lLCBhbmQgc2VlZHMgZG9jdW1lbnRzIE9OTFkgd2hlbiB0aGUgaW5kZXggaXMgc3RpbGwgZW1wdHkuXG4gICAqXG4gICAqIEZvciB0aGUgZGVtby9kdW1teS1kYXRhIGNhc2UgdGhpcyBuZWVkcyBubyBEZWx0YSB0YWJsZSBhbmQgbm8gd2FyZWhvdXNlOlxuICAgKiB0aGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIGB0ZXh0YFxuICAgKiBjb2x1bW4gb24gd3JpdGUgYW5kIHF1ZXJ5KSwgc28gc2VlZGluZyBpcyBqdXN0IGFuIGBhZGREb2N1bWVudHNgIG9mIHBsYWluXG4gICAqIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKG5hbWU6IHN0cmluZywgb3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgLy8gTGFrZWJhc2UgZmFsbGJhY2s6IG5vIGVuZHBvaW50LCBubyBlbWJlZGRpbmdzLCBubyB2ZWN0b3JzIC0ganVzdCBhXG4gICAgICAvLyBQb3N0Z3JlcyBmdWxsLXRleHQgdGFibGUuIFJldHVybnMgYW4gSW5kZXhJbmZvLXNoYXBlZCByZXN1bHQgc28gdGhlXG4gICAgICAvLyBjYWxsZXIncyBsb2dnaW5nICsgcmVhZGluZXNzIGhhbmRsaW5nIGlzIGlkZW50aWNhbCB0byBWZWN0b3IgU2VhcmNoLlxuICAgICAgY29uc3Qgcm93Q291bnQgPSBhd2FpdCB0aGlzLmxha2ViYXNlLnByb3Zpc2lvbihuYW1lLCB7XG4gICAgICAgIHRleHRDb2x1bW46IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiLFxuICAgICAgICAuLi4ob3B0aW9ucy5zZWVkID8geyBzZWVkOiBvcHRpb25zLnNlZWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMuc2lnbmFsID8geyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IG9wdGlvbnMucHJpbWFyeUtleSA/PyBcImlkXCIsXG4gICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcm93Q291bnQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB3YWl0ID0gb3B0aW9ucy53YWl0ID8/IHRydWU7XG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gMjAgKiA2MCAqIDEwMDA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCkgYXdhaXQgdGhpcy5lbnN1cmVFbmRwb2ludChlbmRwb2ludCwgeyB3YWl0LCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuXG4gICAgY29uc3QgeyBzZWVkOiBfc2VlZCwgd2FpdDogX3dhaXQsIHRpbWVvdXRNczogX3RpbWVvdXRNcywgLi4uY3JlYXRlT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgobmFtZSwgY3JlYXRlT3B0aW9ucyk7XG5cbiAgICBpZiAod2FpdCAmJiAhaW5mby5yZWFkeSkgaW5mbyA9IGF3YWl0IHRoaXMud2FpdEZvckluZGV4UmVhZHkobmFtZSwgdGltZW91dE1zLCBvcHRpb25zLnNpZ25hbCk7XG5cbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChzZWVkLmxlbmd0aCA+IDAgJiYgKGluZm8ucm93Q291bnQgPz8gMCkgPT09IDApIHtcbiAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcbiAgICAgIC8vIERpcmVjdC1hY2Nlc3MgaW5kZXhlcyBzdG9yZSB2ZWN0b3JzIHdlIHN1cHBseSwgc28gZW1iZWQgdGhlIHRleHQgY29sdW1uXG4gICAgICAvLyBmb3IgYW55IHNlZWQgcm93IHRoYXQgZGlkIG5vdCBhbHJlYWR5IGNhcnJ5IGEgdmVjdG9yLlxuICAgICAgY29uc3QgbmVlZEVtYmVkID0gc2VlZC5zb21lKChkb2MpID0+IGRvY1t2ZWN0b3JDb2x1bW5dID09PSB1bmRlZmluZWQpO1xuICAgICAgbGV0IHJvd3MgPSBzZWVkO1xuICAgICAgaWYgKG5lZWRFbWJlZCkge1xuICAgICAgICBjb25zdCB0ZXh0cyA9IHNlZWQubWFwKChkb2MpID0+IHN0cmluZy50cmltVG9FbXB0eShTdHJpbmcoZG9jW3NvdXJjZUNvbHVtbl0gPz8gXCJcIikpKTtcbiAgICAgICAgY29uc3QgdmVjdG9ycyA9IGF3YWl0IHRoaXMuZW1iZWQodGV4dHMsIG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgcm93cyA9IHNlZWQubWFwKChkb2MsIGkpID0+XG4gICAgICAgICAgZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCA/IHsgLi4uZG9jLCBbdmVjdG9yQ29sdW1uXTogdmVjdG9yc1tpXSB9IDogZG9jLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGREb2N1bWVudHMobmFtZSwgcm93cywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleDogbmFtZSwgY291bnQ6IHJvd3MubGVuZ3RoIH0pO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBQb2xsIGFuIGluZGV4IHVudGlsIGl0IHJlcG9ydHMgcmVhZHksIG9yIHRocm93IGFmdGVyIHtAbGluayB0aW1lb3V0TXN9LiAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbmRleFJlYWR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgd2hpbGUgKCFpbmZvLnJlYWR5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiBpbmRleCAke25hbWV9IGRpZCBub3QgY29tZSBvbmxpbmUgaW4gdGltZWAsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJwcm92aXNpb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGFzeW5jVXRpbC5zbGVlcCg1MDAwLCBzaWduYWwpO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgYSBEZWx0YSBTeW5jIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgYXN5bmMgc3luY0luZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcInN5bmNJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJzeW5jSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuc3luY0luZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc3luY2VkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogRGVsZXRlIGFuIGluZGV4LiAqL1xuICBhc3luYyBkZWxldGVJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJkZWxldGVJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5kZWxldGVJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LWRlbGV0ZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBMaXN0IHRoZSBpbmRleGVzIGhvc3RlZCBvbiBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgKG5hbWUgKyB0eXBlIG9ubHkpLiAqL1xuICBhc3luYyBsaXN0SW5kZXhlcyhlbmRwb2ludD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZW5kcG9pbnROYW1lID0gZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgY29uZmlndXJlZCB0byBsaXN0IGluZGV4ZXNcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJsaXN0SW5kZXhlc1wiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImxpc3RJbmRleGVzXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGluZGV4IG9mIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmxpc3RJbmRleGVzKFxuICAgICAgICB7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50TmFtZSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSkge1xuICAgICAgICBpZiAoaW5kZXgubmFtZSkgbmFtZXMucHVzaChpbmRleC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGV4aXN0cywgY3JlYXRpbmcgYSBgU1RBTkRBUkRgIG9uZSB3aGVuIGl0XG4gICAqIGRvZXMgbm90LiBPcHRpb25hbGx5IHdhaXQgZm9yIGl0IHRvIGNvbWUgb25saW5lLiBJZGVtcG90ZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRW5kcG9pbnQobmFtZT86IHN0cmluZywgb3B0aW9uczogRW5zdXJlRW5kcG9pbnRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG5hbWUgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBuYW1lIHRvIGVuc3VyZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVuc3VyZUVuZHBvaW50XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJlbnN1cmVFbmRwb2ludFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5nZXRFbmRwb2ludCh7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50IH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3Qgd2FpdGVyID0gYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5jcmVhdGVFbmRwb2ludChcbiAgICAgICAgICB7IG5hbWU6IGVuZHBvaW50LCBlbmRwb2ludF90eXBlOiBcIlNUQU5EQVJEXCIgfSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuaW5mbyhcImVuZHBvaW50LWNyZWF0ZWRcIiwgeyBlbmRwb2ludCB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2FpdCkgYXdhaXQgd2FpdGVyLndhaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgY2xpZW50IGFuZCBydW4gb25lIGNhbGwgdW5kZXIgYSBib3VuZGVkIHRpbWVvdXQuIFRoZVxuICAgKiBjYWxsZXIncyBzaWduYWwgKGlmIGFueSkgYW5kIGEgdGltZW91dCBhcmUgbWVyZ2VkIGludG8gb25lIFNESyBgQ29udGV4dGBcbiAgICogdmlhIHtAbGluayBhcHBraXQuZGF0YWJyaWNrcy50b0NvbnRleHR9LCBzbyBlaXRoZXIgdW53aW5kcyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2l0aENsaWVudDxUPihcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIGZuOiAoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLCBjb250ZXh0PzogQ29udGV4dCkgPT4gUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy53b3Jrc3BhY2VDbGllbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aGlzLmNvbmZpZy50aW1lb3V0TXMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBkYXRhYnJpY2tzLnRvQ29udGV4dChjb250cm9sbGVyLCBzaWduYWwpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oY2xpZW50LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IEV4ZWN1dGlvbkVycm9yLmNhbmNlbGVkKCk7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwgeyBvcGVyYXRpb24gfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGNvbnRleHQsIG9yIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50LiAqL1xuZnVuY3Rpb24gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCgpOiBXb3Jrc3BhY2VDbGllbnRMaWtlIHtcbiAgY29uc3QgY3R4ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgaWYgKGN0eD8uY2xpZW50KSByZXR1cm4gY3R4LmNsaWVudDtcbiAgLy8gT3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUgKGEgc2NyaXB0LCBhIHRlc3QpOiBhIGZyZXNoIGVudi1hdXRoIGNsaWVudC5cbiAgcmV0dXJuIGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG59XG5cbi8qKiBDb25zdHJ1Y3QgYSB7QGxpbmsgU2VhcmNoQ2xpZW50fSBmcm9tIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlYXJjaENsaWVudChcbiAgY29uZmlnPzogUmVzb2x2ZWRTZWFyY2hDb25maWcsXG4gIHdvcmtzcGFjZUNsaWVudEZhY3Rvcnk/OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgbGFrZWJhc2UpO1xufVxuIl19
598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixHQUVqQixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLE1BQU0sRUFDTixXQUFXLEVBQ1gsZ0JBQWdCLEdBRWpCLE1BQU0sWUFBWSxDQUFDO0FBR3BCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVB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Qy9DLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUMsSUFBSSxHQUFHLEVBQUUsTUFBTTtRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUNuQyx1RUFBdUU7SUFDdkUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUN0QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBNkIsRUFDN0Isc0JBQWtELEVBQ2xELFFBQWdDO0lBRWhDLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc21hbGwsIE1laWxpc2VhcmNoLXNoYXBlZCBjbGllbnQgb3ZlciBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yXG4gKiBTZWFyY2gpLiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtb2R1bGUgaXMgZXJnb25vbWljczogdGhlIERhdGFicmlja3MgU0RLJ3NcbiAqIGB2ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoeyBpbmRleF9uYW1lLCBjb2x1bW5zLCBxdWVyeV90ZXh0LFxuICogcXVlcnlfdHlwZSwgbnVtX3Jlc3VsdHMsIGZpbHRlcnNfanNvbiB9KWAgaXMgcG93ZXJmdWwgYnV0IHZlcmJvc2UsIGFuZCB0aGVcbiAqIHJlc3BvbnNlIGlzIGNvbHVtbmFyLiBUaGlzIGNsaWVudCBoaWRlcyBhbGwgb2YgdGhhdCBiZWhpbmQgdHdvIG9iamVjdHM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNlYXJjaENsaWVudCgpO1xuICogY29uc3QgaW5kZXggPSBjbGllbnQuaW5kZXgoXCJtYWluLnN1cHBvcnQuZG9jc1wiKTtcbiAqIGNvbnN0IHsgaGl0cyB9ID0gYXdhaXQgaW5kZXguc2VhcmNoKFwicmVzZXQgbXkgcGFzc3dvcmRcIiwgeyBsaW1pdDogNSB9KTtcbiAqIGF3YWl0IGluZGV4LmFkZERvY3VtZW50cyhbeyBpZDogXCI0MlwiLCB0aXRsZTogXCJSZXNldFwiLCBib2R5OiBcIi4uLlwiIH1dKTtcbiAqIGBgYFxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUsIHJlc29sdmVzIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmVcbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoZmFsbGluZyBiYWNrIHRvIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IG91dHNpZGVcbiAqIGEgcmVxdWVzdCksIGFuZCByZXR1cm5zIHRoZSBicm93c2VyLXNhZmUgc2hhcGVzIGZyb21cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgLlxuICpcbiAqIEF1dG9jb21wbGV0ZSBpcyBqdXN0IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBgbGltaXRgIGFuZCB0aGUgcmF3IHF1ZXJ5IHRleHQgLVxuICogaHlicmlkIG1vZGUgYWxyZWFkeSBwcmVmaXgtbWF0Y2hlcywgc28gbm8gc2VwYXJhdGUgZW5kcG9pbnQgaXMgbmVlZGVkOyB0aGVcbiAqIHtAbGluayBTZWFyY2hJbmRleC5hdXRvY29tcGxldGV9IGhlbHBlciBpcyBhIHRoaW4sIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQsIGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGludm9rZSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsIHNlcnZpbmcgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgc2hhcmVkQXN5bmMsIGpzb24sIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2VhcmNoRG9jdW1lbnQsXG4gIFNlYXJjaEhpdCxcbiAgU2VhcmNoTW9kZSxcbiAgU2VhcmNoUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfTU9ERSxcbiAgREVGQVVMVF9QQUdFX1NJWkUsXG4gIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgaW5kZXhDb25maWdGb3IsXG4gIHJlc29sdmVJbmRleE5hbWUsXG4gIHR5cGUgUmVzb2x2ZWRTZWFyY2hDb25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHR5cGUgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuaW1wb3J0IHtcbiAgY29tcGlsZUZpbHRlcixcbiAgdG9IaXRzLFxuICB0b1F1ZXJ5VHlwZSxcbiAgdG9SZXF1ZXN0Q29sdW1ucyxcbiAgdHlwZSBRdWVyeVJlc3BvbnNlTGlrZSxcbn0gZnJvbSBcIi4vcXVlcnkudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gYXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2U7XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2NsaWVudFwiKTtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSBzaW5nbGUtaW5kZXggc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgLyoqIE1heGltdW0gaGl0cyB0byByZXR1cm4uIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmVkIHBhZ2Ugc2l6ZS4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBtb2RlIChoeWJyaWQpLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIENvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQuIERlZmF1bHRzIHRvIHRoZSBpbmRleCdzIGNvbmZpZ3VyZWQgY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQXR0cmlidXRlIGZpbHRlcnMgYXMgYHsgY29sdW1uOiB2YWx1ZSB9YCBvciBgeyBjb2x1bW46IHsgXCI+PVwiOiBuIH0gfWAuICovXG4gIGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogRHJvcCBoaXRzIGJlbG93IHRoaXMgc2NvcmUuICovXG4gIHNjb3JlVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSB1bml2ZXJzYWwgKGZlZGVyYXRlZCkgc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbml2ZXJzYWxTZWFyY2hPcHRpb25zIHtcbiAgLyoqIEluZGV4ZXMgdG8gc2VhcmNoLiBEZWZhdWx0cyB0byBldmVyeSBrbm93biBpbmRleC4gKi9cbiAgaW5kZXhlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogTWF4aW11bSBoaXRzIHBlciBpbmRleCBiZWZvcmUgbWVyZ2luZy4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4LiBNb2RlbGVkIG9uIE1laWxpc2VhcmNoJ3MgYGNsaWVudC5pbmRleCh1aWQpYDpcbiAqIGBzZWFyY2hgIC8gYGF1dG9jb21wbGV0ZWAgcmVhZCwgYGFkZERvY3VtZW50c2AgLyBgZGVsZXRlRG9jdW1lbnRzYCB3cml0ZSAodG9cbiAqIGEgZGlyZWN0LWFjY2VzcyBpbmRleCksIGFuZCBgaW5mb2AgZmV0Y2hlcyB0aGUgbGl2ZSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoSW5kZXgge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFNlYXJjaENsaWVudCxcbiAgKSB7fVxuXG4gIC8qKiBTZWFyY2ggdGhpcyBpbmRleC4gU2VlIHtAbGluayBTZWFyY2hDbGllbnQuc2VhcmNofS4gKi9cbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VhcmNoKHF1ZXJ5LCB7IC4uLm9wdGlvbnMsIGluZGV4OiB0aGlzLm5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0b2NvbXBsZXRlIGFnYWluc3QgdGhpcyBpbmRleDogYSBzZWFyY2ggd2l0aCBhIHNtYWxsIGRlZmF1bHQgYGxpbWl0YCBhbmRcbiAgICogdGhlIHJhdyBwcmVmaXggYXMgdGhlIHF1ZXJ5LiBIeWJyaWQgbW9kZSBhbHJlYWR5IGhhbmRsZXMgcHJlZml4ZXMsIHNvIHRoaXNcbiAgICogaXMgYSBzZWxmLWRvY3VtZW50aW5nIGFsaWFzIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgY29kZSBwYXRoLlxuICAgKi9cbiAgYXV0b2NvbXBsZXRlKHByZWZpeDogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKHByZWZpeCwgeyBsaW1pdDogNSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleC4gKi9cbiAgYWRkRG9jdW1lbnRzKGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hZGREb2N1bWVudHModGhpcy5uYW1lLCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBmcm9tIHRoaXMgKGRpcmVjdC1hY2Nlc3MpIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBkZWxldGVEb2N1bWVudHMoaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZURvY3VtZW50cyh0aGlzLm5hbWUsIGlkcywgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCB0aGlzIGluZGV4J3MgbGl2ZSBkZWZpbml0aW9uIChwcmltYXJ5IGtleSwgY29sdW1ucywgcmVhZGluZXNzKS4gKi9cbiAgaW5mbyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEluZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIGEgc3luYyBvZiB0aGlzIChEZWx0YSBTeW5jKSBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIHN5bmMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc3luY0luZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhpcyBpbmRleC4gKi9cbiAgZGVsZXRlKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZUluZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgdGhpcyBpbmRleCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXhpc3Rpbmcgb25lLiAqL1xuICBlbnN1cmUob3B0aW9ucz86IENyZWF0ZUluZGV4T3B0aW9ucyk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmVuc3VyZUluZGV4KHRoaXMubmFtZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqIEEgcmVzb2x2ZWQgbGl2ZSBpbmRleCBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleEluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHJvd0NvdW50PzogbnVtYmVyO1xuICAvKiogVHJ1ZSBmb3IgYSBESVJFQ1RfQUNDRVNTIGluZGV4ICh5b3Ugc3VwcGx5IHZlY3RvcnM7IHF1ZXJpZXMgZW1iZWQgY2xpZW50LXNpZGUpLiAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9IC8ge0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVJbmRleH0uXG4gKiBUaGUgZ29hbCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiB0aGUgY2xpZW50OiBuYW1lIGEgc291cmNlIHRhYmxlIGFuZCBhXG4gKiB0ZXh0IGNvbHVtbiwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBlbmRwb2ludCwgdGhlIGVtYmVkZGluZyBtb2RlbCwgdGhlXG4gKiBpbmRleCB0eXBlLCB0aGUgc3luYyBtb2RlIC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGluZmVycyBmcm9tIHRoZVxuICogd29ya3NwYWNlLCBvdmVycmlkYWJsZSB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBEZWx0YSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpIGZvciBhIERlbHRhIFN5bmMgaW5kZXguIFByb3ZpZGVcbiAgICogdGhpcyBmb3IgdGhlIGNvbW1vbiBjYXNlOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGFuZCBzeW5jcyBlbWJlZGRpbmdzIGZyb20gaXQuXG4gICAqIE9taXQgaXQgKGFuZCBwYXNzIHtAbGluayBlbWJlZGRpbmdEaW1lbnNpb259KSB0byBjcmVhdGUgYSBkaXJlY3QtYWNjZXNzXG4gICAqIGluZGV4IHlvdSB3cml0ZSB2ZWN0b3JzIHRvIHlvdXJzZWxmLlxuICAgKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb2x1bW4gZW1iZWRkaW5ncyBhcmUgY29tcHV0ZWQgZnJvbSAoRGVsdGEgU3luYykuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBmaXJzdCBvZiBgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWAgcHJlc2VudCwgZWxzZSB0aGUgY2FsbGVyIG11c3Qgc2V0IGl0LlxuICAgKi9cbiAgZW1iZWRkaW5nU291cmNlQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBBIGxvb3NlIG5hbWUgaXMgZnV6enktbWF0Y2hlZDsgd2hlbiBvbWl0dGVkIHRoZVxuICAgKiBiZXN0IGVtYmVkZGluZyBlbmRwb2ludCBpbiB0aGUgd29ya3NwYWNlIGlzIGNob3NlbiAoe0BsaW5rIHJlc29sdmVFbWJlZGRpbmdNb2RlbH0pLlxuICAgKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgdGhlIGluZGV4IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gKHNlbGYtbWFuYWdlZCB2ZWN0b3JzLCBubyBzb3VyY2UgdGFibGUpLiAqL1xuICBlbWJlZGRpbmdEaW1lbnNpb24/OiBudW1iZXI7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgY29sdW1uIHRoZSB2ZWN0b3IgaXMgc3RvcmVkIGluLiBEZWZhdWx0cyB0byBgZW1iZWRkaW5nYC4gKi9cbiAgZW1iZWRkaW5nVmVjdG9yQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbHVtbi1uYW1lIC0+IHR5cGUgbWFwIHVzZWQgdG8gYnVpbGQgYSBkaXJlY3QtYWNjZXNzIGluZGV4J3NcbiAgICogYHNjaGVtYV9qc29uYCAodHlwZXM6IGBzdHJpbmdgLCBgaW50YCwgYGxvbmdgLCBgZmxvYXRgLCBgZG91YmxlYCxcbiAgICogYGJvb2xlYW5gLCBgZGF0ZWAsIGB0aW1lc3RhbXBgKS4gTXVzdCBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBhbmQgYW55XG4gICAqIGNvbHVtbnMgeW91IHVwc2VydC4gRGVmYXVsdHMgdG8gYHsgaWQ6IFwic3RyaW5nXCIsIHRleHQ6IFwic3RyaW5nXCIgfWAuIFRoZVxuICAgKiBlbWJlZGRpbmcgdmVjdG9yIGNvbHVtbiBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFN5bmMgbW9kZSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBgVFJJR0dFUkVEYCAoZGVmYXVsdCkgc3luY3Mgb24gZGVtYW5kOyBgQ09OVElOVU9VU2Aga2VlcHMgZnJlc2guICovXG4gIHBpcGVsaW5lVHlwZT86IFwiVFJJR0dFUkVEXCIgfCBcIkNPTlRJTlVPVVNcIjtcbiAgLyoqIEV4dHJhIGNvbHVtbnMgdG8gc3luYyBhbG9uZ3NpZGUgdGhlIGVtYmVkZGluZyBzb3VyY2UgKERlbHRhIFN5bmMpLiAqL1xuICBjb2x1bW5zVG9TeW5jPzogc3RyaW5nW107XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZUVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBXYWl0IGZvciB0aGUgZW5kcG9pbnQgdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHdhaXQ/OiBib29sZWFuO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LnByb3Zpc2lvbn0gLSBhIG9uZS1jYWxsIFwibWFrZSB0aGlzIGluZGV4IHJlYWxcbiAqIGFuZCBzZWFyY2hhYmxlXCIgdXNlZCBhdCBib290IG9yIGluIGEgc2VlZCBzY3JpcHQuIEl0IGVuc3VyZXMgdGhlIGVuZHBvaW50LFxuICogZW5zdXJlcyB0aGUgaW5kZXgsIGFuZCAob3B0aW9uYWxseSkgc2VlZHMgZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVJbmRleE9wdGlvbnMge1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaGFzIG5vIHJvd3MgeWV0LiBTa2lwcGVkIGlmIGl0IGFscmVhZHkgaGFzIGRhdGEuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGVuZHBvaW50IEFORCBpbmRleCB0byBjb21lIG9ubGluZSBiZWZvcmUgcmV0dXJuaW5nIChuZWVkZWRcbiAgICogYmVmb3JlIHNlZWRpbmcpLiBEZWZhdWx0cyB0byB0cnVlLiBFbmRwb2ludCBjcmVhdGlvbiBjYW4gdGFrZSBtYW55IG1pbnV0ZXMuXG4gICAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHJlYWRpbmVzcyBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBjbGllbnQuIENvbnN0cnVjdCBpdCB3aXRoIHtAbGluayBjcmVhdGVTZWFyY2hDbGllbnR9ICh3aGljaFxuICogcmVhZHMgYSByZXNvbHZlZCBjb25maWcpIG9yIGRpcmVjdGx5IGZvciBvbmUtb2ZmIHVzZS4gQWxsIHJlYWRzIHJlc29sdmUgdGhlXG4gKiBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBbXSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIG1vZGU6IERFRkFVTFRfTU9ERSxcbiAgICAgIGJhc2VQYXRoOiBcIi9hcGkvc2VhcmNoXCIsXG4gICAgICB0aW1lb3V0TXM6IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgIGFsbG93V3JpdGU6IGZhbHNlLFxuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlID0gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCxcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBMYWtlYmFzZSBmdWxsLXRleHQgRkFMTEJBQ0sgYmFja2VuZC4gUHJlc2VudCBvbmx5IHdoZW4gbm8gVmVjdG9yXG4gICAgICogU2VhcmNoIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWQgYnV0IGEgTGFrZWJhc2UgcG9vbCBpcyBhdmFpbGFibGU7IHdoZW4gc2V0LFxuICAgICAqIHNlYXJjaCAvIHByb3Zpc2lvbiAvIHdyaXRlIG9wZXJhdGlvbnMgZGVsZWdhdGUgdG8gaXQgYW5kIHJldHVybiB0aGUgZXhhY3RcbiAgICAgKiBzYW1lIHNoYXBlcywgc28gbm90aGluZyBkb3duc3RyZWFtIGNhbiB0ZWxsIHdoaWNoIGJhY2tlbmQgYW5zd2VyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZCxcbiAgKSB7fVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBjbGllbnQgaXMgYW5zd2VyaW5nIG91dCBvZiB0aGUgTGFrZWJhc2UgZmFsbGJhY2sgYmFja2VuZC4gKi9cbiAgZ2V0IHVzZXNMYWtlYmFzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYWtlYmFzZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleCAoYnkgZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpLiAqL1xuICBpbmRleChyZWZlcmVuY2U6IHN0cmluZyk6IFNlYXJjaEluZGV4IHtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2U7XG4gICAgcmV0dXJuIG5ldyBTZWFyY2hJbmRleChuYW1lLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggb25lIGluZGV4LiBgaW5kZXhgIG1heSBiZSBhIGZ1bGwgVUMgbmFtZSwgYSBjb25maWd1cmVkIGFsaWFzLCBvclxuICAgKiBvbWl0dGVkIHRvIHVzZSB0aGUgZGVmYXVsdCBpbmRleC4gUmV0dXJucyBoaXRzIHNvcnRlZCBtb3N0LXJlbGV2YW50LWZpcnN0LlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyAmIHsgaW5kZXg/OiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCBvcHRpb25zLmluZGV4KTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2Uuc2VhcmNoKG5hbWUsIHRleHQsIHtcbiAgICAgICAgbGltaXQ6IG9wdGlvbnMubGltaXQgPz8gdGhpcy5jb25maWcucGFnZVNpemUsXG4gICAgICAgIC4uLihvcHRpb25zLnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHNjb3JlVGhyZXNob2xkOiBvcHRpb25zLnNjb3JlVGhyZXNob2xkIH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGtub3duID0gaW5kZXhDb25maWdGb3IodGhpcy5jb25maWcsIG5hbWUpO1xuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBrbm93bj8ucHJpbWFyeUtleTtcbiAgICBjb25zdCBjb2x1bW5zID0gdG9SZXF1ZXN0Q29sdW1ucyhcbiAgICAgIG9wdGlvbnMuY29sdW1ucyxcbiAgICAgIGtub3duPy5jb2x1bW5zID8/IHRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBwcmltYXJ5S2V5LFxuICAgICk7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZSA/PyB0aGlzLmNvbmZpZy5tb2RlO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIC8vIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhIFN5bmMgaW5kZXhlcywgc28gYSBxdWVyeVxuICAgIC8vIGFnYWluc3QgYSBESVJFQ1RfQUNDRVNTIGluZGV4IG11c3QgY2FycnkgYSBxdWVyeSBWRUNUT1IsIG5vdCB0ZXh0LiBFbWJlZFxuICAgIC8vIHRoZSBxdWVyeSBjbGllbnQtc2lkZSBpbiB0aGF0IGNhc2UgKHRoZSBpbmRleCB0eXBlIGlzIGNhY2hlZCBhZnRlciB0aGVcbiAgICAvLyBmaXJzdCBsb29rdXAgc28gdGhpcyBjb3N0cyBvbmUgZXh0cmEgY2FsbCBwZXIgaW5kZXgsIG5vdCBwZXIgc2VhcmNoKS5cbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBhd2FpdCB0aGlzLmlzRGlyZWN0QWNjZXNzKG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICBjb25zdCBxdWVyeVZlY3RvciA9IGRpcmVjdEFjY2Vzc1xuICAgICAgPyAoYXdhaXQgdGhpcy5lbWJlZChbdGV4dF0sIHRoaXMuY29uZmlnLmVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpWzBdXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwic2VhcmNoXCIsIG9wdGlvbnMuc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMucXVlcnlJbmRleChcbiAgICAgICAge1xuICAgICAgICAgIGluZGV4X25hbWU6IG5hbWUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAuLi4ocXVlcnlWZWN0b3IgPyB7IHF1ZXJ5X3ZlY3RvcjogcXVlcnlWZWN0b3IgfSA6IHsgcXVlcnlfdGV4dDogdGV4dCB9KSxcbiAgICAgICAgICBxdWVyeV90eXBlOiB0b1F1ZXJ5VHlwZShtb2RlKSxcbiAgICAgICAgICBudW1fcmVzdWx0czogbGltaXQsXG4gICAgICAgICAgLi4uKGNvbXBpbGVGaWx0ZXIob3B0aW9ucy5maWx0ZXIpID8geyBmaWx0ZXJzX2pzb246IGNvbXBpbGVGaWx0ZXIob3B0aW9ucy5maWx0ZXIpIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHNjb3JlX3RocmVzaG9sZDogb3B0aW9ucy5zY29yZVRocmVzaG9sZCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoaXRzID0gdG9IaXRzKHJlc3BvbnNlIGFzIFF1ZXJ5UmVzcG9uc2VMaWtlLCBwcmltYXJ5S2V5KTtcbiAgICByZXR1cm4geyBxdWVyeTogdGV4dCwgaW5kZXg6IG5hbWUsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIENhY2hlIG9mIGluZGV4LW5hbWUgLT4gaXMtRElSRUNUX0FDQ0VTUywgc28gYSBzZWFyY2ggZW1iZWRzIGl0cyBxdWVyeSBvbmx5IHdoZW4gbmVlZGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdEFjY2Vzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG5cbiAgLyoqIFdoZXRoZXIgYW4gaW5kZXggaXMgRElSRUNUX0FDQ0VTUyAobWVtb2l6ZWQpOyBhIGxvb2t1cCBmYWlsdXJlIGFzc3VtZXMgRGVsdGEgU3luYy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0RpcmVjdEFjY2VzcyhuYW1lOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5kaXJlY3RBY2Nlc3NDYWNoZS5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBzaWduYWwpO1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmZvLmRpcmVjdEFjY2VzcyA/PyBmYWxzZTtcbiAgICAgIHRoaXMuZGlyZWN0QWNjZXNzQ2FjaGUuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFuIGEgcXVlcnkgYWNyb3NzIHNldmVyYWwgaW5kZXhlcyBhbmQgbWVyZ2UgdGhlIGhpdHMsIHNvcnRlZCBieSBzY29yZSAtXG4gICAqIHRoZSBcInVuaXZlcnNhbCBzZWFyY2hcIiBhIHNpbmdsZSBib3ggb3ZlciBtYW55IGNvbGxlY3Rpb25zIG5lZWRzLiBFYWNoXG4gICAqIGluZGV4IGlzIHNlYXJjaGVkIGNvbmN1cnJlbnRseTsgYW4gaW5kZXggdGhhdCBlcnJvcnMgaXMgbG9nZ2VkIGFuZCBza2lwcGVkXG4gICAqIHNvIG9uZSBiYWQgaW5kZXggZG9lcyBub3Qgc2luayB0aGUgd2hvbGUgc2VhcmNoLlxuICAgKi9cbiAgYXN5bmMgdW5pdmVyc2FsU2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWVzID1cbiAgICAgIG9wdGlvbnMuaW5kZXhlcyAmJiBvcHRpb25zLmluZGV4ZXMubGVuZ3RoID4gMFxuICAgICAgICA/IG9wdGlvbnMuaW5kZXhlcy5tYXAoKHJlZikgPT4gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmKSA/PyByZWYpXG4gICAgICAgIDogdGhpcy5jb25maWcuaW5kZXhlcy5tYXAoKGkpID0+IGkubmFtZSk7XG4gICAgY29uc3QgcGVySW5kZXggPSBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplO1xuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIG5hbWVzLm1hcChhc3luYyAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlYXJjaCh0ZXh0LCB7XG4gICAgICAgICAgaW5kZXg6IG5hbWUsXG4gICAgICAgICAgbGltaXQ6IHBlckluZGV4LFxuICAgICAgICAgIC4uLihvcHRpb25zLm1vZGUgPyB7IG1vZGU6IG9wdGlvbnMubW9kZSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5oaXRzLm1hcCgoaGl0KTogU2VhcmNoSGl0ID0+ICh7IC4uLmhpdCwgaW5kZXg6IG5hbWUgfSkpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGhpdHMgPSBzZXR0bGVkXG4gICAgICAuZmxhdE1hcCgob3V0Y29tZSwgaSkgPT4ge1xuICAgICAgICBpZiAob3V0Y29tZS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHJldHVybiBvdXRjb21lLnZhbHVlO1xuICAgICAgICBsb2dnZXIud2FybihcInVuaXZlcnNhbC1pbmRleC1mYWlsZWRcIiwgeyBpbmRleDogbmFtZXNbaV0gfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuXG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gaW5kZXggcmVmZXJlbmNlIChmdWxsIFVDIG5hbWUgb3IgY29uZmlndXJlZCBhbGlhcykgdG8gdGhlIG5hbWVcbiAgICogdGhlIEFQSSBleHBlY3RzLCBmYWlsaW5nIGZhc3Qgd2hlbiBpdCByZXNvbHZlcyB0byBub3RoaW5nLiBXaXRob3V0IHRoaXMgYVxuICAgKiBibGFuayByZWZlcmVuY2UgLSB3aGF0IGFuIG9taXR0ZWQgYGluZGV4YCBiZWNvbWVzIHdoZW4gbm8gZGVmYXVsdCBpc1xuICAgKiBjb25maWd1cmVkIC0gcmVhY2hlcyB0aGUgU0RLIGFzIGFuIGVtcHR5IGBpbmRleF9uYW1lYCwgd2hpY2ggYnVpbGRzIGFcbiAgICogVVJMIHdpdGggdGhlIG5hbWUgc2VnbWVudCBtaXNzaW5nIGFuZCBjb21lcyBiYWNrIGFzIGEgY29uZnVzaW5nXG4gICAqIGBFTkRQT0lOVF9OT1RfRk9VTkRgIGluc3RlYWQgb2YgbmFtaW5nIHRoZSByZWFsIHByb2JsZW0uXG4gICAqL1xuICBwcml2YXRlIHJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gc3RyaW5nLnRyaW1Ub051bGwocmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2UpO1xuICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIGBzZWFyY2g6IG5vIGluZGV4IGNvbmZpZ3VyZWQ7IHNldCBhIGRlZmF1bHQgaW5kZXggb3IgcGFzcyBvbmUgdG8gJHtvcGVyYXRpb259YCxcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIC8qKiBGZXRjaCBhbiBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbi4gKi9cbiAgYXN5bmMgZ2V0SW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJnZXRJbmRleFwiKTtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcImdldEluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmdldEluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGNvbnN0IGRpcmVjdEFjY2VzcyA9IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwZWMgPSBpbmRleC5kZWx0YV9zeW5jX2luZGV4X3NwZWMgPz8gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjO1xuICAgIC8vIERlbHRhIFN5bmMgc3VyZmFjZXMgaXRzIGVtYmVkZGluZyBzb3VyY2UgY29sdW1ucyBkaXJlY3RseTsgYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggY2FycmllcyBpdHMgY29sdW1ucyBpbiBzY2hlbWFfanNvbiAobWludXMgdGhlIHZlY3RvciBjb2x1bW4pLlxuICAgIGxldCBjb2x1bW5zID0gKHNwZWM/LmVtYmVkZGluZ19zb3VyY2VfY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHNjaGVtYUpzb24gPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LnNjaGVtYV9qc29uO1xuICAgIGlmIChkaXJlY3RBY2Nlc3MgJiYgc2NoZW1hSnNvbikge1xuICAgICAgY29uc3Qgc2NoZW1hID0ganNvbi5wYXJzZVJlY29yZChzY2hlbWFKc29uKSA/PyB7fTtcbiAgICAgIGNvbnN0IHZlY3Rvck5hbWVzID0gbmV3IFNldChcbiAgICAgICAgKGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYz8uZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zID8/IFtdKVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMubmFtZSlcbiAgICAgICAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSksXG4gICAgICApO1xuICAgICAgY29sdW1ucyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKChjKSA9PiAhdmVjdG9yTmFtZXMuaGFzKGMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGluZGV4Lm5hbWUgPz8gbmFtZSxcbiAgICAgIC4uLihpbmRleC5lbmRwb2ludF9uYW1lID8geyBlbmRwb2ludDogaW5kZXguZW5kcG9pbnRfbmFtZSB9IDoge30pLFxuICAgICAgLi4uKGluZGV4LnByaW1hcnlfa2V5ID8geyBwcmltYXJ5S2V5OiBpbmRleC5wcmltYXJ5X2tleSB9IDoge30pLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHJlYWR5OiBpbmRleC5zdGF0dXM/LnJlYWR5ID8/IGZhbHNlLFxuICAgICAgLi4uKGluZGV4LnN0YXR1cz8uaW5kZXhlZF9yb3dfY291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgcm93Q291bnQ6IGluZGV4LnN0YXR1cy5pbmRleGVkX3Jvd19jb3VudCB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGRpcmVjdEFjY2VzcyA/IHsgZGlyZWN0QWNjZXNzOiB0cnVlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG4gIGFzeW5jIGFkZERvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiYWRkRG9jdW1lbnRzXCIpO1xuICAgIGlmICh0aGlzLmxha2ViYXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWtlYmFzZS5hZGREb2N1bWVudHMoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRvY3VtZW50cyxcbiAgICAgICAgdGhpcy5jb25maWcuZW5zdXJlT25TZXR1cD8udGV4dENvbHVtbiA/PyBcInRleHRcIixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiYWRkRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnVwc2VydERhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBpbnB1dHNfanNvbjogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRzKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogZG9jdW1lbnRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGFzeW5jIGRlbGV0ZURvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZGVsZXRlRG9jdW1lbnRzXCIpO1xuICAgIGlmICh0aGlzLmxha2ViYXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWtlYmFzZS5kZWxldGVEb2N1bWVudHMobmFtZSwgaWRzLCBzaWduYWwpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVEb2N1bWVudHNcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlRGF0YVZlY3RvckluZGV4KFxuICAgICAgICB7IGluZGV4X25hbWU6IG5hbWUsIHByaW1hcnlfa2V5czogaWRzLm1hcChTdHJpbmcpIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgaW5kZXg6IG5hbWUsIGNvdW50OiBpZHMubGVuZ3RoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbWJlZGRpbmcgZW5kcG9pbnQgaWQgZm9yIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleC4gUmV1c2VzXG4gICAqIHRoZSBtb2RlbCByZXNvbHZlcjogYSBjb25maWd1cmVkIC8gcGFzc2VkIG5hbWUgaXMgZnV6enktbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBsaXZlIGNhdGFsb2d1ZSwgb3RoZXJ3aXNlIHRoZSBoaWdoZXN0LXJhbmtlZCBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgY2hvc2VuLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUVtYmVkZGluZ01vZGVsKHJlcXVlc3RlZD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBleHBsaWNpdCA9IHN0cmluZy50cmltVG9OdWxsKHJlcXVlc3RlZCA/PyB0aGlzLmNvbmZpZy5lbWJlZGRpbmdNb2RlbCk7XG4gICAgLy8gQW4gZXhwbGljaXQgbmFtZSB0aGF0IGFscmVhZHkgbG9va3MgbGlrZSBhbiBlbmRwb2ludCBpZCAobm8gd2hpdGVzcGFjZSlcbiAgICAvLyBpcyB1c2VkIHZlcmJhdGltIC0gbm8gbmVlZCB0byBmZXRjaCBhbmQgZnV6enktbWF0Y2ggdGhlIGxpdmUgY2F0YWxvZ3VlLlxuICAgIC8vIEEgZ2VudWluZWx5IGxvb3NlIG5hbWUgKGUuZy4gXCJndGUgbGFyZ2VcIikgc3RpbGwgcmVzb2x2ZXMgYWdhaW5zdCBpdC5cbiAgICBpZiAoZXhwbGljaXQgJiYgIS9cXHMvLnRlc3QoZXhwbGljaXQpKSByZXR1cm4gZXhwbGljaXQ7XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcInJlc29sdmVFbWJlZGRpbmdNb2RlbFwiLCBzaWduYWwsIGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBzZXJ2aW5nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgICBjb25zdCB7IG1vZGVsSWQgfSA9IG1vZGVsUmVzb2x2ZS5yZXNvbHZlTW9kZWwoZW5kcG9pbnRzLCB7XG4gICAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdHJpbmcudHJpbVRvTnVsbChtb2RlbElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZCB0ZXh0IHZpYSBhIERhdGFicmlja3MgZW1iZWRkaW5nIHNlcnZpbmcgZW5kcG9pbnQsIHJldHVybmluZyBvbmVcbiAgICogdmVjdG9yIHBlciBpbnB1dC4gVXNlZCB0byBzZWVkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCBhbmQgdG8gdHVybiBhIHNlYXJjaFxuICAgKiBxdWVyeSBpbnRvIGEgcXVlcnkgdmVjdG9yIC0gRGF0YWJyaWNrcyBvbmx5IG1hbmFnZXMgZW1iZWRkaW5ncyBmb3IgRGVsdGFcbiAgICogU3luYyBpbmRleGVzLCBzbyBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKG5vIERlbHRhIHRhYmxlLCBubyB3YXJlaG91c2UpIG5lZWRzXG4gICAqIHRoZSBjbGllbnQgdG8gZW1iZWQgb24gd3JpdGUgYW5kIG9uIHF1ZXJ5LiBUaGUgZW5kcG9pbnQgaXMgcmVzb2x2ZWQgdGhlXG4gICAqIHNhbWUgd2F5IGFzIGZvciBpbmRleCBjcmVhdGlvbiB3aGVuIG5vdCBuYW1lZC5cbiAgICovXG4gIGFzeW5jIGVtYmVkKHRleHRzOiBzdHJpbmdbXSwgbW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXJbXVtdPiB7XG4gICAgaWYgKHRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwobW9kZWwsIHNpZ25hbCk7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBjb3VsZCBub3QgcmVzb2x2ZSBhbiBlbWJlZGRpbmcgbW9kZWwgdG8gZW1iZWQgdGV4dFwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwiZW1iZWRcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgdXJsID0gaW52b2tlLmludm9jYXRpb25zVXJsKGhvc3QsIGVuZHBvaW50KTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBpbnZva2UuYXV0aEhlYWRlcnMoY2xpZW50KTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4uaGVhZGVycywgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpbnB1dDogdGV4dHMgfSksXG4gICAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgICBgc2VhcmNoOiBlbWJlZGRpbmcgZW5kcG9pbnQgJHtlbmRwb2ludH0gZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgZGF0YT86IEFycmF5PHsgZW1iZWRkaW5nOiBudW1iZXJbXSB9PiB9O1xuICAgICAgY29uc3QgdmVjdG9ycyA9IChib2R5LmRhdGEgPz8gW10pLm1hcCgocm93KSA9PiByb3cuZW1iZWRkaW5nKTtcbiAgICAgIGlmICh2ZWN0b3JzLmxlbmd0aCAhPT0gdGV4dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogZW1iZWRkaW5nIHJlc3BvbnNlIGRpZCBub3QgbWF0Y2ggdGhlIGlucHV0IGNvdW50XCIsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZlY3RvcnM7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIHZlY3RvciBkaW1lbnNpb24gYSBtb2RlbCBwcm9kdWNlcyAoZW1iZWRzIGEgcHJvYmUgc3RyaW5nIG9uY2UpLiAqL1xuICBwcml2YXRlIGFzeW5jIGVtYmVkZGluZ0RpbWVuc2lvbihtb2RlbD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IFt2ZWN0b3JdID0gYXdhaXQgdGhpcy5lbWJlZChbXCJkaW1lbnNpb24gcHJvYmVcIl0sIG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghdmVjdG9yIHx8IHZlY3Rvci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IGRldGVybWluZSB0aGUgZW1iZWRkaW5nIGRpbWVuc2lvblwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gQUkgU2VhcmNoIGluZGV4IHdpdGggYXMgbGl0dGxlIGNlcmVtb255IGFzIHBvc3NpYmxlLiBUd28gc2hhcGVzOlxuICAgKlxuICAgKiAgIC0gKipEZWx0YSBTeW5jKiogKHRoZSBkZWZhdWx0KTogcGFzcyBgc291cmNlVGFibGVgOyBEYXRhYnJpY2tzIGNvbXB1dGVzXG4gICAqICAgICBlbWJlZGRpbmdzIGZyb20gdGhlIHRleHQgY29sdW1uIGFuZCBrZWVwcyB0aGUgaW5kZXggc3luY2VkLiBUaGVcbiAgICogICAgIGVtYmVkZGluZyBtb2RlbCBpcyByZXNvbHZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gbm90IG5hbWVkLlxuICAgKiAgIC0gKipEaXJlY3QgQWNjZXNzKio6IG9taXQgYHNvdXJjZVRhYmxlYCBhbmQgcGFzcyBgZW1iZWRkaW5nRGltZW5zaW9uYDtcbiAgICogICAgIHlvdSB3cml0ZSB2ZWN0b3JzIHlvdXJzZWxmIHZpYSB7QGxpbmsgYWRkRG9jdW1lbnRzfS5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIGluZmVyczogdGhlIGVuZHBvaW50IGZyb20gdGhlIHBsdWdpbiBjb25maWcsIHRoZSBwcmltYXJ5XG4gICAqIGtleSAoYGlkYCksIHRoZSB0ZXh0IGNvbHVtbiAoYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgKSwgYW5kIHRoZSB2ZWN0b3JcbiAgICogY29sdW1uIChgZW1iZWRkaW5nYCkuIFJldHVybnMgdGhlIGNyZWF0ZWQgaW5kZXgncyB7QGxpbmsgSW5kZXhJbmZvfS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHBhc3MgYGVuZHBvaW50YCBvciBzZXQgaXQgb24gdGhlIHBsdWdpblwiLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG9wdGlvbnMucHJpbWFyeUtleSA/PyBcImlkXCI7XG4gICAgY29uc3QgZGlyZWN0ID0gIW9wdGlvbnMuc291cmNlVGFibGU7XG4gICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcblxuICAgIC8vIERlbHRhIFN5bmMgbGV0cyBEYXRhYnJpY2tzIGVtYmVkIGEgc291cmNlIGNvbHVtbiwgc28gaXQgbmVlZHMgYW4gZW1iZWRkaW5nXG4gICAgLy8gbW9kZWwuIEEgZGlyZWN0LWFjY2VzcyBpbmRleCBzdG9yZXMgdmVjdG9ycyBZT1Ugc3VwcGx5IChEYXRhYnJpY2tzIG9ubHlcbiAgICAvLyBzdXBwb3J0cyBtYW5hZ2VkIGVtYmVkZGluZ3Mgb24gRGVsdGEgU3luYyksIHNvIGl0IG5lZWRzIGEgZGltZW5zaW9uOyB3ZVxuICAgIC8vIHJlc29sdmUgb25lIGZyb20gdGhlIGVtYmVkZGluZyBtb2RlbCB3aGVuIG5vdCBnaXZlbiBzbyBhIGRpcmVjdC1hY2Nlc3NcbiAgICAvLyBpbmRleCBzdGlsbCB3b3JrcyB3aXRoIHplcm8gZXh0cmEgY29uZmlnIChlbWJlZCB2aWEgYGVtYmVkKClgIG9uIHNlZWQgK1xuICAgIC8vIHF1ZXJ5IC0gc2VlIGBwcm92aXNpb25gIC8gYHNlYXJjaGApLlxuICAgIGNvbnN0IGVtYmVkZGluZ01vZGVsID1cbiAgICAgIChhd2FpdCB0aGlzLnJlc29sdmVFbWJlZGRpbmdNb2RlbChvcHRpb25zLmVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAoIWVtYmVkZGluZ01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBjb3VsZCBub3QgcmVzb2x2ZSBhbiBlbWJlZGRpbmcgbW9kZWw7IHBhc3MgYGVtYmVkZGluZ01vZGVsYFwiLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID1cbiAgICAgIG9wdGlvbnMuZW1iZWRkaW5nRGltZW5zaW9uID8/IChhd2FpdCB0aGlzLmVtYmVkZGluZ0RpbWVuc2lvbihlbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIixcbiAgICAgIFtzb3VyY2VDb2x1bW5dOiBcInN0cmluZ1wiLFxuICAgICAgLi4uKG9wdGlvbnMuc2NoZW1hID8/IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlyZWN0U3BlYyA9IHtcbiAgICAgIGRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYzoge1xuICAgICAgICBlbWJlZGRpbmdfdmVjdG9yX2NvbHVtbnM6IFt7IG5hbWU6IHZlY3RvckNvbHVtbiwgZW1iZWRkaW5nX2RpbWVuc2lvbjogZGltZW5zaW9uIH1dLFxuICAgICAgICBzY2hlbWFfanNvbjogSlNPTi5zdHJpbmdpZnkoeyAuLi5zY2hlbWEsIFt2ZWN0b3JDb2x1bW5dOiBgYXJyYXk8ZmxvYXQ+YCB9KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImNyZWF0ZUluZGV4XCIsIG9wdGlvbnMuc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuY3JlYXRlSW5kZXgoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGVuZHBvaW50X25hbWU6IGVuZHBvaW50LFxuICAgICAgICAgIHByaW1hcnlfa2V5OiBwcmltYXJ5S2V5LFxuICAgICAgICAgIGluZGV4X3R5cGU6IGRpcmVjdCA/IFwiRElSRUNUX0FDQ0VTU1wiIDogXCJERUxUQV9TWU5DXCIsXG4gICAgICAgICAgLi4uKGRpcmVjdFxuICAgICAgICAgICAgPyBkaXJlY3RTcGVjXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBkZWx0YV9zeW5jX2luZGV4X3NwZWM6IHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZV90YWJsZTogb3B0aW9ucy5zb3VyY2VUYWJsZSxcbiAgICAgICAgICAgICAgICAgIHBpcGVsaW5lX3R5cGU6IG9wdGlvbnMucGlwZWxpbmVUeXBlID8/IFwiVFJJR0dFUkVEXCIsXG4gICAgICAgICAgICAgICAgICBlbWJlZGRpbmdfc291cmNlX2NvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiBzb3VyY2VDb2x1bW4sIGVtYmVkZGluZ19tb2RlbF9lbmRwb2ludF9uYW1lOiBlbWJlZGRpbmdNb2RlbCB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmNvbHVtbnNUb1N5bmMgJiYgb3B0aW9ucy5jb2x1bW5zVG9TeW5jLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB7IGNvbHVtbnNfdG9fc3luYzogb3B0aW9ucy5jb2x1bW5zVG9TeW5jIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1jcmVhdGVkXCIsIHtcbiAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB0eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmdldEluZGV4KG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGluZGV4IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlXG4gICAqIGV4aXN0aW5nIG9uZS4gSWRlbXBvdGVudCAtIHNhZmUgdG8gY2FsbCBvbiBldmVyeSBib290IHRvIGd1YXJhbnRlZSBhblxuICAgKiBpbmRleCBpcyBwcmVzZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlSW5kZXgobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDcmVhdGVJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUluZGV4KG5hbWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYW4gaW5kZXggZXhpc3RzLCBpcyBvbmxpbmUsIGFuZCAob3B0aW9uYWxseSkgaG9sZHMgc2VlZCBkYXRhIC0gdGhlXG4gICAqIFwid2lyZSB1cCBhIHJlYWwgaW5kZXggb24gYm9vdFwiIHBhdGguIElkZW1wb3RlbnQgYW5kIGNoZWFwIHRvIGNhbGwgZXZlcnlcbiAgICogYm9vdDogaXQgY3JlYXRlcyB0aGUgZW5kcG9pbnQgYW5kIGluZGV4IG9ubHkgaWYgbWlzc2luZywgd2FpdHMgZm9yIHRoZW0gdG9cbiAgICogY29tZSBvbmxpbmUsIGFuZCBzZWVkcyBkb2N1bWVudHMgT05MWSB3aGVuIHRoZSBpbmRleCBpcyBzdGlsbCBlbXB0eS5cbiAgICpcbiAgICogRm9yIHRoZSBkZW1vL2R1bW15LWRhdGEgY2FzZSB0aGlzIG5lZWRzIG5vIERlbHRhIHRhYmxlIGFuZCBubyB3YXJlaG91c2U6XG4gICAqIHRoZSBkZWZhdWx0IGlzIGEgTUFOQUdFRCBkaXJlY3QtYWNjZXNzIGluZGV4IChEYXRhYnJpY2tzIGVtYmVkcyB0aGUgYHRleHRgXG4gICAqIGNvbHVtbiBvbiB3cml0ZSBhbmQgcXVlcnkpLCBzbyBzZWVkaW5nIGlzIGp1c3QgYW4gYGFkZERvY3VtZW50c2Agb2YgcGxhaW5cbiAgICogcm93cyBhbmQgc2VhcmNoLWJ5LXRleHQgd29ya3MgaW1tZWRpYXRlbHkuXG4gICAqL1xuICBhc3luYyBwcm92aXNpb24obmFtZTogc3RyaW5nLCBvcHRpb25zOiBQcm92aXNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGlmICh0aGlzLmxha2ViYXNlKSB7XG4gICAgICAvLyBMYWtlYmFzZSBmYWxsYmFjazogbm8gZW5kcG9pbnQsIG5vIGVtYmVkZGluZ3MsIG5vIHZlY3RvcnMgLSBqdXN0IGFcbiAgICAgIC8vIFBvc3RncmVzIGZ1bGwtdGV4dCB0YWJsZS4gUmV0dXJucyBhbiBJbmRleEluZm8tc2hhcGVkIHJlc3VsdCBzbyB0aGVcbiAgICAgIC8vIGNhbGxlcidzIGxvZ2dpbmcgKyByZWFkaW5lc3MgaGFuZGxpbmcgaXMgaWRlbnRpY2FsIHRvIFZlY3RvciBTZWFyY2guXG4gICAgICBjb25zdCByb3dDb3VudCA9IGF3YWl0IHRoaXMubGFrZWJhc2UucHJvdmlzaW9uKG5hbWUsIHtcbiAgICAgICAgdGV4dENvbHVtbjogb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCIsXG4gICAgICAgIC4uLihvcHRpb25zLnNlZWQgPyB7IHNlZWQ6IG9wdGlvbnMuc2VlZCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcHJpbWFyeUtleTogb3B0aW9ucy5wcmltYXJ5S2V5ID8/IFwiaWRcIixcbiAgICAgICAgY29sdW1uczogW10sXG4gICAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgICByb3dDb3VudCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHdhaXQgPSBvcHRpb25zLndhaXQgPz8gdHJ1ZTtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyAyMCAqIDYwICogMTAwMDtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50KSBhd2FpdCB0aGlzLmVuc3VyZUVuZHBvaW50KGVuZHBvaW50LCB7IHdhaXQsIHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG5cbiAgICBjb25zdCB7IHNlZWQ6IF9zZWVkLCB3YWl0OiBfd2FpdCwgdGltZW91dE1zOiBfdGltZW91dE1zLCAuLi5jcmVhdGVPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5lbnN1cmVJbmRleChuYW1lLCBjcmVhdGVPcHRpb25zKTtcblxuICAgIGlmICh3YWl0ICYmICFpbmZvLnJlYWR5KSBpbmZvID0gYXdhaXQgdGhpcy53YWl0Rm9ySW5kZXhSZWFkeShuYW1lLCB0aW1lb3V0TXMsIG9wdGlvbnMuc2lnbmFsKTtcblxuICAgIGNvbnN0IHNlZWQgPSBvcHRpb25zLnNlZWQgPz8gW107XG4gICAgaWYgKHNlZWQubGVuZ3RoID4gMCAmJiAoaW5mby5yb3dDb3VudCA/PyAwKSA9PT0gMCkge1xuICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgICBjb25zdCB2ZWN0b3JDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1ZlY3RvckNvbHVtbiA/PyBcImVtYmVkZGluZ1wiO1xuICAgICAgLy8gRGlyZWN0LWFjY2VzcyBpbmRleGVzIHN0b3JlIHZlY3RvcnMgd2Ugc3VwcGx5LCBzbyBlbWJlZCB0aGUgdGV4dCBjb2x1bW5cbiAgICAgIC8vIGZvciBhbnkgc2VlZCByb3cgdGhhdCBkaWQgbm90IGFscmVhZHkgY2FycnkgYSB2ZWN0b3IuXG4gICAgICBjb25zdCBuZWVkRW1iZWQgPSBzZWVkLnNvbWUoKGRvYykgPT4gZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCk7XG4gICAgICBsZXQgcm93cyA9IHNlZWQ7XG4gICAgICBpZiAobmVlZEVtYmVkKSB7XG4gICAgICAgIGNvbnN0IHRleHRzID0gc2VlZC5tYXAoKGRvYykgPT4gc3RyaW5nLnRyaW1Ub0VtcHR5KFN0cmluZyhkb2Nbc291cmNlQ29sdW1uXSA/PyBcIlwiKSkpO1xuICAgICAgICBjb25zdCB2ZWN0b3JzID0gYXdhaXQgdGhpcy5lbWJlZCh0ZXh0cywgb3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICByb3dzID0gc2VlZC5tYXAoKGRvYywgaSkgPT5cbiAgICAgICAgICBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkID8geyAuLi5kb2MsIFt2ZWN0b3JDb2x1bW5dOiB2ZWN0b3JzW2ldIH0gOiBkb2MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZERvY3VtZW50cyhuYW1lLCByb3dzLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICBsb2dnZXIuaW5mbyhcImluZGV4LXNlZWRlZFwiLCB7IGluZGV4OiBuYW1lLCBjb3VudDogcm93cy5sZW5ndGggfSk7XG4gICAgICBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFBvbGwgYW4gaW5kZXggdW50aWwgaXQgcmVwb3J0cyByZWFkeSwgb3IgdGhyb3cgYWZ0ZXIge0BsaW5rIHRpbWVvdXRNc30uICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluZGV4UmVhZHkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB3aGlsZSAoIWluZm8ucmVhZHkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IGluZGV4ICR7bmFtZX0gZGlkIG5vdCBjb21lIG9ubGluZSBpbiB0aW1lYCwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInByb3Zpc2lvblwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2hhcmVkQXN5bmMuc2xlZXAoNTAwMCwgc2lnbmFsKTtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIGFzeW5jIHN5bmNJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJzeW5jSW5kZXhcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwic3luY0luZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnN5bmNJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LXN5bmNlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBhbiBpbmRleC4gKi9cbiAgYXN5bmMgZGVsZXRlSW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZGVsZXRlSW5kZXhcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1kZWxldGVkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogTGlzdCB0aGUgaW5kZXhlcyBob3N0ZWQgb24gYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IChuYW1lICsgdHlwZSBvbmx5KS4gKi9cbiAgYXN5bmMgbGlzdEluZGV4ZXMoZW5kcG9pbnQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGVuZHBvaW50TmFtZSA9IGVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IGNvbmZpZ3VyZWQgdG8gbGlzdCBpbmRleGVzXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwibGlzdEluZGV4ZXNcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJsaXN0SW5kZXhlc1wiLCBzaWduYWwsIGFzeW5jIChjbGllbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBpbmRleCBvZiBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5saXN0SW5kZXhlcyhcbiAgICAgICAgeyBlbmRwb2ludF9uYW1lOiBlbmRwb2ludE5hbWUgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKGluZGV4Lm5hbWUpIG5hbWVzLnB1c2goaW5kZXgubmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZXM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBleGlzdHMsIGNyZWF0aW5nIGEgYFNUQU5EQVJEYCBvbmUgd2hlbiBpdFxuICAgKiBkb2VzIG5vdC4gT3B0aW9uYWxseSB3YWl0IGZvciBpdCB0byBjb21lIG9ubGluZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUVuZHBvaW50KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM6IEVuc3VyZUVuZHBvaW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBuYW1lID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgbmFtZSB0byBlbnN1cmVcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbnN1cmVFbmRwb2ludFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZW5zdXJlRW5kcG9pbnRcIiwgb3B0aW9ucy5zaWduYWwsIGFzeW5jIChjbGllbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC52ZWN0b3JTZWFyY2hFbmRwb2ludHMuZ2V0RW5kcG9pbnQoeyBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCB9LCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHdhaXRlciA9IGF3YWl0IGNsaWVudC52ZWN0b3JTZWFyY2hFbmRwb2ludHMuY3JlYXRlRW5kcG9pbnQoXG4gICAgICAgICAgeyBuYW1lOiBlbmRwb2ludCwgZW5kcG9pbnRfdHlwZTogXCJTVEFOREFSRFwiIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJlbmRwb2ludC1jcmVhdGVkXCIsIHsgZW5kcG9pbnQgfSk7XG4gICAgICAgIGlmIChvcHRpb25zLndhaXQpIGF3YWl0IHdhaXRlci53YWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgd29ya3NwYWNlIGNsaWVudCBhbmQgcnVuIG9uZSBjYWxsIHVuZGVyIGEgYm91bmRlZCB0aW1lb3V0LiBUaGVcbiAgICogY2FsbGVyJ3Mgc2lnbmFsIChpZiBhbnkpIGFuZCBhIHRpbWVvdXQgYXJlIG1lcmdlZCBpbnRvIG9uZSBTREsgYENvbnRleHRgXG4gICAqIHZpYSB7QGxpbmsgYXBwa2l0LmRhdGFicmlja3MudG9Db250ZXh0fSwgc28gZWl0aGVyIHVud2luZHMgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdpdGhDbGllbnQ8VD4oXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgICBmbjogKGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSwgY29udGV4dD86IENvbnRleHQpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMud29ya3NwYWNlQ2xpZW50RmFjdG9yeSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGhpcy5jb25maWcudGltZW91dE1zKTtcbiAgICBjb25zdCBjb250ZXh0ID0gZGF0YWJyaWNrcy50b0NvbnRleHQoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKGNsaWVudCwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCgpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHsgb3BlcmF0aW9uIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogVGhlIE9CTyB3b3Jrc3BhY2UgY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBjb250ZXh0LCBvciBhIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudC4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIGNvbnN0IGN0eCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChjdHg/LmNsaWVudCkgcmV0dXJuIGN0eC5jbGllbnQ7XG4gIC8vIE91dHNpZGUgYSByZXF1ZXN0IHNjb3BlIChhIHNjcmlwdCwgYSB0ZXN0KTogYSBmcmVzaCBlbnYtYXV0aCBjbGllbnQuXG4gIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xufVxuXG4vKiogQ29uc3RydWN0IGEge0BsaW5rIFNlYXJjaENsaWVudH0gZnJvbSBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hDbGllbnQoXG4gIGNvbmZpZz86IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5PzogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgbGFrZWJhc2U/OiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQsXG4pOiBTZWFyY2hDbGllbnQge1xuICByZXR1cm4gbmV3IFNlYXJjaENsaWVudChjb25maWcsIHdvcmtzcGFjZUNsaWVudEZhY3RvcnksIGxha2ViYXNlKTtcbn1cbiJdfQ==
package/lib/src/config.js CHANGED
@@ -22,7 +22,7 @@
22
22
  * @module
23
23
  */
24
24
  import { ConfigurationError } from "@databricks/appkit";
25
- import { config as runtimeConfig } from "@dbx-tools/core";
25
+ import { config as coreConfig } from "@dbx-tools/core";
26
26
  import { object, string } from "@dbx-tools/shared-core";
27
27
  /** The default index, honoring AppKit's standard Vector Search binding name. */
28
28
  export const INDEX_ENV = "SEARCH_INDEX";
@@ -125,7 +125,7 @@ function toResolvedIndex(entry) {
125
125
  }
126
126
  /** Parse and validate a {@link SearchMode} from config or an env var. */
127
127
  function resolveMode(configured) {
128
- const raw = configured ?? runtimeConfig.text("SEARCH_MODE", runtimeConfig.ENV_ONLY);
128
+ const raw = configured ?? coreConfig.text("SEARCH_MODE", coreConfig.ENV_ONLY);
129
129
  if (raw === undefined)
130
130
  return DEFAULT_MODE;
131
131
  if (raw !== "hybrid" && raw !== "vector" && raw !== "keyword") {
@@ -140,13 +140,13 @@ function resolveMode(configured) {
140
140
  * and a bad mode throws a {@link ConfigurationError} naming the field.
141
141
  */
142
142
  export function resolveSearchConfig(config = {}) {
143
- const defaultIndexRaw = runtimeConfig.string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV], runtimeConfig.ENV_ONLY);
143
+ const defaultIndexRaw = coreConfig.string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV], coreConfig.ENV_ONLY);
144
144
  const configured = (config.indexes ?? [])
145
145
  .map(toResolvedIndex)
146
146
  .filter((entry) => entry !== null);
147
147
  // Ensure the default index is represented in the known set.
148
148
  if (defaultIndexRaw && !configured.some((i) => i.name === defaultIndexRaw)) {
149
- const envColumns = runtimeConfig.list(undefined, "SEARCH_COLUMNS", undefined, runtimeConfig.ENV_ONLY);
149
+ const envColumns = coreConfig.list(undefined, "SEARCH_COLUMNS", undefined, coreConfig.ENV_ONLY);
150
150
  configured.unshift({
151
151
  name: defaultIndexRaw,
152
152
  alias: defaultAlias(defaultIndexRaw),
@@ -162,18 +162,18 @@ export function resolveSearchConfig(config = {}) {
162
162
  return { ...entry, alias };
163
163
  });
164
164
  const defaultIndex = defaultIndexRaw ?? indexes[0]?.name;
165
- const columns = runtimeConfig.list(config.columns, "SEARCH_COLUMNS", undefined, runtimeConfig.ENV_ONLY);
165
+ const columns = coreConfig.list(config.columns, "SEARCH_COLUMNS", undefined, coreConfig.ENV_ONLY);
166
166
  return {
167
167
  ...object.optional("defaultIndex", defaultIndex),
168
168
  indexes,
169
- ...object.optional("endpoint", runtimeConfig.string(config.endpoint, ENDPOINT_ENV, runtimeConfig.ENV_ONLY)),
169
+ ...object.optional("endpoint", coreConfig.string(config.endpoint, ENDPOINT_ENV, coreConfig.ENV_ONLY)),
170
170
  ...(columns.length > 0 ? { columns } : {}),
171
- pageSize: runtimeConfig.positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE, runtimeConfig.ENV_ONLY),
171
+ pageSize: coreConfig.positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE, coreConfig.ENV_ONLY),
172
172
  mode: resolveMode(config.mode),
173
- ...object.optional("embeddingModel", runtimeConfig.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", runtimeConfig.ENV_ONLY)),
173
+ ...object.optional("embeddingModel", coreConfig.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", coreConfig.ENV_ONLY)),
174
174
  basePath: DEFAULT_BASE_PATH,
175
- timeoutMs: runtimeConfig.positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, runtimeConfig.ENV_ONLY),
176
- allowWrite: runtimeConfig.boolean(config.allowWrite, "SEARCH_WRITE", runtimeConfig.ENV_ONLY) ?? false,
175
+ timeoutMs: coreConfig.positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, coreConfig.ENV_ONLY),
176
+ allowWrite: coreConfig.boolean(config.allowWrite, "SEARCH_WRITE", coreConfig.ENV_ONLY) ?? false,
177
177
  ...(config.ensureOnSetup ? { ensureOnSetup: config.ensureOnSetup } : {}),
178
178
  };
179
179
  }
@@ -199,4 +199,4 @@ export function resolveIndexName(config, reference) {
199
199
  export function indexConfigFor(config, name) {
200
200
  return config.indexes.find((i) => i.name === name || i.alias === name);
201
201
  }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxJQUFJLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJeEQsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUM7QUFFeEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGdDQUFnQyxDQUFDO0FBRXJFLG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUM7QUFFOUMsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBZSxRQUFRLENBQUM7QUFFakQseUZBQXlGO0FBQ3pGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUVwQywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBRXpDLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFxRy9DLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZ0I7SUFDL0MsSUFBSSxFQUFFLFFBQVE7SUFDZCxvQkFBb0IsRUFBRSxJQUFJO0lBQzFCLFVBQVUsRUFBRTtRQUNWLEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHVFQUF1RTtTQUNyRjtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsV0FBVyxFQUFFLDRF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Q0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUM1RCxPQUFPLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO0FBQ3JDLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBNEIsRUFDNUIsSUFBWTtJQUVaLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFJIFNlYXJjaCBwbHVnaW46IHRoZSB0eXBlZFxuICoge0BsaW5rIFNlYXJjaFBsdWdpbkNvbmZpZ30gKHRoZSBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnKSwgdGhlIEpTT05cbiAqIFNjaGVtYSB0aGUgbWFuaWZlc3QgcHVibGlzaGVzIGZvciBpdCwgYW5kIHtAbGluayByZXNvbHZlU2VhcmNoQ29uZmlnfVxuICogd2hpY2ggbGF5ZXJzIHRoYXQgY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30gdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC5cbiAqXG4gKiBUaGUgZGVzaWduIGdvYWwgaXMgXCJvbmUgaW5kZXgsIHplcm8gY29uZmlnXCI6IG5hbWUgYSBkZWZhdWx0IGluZGV4IChvciBzZXRcbiAqIGBEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhgKSBhbmQgZXZlcnl0aGluZyBlbHNlIC0gdGhlIGNvbHVtbnMgdG9cbiAqIHJldHVybiwgdGhlIHBhZ2Ugc2l6ZSwgdGhlIG1hdGNoIG1vZGUsIHRoZSBtb3VudGVkIHJvdXRlIHBhdGgsIHRoZSBlbWJlZGRpbmdcbiAqIG1vZGVsIHVzZWQgd2hlbiBjcmVhdGluZyBhbiBpbmRleCAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBjYW4gYmVcbiAqIG92ZXJyaWRkZW4gd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICpcbiAqIFdoaWNoIGluZGV4IC8gZW5kcG9pbnQgaXMgdXNlZCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBwcmVjZWRlbmNlOiBleHBsaWNpdFxuICogcGx1Z2luIGNvbmZpZywgdGhlbiBlbnZpcm9ubWVudCwgdGhlbiBhIGRlZmF1bHQuXG4gKlxuICogRW52IGZhbGxiYWNrczogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWGAgKHRoZSBkZWZhdWx0IGluZGV4KSxcbiAqIGBTRUFSQ0hfSU5ERVhgLCBgU0VBUkNIX0VORFBPSU5UYCwgYFNFQVJDSF9DT0xVTU5TYCxcbiAqIGBTRUFSQ0hfUEFHRV9TSVpFYCwgYFNFQVJDSF9NT0RFYCwgYFNFQVJDSF9FTUJFRERJTkdfTU9ERUxgLFxuICogYFNFQVJDSF9USU1FT1VUX01TYCwgYFNFQVJDSF9XUklURWAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIHJ1bnRpbWVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaERvY3VtZW50LCBTZWFyY2hNb2RlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG4vKiogVGhlIGRlZmF1bHQgaW5kZXgsIGhvbm9yaW5nIEFwcEtpdCdzIHN0YW5kYXJkIFZlY3RvciBTZWFyY2ggYmluZGluZyBuYW1lLiAqL1xuZXhwb3J0IGNvbnN0IElOREVYX0VOViA9IFwiU0VBUkNIX0lOREVYXCI7XG5cbi8qKiBBcHBLaXQncyBzdGFuZGFyZCBlbnZpcm9ubWVudCBuYW1lIGZvciBhIFZlY3RvciBTZWFyY2ggaW5kZXggYmluZGluZy4gKi9cbmV4cG9ydCBjb25zdCBEQVRBQlJJQ0tTX0lOREVYX0VOViA9IFwiREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0lOREVYXCI7XG5cbi8qKiBEZWRpY2F0ZWQgb3ZlcnJpZGUgZm9yIHRoZSBWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgdGhhdCBob3N0cyBpbmRleGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VOViA9IFwiU0VBUkNIX0VORFBPSU5UXCI7XG5cbi8qKiBEZWZhdWx0IG1hdGNoIG1vZGUgd2hlbiBhIHJlcXVlc3QgZG9lcyBub3QgbmFtZSBvbmUuIEh5YnJpZCBzdWl0cyBtb3N0IHNlYXJjaCBib3hlcy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREU6IFNlYXJjaE1vZGUgPSBcImh5YnJpZFwiO1xuXG4vKiogRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zIChhIGdvb2QgYXV0b2NvbXBsZXRlIC8gcmVzdWx0cy1saXN0IHNpemUpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG5cbi8qKiBEZWZhdWx0IHBlci1jYWxsIHRpbWVvdXQgZm9yIGEgc2VhcmNoIC8gaW5kZXggb3BlcmF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqIEJhc2UgcGF0aCB0aGUgcGx1Z2luIG1vdW50cyBpdHMgcm91dGVzIHVuZGVyLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfUEFUSCA9IFwiL2FwaS9zZWFyY2hcIjtcblxuLyoqXG4gKiBBIGNvbmZpZ3VyZWQgaW5kZXggdGhlIHBsdWdpbiBrbm93cyBhYm91dCBhaGVhZCBvZiB0aW1lLiBPbmx5IGBuYW1lYCAob3JcbiAqIGBhbGlhc2ApIGlzIHJlcXVpcmVkOyB0aGUgcmVzdCBpcyByZXNvbHZlZCBmcm9tIHRoZSBsaXZlIGluZGV4IGRlZmluaXRpb25cbiAqIHdoZW4gb21pdHRlZCwgc28gYSBkZXBsb3ltZW50IGNhbiByZWdpc3RlciBgeyBuYW1lIH1gIGFuZCBsZXQgdGhlIHBsdWdpbiBmaWxsXG4gKiBpbiB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvbHVtbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoSW5kZXhDb25maWcge1xuICAvKiogVW5pdHkgQ2F0YWxvZyBuYW1lIG9mIHRoZSBpbmRleCAoY2F0YWxvZy5zY2hlbWEuaW5kZXgpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTaG9ydCBhbGlhcyBhIGNhbGxlciBtYXkgdXNlIGluIHBsYWNlIG9mIGBuYW1lYCAoZGVmYXVsdHMgdG8gdGhlIGxhc3QgbmFtZSBzZWdtZW50KS4gKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIFJlc29sdmVkIGZyb20gdGhlIGluZGV4IGRlZmluaXRpb24gd2hlbiBvbWl0dGVkLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKiogQ29sdW1ucyB0byByZXR1cm4gcGVyIGhpdCwgaW4gZGlzcGxheSBvcmRlci4gRGVmYXVsdHMgdG8gZXZlcnkgaW5kZXhlZCBjb2x1bW4uICovXG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcuIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIC0gdGhlXG4gKiBwbHVnaW4gd29ya3Mgd2l0aCBub3RoaW5nIGJ1dCBhbiBpbmRleCBuYW1lIGluIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIFRoZSBkZWZhdWx0IGluZGV4IHNlYXJjaGVkIHdoZW4gYSByZXF1ZXN0IG9taXRzIG9uZSAobmFtZSBvciBhbGlhcykuICovXG4gIGluZGV4Pzogc3RyaW5nO1xuICAvKiogSW5kZXhlcyB0aGUgcGx1Z2luIHNob3VsZCBrbm93IGFib3V0IChmb3IgYWxpYXNlcywgdW5pdmVyc2FsIHNlYXJjaCwgYW5kIHRoZSBVSSBjYXRhbG9ndWUpLiAqL1xuICBpbmRleGVzPzogQXJyYXk8c3RyaW5nIHwgU2VhcmNoSW5kZXhDb25maWc+O1xuICAvKiogVGhlIFZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCBpbmRleGVzIGxpdmUgb24gKG9ubHkgbmVlZGVkIHRvIGNyZWF0ZSBhbiBpbmRleCkuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBjb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBGYWxscyBiYWNrIHRvIGVhY2ggaW5kZXgncyBvd24gY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHN0cmluZ1tdO1xuICAvKiogRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zLiAqL1xuICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgbWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFbWJlZGRpbmcgbW9kZWwgZW5kcG9pbnQgdXNlZCB3aGVuIHRoZSBwbHVnaW4gQ1JFQVRFUyBhIERlbHRhIFN5bmMgaW5kZXguIEZ1enp5LXJlc29sdmVkLiAqL1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgLyoqIFBlci1jYWxsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBFbmFibGUgdGhlIHdyaXRlIHN1cmZhY2UgKGBhZGRfZG9jdW1lbnRzYCB0b29sICsgYFBPU1QgL2RvY3VtZW50c2ApLiBPZmYgYnkgZGVmYXVsdC4gKi9cbiAgYWxsb3dXcml0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcm92aXNpb24gYSBSRUFMIGluZGV4IGF0IGJvb3Q6IGVuc3VyZSB0aGUgZW5kcG9pbnQgKyBpbmRleCBleGlzdCBhbmQgc2VlZFxuICAgKiBkb2N1bWVudHMgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkuIFJ1bnMgaW4gdGhlIGJhY2tncm91bmQgZHVyaW5nIGBzZXR1cCgpYFxuICAgKiAoYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQvaW5kZXggYnVpbGQgbmV2ZXIgYmxvY2tzIHRoZSBzZXJ2ZXIpIHVzaW5nIHRoZVxuICAgKiBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKS4gSWRlbXBvdGVudCAtIHNhZmUgZXZlcnkgYm9vdC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgYSBNQU5BR0VEIGRpcmVjdC1hY2Nlc3MgaW5kZXggKERhdGFicmlja3MgZW1iZWRzIHRoZSB0ZXh0XG4gICAqIGNvbHVtbiksIHNvIGBkb2N1bWVudHNgIGFyZSBwbGFpbiByb3dzIGFuZCBzZWFyY2gtYnktdGV4dCB3b3JrcyB3aXRoIG5vXG4gICAqIERlbHRhIHRhYmxlLCBubyB3YXJlaG91c2UsIGFuZCBubyB2ZWN0b3JzIHRvIGNvbXB1dGUuIFBvaW50IGl0IGF0IGFcbiAgICogYHNvdXJjZVRhYmxlYCB0byBwcm92aXNpb24gYSBEZWx0YSBTeW5jIGluZGV4IGluc3RlYWQuXG4gICAqL1xuICBlbnN1cmVPblNldHVwPzogRW5zdXJlT25TZXR1cENvbmZpZztcbn1cblxuLyoqIEJvb3QtdGltZSBwcm92aXNpb25pbmcgKyBzZWVkaW5nIGZvciBhIHNpbmdsZSBpbmRleCAoc2VlIGBlbnN1cmVPblNldHVwYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZU9uU2V0dXBDb25maWcge1xuICAvKiogVUMgbmFtZSBvZiB0aGUgaW5kZXggdG8gZW5zdXJlIChjYXRhbG9nLnNjaGVtYS5pbmRleCkuIERlZmF1bHRzIHRvIHRoZSBwbHVnaW4ncyBgaW5kZXhgLiAqL1xuICBpbmRleD86IHN0cmluZztcbiAgLyoqIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgdG8gaG9zdCBpdCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKiogVGV4dCBjb2x1bW4gRGF0YWJyaWNrcyBlbWJlZHMgKG1hbmFnZWQgZGlyZWN0LWFjY2VzcykuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbiAgLyoqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gRnV6enktbWF0Y2hlZDsgZGVmYXVsdHMgdG8gdGhlIGJlc3QgZW1iZWRkaW5nIGVuZHBvaW50LiAqL1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgLyoqIEZvciBhIERlbHRhIFN5bmMgaW5kZXggaW5zdGVhZCBvZiBtYW5hZ2VkIGRpcmVjdC1hY2Nlc3M6IHRoZSBzb3VyY2UgRGVsdGEgdGFibGUuICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogQ29sdW1uIC0+IHR5cGUgbWFwIGZvciB0aGUgbWFuYWdlZCBkaXJlY3QtYWNjZXNzIGBzY2hlbWFfanNvbmAuIEluZmVycmVkIGZyb20gYGRvY3VtZW50c2Agd2hlbiBvbWl0dGVkLiAqL1xuICBzY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkuIFBsYWluIGB7IGlkLCB0ZXh0LCAuLi4gfWAgcm93cyBmb3IgYSBtYW5hZ2VkIGluZGV4LiAqL1xuICBkb2N1bWVudHM/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKiogTWF4IHRpbWUgdG8gd2FpdCBmb3IgZW5kcG9pbnQgKyBpbmRleCByZWFkaW5lc3MuIERlZmF1bHRzIHRvIDIwIG1pbnV0ZXMuICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbn1cblxuLyoqIEEgZnVsbHkgcmVzb2x2ZWQgaW5kZXggZW50cnkgKHRoZSBwbHVnaW4ta25vd24gZm9ybSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSW5kZXhDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIFRoZSBjb25jcmV0ZSBjb25maWcgdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTZWFyY2hDb25maWcge1xuICBkZWZhdWx0SW5kZXg/OiBzdHJpbmc7XG4gIGluZGV4ZXM6IFJlc29sdmVkSW5kZXhDb25maWdbXTtcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbiAgcGFnZVNpemU6IG51bWJlcjtcbiAgbW9kZTogU2VhcmNoTW9kZTtcbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIGJhc2VQYXRoOiBzdHJpbmc7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICBhbGxvd1dyaXRlOiBib29sZWFuO1xuICBlbnN1cmVPblNldHVwPzogRW5zdXJlT25TZXR1cENvbmZpZztcbn1cblxuLyoqIEpTT04gU2NoZW1hIHRoZSBwbHVnaW4gbWFuaWZlc3QgcHVibGlzaGVzIGZvciB7QGxpbmsgU2VhcmNoUGx1Z2luQ29uZmlnfS4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgaW5kZXg6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IGluZGV4IHRvIHNlYXJjaCAoY2F0YWxvZy5zY2hlbWEuaW5kZXggb3IgYSBjb25maWd1cmVkIGFsaWFzKS5cIixcbiAgICB9LFxuICAgIGluZGV4ZXM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkluZGV4ZXMgdGhlIHBsdWdpbiBrbm93cyBhYm91dCwgZm9yIGFsaWFzZXMsIHVuaXZlcnNhbCBzZWFyY2gsIGFuZCB0aGUgVUkuXCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICBvbmVPZjogW1xuICAgICAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGFsaWFzOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgcHJpbWFyeUtleTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGNvbHVtbnM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbmRwb2ludDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCBpbmRleGVzIGxpdmUgb24gKG5lZWRlZCBvbmx5IHRvIGNyZWF0ZSBvbmUpLlwiLFxuICAgIH0sXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBjb2x1bW5zIHRvIHJldHVybi5cIixcbiAgICB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IFwibnVtYmVyXCIsIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgbnVtYmVyIG9mIGhpdHMgcGVyIHNlYXJjaC5cIiB9LFxuICAgIG1vZGU6IHsgZW51bTogW1wiaHlicmlkXCIsIFwidmVjdG9yXCIsIFwia2V5d29yZFwiXSwgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBtYXRjaCBtb2RlLlwiIH0sXG4gICAgZW1iZWRkaW5nTW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFbWJlZGRpbmcgZW5kcG9pbnQgdXNlZCB3aGVuIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleCAoZnV6enktbWF0Y2hlZCkuXCIsXG4gICAgfSxcbiAgICB0aW1lb3V0TXM6IHsgdHlwZTogXCJudW1iZXJcIiwgZGVzY3JpcHRpb246IFwiUGVyLWNhbGwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXCIgfSxcbiAgICBhbGxvd1dyaXRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkVuYWJsZSB0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSAoYWRkX2RvY3VtZW50cyB0b29sICsgcm91dGUpLlwiLFxuICAgIH0sXG4gICAgZW5zdXJlT25TZXR1cDoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByb3Zpc2lvbiBhIHJlYWwgaW5kZXggYXQgYm9vdDogZW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIFwiICtcbiAgICAgICAgXCJkb2N1bWVudHMgd2hlbiBlbXB0eS4gUnVucyBpbiB0aGUgYmFja2dyb3VuZCBkdXJpbmcgc2V0dXAgdXNpbmcgYm9vdC10aW1lIGF1dGguXCIsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaW5kZXg6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBlbmRwb2ludDogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHByaW1hcnlLZXk6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB0ZXh0Q29sdW1uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZW1iZWRkaW5nTW9kZWw6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBzb3VyY2VUYWJsZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHNjaGVtYTogeyB0eXBlOiBcIm9iamVjdFwiLCBhZGRpdGlvbmFsUHJvcGVydGllczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgZG9jdW1lbnRzOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJvYmplY3RcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUgfSB9LFxuICAgICAgICB0aW1lb3V0TXM6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqIERlcml2ZSB0aGUgZGVmYXVsdCBhbGlhcyBmb3IgYW4gaW5kZXggbmFtZSAoaXRzIGxhc3QgZG90dGVkIHNlZ21lbnQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBbGlhcyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50cyA9IG5hbWUuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA+IDAgPyBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSA6IG5hbWU7XG59XG5cbi8qKiBOb3JtYWxpemUgYSBjb25maWcgaW5kZXggZW50cnkgKHN0cmluZyBvciBvYmplY3QpIGludG8gYSB7QGxpbmsgUmVzb2x2ZWRJbmRleENvbmZpZ30uICovXG5mdW5jdGlvbiB0b1Jlc29sdmVkSW5kZXgoZW50cnk6IHN0cmluZyB8IFNlYXJjaEluZGV4Q29uZmlnKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IG51bGwge1xuICBjb25zdCByYXcgPSB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IGVudHJ5IH0gOiBlbnRyeTtcbiAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJhdy5uYW1lKTtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgYWxpYXM6IHN0cmluZy50cmltVG9OdWxsKHJhdy5hbGlhcykgPz8gZGVmYXVsdEFsaWFzKG5hbWUpLFxuICAgIC4uLihyYXcucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogcmF3LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAuLi4ocmF3LmNvbHVtbnMgJiYgcmF3LmNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1uczogWy4uLnJhdy5jb2x1bW5zXSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUGFyc2UgYW5kIHZhbGlkYXRlIGEge0BsaW5rIFNlYXJjaE1vZGV9IGZyb20gY29uZmlnIG9yIGFuIGVudiB2YXIuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZShjb25maWd1cmVkOiBTZWFyY2hNb2RlIHwgdW5kZWZpbmVkKTogU2VhcmNoTW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ3VyZWQgPz8gcnVudGltZUNvbmZpZy50ZXh0KFwiU0VBUkNIX01PREVcIiwgcnVudGltZUNvbmZpZy5FTlZfT05MWSk7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfTU9ERTtcbiAgaWYgKHJhdyAhPT0gXCJoeWJyaWRcIiAmJiByYXcgIT09IFwidmVjdG9yXCIgJiYgcmF3ICE9PSBcImtleXdvcmRcIikge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAnbW9kZSBtdXN0IGJlIFwiaHlicmlkXCIsIFwidmVjdG9yXCIgb3IgXCJrZXl3b3JkXCIgKGVudjogU0VBUkNIX01PREUpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJtb2RlXCIsIGVudlZhcjogXCJTRUFSQ0hfTU9ERVwiIH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30uIFRoZSBkZWZhdWx0IGluZGV4IGlzIHVuaW9uZWQgaW50byB0aGUga25vd25cbiAqIGluZGV4ZXMgc28gaXQgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIGNhdGFsb2d1ZSwgYWxpYXNlcyBhcmUgZGUtZHVwbGljYXRlZCxcbiAqIGFuZCBhIGJhZCBtb2RlIHRocm93cyBhIHtAbGluayBDb25maWd1cmF0aW9uRXJyb3J9IG5hbWluZyB0aGUgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VhcmNoQ29uZmlnKGNvbmZpZzogU2VhcmNoUGx1Z2luQ29uZmlnID0ge30pOiBSZXNvbHZlZFNlYXJjaENvbmZpZyB7XG4gIGNvbnN0IGRlZmF1bHRJbmRleFJhdyA9IHJ1bnRpbWVDb25maWcuc3RyaW5nKFxuICAgIGNvbmZpZy5pbmRleCxcbiAgICBbSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOVl0sXG4gICAgcnVudGltZUNvbmZpZy5FTlZfT05MWSxcbiAgKTtcblxuICBjb25zdCBjb25maWd1cmVkID0gKGNvbmZpZy5pbmRleGVzID8/IFtdKVxuICAgIC5tYXAodG9SZXNvbHZlZEluZGV4KVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVzb2x2ZWRJbmRleENvbmZpZyA9PiBlbnRyeSAhPT0gbnVsbCk7XG5cbiAgLy8gRW5zdXJlIHRoZSBkZWZhdWx0IGluZGV4IGlzIHJlcHJlc2VudGVkIGluIHRoZSBrbm93biBzZXQuXG4gIGlmIChkZWZhdWx0SW5kZXhSYXcgJiYgIWNvbmZpZ3VyZWQuc29tZSgoaSkgPT4gaS5uYW1lID09PSBkZWZhdWx0SW5kZXhSYXcpKSB7XG4gICAgY29uc3QgZW52Q29sdW1ucyA9IHJ1bnRpbWVDb25maWcubGlzdChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFwiU0VBUkNIX0NPTFVNTlNcIixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJ1bnRpbWVDb25maWcuRU5WX09OTFksXG4gICAgKTtcbiAgICBjb25maWd1cmVkLnVuc2hpZnQoe1xuICAgICAgbmFtZTogZGVmYXVsdEluZGV4UmF3LFxuICAgICAgYWxpYXM6IGRlZmF1bHRBbGlhcyhkZWZhdWx0SW5kZXhSYXcpLFxuICAgICAgLi4uKGVudkNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1uczogZW52Q29sdW1ucyB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2VlbkFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgaW5kZXhlcyA9IGNvbmZpZ3VyZWQubWFwKChlbnRyeSkgPT4ge1xuICAgIGxldCBhbGlhcyA9IGVudHJ5LmFsaWFzO1xuICAgIHdoaWxlIChzZWVuQWxpYXNlcy5oYXMoYWxpYXMpKSBhbGlhcyA9IGAke2FsaWFzfV9gO1xuICAgIHNlZW5BbGlhc2VzLmFkZChhbGlhcyk7XG4gICAgcmV0dXJuIHsgLi4uZW50cnksIGFsaWFzIH07XG4gIH0pO1xuXG4gIGNvbnN0IGRlZmF1bHRJbmRleCA9IGRlZmF1bHRJbmRleFJhdyA/PyBpbmRleGVzWzBdPy5uYW1lO1xuICBjb25zdCBjb2x1bW5zID0gcnVudGltZUNvbmZpZy5saXN0KFxuICAgIGNvbmZpZy5jb2x1bW5zLFxuICAgIFwiU0VBUkNIX0NPTFVNTlNcIixcbiAgICB1bmRlZmluZWQsXG4gICAgcnVudGltZUNvbmZpZy5FTlZfT05MWSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm9iamVjdC5vcHRpb25hbChcImRlZmF1bHRJbmRleFwiLCBkZWZhdWx0SW5kZXgpLFxuICAgIGluZGV4ZXMsXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFxuICAgICAgXCJlbmRwb2ludFwiLFxuICAgICAgcnVudGltZUNvbmZpZy5zdHJpbmcoY29uZmlnLmVuZHBvaW50LCBFTkRQT0lOVF9FTlYsIHJ1bnRpbWVDb25maWcuRU5WX09OTFkpLFxuICAgICksXG4gICAgLi4uKGNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1ucyB9IDoge30pLFxuICAgIHBhZ2VTaXplOiBydW50aW1lQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnBhZ2VTaXplLFxuICAgICAgXCJTRUFSQ0hfUEFHRV9TSVpFXCIsXG4gICAgICBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIHJ1bnRpbWVDb25maWcuRU5WX09OTFksXG4gICAgKSxcbiAgICBtb2RlOiByZXNvbHZlTW9kZShjb25maWcubW9kZSksXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFxuICAgICAgXCJlbWJlZGRpbmdNb2RlbFwiLFxuICAgICAgcnVudGltZUNvbmZpZy5zdHJpbmcoY29uZmlnLmVtYmVkZGluZ01vZGVsLCBcIlNFQVJDSF9FTUJFRERJTkdfTU9ERUxcIiwgcnVudGltZUNvbmZpZy5FTlZfT05MWSksXG4gICAgKSxcbiAgICBiYXNlUGF0aDogREVGQVVMVF9CQVNFX1BBVEgsXG4gICAgdGltZW91dE1zOiBydW50aW1lQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnRpbWVvdXRNcyxcbiAgICAgIFwiU0VBUkNIX1RJTUVPVVRfTVNcIixcbiAgICAgIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgIHJ1bnRpbWVDb25maWcuRU5WX09OTFksXG4gICAgKSxcbiAgICBhbGxvd1dyaXRlOlxuICAgICAgcnVudGltZUNvbmZpZy5ib29sZWFuKGNvbmZpZy5hbGxvd1dyaXRlLCBcIlNFQVJDSF9XUklURVwiLCBydW50aW1lQ29uZmlnLkVOVl9PTkxZKSA/PyBmYWxzZSxcbiAgICAuLi4oY29uZmlnLmVuc3VyZU9uU2V0dXAgPyB7IGVuc3VyZU9uU2V0dXA6IGNvbmZpZy5lbnN1cmVPblNldHVwIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNhbGxlci1zdXBwbGllZCBpbmRleCByZWZlcmVuY2UgKGEgZnVsbCBVQyBuYW1lIG9yIGEgY29uZmlndXJlZFxuICogYWxpYXMpIGludG8gYSBjb25jcmV0ZSBpbmRleCBuYW1lLiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGluZGV4IHdoZW4gdGhlXG4gKiByZWZlcmVuY2UgaXMgZW1wdHkuIFJldHVybnMgYG51bGxgIHdoZW4gbm90aGluZyBjYW4gYmUgcmVzb2x2ZWQgc28gY2FsbGVyc1xuICogcmFpc2UgYSBzdGFibGUsIHVzZXItZmFjaW5nIGVycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYSBwaGFudG9tIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluZGV4TmFtZShcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgcmVmZXJlbmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gc3RyaW5nLnRyaW1Ub051bGwocmVmZXJlbmNlKTtcbiAgaWYgKHJlZiA9PT0gbnVsbCkgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbiAgY29uc3QgYnlBbGlhcyA9IGNvbmZpZy5pbmRleGVzLmZpbmQoKGkpID0+IGkuYWxpYXMgPT09IHJlZiB8fCBpLm5hbWUgPT09IHJlZik7XG4gIGlmIChieUFsaWFzKSByZXR1cm4gYnlBbGlhcy5uYW1lO1xuICAvLyBBY2NlcHQgYW4gdW5yZWdpc3RlcmVkIGJ1dCBmdWxseS1xdWFsaWZpZWQgVUMgbmFtZSAodGhyZWUgZG90dGVkIHBhcnRzKS5cbiAgaWYgKHJlZi5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA9PT0gMykgcmV0dXJuIHJlZjtcbiAgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbn1cblxuLyoqIFRoZSBrbm93biBjb25maWcgZm9yIGFuIGluZGV4IG5hbWUsIHdoZW4gdGhlIHBsdWdpbiB3YXMgdG9sZCBhYm91dCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleENvbmZpZ0ZvcihcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb25maWcuaW5kZXhlcy5maW5kKChpKSA9PiBpLm5hbWUgPT09IG5hbWUgfHwgaS5hbGlhcyA9PT0gbmFtZSk7XG59XG4iXX0=
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxJQUFJLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJeEQsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUM7QUFFeEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGdDQUFnQyxDQUFDO0FBRXJFLG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUM7QUFFOUMsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBZSxRQUFRLENBQUM7QUFFakQseUZBQXlGO0FBQ3pGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUVwQywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBRXpDLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFxRy9DLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZ0I7SUFDL0MsSUFBSSxFQUFFLFFBQVE7SUFDZCxvQkFBb0IsRUFBRSxJQUFJO0lBQzFCLFVBQVUsRUFBRTtRQUNWLEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHVFQUF1RTtTQUNyRjtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsV0FBVyxFQUFFLDRF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Q0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUM1RCxPQUFPLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO0FBQ3JDLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBNEIsRUFDNUIsSUFBWTtJQUVaLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFJIFNlYXJjaCBwbHVnaW46IHRoZSB0eXBlZFxuICoge0BsaW5rIFNlYXJjaFBsdWdpbkNvbmZpZ30gKHRoZSBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnKSwgdGhlIEpTT05cbiAqIFNjaGVtYSB0aGUgbWFuaWZlc3QgcHVibGlzaGVzIGZvciBpdCwgYW5kIHtAbGluayByZXNvbHZlU2VhcmNoQ29uZmlnfVxuICogd2hpY2ggbGF5ZXJzIHRoYXQgY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30gdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC5cbiAqXG4gKiBUaGUgZGVzaWduIGdvYWwgaXMgXCJvbmUgaW5kZXgsIHplcm8gY29uZmlnXCI6IG5hbWUgYSBkZWZhdWx0IGluZGV4IChvciBzZXRcbiAqIGBEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhgKSBhbmQgZXZlcnl0aGluZyBlbHNlIC0gdGhlIGNvbHVtbnMgdG9cbiAqIHJldHVybiwgdGhlIHBhZ2Ugc2l6ZSwgdGhlIG1hdGNoIG1vZGUsIHRoZSBtb3VudGVkIHJvdXRlIHBhdGgsIHRoZSBlbWJlZGRpbmdcbiAqIG1vZGVsIHVzZWQgd2hlbiBjcmVhdGluZyBhbiBpbmRleCAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBjYW4gYmVcbiAqIG92ZXJyaWRkZW4gd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICpcbiAqIFdoaWNoIGluZGV4IC8gZW5kcG9pbnQgaXMgdXNlZCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBwcmVjZWRlbmNlOiBleHBsaWNpdFxuICogcGx1Z2luIGNvbmZpZywgdGhlbiBlbnZpcm9ubWVudCwgdGhlbiBhIGRlZmF1bHQuXG4gKlxuICogRW52IGZhbGxiYWNrczogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWGAgKHRoZSBkZWZhdWx0IGluZGV4KSxcbiAqIGBTRUFSQ0hfSU5ERVhgLCBgU0VBUkNIX0VORFBPSU5UYCwgYFNFQVJDSF9DT0xVTU5TYCxcbiAqIGBTRUFSQ0hfUEFHRV9TSVpFYCwgYFNFQVJDSF9NT0RFYCwgYFNFQVJDSF9FTUJFRERJTkdfTU9ERUxgLFxuICogYFNFQVJDSF9USU1FT1VUX01TYCwgYFNFQVJDSF9XUklURWAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIGNvcmVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaERvY3VtZW50LCBTZWFyY2hNb2RlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG4vKiogVGhlIGRlZmF1bHQgaW5kZXgsIGhvbm9yaW5nIEFwcEtpdCdzIHN0YW5kYXJkIFZlY3RvciBTZWFyY2ggYmluZGluZyBuYW1lLiAqL1xuZXhwb3J0IGNvbnN0IElOREVYX0VOViA9IFwiU0VBUkNIX0lOREVYXCI7XG5cbi8qKiBBcHBLaXQncyBzdGFuZGFyZCBlbnZpcm9ubWVudCBuYW1lIGZvciBhIFZlY3RvciBTZWFyY2ggaW5kZXggYmluZGluZy4gKi9cbmV4cG9ydCBjb25zdCBEQVRBQlJJQ0tTX0lOREVYX0VOViA9IFwiREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0lOREVYXCI7XG5cbi8qKiBEZWRpY2F0ZWQgb3ZlcnJpZGUgZm9yIHRoZSBWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgdGhhdCBob3N0cyBpbmRleGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VOViA9IFwiU0VBUkNIX0VORFBPSU5UXCI7XG5cbi8qKiBEZWZhdWx0IG1hdGNoIG1vZGUgd2hlbiBhIHJlcXVlc3QgZG9lcyBub3QgbmFtZSBvbmUuIEh5YnJpZCBzdWl0cyBtb3N0IHNlYXJjaCBib3hlcy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREU6IFNlYXJjaE1vZGUgPSBcImh5YnJpZFwiO1xuXG4vKiogRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zIChhIGdvb2QgYXV0b2NvbXBsZXRlIC8gcmVzdWx0cy1saXN0IHNpemUpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG5cbi8qKiBEZWZhdWx0IHBlci1jYWxsIHRpbWVvdXQgZm9yIGEgc2VhcmNoIC8gaW5kZXggb3BlcmF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqIEJhc2UgcGF0aCB0aGUgcGx1Z2luIG1vdW50cyBpdHMgcm91dGVzIHVuZGVyLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfUEFUSCA9IFwiL2FwaS9zZWFyY2hcIjtcblxuLyoqXG4gKiBBIGNvbmZpZ3VyZWQgaW5kZXggdGhlIHBsdWdpbiBrbm93cyBhYm91dCBhaGVhZCBvZiB0aW1lLiBPbmx5IGBuYW1lYCAob3JcbiAqIGBhbGlhc2ApIGlzIHJlcXVpcmVkOyB0aGUgcmVzdCBpcyByZXNvbHZlZCBmcm9tIHRoZSBsaXZlIGluZGV4IGRlZmluaXRpb25cbiAqIHdoZW4gb21pdHRlZCwgc28gYSBkZXBsb3ltZW50IGNhbiByZWdpc3RlciBgeyBuYW1lIH1gIGFuZCBsZXQgdGhlIHBsdWdpbiBmaWxsXG4gKiBpbiB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvbHVtbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoSW5kZXhDb25maWcge1xuICAvKiogVW5pdHkgQ2F0YWxvZyBuYW1lIG9mIHRoZSBpbmRleCAoY2F0YWxvZy5zY2hlbWEuaW5kZXgpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTaG9ydCBhbGlhcyBhIGNhbGxlciBtYXkgdXNlIGluIHBsYWNlIG9mIGBuYW1lYCAoZGVmYXVsdHMgdG8gdGhlIGxhc3QgbmFtZSBzZWdtZW50KS4gKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIFJlc29sdmVkIGZyb20gdGhlIGluZGV4IGRlZmluaXRpb24gd2hlbiBvbWl0dGVkLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKiogQ29sdW1ucyB0byByZXR1cm4gcGVyIGhpdCwgaW4gZGlzcGxheSBvcmRlci4gRGVmYXVsdHMgdG8gZXZlcnkgaW5kZXhlZCBjb2x1bW4uICovXG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcuIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIC0gdGhlXG4gKiBwbHVnaW4gd29ya3Mgd2l0aCBub3RoaW5nIGJ1dCBhbiBpbmRleCBuYW1lIGluIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIFRoZSBkZWZhdWx0IGluZGV4IHNlYXJjaGVkIHdoZW4gYSByZXF1ZXN0IG9taXRzIG9uZSAobmFtZSBvciBhbGlhcykuICovXG4gIGluZGV4Pzogc3RyaW5nO1xuICAvKiogSW5kZXhlcyB0aGUgcGx1Z2luIHNob3VsZCBrbm93IGFib3V0IChmb3IgYWxpYXNlcywgdW5pdmVyc2FsIHNlYXJjaCwgYW5kIHRoZSBVSSBjYXRhbG9ndWUpLiAqL1xuICBpbmRleGVzPzogQXJyYXk8c3RyaW5nIHwgU2VhcmNoSW5kZXhDb25maWc+O1xuICAvKiogVGhlIFZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCBpbmRleGVzIGxpdmUgb24gKG9ubHkgbmVlZGVkIHRvIGNyZWF0ZSBhbiBpbmRleCkuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBjb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBGYWxscyBiYWNrIHRvIGVhY2ggaW5kZXgncyBvd24gY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHN0cmluZ1tdO1xuICAvKiogRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zLiAqL1xuICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgbWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFbWJlZGRpbmcgbW9kZWwgZW5kcG9pbnQgdXNlZCB3aGVuIHRoZSBwbHVnaW4gQ1JFQVRFUyBhIERlbHRhIFN5bmMgaW5kZXguIEZ1enp5LXJlc29sdmVkLiAqL1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgLyoqIFBlci1jYWxsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBFbmFibGUgdGhlIHdyaXRlIHN1cmZhY2UgKGBhZGRfZG9jdW1lbnRzYCB0b29sICsgYFBPU1QgL2RvY3VtZW50c2ApLiBPZmYgYnkgZGVmYXVsdC4gKi9cbiAgYWxsb3dXcml0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcm92aXNpb24gYSBSRUFMIGluZGV4IGF0IGJvb3Q6IGVuc3VyZSB0aGUgZW5kcG9pbnQgKyBpbmRleCBleGlzdCBhbmQgc2VlZFxuICAgKiBkb2N1bWVudHMgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkuIFJ1bnMgaW4gdGhlIGJhY2tncm91bmQgZHVyaW5nIGBzZXR1cCgpYFxuICAgKiAoYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQvaW5kZXggYnVpbGQgbmV2ZXIgYmxvY2tzIHRoZSBzZXJ2ZXIpIHVzaW5nIHRoZVxuICAgKiBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKS4gSWRlbXBvdGVudCAtIHNhZmUgZXZlcnkgYm9vdC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgYSBNQU5BR0VEIGRpcmVjdC1hY2Nlc3MgaW5kZXggKERhdGFicmlja3MgZW1iZWRzIHRoZSB0ZXh0XG4gICAqIGNvbHVtbiksIHNvIGBkb2N1bWVudHNgIGFyZSBwbGFpbiByb3dzIGFuZCBzZWFyY2gtYnktdGV4dCB3b3JrcyB3aXRoIG5vXG4gICAqIERlbHRhIHRhYmxlLCBubyB3YXJlaG91c2UsIGFuZCBubyB2ZWN0b3JzIHRvIGNvbXB1dGUuIFBvaW50IGl0IGF0IGFcbiAgICogYHNvdXJjZVRhYmxlYCB0byBwcm92aXNpb24gYSBEZWx0YSBTeW5jIGluZGV4IGluc3RlYWQuXG4gICAqL1xuICBlbnN1cmVPblNldHVwPzogRW5zdXJlT25TZXR1cENvbmZpZztcbn1cblxuLyoqIEJvb3QtdGltZSBwcm92aXNpb25pbmcgKyBzZWVkaW5nIGZvciBhIHNpbmdsZSBpbmRleCAoc2VlIGBlbnN1cmVPblNldHVwYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZU9uU2V0dXBDb25maWcge1xuICAvKiogVUMgbmFtZSBvZiB0aGUgaW5kZXggdG8gZW5zdXJlIChjYXRhbG9nLnNjaGVtYS5pbmRleCkuIERlZmF1bHRzIHRvIHRoZSBwbHVnaW4ncyBgaW5kZXhgLiAqL1xuICBpbmRleD86IHN0cmluZztcbiAgLyoqIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgdG8gaG9zdCBpdCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKiogVGV4dCBjb2x1bW4gRGF0YWJyaWNrcyBlbWJlZHMgKG1hbmFnZWQgZGlyZWN0LWFjY2VzcykuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbiAgLyoqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gRnV6enktbWF0Y2hlZDsgZGVmYXVsdHMgdG8gdGhlIGJlc3QgZW1iZWRkaW5nIGVuZHBvaW50LiAqL1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgLyoqIEZvciBhIERlbHRhIFN5bmMgaW5kZXggaW5zdGVhZCBvZiBtYW5hZ2VkIGRpcmVjdC1hY2Nlc3M6IHRoZSBzb3VyY2UgRGVsdGEgdGFibGUuICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogQ29sdW1uIC0+IHR5cGUgbWFwIGZvciB0aGUgbWFuYWdlZCBkaXJlY3QtYWNjZXNzIGBzY2hlbWFfanNvbmAuIEluZmVycmVkIGZyb20gYGRvY3VtZW50c2Agd2hlbiBvbWl0dGVkLiAqL1xuICBzY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkuIFBsYWluIGB7IGlkLCB0ZXh0LCAuLi4gfWAgcm93cyBmb3IgYSBtYW5hZ2VkIGluZGV4LiAqL1xuICBkb2N1bWVudHM/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKiogTWF4IHRpbWUgdG8gd2FpdCBmb3IgZW5kcG9pbnQgKyBpbmRleCByZWFkaW5lc3MuIERlZmF1bHRzIHRvIDIwIG1pbnV0ZXMuICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbn1cblxuLyoqIEEgZnVsbHkgcmVzb2x2ZWQgaW5kZXggZW50cnkgKHRoZSBwbHVnaW4ta25vd24gZm9ybSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSW5kZXhDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIFRoZSBjb25jcmV0ZSBjb25maWcgdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTZWFyY2hDb25maWcge1xuICBkZWZhdWx0SW5kZXg/OiBzdHJpbmc7XG4gIGluZGV4ZXM6IFJlc29sdmVkSW5kZXhDb25maWdbXTtcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbiAgcGFnZVNpemU6IG51bWJlcjtcbiAgbW9kZTogU2VhcmNoTW9kZTtcbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIGJhc2VQYXRoOiBzdHJpbmc7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICBhbGxvd1dyaXRlOiBib29sZWFuO1xuICBlbnN1cmVPblNldHVwPzogRW5zdXJlT25TZXR1cENvbmZpZztcbn1cblxuLyoqIEpTT04gU2NoZW1hIHRoZSBwbHVnaW4gbWFuaWZlc3QgcHVibGlzaGVzIGZvciB7QGxpbmsgU2VhcmNoUGx1Z2luQ29uZmlnfS4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgaW5kZXg6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IGluZGV4IHRvIHNlYXJjaCAoY2F0YWxvZy5zY2hlbWEuaW5kZXggb3IgYSBjb25maWd1cmVkIGFsaWFzKS5cIixcbiAgICB9LFxuICAgIGluZGV4ZXM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkluZGV4ZXMgdGhlIHBsdWdpbiBrbm93cyBhYm91dCwgZm9yIGFsaWFzZXMsIHVuaXZlcnNhbCBzZWFyY2gsIGFuZCB0aGUgVUkuXCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICBvbmVPZjogW1xuICAgICAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGFsaWFzOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgcHJpbWFyeUtleTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGNvbHVtbnM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbmRwb2ludDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCBpbmRleGVzIGxpdmUgb24gKG5lZWRlZCBvbmx5IHRvIGNyZWF0ZSBvbmUpLlwiLFxuICAgIH0sXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBjb2x1bW5zIHRvIHJldHVybi5cIixcbiAgICB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IFwibnVtYmVyXCIsIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgbnVtYmVyIG9mIGhpdHMgcGVyIHNlYXJjaC5cIiB9LFxuICAgIG1vZGU6IHsgZW51bTogW1wiaHlicmlkXCIsIFwidmVjdG9yXCIsIFwia2V5d29yZFwiXSwgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBtYXRjaCBtb2RlLlwiIH0sXG4gICAgZW1iZWRkaW5nTW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFbWJlZGRpbmcgZW5kcG9pbnQgdXNlZCB3aGVuIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleCAoZnV6enktbWF0Y2hlZCkuXCIsXG4gICAgfSxcbiAgICB0aW1lb3V0TXM6IHsgdHlwZTogXCJudW1iZXJcIiwgZGVzY3JpcHRpb246IFwiUGVyLWNhbGwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXCIgfSxcbiAgICBhbGxvd1dyaXRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkVuYWJsZSB0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSAoYWRkX2RvY3VtZW50cyB0b29sICsgcm91dGUpLlwiLFxuICAgIH0sXG4gICAgZW5zdXJlT25TZXR1cDoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByb3Zpc2lvbiBhIHJlYWwgaW5kZXggYXQgYm9vdDogZW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIFwiICtcbiAgICAgICAgXCJkb2N1bWVudHMgd2hlbiBlbXB0eS4gUnVucyBpbiB0aGUgYmFja2dyb3VuZCBkdXJpbmcgc2V0dXAgdXNpbmcgYm9vdC10aW1lIGF1dGguXCIsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaW5kZXg6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBlbmRwb2ludDogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHByaW1hcnlLZXk6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB0ZXh0Q29sdW1uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZW1iZWRkaW5nTW9kZWw6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBzb3VyY2VUYWJsZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHNjaGVtYTogeyB0eXBlOiBcIm9iamVjdFwiLCBhZGRpdGlvbmFsUHJvcGVydGllczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgZG9jdW1lbnRzOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJvYmplY3RcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUgfSB9LFxuICAgICAgICB0aW1lb3V0TXM6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqIERlcml2ZSB0aGUgZGVmYXVsdCBhbGlhcyBmb3IgYW4gaW5kZXggbmFtZSAoaXRzIGxhc3QgZG90dGVkIHNlZ21lbnQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBbGlhcyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50cyA9IG5hbWUuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA+IDAgPyBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSA6IG5hbWU7XG59XG5cbi8qKiBOb3JtYWxpemUgYSBjb25maWcgaW5kZXggZW50cnkgKHN0cmluZyBvciBvYmplY3QpIGludG8gYSB7QGxpbmsgUmVzb2x2ZWRJbmRleENvbmZpZ30uICovXG5mdW5jdGlvbiB0b1Jlc29sdmVkSW5kZXgoZW50cnk6IHN0cmluZyB8IFNlYXJjaEluZGV4Q29uZmlnKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IG51bGwge1xuICBjb25zdCByYXcgPSB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IGVudHJ5IH0gOiBlbnRyeTtcbiAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJhdy5uYW1lKTtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgYWxpYXM6IHN0cmluZy50cmltVG9OdWxsKHJhdy5hbGlhcykgPz8gZGVmYXVsdEFsaWFzKG5hbWUpLFxuICAgIC4uLihyYXcucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogcmF3LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAuLi4ocmF3LmNvbHVtbnMgJiYgcmF3LmNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1uczogWy4uLnJhdy5jb2x1bW5zXSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUGFyc2UgYW5kIHZhbGlkYXRlIGEge0BsaW5rIFNlYXJjaE1vZGV9IGZyb20gY29uZmlnIG9yIGFuIGVudiB2YXIuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZShjb25maWd1cmVkOiBTZWFyY2hNb2RlIHwgdW5kZWZpbmVkKTogU2VhcmNoTW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ3VyZWQgPz8gY29yZUNvbmZpZy50ZXh0KFwiU0VBUkNIX01PREVcIiwgY29yZUNvbmZpZy5FTlZfT05MWSk7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfTU9ERTtcbiAgaWYgKHJhdyAhPT0gXCJoeWJyaWRcIiAmJiByYXcgIT09IFwidmVjdG9yXCIgJiYgcmF3ICE9PSBcImtleXdvcmRcIikge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAnbW9kZSBtdXN0IGJlIFwiaHlicmlkXCIsIFwidmVjdG9yXCIgb3IgXCJrZXl3b3JkXCIgKGVudjogU0VBUkNIX01PREUpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJtb2RlXCIsIGVudlZhcjogXCJTRUFSQ0hfTU9ERVwiIH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30uIFRoZSBkZWZhdWx0IGluZGV4IGlzIHVuaW9uZWQgaW50byB0aGUga25vd25cbiAqIGluZGV4ZXMgc28gaXQgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIGNhdGFsb2d1ZSwgYWxpYXNlcyBhcmUgZGUtZHVwbGljYXRlZCxcbiAqIGFuZCBhIGJhZCBtb2RlIHRocm93cyBhIHtAbGluayBDb25maWd1cmF0aW9uRXJyb3J9IG5hbWluZyB0aGUgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VhcmNoQ29uZmlnKGNvbmZpZzogU2VhcmNoUGx1Z2luQ29uZmlnID0ge30pOiBSZXNvbHZlZFNlYXJjaENvbmZpZyB7XG4gIGNvbnN0IGRlZmF1bHRJbmRleFJhdyA9IGNvcmVDb25maWcuc3RyaW5nKFxuICAgIGNvbmZpZy5pbmRleCxcbiAgICBbSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOVl0sXG4gICAgY29yZUNvbmZpZy5FTlZfT05MWSxcbiAgKTtcblxuICBjb25zdCBjb25maWd1cmVkID0gKGNvbmZpZy5pbmRleGVzID8/IFtdKVxuICAgIC5tYXAodG9SZXNvbHZlZEluZGV4KVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVzb2x2ZWRJbmRleENvbmZpZyA9PiBlbnRyeSAhPT0gbnVsbCk7XG5cbiAgLy8gRW5zdXJlIHRoZSBkZWZhdWx0IGluZGV4IGlzIHJlcHJlc2VudGVkIGluIHRoZSBrbm93biBzZXQuXG4gIGlmIChkZWZhdWx0SW5kZXhSYXcgJiYgIWNvbmZpZ3VyZWQuc29tZSgoaSkgPT4gaS5uYW1lID09PSBkZWZhdWx0SW5kZXhSYXcpKSB7XG4gICAgY29uc3QgZW52Q29sdW1ucyA9IGNvcmVDb25maWcubGlzdChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFwiU0VBUkNIX0NPTFVNTlNcIixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNvcmVDb25maWcuRU5WX09OTFksXG4gICAgKTtcbiAgICBjb25maWd1cmVkLnVuc2hpZnQoe1xuICAgICAgbmFtZTogZGVmYXVsdEluZGV4UmF3LFxuICAgICAgYWxpYXM6IGRlZmF1bHRBbGlhcyhkZWZhdWx0SW5kZXhSYXcpLFxuICAgICAgLi4uKGVudkNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1uczogZW52Q29sdW1ucyB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2VlbkFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgaW5kZXhlcyA9IGNvbmZpZ3VyZWQubWFwKChlbnRyeSkgPT4ge1xuICAgIGxldCBhbGlhcyA9IGVudHJ5LmFsaWFzO1xuICAgIHdoaWxlIChzZWVuQWxpYXNlcy5oYXMoYWxpYXMpKSBhbGlhcyA9IGAke2FsaWFzfV9gO1xuICAgIHNlZW5BbGlhc2VzLmFkZChhbGlhcyk7XG4gICAgcmV0dXJuIHsgLi4uZW50cnksIGFsaWFzIH07XG4gIH0pO1xuXG4gIGNvbnN0IGRlZmF1bHRJbmRleCA9IGRlZmF1bHRJbmRleFJhdyA/PyBpbmRleGVzWzBdPy5uYW1lO1xuICBjb25zdCBjb2x1bW5zID0gY29yZUNvbmZpZy5saXN0KFxuICAgIGNvbmZpZy5jb2x1bW5zLFxuICAgIFwiU0VBUkNIX0NPTFVNTlNcIixcbiAgICB1bmRlZmluZWQsXG4gICAgY29yZUNvbmZpZy5FTlZfT05MWSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm9iamVjdC5vcHRpb25hbChcImRlZmF1bHRJbmRleFwiLCBkZWZhdWx0SW5kZXgpLFxuICAgIGluZGV4ZXMsXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFxuICAgICAgXCJlbmRwb2ludFwiLFxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmVuZHBvaW50LCBFTkRQT0lOVF9FTlYsIGNvcmVDb25maWcuRU5WX09OTFkpLFxuICAgICksXG4gICAgLi4uKGNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1ucyB9IDoge30pLFxuICAgIHBhZ2VTaXplOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnBhZ2VTaXplLFxuICAgICAgXCJTRUFSQ0hfUEFHRV9TSVpFXCIsXG4gICAgICBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIGNvcmVDb25maWcuRU5WX09OTFksXG4gICAgKSxcbiAgICBtb2RlOiByZXNvbHZlTW9kZShjb25maWcubW9kZSksXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFxuICAgICAgXCJlbWJlZGRpbmdNb2RlbFwiLFxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmVtYmVkZGluZ01vZGVsLCBcIlNFQVJDSF9FTUJFRERJTkdfTU9ERUxcIiwgY29yZUNvbmZpZy5FTlZfT05MWSksXG4gICAgKSxcbiAgICBiYXNlUGF0aDogREVGQVVMVF9CQVNFX1BBVEgsXG4gICAgdGltZW91dE1zOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnRpbWVvdXRNcyxcbiAgICAgIFwiU0VBUkNIX1RJTUVPVVRfTVNcIixcbiAgICAgIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgIGNvcmVDb25maWcuRU5WX09OTFksXG4gICAgKSxcbiAgICBhbGxvd1dyaXRlOlxuICAgICAgY29yZUNvbmZpZy5ib29sZWFuKGNvbmZpZy5hbGxvd1dyaXRlLCBcIlNFQVJDSF9XUklURVwiLCBjb3JlQ29uZmlnLkVOVl9PTkxZKSA/PyBmYWxzZSxcbiAgICAuLi4oY29uZmlnLmVuc3VyZU9uU2V0dXAgPyB7IGVuc3VyZU9uU2V0dXA6IGNvbmZpZy5lbnN1cmVPblNldHVwIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNhbGxlci1zdXBwbGllZCBpbmRleCByZWZlcmVuY2UgKGEgZnVsbCBVQyBuYW1lIG9yIGEgY29uZmlndXJlZFxuICogYWxpYXMpIGludG8gYSBjb25jcmV0ZSBpbmRleCBuYW1lLiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGluZGV4IHdoZW4gdGhlXG4gKiByZWZlcmVuY2UgaXMgZW1wdHkuIFJldHVybnMgYG51bGxgIHdoZW4gbm90aGluZyBjYW4gYmUgcmVzb2x2ZWQgc28gY2FsbGVyc1xuICogcmFpc2UgYSBzdGFibGUsIHVzZXItZmFjaW5nIGVycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYSBwaGFudG9tIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluZGV4TmFtZShcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgcmVmZXJlbmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gc3RyaW5nLnRyaW1Ub051bGwocmVmZXJlbmNlKTtcbiAgaWYgKHJlZiA9PT0gbnVsbCkgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbiAgY29uc3QgYnlBbGlhcyA9IGNvbmZpZy5pbmRleGVzLmZpbmQoKGkpID0+IGkuYWxpYXMgPT09IHJlZiB8fCBpLm5hbWUgPT09IHJlZik7XG4gIGlmIChieUFsaWFzKSByZXR1cm4gYnlBbGlhcy5uYW1lO1xuICAvLyBBY2NlcHQgYW4gdW5yZWdpc3RlcmVkIGJ1dCBmdWxseS1xdWFsaWZpZWQgVUMgbmFtZSAodGhyZWUgZG90dGVkIHBhcnRzKS5cbiAgaWYgKHJlZi5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA9PT0gMykgcmV0dXJuIHJlZjtcbiAgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbn1cblxuLyoqIFRoZSBrbm93biBjb25maWcgZm9yIGFuIGluZGV4IG5hbWUsIHdoZW4gdGhlIHBsdWdpbiB3YXMgdG9sZCBhYm91dCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleENvbmZpZ0ZvcihcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb25maWcuaW5kZXhlcy5maW5kKChpKSA9PiBpLm5hbWUgPT09IG5hbWUgfHwgaS5hbGlhcyA9PT0gbmFtZSk7XG59XG4iXX0=