discord-player 7.2.0-dev.0 → 7.2.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __typeError = (msg) => {
9
7
  throw TypeError(msg);
@@ -23,14 +21,6 @@ var __copyProps = (to, from, except, desc) => {
23
21
  return to;
24
22
  };
25
23
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
26
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
27
- // If the importer is in node compatibility mode or this is not an ESM
28
- // file that has been converted to a CommonJS file using a Babel-
29
- // compatible transform (i.e. "__esModule" has not been set), then set
30
- // "default" to the CommonJS "module.exports" for node compatibility.
31
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
32
- mod
33
- ));
34
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
25
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
36
26
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
@@ -1700,7 +1690,6 @@ __name(erisUsersProxy, "erisUsersProxy");
1700
1690
 
1701
1691
  // src/compat/createOceanicCompat.ts
1702
1692
  var import_v102 = require("discord-api-types/v10");
1703
- var Oceanic = __toESM(require("oceanic.js"));
1704
1693
  var DiscordPlayerClientSymbol3 = Symbol("DiscordPlayerClient");
1705
1694
  function declareProperty2(target, key, value) {
1706
1695
  Reflect.set(target, key, value);
@@ -6614,7 +6603,7 @@ var import_ffmpeg2 = require("@discord-player/ffmpeg");
6614
6603
  // src/version.ts
6615
6604
  var version = (
6616
6605
  /* @__MACRO__ getVersion */
6617
- "7.2.0-dev.0"
6606
+ "7.2.0-dev.1"
6618
6607
  );
6619
6608
 
6620
6609
  // src/utils/DependencyReportGenerator.ts
@@ -7535,4 +7524,4 @@ var import_discord_voip6 = require("discord-voip");
7535
7524
  version,
7536
7525
  ...require("@discord-player/ffmpeg")
7537
7526
  });
7538
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvY29tcGF0L2NvbW1vbi50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2NvbXBhdC9jcmVhdGVPY2VhbmljQ29tcGF0LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9zdHJlYW0vVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL3ZlcnNpb24udHMiLCAiLi4vc3JjL1BsYXllclN0cmVhbUludGVyY2VwdG9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBjcmVhdGVFcmlzQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgeyBjcmVhdGVPY2VhbmljQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlT2NlYW5pY0NvbXBhdCc7XG5leHBvcnQgeyBpc0VyaXNQcm94eSwgaXNPY2VhbmljUHJveHkgfSBmcm9tICcuL2NvbXBhdC9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vZmFicmljJztcbmV4cG9ydCAqIGZyb20gJy4vcXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5leHBvcnQgKiBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuZXhwb3J0ICogZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2VyZGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyU3RyZWFtSW50ZXJjZXB0b3InO1xuZXhwb3J0IHtcbiAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gIHR5cGUgUENNRmlsdGVycyxcbiAgUV9CVVRURVJXT1JUSCxcbiAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gIEJBU1NfRVFfQkFORFMsXG4gIEFGX05JR0hUQ09SRV9SQVRFLFxuICBBRl9WQVBPUldBVkVfUkFURSxcbiAgRmlsdGVyc0NoYWluIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFN0cmVhbVR5cGUsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGF0Q2xpZW50LCBDb21wYXRQcm92aWRlciB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcblxuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgVm9pY2VTdGF0ZSB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIEVyaXMgZnJvbSAnZXJpcyc7XG5cbnR5cGUgRXJpc1VzZXJSZXNvbHZhYmxlID0gRXJpcy5Vc2VyIHwgc3RyaW5nIHwgRXJpcy5NZW1iZXI7XG50eXBlIEVyaXNHdWlsZFJlc29sdmFibGUgPVxuRXJpcy5HdWlsZCB8XG5zdHJpbmcgfFxuRXJpcy5NZW1iZXIgfFxuRXJpcy5HdWlsZENoYW5uZWwgfFxuRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBjcmVhdGVDb21wYXRDbGllbnQoZXJpc1Byb3h5LCAnRXJpcycpLmNsaWVudCBhcyB1bmtub3duIGFzIENsaWVudDtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlU3RhdGVVcGRhdGVQcm94eShcbmNsaWVudDogRXJpcy5DbGllbnQsXG5wcm94eTogRXJpcy5DbGllbnQsXG5oYW5kbGVyOiAoYSwgYikgPT4gdm9pZClcbntcbiAgY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG1lbWJlciwgb2xkU3RhdGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJveGllZE9sZFN0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG9sZFN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogb2xkU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG9sZFN0YXRlLnN1cHByZXNzLFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS5ndWlsZC5pZFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUudXNlci5pZFxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIGNvbnN0IG1lID0gbWVtYmVyLmd1aWxkLm1lbWJlcnMuZ2V0KGNsaWVudC51c2VyLmlkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2hhbm5lbCA9IG1lbWJlci5ndWlsZC5jaGFubmVscy5nZXQoXG4gICAgICAgIG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcHJveGllZE5ld1N0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogbWVtYmVyLnZvaWNlU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG1lbWJlci52b2ljZVN0YXRlLnN1cHByZXNzLFxuICAgICAgICBjaGFubmVsOiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2ZWRDaGFubmVsLCBjbGllbnQpLFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmlkXG4gICAgICAgIH0sXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5ndWlsZC5pZCxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBtZToge1xuICAgICAgICAgICAgICBpZDogbWU/LmlkLFxuICAgICAgICAgICAgICB2b2ljZToge1xuICAgICAgICAgICAgICAgIGFzeW5jIHNldFJlcXVlc3RUb1NwZWFrKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICB2b2lkIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lPy52b2ljZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgLy8gaWYgKG1lKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBtZS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyKHByb3hpZWROZXdTdGF0ZSwgcHJveGllZE9sZFN0YXRlKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50OiBFcmlzLkNsaWVudCkge1xuICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gIGlmICghYWRhcHRlcnMpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gIH1cblxuICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZ3VpbGRJZCwgYWRhcHRlcl0gb2YgYWRhcHRlcnMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2xpZW50Lmd1aWxkcy5nZXQoZ3VpbGRJZCk/LnNoYXJkLmlkID09PSBzaGFyZElkKSB7XG4gICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY2xpZW50Lm9uKCdyYXdXUycsIChwYWNrZXQpID0+IHtcbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVNlcnZlclVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YTtcbiAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTZXJ2ZXJVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGE7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcGF5bG9hZC5ndWlsZF9pZCAmJlxuICAgICAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCAmJlxuICAgICAgICAgIHBheWxvYWQudXNlcl9pZCA9PT0gY2xpZW50LnVzZXIuaWQpXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU3RhdGVVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzQ2hhbm5lbHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgY29uc3QgaGFuZGxlciA9IHtcbiAgICBjbGllbnQsXG4gICAgZ2V0IGNhY2hlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50LmdldENoYW5uZWwoaWQpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBpZCBpbiBjbGllbnQuY2hhbm5lbEd1aWxkTWFwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgcmVzb2x2ZShyZXNvbHZhYmxlOiBzdHJpbmcgfCBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShcbiAgICAgICAgICB0aGlzLmNsaWVudC5nZXRDaGFubmVsKHJlc29sdmFibGUpIGFzIEVyaXMuR3VpbGRDaGFubmVsLFxuICAgICAgICAgIGNsaWVudFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGRDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2YWJsZSwgY2xpZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnJlc29sdmUocmVzb2x2YWJsZSk7XG4gICAgICByZXR1cm4gY2hhbm5lbD8uaWQ7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG5jaGFubmVsOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFubmVsKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShjaGFubmVsLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ2d1aWxkJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlclByb3h5KHRhcmdldC5ndWlsZCwgY2xpZW50KTtcbiAgICAgICAgY2FzZSAnbWVtYmVycyc6XG4gICAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgRXJpcy5Wb2ljZUNoYW5uZWwpLnZvaWNlTWVtYmVycztcbiAgICAgICAgY2FzZSAnaXNWb2ljZUJhc2VkJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT5cbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fFxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNTdGFnZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlclByb3h5KFxuZ3VpbGQ6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFndWlsZCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoZ3VpbGQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ3ZvaWNlQWRhcHRlckNyZWF0b3InKSB7XG4gICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcih0YXJnZXQsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IoXG5ndWlsZDogRXJpcy5HdWlsZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3Ige1xuICByZXR1cm4gKG1ldGhvZHMpID0+IHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgYWRhcHRlcnMuc2V0KGd1aWxkLmlkLCBtZXRob2RzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChndWlsZC5zaGFyZC5zdGF0dXMgIT09ICdyZWFkeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZ3VpbGQuc2hhcmQuc2VuZFdTKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1VzZXJzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJleHBvcnQgY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgdHlwZSBDb21wYXRQcm92aWRlciA9ICdFcmlzJyB8ICdPY2VhbmljJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXRDbGllbnQge1xuICBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXI7XG4gIGNsaWVudDogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGF0Q2xpZW50KGNsaWVudDogYW55LCBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXIpOiBDb21wYXRDbGllbnQge1xuICBSZWZsZWN0LnNldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsIHByb3ZpZGVyKTtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcixcbiAgICBjbGllbnRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBDb21wYXRQcm92aWRlciB8IG51bGwge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPY2VhbmljUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ09jZWFuaWMnO1xufSIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IE91dE9mU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQgfSBmcm9tXG4nQHdlYi1zY3JvYmJsZXIvbWV0YWRhdGEtZmlsdGVyJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWUge1xuICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIFV0aWxzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAvKipcbiAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgY29uc3QgdmVyc2lvbiA9XG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogbnVsbDtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIERlbm8udmVyc2lvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHsgbmFtZTogJ2Rlbm8nLCB2ZXJzaW9uOiBEZW5vLnZlcnNpb24uZGVubyB9O1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9uKVxuICAgIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICByZXR1cm4geyBuYW1lOiAndW5rbm93bicsIHZlcnNpb246IHZlcnNpb24gPz8gJ3Vua25vd24nIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKS5cbiAgICBtYXAoKG0pID0+IGlzTmFOKG0pID8gMCA6IG0pLlxuICAgIGpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICB9IGFzIFRpbWVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5cbiAgICBmaWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5cbiAgICBtYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICBjb25zdCBmaW5hbCA9IHBhcnNlZC5cbiAgICBzbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSkuXG4gICAgbWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSkuXG4gICAgam9pbignOicpO1xuXG4gICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZHVyYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAqL1xuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbHRlck9wdHMgPSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFjazogW1xuICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XVxuXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3BvdGlmeUZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcbiAgICAgIHNwb3RpZnlGaWx0ZXIuZXh0ZW5kKGNyZWF0ZVNwb3RpZnlGaWx0ZXIoKSk7XG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICByZXR1cm4geW91dHViZSh0aXRsZSk7XG4gICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgIHJldHVybiBzcG90aWZ5RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdEZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVyIHJlcXVpcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gIH1cblxuICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oXG4gICAgICAgICAgKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgY29uc3QgcmVzID0gcmVxdWlyZShsaWIpO1xuICAgICAgICAgIGlmIChyZXMpIHJldHVybiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0O1xuICAgICAgICB9IGNhdGNoIHtcblxuICAgICAgICAgIC8vIG5vP1xuICAgICAgICB9fVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHtcbiAgICAgIGNvZGUsXG4gICAgICBkZXRhaWxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICByZXR1cm4gc3JjW3JhbmRvbUludChzcmMubGVuZ3RoKV07XG4gIH1cblxuICBzdGF0aWMgYXJyYXlDbG9uZVNodWZmbGU8VD4oc3JjOiBUW10pOiBUW10ge1xuICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgbGV0IG0gPSBhcnIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKG0pIHtcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtLS0pO1xuICAgICAgW2FyclttXSwgYXJyW2ldXSA9IFthcnJbaV0sIGFyclttXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKFxucXVldWU6IEd1aWxkUXVldWUsXG5pdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10gfCBudW1iZXIpID0+XG57XG4gIGlmIChxdWV1ZS5tYXhTaXplIDwgMSB8fCBxdWV1ZS5tYXhTaXplID09PSBJbmZpbml0eSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRyYWNrcyA9XG4gIHR5cGVvZiBpdGVtcyA9PT0gJ251bWJlcicgP1xuICBpdGVtcyA6XG4gIChpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID9cbiAgaXRlbXMudHJhY2tzIDpcbiAgQXJyYXkuaXNBcnJheShpdGVtcykgP1xuICBpdGVtcyA6XG4gIFtpdGVtc10pLlxuICBsZW5ndGg7XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzKSB7XG4gICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFcnJvcigndHJhY2tzIHF1ZXVlJywgbWF4Q2FwLCB0cmFja3MpO1xuICB9XG59O1xuXG5leHBvcnQgeyBVdGlsIH07IiwgImltcG9ydCB7XG4gIFVzZXIsXG4gIGVzY2FwZU1hcmtkb3duLFxuICBTbm93Zmxha2VVdGlsLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIEFQSVVzZXIgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBQbGF5ZXIsXG4gIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCxcbiAgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb21cbicuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFBsYXlsaXN0SlNPTiB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTZWVrRXZlbnQgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gIG1ldGFkYXRhOiBNO1xuICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPVxuJ3NvdW5kY2xvdWQnIHxcbid5b3V0dWJlJyB8XG4nc3BvdGlmeScgfFxuJ2FwcGxlX211c2ljJyB8XG4nYXJiaXRyYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAvKipcbiAgICogVGhlIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICB2aWV3czogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0XG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAvKipcbiAgICogVGhlIHNvdXJjZVxuICAgKi9cbiAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgZW5naW5lXG4gICAqL1xuICBlbmdpbmU/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByYXcgZGF0YVxuICAgKi9cbiAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0eXBlXG4gICAqL1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWFsaXplZCB0aXRsZVxuICAgKi9cbiAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdmlld3NcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICAgKi9cbiAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHJhdzogYW55O1xuICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuICBwdWJsaWMgY2xlYW5UaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYnJpZGdlZEV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgYnJpZGdlZFRyYWNrOiBUcmFjayB8IG51bGwgPSBudWxsO1xuXG4gICNvblNlZWs6ICgoZXZlbnQ6IFNlZWtFdmVudCkgPT4gQXdhaXRlZDx2b2lkPikgfCBudWxsID0gbnVsbDtcbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pXG4gIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sXG4gICAgICBkYXRhLnJhdyA/PyBkYXRhXG4gICAgKTtcbiAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPVxuICAgIGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPVxuICAgIGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgdHJhY2sgY2FuIGJlIHNlZWtlZFxuICAgKi9cbiAgcHVibGljIGdldCBzZWVrYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jb25TZWVrICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25TZWVrIGV2ZW50XG4gICAqIEBwYXJhbSBmbiBUaGUgb25TZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgaGFuZGxlU2VlayhmbjogKGV2ZW50OiBTZWVrRXZlbnQpID0+IEF3YWl0ZWQ8dm9pZD4pIHtcbiAgICB0aGlzLiNvblNlZWsgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHNlZWtcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBzZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhldmVudDogU2Vla0V2ZW50KSB7XG4gICAgaWYgKHRoaXMuI29uU2VlaykgcmV0dXJuIHRoaXMuI29uU2VlayhldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFjay4gVGhpcyBpcyBub3QgdXNlZnVsIG91dHNpZGUgb2YgdGhlIGxpYnJhcnkuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBBdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHNldFJlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXVkaW8gcmVzb3VyY2UgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT5cbiAgICBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MgPz8gMCxcbiAgICAgIHJlcXVlc3RlZF9ieTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHF1ZXJ5X3R5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciA/PyBudWxsLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuVHJhY2ssXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFjayBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQoXG4gIHBsYXllcjogUGxheWVyLFxuICBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pXG4gIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnZGF0YScsXG4gICAgICAnU2VyaWFsaXplZFRyYWNrJyxcbiAgICAgICdtYWxmb3JtZWQgZGF0YSdcbiAgICApO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpXG4gICAgICAgICAgcmV0dXJuIHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuZ2V0KHJlcy5pZCkhO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pKCkgOlxuICAgICAgbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogZGF0YS5xdWVyeV90eXBlID8/IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlbG9uZ2luZyBxdWV1ZXMgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT5cbiAgICBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKVxuICAgICk7XG5cbiAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJleHBvcnQgY2xhc3MgRGlzY29yZFBsYXllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlcztcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29kZTogRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy50aW1lc3RhbXBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlNwYWNlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLFxuICAgICAgYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJnVHlwZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVzdWx0RXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19SRVNVTFQsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfSU1QTEVNRU5URUQsIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RFeGlzdGluZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfRVhJU1RJTkcsIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3V0T2ZSYW5nZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfUkFOR0UsXG4gICAgICBgJHt0YXJnZXR9IGlzIG91dCBvZiByYW5nZSAoRXhwZWN0ZWQgbWluaW11bSAke21pbmltdW19IGFuZCBtYXhpbXVtICR7bWF4aW11bX0sIGdvdCAke3ZhbHVlfSlgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04sXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PydcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQsXG4gICAgICAnQ2Fubm90IHVzZSBkZXN0cm95ZWQgdm9pY2UgY29ubmVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCwgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMLCAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVjZWl2ZXJFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1JFQ0VJVkVSLFxuICAgICAgbWVzc2FnZSB8fFxuICAgICAgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX0FVRElPX1JFU09VUkNFLFxuICAgICAgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTkZPX1JFUVVJUkVELFxuICAgICAgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCxcbiAgICAgIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtcbiAgICAgIGlkID8gYChFeHRyYWN0b3IgRXhlY3V0aW9uIENvbnRleHQgSUQgaXMgJHtpZH0pYCA6ICcnfUZhaWxlZCB0byBicmlkZ2UgdGhpcyBxdWVyeTpcXG4ke1xuICAgICAgZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgRVJSX09VVF9PRl9TUEFDRTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgRVJSX05PX1JFU1VMVDogJ0VSUl9OT19SRVNVTFQnLFxuICBFUlJfTk9UX0lNUExFTUVOVEVEOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gIEVSUl9OT1RfRVhJU1RJTkc6ICdFUlJfTk9UX0VYSVNUSU5HJyxcbiAgRVJSX09VVF9PRl9SQU5HRTogJ0VSUl9PVVRfT0ZfUkFOR0UnLFxuICBFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTjogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6ICdFUlJfTk9fVk9JQ0VfQ0hBTk5FTCcsXG4gIEVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUw6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX05PX1JFQ0VJVkVSOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgRVJSX0ZGTVBFR19MT0NBVE9SOiAnRVJSX0ZGTVBFR19MT0NBVE9SJyxcbiAgRVJSX05PX0FVRElPX1JFU09VUkNFOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgRVJSX05PX0dVSUxEX1FVRVVFOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgRVJSX05PX0dVSUxEOiAnRVJSX05PX0dVSUxEJyxcbiAgRVJSX0lORk9fUkVRVUlSRUQ6ICdFUlJfSU5GT19SRVFVSVJFRCcsXG4gIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ0VSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRTogJ0VSUl9OT1RfRVhJU1RJTkdfTU9EVUxFJyxcbiAgRVJSX0JSSURHRV9GQUlMRUQ6ICdFUlJfQlJJREdFX0ZBSUxFRCdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVycm9yQ29kZXMgPSAodHlwZW9mIEVycm9yQ29kZXMpW2tleW9mIHR5cGVvZiBFcnJvckNvZGVzXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3I6IGFueSk6IGVycm9yIGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIHJldHVybiBlcnJvciAhPSBudWxsICYmIGVycm9yIGluc3RhbmNlb2YgRGlzY29yZFBsYXllckVycm9yO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhIGBEaXNjb3JkUGxheWVyRXJyb3JgIGVycm9yLlxuICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBoYW5kbGVcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIGVycm9yIGlzIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAuXG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGhhbmRsZXJcbiAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIC8vIC4uLlxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IsIChlcnJvcikgPT4ge1xuICogICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZnJvbSBkaXNjb3JkLXBsYXllcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICogIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3I8XG4gIFQgZXh0ZW5kcyBhbnlbXSxcbiAgRiBleHRlbmRzIChlcnJvcjogRGlzY29yZFBsYXllckVycm9yLCAuLi5hcmdzOiBUKSA9PiBhbnksXG4gIFIgZXh0ZW5kcyBSZXR1cm5UeXBlPEY+PihcbmVycm9yOiBhbnksIGhhbmRsZXI6IEYsIGFyZ3M6IFQpOiBSIHtcbiAgaWYgKGlzRGlzY29yZFBsYXllckVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBoYW5kbGVyKGVycm9yLCAuLi5hcmdzKSBhcyBSO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8iLCAiaW1wb3J0IHsgRGlzY29yZFBsYXllckVycm9yLCBpc0Rpc2NvcmRQbGF5ZXJFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgcmV0dXJuIFR5cGVVdGlsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU3RyaW5nKHQ6IHVua25vd24pOiB0IGlzIHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheSh0OiB1bmtub3duKTogdCBpcyB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0OiB1bmtub3duKTogdCBpcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICAgIHJldHVybiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0KTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IERlc2VyaWFsaXphdGlvbkVycm9yLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUGxheWxpc3QsXG4gIHR5cGUgU2VyaWFsaXplZFRyYWNrLFxuICBUcmFjayxcbiAgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbVxuJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCBlbnVtIFNlcmlhbGl6ZWRUeXBlIHtcbiAgVHJhY2sgPSAndHJhY2snLFxuICBQbGF5bGlzdCA9ICdwbGF5bGlzdCcsXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PlxuZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBUcmFjayB8IFBsYXlsaXN0IHwgYW55KSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgaWYgKGlzVHJhY2soZGF0YSkpIHJldHVybiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShkYXRhOiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKFR5cGVVdGlsLmlzU3RyaW5nKGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IiwgImltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tKU09OLCBUcmFja1NvdXJjZSB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgdHJhY2tzOiBUcmFja1tdO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAgICovXG4gIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICovXG4gIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIHB1YmxpYyBhdXRob3I6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgLyoqXG4gICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllclxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICogLSBgYWxidW1gXG4gICAgICogLSBgcGxheWxpc3RgXG4gICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgKi9cbiAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgfTtcblxuICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdClcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkUGxheWxpc3QnLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEluZm9SZXF1aXJlZEVycm9yLCBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPVxuL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9XG4vXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvKHNvbmd8YWxidW0pXFwvLis/KFxcLy4rP1xcP2k9fFxcLykoWzAtOV0rKSQvO1xuY29uc3QgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPVxuL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8od3d3Lik/eW91dHViZS5jb21cXC9wbGF5bGlzdFxcP2xpc3Q9KChQTHxGTHxVVXxMTHxSRHxPTClbYS16QS1aMC05LV9dezE2LDQxfSkkLztcbmNvbnN0IHlvdXR1YmVWaWRlb1VSTFJlZ2V4ID1cbi9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyBkaXNjb3JkLXBsYXllcjovL2Jsb2IvdXVpZC12NFxuY29uc3QgZGlzY29yZFBsYXllckJsb2JSZWdleCA9IC9eZGlzY29yZC1wbGF5ZXI6XFwvXFwvYmxvYlxcL1xcZCskLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jb25zdCBEb21haW5zTWFwID0ge1xuICBEaXNjb3JkUGxheWVyOiBbJ2Rpc2NvcmQtcGxheWVyJ10sXG4gIFlvdVR1YmU6IFtcbiAgJ3lvdXR1YmUuY29tJyxcbiAgJ3lvdXR1LmJlJyxcbiAgJ211c2ljLnlvdXR1YmUuY29tJyxcbiAgJ2dhbWluZy55b3V0dWJlLmNvbScsXG4gICd3d3cueW91dHViZS5jb20nLFxuICAnbS55b3V0dWJlLmNvbSddLFxuXG4gIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4vXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmxpbmtcXC9bQS1aYS16MC05XSskLyxcbi9eaHR0cHM6XFwvXFwvb25cXC5zb3VuZGNsb3VkXFwuY29tXFwvW2EtekEtWjEtOV17MCwxN30kL11cbik7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIC0gRElTQ09SRF9QTEFZRVJfQkxPQlxuICogQHR5cGVkZWYge3N0cmluZ30gUXVlcnlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeVR5cGUgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICBZT1VUVUJFX1BMQVlMSVNUOiAneW91dHViZVBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICBTT1VORENMT1VEOiAnc291bmRjbG91ZCcsXG4gIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gIFNQT1RJRllfUExBWUxJU1Q6ICdzcG90aWZ5UGxheWxpc3QnLFxuICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgVklNRU86ICd2aW1lbycsXG4gIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gIFlPVVRVQkVfU0VBUkNIOiAneW91dHViZVNlYXJjaCcsXG4gIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICBBUFBMRV9NVVNJQ19TT05HOiAnYXBwbGVNdXNpY1NvbmcnLFxuICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgQVBQTEVfTVVTSUNfU0VBUkNIOiAnYXBwbGVNdXNpY1NlYXJjaCcsXG4gIEZJTEU6ICdmaWxlJyxcbiAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJyxcbiAgRElTQ09SRF9QTEFZRVJfQkxPQjogJ2Rpc2NvcmRQbGF5ZXJCbG9iJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUXVlcnlUeXBlID0gKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgUXVlcnlUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gIHF1ZXJ5OiBzdHJpbmc7XG59XG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAvKipcbiAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgdmltZW9SZWdleCxcbiAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXgsXG4gICAgICBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtcmVzb2x2ZSByZWRpcmVjdCB1cmxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHJlUmVzb2x2ZShxdWVyeTogc3RyaW5nLCBtYXhEZXB0aCA9IDUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgIGZvciAoY29uc3QgZG9tYWluIG9mIHJlZGlyZWN0RG9tYWlucykge1xuICAgICAgaWYgKGRvbWFpbi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHF1ZXJ5LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgIGlmICgvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmFwcC5saW5rXFwvKC4rKSQvLnRlc3QocmVzLnVybCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYm9keS5cbiAgICAgICAgICAgIHNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uXG4gICAgICAgICAgICBzcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgP1xuICAgICAgICAgIHJlcy51cmwgOlxuICAgICAgICAgIHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEluZm9SZXF1aXJlZEVycm9yKCdxdWVyeScsIFN0cmluZyhxdWVyeSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeTogc3RyaW5nKSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIHF1ZXJ5XG4gICAgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsIHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnbGlzdCcpO1xuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgaWYgKHBsYXlsaXN0SWQpIHtcbiAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9Jmxpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID9cbiAgICBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6XG4gICAgbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICBzb2Z0bGltaXRlcjpcbiAgICAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgIHNpbGVuY2VyZW1vdmU6ICdzaWxlbmNlcmVtb3ZlPTE6MDotNTBkQidcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHtcbiAgICBuYW1lOiBGaWx0ZXJzTmFtZTtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9PiB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgeWllbGQgeyBuYW1lOiBrIGFzIEZpbHRlcnNOYW1lLCB2YWx1ZTogdiBhcyBzdHJpbmcgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKSBhcyBGaWx0ZXJzTmFtZVtdO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IChLIHwgc3RyaW5nKVtdKSB7XG4gICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIHJldHVybiBmaWx0ZXJzLlxuICAgIGZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJykuXG4gICAgbWFwKChtKSA9PiB0aGlzLmdldChtIGFzIEspKS5cbiAgICBqb2luKCcsJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheToge25hbWU6IHN0cmluZzt2YWx1ZTogc3RyaW5nO31bXSkge1xuICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vLyBAdHMtbm9jaGVja1xuXG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR2F0ZXdheURpc3BhdGNoRXZlbnRzIH0gZnJvbSAnZGlzY29yZC1hcGktdHlwZXMvdjEwJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBhdENsaWVudCwgQ29tcGF0UHJvdmlkZXIgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgKiBhcyBPY2VhbmljIGZyb20gJ29jZWFuaWMuanMnO1xuXG50eXBlIE9jZWFuaWNVc2VyUmVzb2x2YWJsZSA9IE9jZWFuaWMuVXNlciB8IHN0cmluZyB8IE9jZWFuaWMuTWVtYmVyO1xudHlwZSBPY2VhbmljR3VpbGRSZXNvbHZhYmxlID1cbk9jZWFuaWMuR3VpbGQgfFxuc3RyaW5nIHxcbk9jZWFuaWMuTWVtYmVyIHxcbk9jZWFuaWMuR3VpbGRDaGFubmVsIHxcbk9jZWFuaWMuUm9sZTtcbnR5cGUgT2NlYW5pY0NoYW5uZWxSZXNvbHZhYmxlID0gT2NlYW5pYy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2NlYW5pY0NsaWVudChjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBPY2VhbmljLkNsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdvY2VhbmljLmpzJyk7XG5cbiAgaWYgKGVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIG9jZWFuaWMuQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBkZWNsYXJlUHJvcGVydHkodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogVCB7XG4gIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PFQ+KHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IFQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXkpO1xufVxuXG4vKipcbiAqIEFsbG93cyBPY2VhbmljLmpzIGNsaWVudHMgdG8gYmUgdXNlZCB3aXRoIGRpc2NvcmQtcGxheWVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgY3JlYXRlcyBhIHByb3h5IG9iamVjdCB0aGF0IGludGVyY2VwdHMgY2VydGFpbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIGRpc2NvcmQtcGxheWVyLlxuICogQHBhcmFtIGNsaWVudCBUaGUgT2NlYW5pYy5qcyBjbGllbnQgdG8gYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSBPY2VhbmljLmpzIGNsaWVudCB3aXRoIGRpc2NvcmQtcGxheWVyIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPY2VhbmljQ29tcGF0KGNsaWVudDogT2NlYW5pYy5DbGllbnQpOiBDbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnb2NlYW5pYy5qcycpO1xuXG4gIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgb2NlYW5pY1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQpO1xuXG4gIGNvbnN0IG9jZWFuaWNQcm94eSA9IG5ldyBQcm94eShjbGllbnQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAndXNlcnMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVXNlcnNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdndWlsZHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljR3VpbGRzUHJveHkodGFyZ2V0LCBvY2VhbmljKTtcbiAgICAgICAgY2FzZSAnY2hhbm5lbHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljQ2hhbm5lbHNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdfX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHknOlxuICAgICAgICAgIHJldHVybiAoaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpID0+XG4gICAgICAgICAgb2NlYW5pY1ZvaWNlU3RhdGVVcGRhdGVQcm94eSh0YXJnZXQsIG9jZWFuaWNQcm94eSwgaGFuZGxlcik7XG4gICAgICAgIGNhc2UgJ2luY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNsaWVudC5zZXRNYXhMaXN0ZW5lcnMoY2xpZW50LmdldE1heExpc3RlbmVycygpICsgMSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZGVjcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2xpZW50LmdldE1heExpc3RlbmVycygpIC0gMTtcblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhsaXN0ZW5lcnMgPCAwID8gMSA6IGxpc3RlbmVycyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIFJlZmxlY3Quc2V0KG9jZWFuaWNQcm94eSwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgJ09jZWFuaWMnKTtcblxuICByZXR1cm4gY3JlYXRlQ29tcGF0Q2xpZW50KG9jZWFuaWNQcm94eSwgJ09jZWFuaWMnKS5jbGllbnQgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IE9jZWFuaWMuQ2xpZW50LFxucHJveHk6IE9jZWFuaWMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogT2NlYW5pYy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncGFja2V0JywgKHBhY2tldCkgPT4ge1xuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU2VydmVyVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhO1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVNlcnZlclVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICBwYXlsb2FkLmd1aWxkX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNDaGFubmVsc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuICAgICAgICAgIHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgT2NlYW5pYy5HdWlsZENoYW5uZWwsXG4gICAgICAgICAgY2xpZW50XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgT2NlYW5pYy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IE9jZWFuaWMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogT2NlYW5pYy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBPY2VhbmljLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlIHx8XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNWb2ljZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlO1xuICAgICAgICBjYXNlICdpc1N0YWdlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkoXG5ndWlsZDogT2NlYW5pYy5HdWlsZCB8IHVuZGVmaW5lZCxcbmNsaWVudDogT2NlYW5pYy5DbGllbnQpXG46IE9jZWFuaWMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyQ3JlYXRvcihcbmd1aWxkOiBPY2VhbmljLkd1aWxkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gIHJldHVybiAobWV0aG9kcykgPT4ge1xuICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgIGlmICghYWRhcHRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+KCk7XG4gICAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRQYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBndWlsZC5zaGFyZC5zZW5kKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY0d1aWxkc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY1VzZXJzUHJveHkoY2xpZW50OiBPY2VhbmljLkNsaWVudCwgb2NlYW5pYzogdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBPY2VhbmljVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogT2NlYW5pY1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxcbiAgTCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzXG5FdmVudEVtaXR0ZXI8TD4ge1xuICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICBpZiAoXG4gICAgdGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSlcbiAgICB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+XG4gIGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgcHVibGljIG9wdGlvbnM6IFQgPSA8VD4ge30pXG4gIHt9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VFeHRyYWN0b3IpLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25maWd1cmVzIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY29uZmlndXJlKG9wdGlvbnM6IFQpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgIGF3YWl0IHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGluY29taW5nIHF1ZXJ5XG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpXG4gIDogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCBjb250ZXh0O1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3MoXG4gIHRyYWNrOiBUcmFjayxcbiAgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCB0cmFjaztcbiAgICB2b2lkIGhpc3Rvcnk7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPilcbiAge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKFxuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCxcbiAgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSlcbiAgOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbClcbiAgOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgdm9pZCBzb3VyY2VFeHRyYWN0b3I7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufSIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yLCBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IEJyaWRnZUZhaWxlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgYXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG4gIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAqL1xuICBhY3RpdmF0ZTogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBkZWFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLFxuICBlcnJvcjogRXJyb3IpXG4gID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAqL1xuICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEV4dHJhY3RvclNlc3Npb24+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpZFxuICAgKi9cbiAgcHVibGljIGdldEV4ZWN1dGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uc3VtZSgpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCkgPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBgXFx0aW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcXG5cXHRhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO2A7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSBleHRyYWN0b3JzLmxvYWRNdWx0aSBpbnN0ZWFkLiBFeGFtcGxlOlxcbiR7c2FtcGxlfVxcbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBidW5kbGUgb2YgZXh0cmFjdG9ycy5cbiAgICogQGV4YW1wbGUgaW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcbiAgICpcbiAgICogYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgTyBleHRlbmRzIG9iamVjdCxcbiAgICBUIGV4dGVuZHMgKHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+KVtdLFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgICBUW251bWJlcl1bJ2lkZW50aWZpZXInXSxcbiAgICAgIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPj4oXG5cbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmIChcbiAgICB0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fFxuICAgIHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIHJldHVybiBleHRyYWN0b3IgYXMgdW5rbm93biBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgY29uc3QgZXh0cmFjdG9yID1cbiAgICB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgP1xuICAgIHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDpcbiAgICB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgIGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhcbiAgICAgICAgYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KFxuICBmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sXG4gIGZpbHRlckJsb2NrZWQgPSB0cnVlKVxuICB7XG4gICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLFxuICAgICAgICAnTm9FeHRyYWN0b3JzJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgIGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyKVxuICAgIHJldHVybiB7XG4gICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgZXJyb3I6IGVycixcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZm9yIGEgdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpXG4gIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID1cbiAgICB0aGlzLmdldENvbnRleHQoKT8uYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9ycyA/PyBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8XG4gICAgICByZXN1bHQ/LmVycm9yPy5tZXNzYWdlIHx8XG4gICAgICAnTm8gZXh0cmFjdG9ycyBhdmFpbGFibGUgdG8gYnJpZGdlJ1xuICAgICk7XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gcmVzdWx0LmV4dHJhY3RvcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKiBAcGFyYW0gdGFyZ2V0RXh0cmFjdG9yIFRoZSB0YXJnZXQgZXh0cmFjdG9yIHRvIGJyaWRnZSB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2VGcm9tKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsXG4gIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSlcbiAge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZSh0YXJnZXRFeHRyYWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoXG5leHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG49PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7IiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFQ+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVmYXVsdFZhbHVlPzogVCkge31cblxuICAvKipcbiAgICogRXhpdCBvdXQgb2YgdGhpcyBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgdGhpcy5zdG9yYWdlLmV4aXQoc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdW1lKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHZhbHVlIG1heSBub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0XG4gKiBAZXhhbXBsZSBjb25zdCB1c2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAqXG4gKiAgLy8gdGhlIHZhbHVlIHRvIHByb3ZpZGVcbiAqICBjb25zdCB1c2VyID0ge1xuICogICBpZDogMSxcbiAqICAgbmFtZTogJ0pvaG4gRG9lJ1xuICogIH07XG4gKlxuICogIC8vIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUgdG8gdGhlIHJlY2VpdmVyXG4gKiAgY29udGV4dC5wcm92aWRlKHVzZXIsIGhhbmRsZXIpO1xuICpcbiAqICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICogICAgLy8gZ2V0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICpcbiAqICAgIGNvbnNvbGUubG9nKGlkLCBuYW1lKTsgLy8gMSwgSm9obiBEb2VcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQgPSB1bnNhZmU+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn0iLCAiaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTsiLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGQgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0L2FzeW5jLWNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzQ3R4IHtcbiAgZ3VpbGQ6IEd1aWxkO1xufVxuXG5leHBvcnQgY29uc3QgU1VQRVJfQ09OVEVYVCA9IGNyZWF0ZUNvbnRleHQ8UGxheWVyPigpO1xuXG5jb25zdCBnZXRGYWxsYmFja0NvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtwbGF5ZXJdJykgYXMgUGxheWVyIHwgdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9va3NDb250ZXh0KGhvb2tOYW1lOiBzdHJpbmcsIG1haW5Pbmx5ID0gZmFsc2UpIHtcbiAgbGV0IGlzRmFsbGJhY2sgPSBmYWxzZTtcblxuICBsZXQgcGxheWVyOiBQbGF5ZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCEocGxheWVyID0gU1VQRVJfQ09OVEVYVC5jb25zdW1lKCkpKSB7XG4gICAgcGxheWVyID0gZ2V0RmFsbGJhY2tDb250ZXh0KCk7XG4gICAgaXNGYWxsYmFjayA9IHRydWU7XG4gIH1cblxuICBpZiAoIXBsYXllcilcbiAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICdkaXNjb3JkLXBsYXllcicsXG4gICAgYFBsYXllciBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUsICR7XG4gICAgaXNGYWxsYmFjayA/XG4gICAgJ2RpZCB5b3UgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIHBsYXllciB3aXRoIGBuZXcgUGxheWVyKGNsaWVudClgPycgOlxuICAgICdpcyBpdCBiZWluZyBjYWxsZWQgaW5zaWRlIDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpPyd9YFxuXG4gICk7XG5cbiAgaWYgKG1haW5Pbmx5KSByZXR1cm4geyBwbGF5ZXIsIGNvbnRleHQ6IHt9IGFzIEhvb2tzQ3R4LCBpc0ZhbGxiYWNrIH07XG5cbiAgbGV0IGNvbnRleHQ6IEhvb2tzQ3R4IHwgdW5kZWZpbmVkO1xuXG4gIGlmICghaXNGYWxsYmFjaykge1xuICAgIGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpXG4gICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgaG9va05hbWUsXG4gICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgcGxheWVyIGNvbnRleHQgY3JlYXRlZCBieSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKWBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQgPSB7XG4gICAgICBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvcihcbiAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleHBsaWNpdCBndWlsZCBhcmd1bWVudCB3aGVuIG5vdCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGFzIHVua25vd24gYXMgSG9va3NDdHg7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0LCBwbGF5ZXIsIGlzRmFsbGJhY2sgfTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VQbGF5ZXInKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUubm9kZTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUuXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGUuIERlZmF1bHRzIHRvIGluZmVycmVkIGd1aWxkIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVF1ZXVlJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5yZXNvbHZlPE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZTtcbn0iLCAiaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICBjb25zdCB7IHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNYWluUGxheWVyJywgdHJ1ZSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IHR5cGUgU2V0dGVyRk48VCwgUD4gPSAocHJldmlvdXM6IFApID0+IFQ7XG5leHBvcnQgdHlwZSBNZXRhZGF0YURpc3BhdGNoPFQ+ID0gcmVhZG9ubHkgW1xuICAoKSA9PiBULFxuICAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPigpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSlcbiAgICAgIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUsIFBsYXllclRpbWVzdGFtcCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZTogTm9kZVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVRpbWVsaW5lIHtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBQbGF5ZXJUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IHZvbHVtZTogbnVtYmVyO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYWNrOiBUcmFjazx1bmtub3duPiB8IG51bGw7XG4gIHBhdXNlKCk6IGJvb2xlYW47XG4gIHJlc3VtZSgpOiBib29sZWFuO1xuICBzZXRWb2x1bWUodm9sOiBudW1iZXIpOiBib29sZWFuO1xuICBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGltZWxpbmUgZGlzcGF0Y2hlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoKTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pXG46IEd1aWxkUXVldWVUaW1lbGluZSB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoXG5vcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0gc2F0aXNmaWVzIEd1aWxkUXVldWVUaW1lbGluZSk7XG5cbiAgcmV0dXJuIHRpbWVsaW5lO1xufSIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25BZnRlckNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbnR5cGUgU2V0dGVyRk4gPSAocHJldmlvdXM6IG51bWJlcikgPT4gbnVtYmVyO1xudHlwZSBWb2x1bWVEaXNwYXRjaCA9IHJlYWRvbmx5IFtcbiAgKCkgPT4gbnVtYmVyLFxuICAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKCk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlOiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlPzogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVZvbHVtZScpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGNvbnN0IHNldHRlciA9ICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiB7XG4gICAgaWYgKHF1ZXVlKSB7XG4gICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbih2b2x1bWUpKVxuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHtcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgQmlxdWFkRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgR3VpbGRRdWV1ZSxcbiAgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsXG4gIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgUXVldWVSZXBlYXRNb2RlIH0gZnJvbVxuJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBOb0d1aWxkRXJyb3IsIE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gYW55PiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZGlzYWJsZVNlZWtlcj86IGJvb2xlYW47XG4gIGRpc2FibGVSZXZlcmI/OiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW0/OiBib29sZWFuO1xuICBlbmFibGVTdHJlYW1JbnRlcmNlcHRvcj86IGJvb2xlYW47XG4gIHZlcmlmeUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkTm9kZU1hbmFnZXI8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU+KCk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBndWlsZCBxdWV1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihcbiAgZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSxcbiAgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KVxuICA6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgLy8gdG9kbyh0d2xpdGUpOiBtYXliZSBkaXNhYmxlIHRoZXNlIGJ5IGRlZmF1bHQ/XG4gICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlQ29tcHJlc3NvciA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmRpc2FibGVTZWVrZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlUmV2ZXJiID8/PSB0cnVlO1xuXG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMudmVyaWZ5RmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IsXG4gICAgICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogb3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbSxcbiAgICAgIGRpc2FibGVDb21wcmVzc29yOiBvcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgZGlzYWJsZVNlZWtlcjogb3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgZGlzYWJsZVJldmVyYjogb3B0aW9ucy5kaXNhYmxlUmV2ZXJiXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhpc3RpbmcgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGdldDxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBpZCA9XG4gICAgbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgP1xuICAgIG5vZGUuaWQgOlxuICAgIHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpITtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgIHJldHVybiBub2RlIGFzIEd1aWxkUXVldWU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhXG4gICAgKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgQ2hhbm5lbFR5cGUsXG4gIEd1aWxkLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIFZvaWNlQmFzZWRDaGFubmVsLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgQmlxdWFkRmlsdGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBDb21wcmVzc29yUGFyYW1ldGVycyxcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgUmV2ZXJiUGFyYW1ldGVycyxcbiAgU2Vla2VyUGFyYW1ldGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7XG4gIHR5cGUgQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUmVzb3VyY2UsXG4gIFN0cmVhbVR5cGUsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9Wb2ljZUNoYW5uZWxFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gYW55PiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yOiBib29sZWFuO1xuICBkaXNhYmxlUmV2ZXJiOiBib29sZWFuO1xuICBkaXNhYmxlU2Vla2VyOiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yOiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyPFQgPSB1bmtub3duPiA9IChcbnN0cmVhbTogUmVhZGFibGUsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbnRyYWNrOiBUcmFjazxUPilcbj0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqL1xuICBTYW1wbGVSYXRlVXBkYXRlOiAnc2FtcGxlUmF0ZVVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZTogJ3NhbXBsZVJhdGVGaWx0ZXJVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgUmV2ZXJiVXBkYXRlOiAncmV2ZXJiVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqL1xuICBDb21wcmVzc29yVXBkYXRlOiAnY29tcHJlc3NvclVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICovXG4gIFBsYXllclNlZWs6ICdwbGF5ZXJTZWVrJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgR3VpbGRRdWV1ZUV2ZW50ID1cbih0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50KVtrZXlvZiB0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50XTtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgTm9TdHJlYW0gPSAnRVJSX05PX1NUUkVBTScsXG4gIE1hbnVhbCA9ICdNQU5VQUwnLFxuICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICBKdW1wID0gJ0pVTVBFRF9UT19BTk9USEVSX1RSQUNLJyxcbiAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSycsXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IGFueT4ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrUmVtb3ZlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25EZXN0cm95ZWRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG1lc3NhZ2U6IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcnJvcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWxdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eVF1ZXVlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBlcnJvcjogRXJyb3IsXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2hdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBza2lwcGluZ1xuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTa2lwXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrLFxuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbixcbiAgZGVzY3JpcHRpb246IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlcl06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgbmV3U3RhdGU6IFZvaWNlU3RhdGUpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRWb2x1bWU6IG51bWJlcixcbiAgbmV3Vm9sdW1lOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sXG4gIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsXG4gIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSxcbiAgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pXG4gID0+IHVua25vd247XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgKiBMaXN0ZW5pbmcgdG8gdGhpcyBldmVudCB3aWxsIHBhdXNlIHRoZSBleGVjdXRpb24gb2YgYXVkaW8gcGxheWVyIHVudGlsIGBkb25lKClgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25zIGZvciBzdHJlYW1pbmdcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrPHVua25vd24+LFxuICBjb25maWc6IFN0cmVhbUNvbmZpZyxcbiAgZG9uZTogKCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXldOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFja3M6IFRyYWNrW10sXG4gIGRvbmU6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNhbXBsZSByYXRlIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRSYXRlIFRoZSBvbGQgc2FtcGxlIHJhdGVcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkUmF0ZTogbnVtYmVyLFxuICBuZXdSYXRlOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFJhdGUgVGhlIG9sZCBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcjogQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0IHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21tb25SZXNhbXBsZXJGaWx0ZXJQcmVzZXQgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlciBUaGUgb2xkIHJldmVyYiBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IHJldmVyYiBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUmV2ZXJiVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVyIFRoZSBvbGQgY29tcHJlc3NvciBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IGNvbXByZXNzb3IgZmlsdGVyXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbXByZXNzb3JVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXI6IENvbXByZXNzb3JQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21wcmVzc29yUGFyYW1ldGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgc2VlayBwb3NpdGlvblxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgcGFyYW1ldGVyczogU2Vla2VyUGFyYW1ldGVycylcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPVxuKHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGUpW2tleW9mIHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGVdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IGFueT4ge1xuICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAjZGVsZXRlZCA9IGZhbHNlO1xuICAjc2h1ZmZsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICBzdHJlYW0sXG4gICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgfSk7XG4gIHB1YmxpYyByZXBlYXRNb2RlOiBRdWV1ZVJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIHN5bmNlZEx5cmljc1Byb3ZpZGVyID0gbmV3IFN5bmNlZEx5cmljc1Byb3ZpZGVyKHRoaXMpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPilcbiAge1xuICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKVxuICAgIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpXG4gICAgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgaWYgKFxuICAgICFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiZcbiAgICAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKVxuICAgIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnW0d1aWxkTm9kZUluaXQubWF4SGlzdG9yeVNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heEhpc3RvcnlTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYFxuICAgICk7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHF1ZXVlIGNhbiBpbnRlcmNlcHQgc3RyZWFtc1xuICAgKi9cbiAgcHVibGljIGNhbkludGVyY2VwdCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVuYWJsZVN0cmVhbUludGVyY2VwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmXG4gICAgICAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGJlZm9yZSB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIHByZXBlbmQodHJhY2s6IFRyYWNrIHwgUXVldWU8VHJhY2s+IHwgQXJyYXk8VHJhY2s+LCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy50cmFja3Muc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ2luZGV4JyxcbiAgICAgICAgYCR7aW5kZXh9YCxcbiAgICAgICAgJzAnLFxuICAgICAgICBgJHt0aGlzLnRyYWNrcy5zaXplfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBBcnJheS5pc0FycmF5KHRyYWNrKSA/XG4gICAgdHJhY2subGVuZ3RoIDpcbiAgICB0cmFjayBpbnN0YW5jZW9mIFF1ZXVlID9cbiAgICB0cmFjay5zaXplIDpcbiAgICAxO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIGNvdW50KTtcblxuICAgIGNvbnN0IGluc2VydGlvbkluZGV4ID0gaW5kZXggPT09IDAgPyAwIDogaW5kZXggLSAxO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluc2VydGlvbkluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluc2VydGlvbkluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgdHJhY2sgb3IgdHJhY2sgcmVzb2x2YWJsZSB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayByZXNvbHZhYmxlIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApLiBJZiA+IDAsIHRoZSBpbnNlcnRlZCB0cmFjayB3aWxsIGJlIHBsYWNlZCBhZnRlciB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGFwcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgKi9cbiAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSlcbiAge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoXG4gICAgICBjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkIVxuICAgICk7XG4gICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgTm9Wb2ljZUNoYW5uZWxFcnJvcigpO1xuICAgIGlmICghY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgY2hhbm5lbCxcbiAgICAgIHRoaXMsXG4gICAgICBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0LFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICBjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSlcbiAge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgQ29ubmVjdGluZyB0byAke1xuICAgICAgY2hhbm5lbC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgPyAnc3RhZ2UnIDogJ3ZvaWNlJ30gY2hhbm5lbCAke1xuICAgICAgY2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgfSk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsoXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIGJlIHNodWZmbGVkIGltbWVkaWF0ZWx5IGluLXBsYWNlLCB3aGljaCBjYW5ub3QgYmUgdW5kb25lLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVTaHVmZmxlKCkge1xuICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2h1ZmZsZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoZHluYW1pYykge1xuICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBsYXRlbmN5IG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgcmV2aXZlKCkge1xuICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIGRlYWZcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBtdXRlXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkoXG4gIHRyYWNrOiBUcmFja0xpa2UsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KVxuICB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIucGxheSh0aGlzLmNoYW5uZWwsIHRyYWNrLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIGV2ZW50IG9uIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pXG4gIDogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLCBlKSk7XG4gICAgZGlzcGF0Y2hlci5vbihcbiAgICAgICdkZWJ1ZycsXG4gICAgICAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKVxuICAgICk7XG4gICAgZGlzcGF0Y2hlci5vbignZmluaXNoJywgKHIpID0+IHRoaXMuI3BlcmZvcm1GaW5pc2gocikpO1xuICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkJpcXVhZEZpbHRlcnNVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZilcbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvbHVtZUNoYW5nZSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgZlxuICAgICAgKTtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBhcmVPYmplY3RzRGlmZmVyZW50ID0gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICBpZiAoIWEgJiYgIWIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYSB8fCAhYikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGEpLnNvbWUoKGspID0+IGFba10gIT09IGJba10pO1xuICAgIH07XG5cbiAgICBkaXNwYXRjaGVyLm9uKCdzYW1wbGVSYXRlJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSAhPT0gZi5zYW1wbGVSYXRlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlLFxuICAgICAgICAgIGYuc2FtcGxlUmF0ZVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gZi5zYW1wbGVSYXRlO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5zZWVrZXI/LnNldFNhbXBsZVJhdGUoZi5zYW1wbGVSYXRlKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzLnNlZWtlcj8uc2V0VG90YWxEdXJhdGlvbih0aGlzLm5vZGUuZXN0aW1hdGVkRHVyYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5jdXJyZW50RmlsdGVyICE9PSB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlcikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlNhbXBsZVJhdGVGaWx0ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA/PyBudWxsLFxuICAgICAgICAgIGYuY3VycmVudEZpbHRlclxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA9IGYuY3VycmVudEZpbHRlcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdyZXZlcmInLCAoZikgPT4ge1xuICAgICAgaWYgKGFyZU9iamVjdHNEaWZmZXJlbnQoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5SZXZlcmJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID8/IG51bGwsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdzZWVrZXInLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICBgU2Vla2VyID4+IFNlZWtlZCB0byAke2Yuc2Vla1RhcmdldH1tcyBmb3IgVHJhY2sgJHt0aGlzLmN1cnJlbnRUcmFjaz8udGl0bGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5zZWVrVGFyZ2V0ICE9IG51bGwpIHRoaXMubm9kZS5zZXRQcm9ncmVzcyhmLnNlZWtUYXJnZXQpO1xuXG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNlZWssIHRoaXMsIGYpO1xuICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hlci5vbignY29tcHJlc3NvcicsIChmKSA9PiB7XG4gICAgICBpZiAoYXJlT2JqZWN0c0RpZmZlcmVudChmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuY29tcHJlc3NvcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5Db21wcmVzc29yVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gbnVsbCxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5jb21wcmVzc29yID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbixcbiAgQ29tcHJlc3NvclBhcmFtZXRlcnMsXG4gIFJldmVyYlBhcmFtZXRlcnMsXG4gIFNlZWtlclBhcmFtZXRlcnMsXG4gIFJlc2FtcGxlUGFyYW1ldGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBTZWVrRXZlbnQgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBOb0F1ZGlvUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gIHR5cGU/OiBTdHJlYW1UeXBlO1xuICBkYXRhOiBUcmFjaztcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZUNvbXByZXNzb3I/OiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJldmVyYj86IGJvb2xlYW47XG4gIGRpc2FibGVTZWVrZXI/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlRmlsdGVycz86IENvbW1vblJlc2FtcGxlckZpbHRlclByZXNldDtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgcmF0aW86IG51bWJlcjtcbiAgICBhdHRhY2s6IG51bWJlcjtcbiAgICByZWxlYXNlOiBudW1iZXI7XG4gICAgbWFrZXVwR2FpbjogbnVtYmVyO1xuICAgIGtuZWVXaWR0aDogbnVtYmVyO1xuICB9O1xuICByZXZlcmI/OiB7XG4gICAgcm9vbVNpemU6IG51bWJlcjtcbiAgICBkYW1waW5nOiBudW1iZXI7XG4gICAgd2V0TGV2ZWw6IG51bWJlcjtcbiAgICBkcnlMZXZlbDogbnVtYmVyO1xuICB9O1xuICBzZWVrZXI/OiB7XG4gICAgc2Vla1RhcmdldDogbnVtYmVyIHwgbnVsbDtcbiAgICB0b3RhbER1cmF0aW9uOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBSZXNhbXBsZVBhcmFtZXRlcnMpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICBjb21wcmVzc29yOiAoZmlsdGVyczogQ29tcHJlc3NvclBhcmFtZXRlcnMpID0+IGFueTtcbiAgcmV2ZXJiOiAoZmlsdGVyczogUmV2ZXJiUGFyYW1ldGVycykgPT4gYW55O1xuICBzZWVrZXI6IChmaWx0ZXJzOiBTZWVrZXJQYXJhbWV0ZXJzKSA9PiBhbnk7XG4gIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICNpbnRlcmNlcHRvcjogSW50ZXJjZXB0ZWRTdHJlYW0gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gIGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbixcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsXG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpXG4gIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICovXG4gICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgYXVkaW9QbGF5ZXIgfHxcbiAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgKi9cbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbihcbiAgICAgICdlcnJvcicsXG4gICAgICAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpXG4gICAgKTtcbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycykge1xuICAgICAgICB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kc3AuY29tcHJlc3Nvcikge1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXByZXNzb3InLCB0aGlzLmRzcC5jb21wcmVzc29yLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXZlcmIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXZlcmInLCB0aGlzLmRzcC5yZXZlcmIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLnNlZWtlcikge1xuICAgICAgICB0aGlzLmVtaXQoJ3NlZWtlcicsIHRoaXMuZHNwLnNlZWtlci5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5NYW51YWwpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgbmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmXG4gICAgICBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpXG4gICAgICB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcblxuICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgdGhpcy5lbmQoKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8XG4gICAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSAmJlxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKVxuICAgICAge1xuICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICovXG4gIGdldCBwYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gIH1cblxuICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucGF1c2VkIHx8XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICovXG4gIGlzQnVmZmVyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICovXG4gIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaWRsZVxuICAgKi9cbiAgaXNJZGxlKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGVzdHJveWVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAqL1xuICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHBsYXlcbiAgICovXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICovXG4gIGlzU2lnbmFsbGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAqL1xuICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBzdHJlYW1cbiAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAqIEByZXR1cm5zIHtBdWRpb1Jlc291cmNlfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wczogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzID9cbiAgICB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICBkc3A6IHtcbiAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyID9cbiAgICAgIHtcbiAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJlc2FtcGxlcjogb3BzPy5zYW1wbGVSYXRlID9cbiAgICAgIHtcbiAgICAgICAgaW5wdXRTYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgfSxcbiAgICAgIHZvbHVtZToge1xuICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICB9LFxuICAgICAgY29tcHJlc3Nvcjogb3BzPy5jb21wcmVzc29yID9cbiAgICAgIHtcbiAgICAgICAgdGhyZXNob2xkOiBvcHM/LmNvbXByZXNzb3IudGhyZXNob2xkLFxuICAgICAgICByYXRpbzogb3BzPy5jb21wcmVzc29yLnJhdGlvLFxuICAgICAgICBhdHRhY2s6IG9wcz8uY29tcHJlc3Nvci5hdHRhY2ssXG4gICAgICAgIHJlbGVhc2U6IG9wcz8uY29tcHJlc3Nvci5yZWxlYXNlLFxuICAgICAgICBtYWtldXBHYWluOiBvcHM/LmNvbXByZXNzb3IubWFrZXVwR2FpbixcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICAgIGtuZWVXaWR0aDogb3BzPy5jb21wcmVzc29yLmtuZWVXaWR0aFxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICByZXZlcmI6IG9wcz8ucmV2ZXJiID9cbiAgICAgIHtcbiAgICAgICAgcm9vbVNpemU6IG9wcz8ucmV2ZXJiLnJvb21TaXplLFxuICAgICAgICBkYW1waW5nOiBvcHM/LnJldmVyYi5kYW1waW5nLFxuICAgICAgICB3ZXRMZXZlbDogb3BzPy5yZXZlcmIud2V0TGV2ZWwsXG4gICAgICAgIGRyeUxldmVsOiBvcHM/LnJldmVyYi5kcnlMZXZlbCxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJldmVyYlxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzZWVrZXI6IG9wcz8uc2Vla2VyID9cbiAgICAgIHtcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVNlZWtlcixcbiAgICAgICAgc2Vla1RhcmdldDogb3BzPy5zZWVrZXIuc2Vla1RhcmdldCxcbiAgICAgICAgc2FtcGxlUmF0ZTogNDgwMDAsXG4gICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICB0b3RhbER1cmF0aW9uOiBvcHM/LnNlZWtlci50b3RhbER1cmF0aW9uXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZFxuICAgIH0pIDpcbiAgICBzcmM7XG5cbiAgICBpZiAodGhpcy5kc3Auc2Vla2VyKSB7XG4gICAgICAvLyB1c2VkIHRvIGhhbmRsZSBiYWNrd2FyZCBzZWVraW5nXG4gICAgICB0aGlzLmRzcC5zZWVrZXIub24oJ3NlZWsnLCAoZGF0YTogU2Vla0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMucXVldWUubm9kZS5yZXF1ZXN0U2VlayhkYXRhKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUsIG9wcz8uZGF0YSkuXG4gICAgY2F0Y2goXG4gICAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeVxuICAgICAgfSkgYXMgUG9zdFByb2Nlc3NlZFJlc3VsdFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcblxuICAgIGNvbnN0IGZvcm1hdCA9IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5O1xuXG4gICAgbGV0IF9zdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgaWYgKHRoaXMucXVldWUuY2FuSW50ZXJjZXB0KCkpIHtcbiAgICAgIHRoaXMuI2ludGVyY2VwdG9yID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIChwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtKS5waXBlKHRoaXMuI2ludGVyY2VwdG9yKTtcblxuICAgICAgX3N0cmVhbSA9IHRoaXMuI2ludGVyY2VwdG9yO1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5oYW5kbGVJbnRlcmNlcHRpbmdTdHJlYW0oXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIG9wcz8uZGF0YSxcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICB0aGlzLiNpbnRlcmNlcHRvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3N0cmVhbSA9IHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW07XG4gICAgfVxuXG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShfc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IGZvcm1hdCxcbiAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEgYXMgVHJhY2ssXG4gICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29tcHJlc3NvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmV2ZXJiIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlZWtlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBzdHJlYW1cbiAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B1cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gdXNlIG9wdXNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9BdWRpb1Jlc291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24sXG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LFxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblRpbWVvdXRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgVHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybUNhbGxiYWNrLCB0eXBlIFdyaXRhYmxlIH0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJlYW0gdGhhdCBjYW4gYmUgaW50ZXJjZXB0ZWQgYW5kIGNvbnN1bWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjb25zdW1lci5cbiAqIEBleGFtcGxlIGNvbnN0IHN0cmVhbSA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuICpcbiAqIC8vIHJlYWwgY29uc3VtZXJcbiAqIHN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKCdmaWxlLnR4dCcpKTtcbiAqXG4gKiAvLyBtYW4gaW4gdGhlIG1pZGRsZSBjb25zdW1lclxuICogY29uc3QgbWFuSW5UaGVNaWRkbGUgPSBuZXcgV3JpdGFibGUoe1xuICogIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAqICAgY29uc29sZS5sb2coY2h1bmsudG9TdHJpbmcoKSk7XG4gKiAgIGNhbGxiYWNrKCk7XG4gKiAgfVxuICogfSk7XG4gKlxuICogLy8gc3RyZWFtLmludGVyY2VwdG9ycyBpcyBhIFNldCBvZiBXcml0YWJsZSBzdHJlYW1zXG4gKiBzdHJlYW0uaW50ZXJjZXB0b3JzLmFkZChtYW5JblRoZU1pZGRsZSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRlZFN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnMgPSBuZXcgU2V0PFdyaXRhYmxlPigpO1xuICAjaW50ZXJjZXB0aW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3RhcnQgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RhdGUgb2YgSW50ZXJjZXB0ZWRTdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgc3RhcnRJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGludGVyY2VwdGluZyB0aGUgc3RyZWFtLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgY29uc3VtZWQgYnkgdGhlIGludGVyY2VwdG9ycy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdGVtcG9yYXJpbHkgc3RvcCB0aGUgaW50ZXJjZXB0aW9uLiBUaGUgc3RvcHBlZCBzdGF0ZSBjYW4gYmUgcmVzdW1lZCBieSBjYWxsaW5nIHN0YXJ0SW50ZXJjZXB0aW5nIGFnYWluLlxuICAgKi9cbiAgcHVibGljIHN0b3BJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RyZWFtIGlzIGJlaW5nIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgaXNJbnRlcmNlcHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVyY2VwdGluZztcbiAgfVxuXG4gIHB1YmxpYyBfdHJhbnNmb3JtKFxuICBjaHVuazogQnVmZmVyLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcsXG4gIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjaylcbiAgOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goY2h1bmssIGVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLiNpbnRlcmNlcHRpbmcgJiYgdGhpcy5pbnRlcmNlcHRvcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgY29uc3VtZXIud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmVuZCgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2Rlc3Ryb3koZXJyb3I6IEVycm9yLCBjYWxsYmFjazogVHJhbnNmb3JtQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBpZ25vcmVFcnJvciA9IFN0cmluZyhlcnJvcikuaW5jbHVkZXMoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJyk7XG4gICAgY29uc3QgZXJyID0gaWdub3JlRXJyb3IgPyB1bmRlZmluZWQgOiBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmRlc3Ryb3koZXJyKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyY2VwdG9ycy5jbGVhcigpO1xuXG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufSIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuXG4gIH1cblxuICAvKipcbiAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAqL1xuICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICB9XG59IiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vUmVzdWx0RXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcbmltcG9ydCB7IFNlZWtFdmVudCB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgKi9cbiAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXIgbGVuZ3RoXG4gICAqL1xuICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICovXG4gIHJpZ2h0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aW1lc3RhbXAgYW5kIGxpbmVcbiAgICovXG4gIGluZGljYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRpY2F0b3JcbiAgICovXG4gIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gYW55PiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QoXG4gICAgICB0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgKi9cbiAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcikge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlci5nZXRQb3NpdGlvbigpO1xuICAgICAgaWYgKHBvcyA+IDApIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICByZXR1cm4gZHVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuXG4gICAgdG9BcnJheSgpLlxuICAgIGZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnMuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgfSkuXG4gICAgZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggP1xuICAgIDEgOlxuICAgIG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXI7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIC8vIGR1cmF0aW9uIG11bHRpcGxpZXIgY2hlY2tzIGZmbXBlZyBmaWx0ZXJzIHRoYXQgbWF5IGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuXG4gICAgLy8gd2UgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSBuYXRpdmUgcmVzYW1wbGVyIGZpbHRlciBhcyBpdCBtYXkgYWxzbyBhZmZlY3QgdGhlIGR1cmF0aW9uXG4gICAgaWYgKHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIpIHtcbiAgICAgIC8vIGdldCB0aGUgcmVzYW1wbGVyIHJhdGlvIGlmIHdlIGhhdmUgb25lXG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIuZ2V0UmF0aW8oKTtcbiAgICAgIGlmIChyYXRpbyA8PSAwKSByZXR1cm4gdmFsO1xuXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWwgLyByYXRpbyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSkge1xuICAgICAgY29uc3QgdHJhY2tIYXNMZWdhY3lNZXRhZGF0YSA9XG4gICAgICB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEgJiZcbiAgICAgIHRyYWNrLm1ldGFkYXRhLmJyaWRnZSAhPSBudWxsO1xuICAgICAgY29uc3QgdHJhY2tIYXNNZXRhZGF0YSA9IHRyYWNrPy5icmlkZ2VkVHJhY2sgIT0gbnVsbDtcblxuICAgICAgaWYgKHRyYWNrSGFzTGVnYWN5TWV0YWRhdGEgfHwgdHJhY2tIYXNNZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgIHRyYWNrLmJyaWRnZWRUcmFjaz8uZHVyYXRpb25NUyA/P1xuICAgICAgICAoXG4gICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICBicmlkZ2U6IHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfT4pLlxuICAgICAgICBtZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXJzIElnbm9yZSBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VycmVudCA9IGlnbm9yZUZpbHRlcnMgP1xuICAgIHRoaXMucGxheWJhY2tUaW1lIDpcbiAgICB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgfSxcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgfSxcbiAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKGN1cnJlbnQgLyB0b3RhbCAqIDEwMClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLFxuICAgICAgbGVmdENoYXIgPSAnXFx1MjVBQycsXG4gICAgICByaWdodENoYXIgPSAnXFx1MjVBQycsXG4gICAgICBsZW5ndGggPSAxNSxcbiAgICAgIHRpbWVjb2RlcyA9IHRydWUsXG4gICAgICBzZXBhcmF0b3IgPSAnXFx1MjUwMydcbiAgICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsXG4gICAgICAgIFN0cmluZyhsZW5ndGgpLFxuICAgICAgICAnMCcsXG4gICAgICAgICdGaW5pdGUgTnVtYmVyJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKFxuICAgICAgdGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUgKiBsZW5ndGhcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAxICYmIGluZGV4IDw9IGxlbmd0aCkge1xuICAgICAgY29uc3QgYmFyID0gbGVmdENoYXIucmVwZWF0KGluZGV4IC0gMSkuc3BsaXQoJycpO1xuICAgICAgYmFyLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgIGJhci5wdXNoKHJpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbihcbiAgICAgICAgICAnJ1xuICAgICAgICApfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtiYXIuam9pbignJyl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7XG4gICAgICAgIHRpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke1xuICAgICAgICBzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChcbiAgICAgICAgICBsZW5ndGggLSAxXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlayB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZHVyYXRpb24gPT09IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZHVyYXRpb24gPiB0aGlzLnRvdGFsRHVyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5TRUVLX09WRVJfVEhSRVNIT0xELFxuICAgICAgICBkZXNjcmlwdGlvbjogbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgICAnW2R1cmF0aW9uXScsXG4gICAgICAgICAgU3RyaW5nKGR1cmF0aW9uKSxcbiAgICAgICAgICAnMCcsXG4gICAgICAgICAgU3RyaW5nKHRoaXMudG90YWxEdXJhdGlvbilcbiAgICAgICAgKS5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuXG4gICAgY29uc3Qgc2Vla2VyID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcjtcblxuICAgIGlmIChzZWVrZXIpIHtcbiAgICAgIHNlZWtlci5zZWVrKGR1cmF0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbikudGhlbigodikgPT4ge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrLCB0aGlzLnF1ZXVlLCB7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSxcbiAgICAgICAgICBzZWVrVGFyZ2V0OiBkdXJhdGlvbixcbiAgICAgICAgICB0b3RhbER1cmF0aW9uOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHZvbHVtZVxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdm9sdW1lXG4gICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGJpdCByYXRlXG4gICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRCaXRyYXRlKHJhdGU6IG51bWJlciB8ICdhdXRvJykge1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShcbiAgICAgIHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSkgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGF1c2UodHJ1ZSkgfHwgZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBza2lwKG9wdGlvbnM/OiBTa2lwT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgY29uc3QgeyByZWFzb24sIGRlc2NyaXB0aW9uIH0gPSBvcHRpb25zIHx8IHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLk1hbnVhbCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBza2lwcGVkIG1hbnVhbGx5J1xuICAgIH07XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICByZWFzb24sXG4gICAgICBkZXNjcmlwdGlvblxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgV2hldGhlciBvciBub3QgdG8gZW1pdCB0aGUgZXZlbnQgQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGVtaXRFdmVudCA9IHRydWUpIHtcbiAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgaWYgKGVtaXRFdmVudClcbiAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrLCBmYWxzZSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUudW5zaGlmdChyZW1vdmVkKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkp1bXAsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMganVtcGVkIHRvIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICovXG4gIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0bywgZGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICd0cmFjayB2YWx1ZScsXG4gICAgICAnaW5zdGFuY2Ugb2YgVHJhY2snLFxuICAgICAgU3RyaW5nKHRyYWNrKVxuICAgICk7XG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIHRyYWNrKTtcbiAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICovXG4gIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgaWYgKCFzcmMpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICBpZiAoc3JjIDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICBpZiAoZGVzdCA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgY29uc3QgZGVzdFQgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XTtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNvdXJjZSB0byBzZWVrXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzZWVrIHBhcmFtZXRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0U2VlayhkYXRhOiBTZWVrRXZlbnQpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0cmFjay5zZWVrYWJsZSkge1xuICAgICAgcmV0dXJuIHRyYWNrLnNlZWsoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGRhdGEucG9zaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSByZXMgVGhlIHRyYWNrIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KHJlcz86IFRyYWNrIHwgbnVsbCwgb3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgXG4gICAgKTtcblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDBcbiAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgIG9wdGlvbnNcbiAgICApITtcblxuICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLidcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTm9SZXN1bHRFcnJvcihcbiAgICAgICAgJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCdcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHBsYXkgdGhlIHRyYWNrLCBpbml0aWFsaXppbmcuLi4nXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3NpZ25lZFJlc291cmNlID0gdHJhY2sucmVzb3VyY2U7XG5cbiAgICAgIGlmIChhc3NpZ25lZFJlc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdUcmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2UgYXNzaWduZWQsIHBsYXllciB3aWxsIG5vdyBwbGF5IHRoZSByZXNvdXJjZSBkaXJlY3RseS4uLidcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID1cbiAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCAoXG4gICAgICBzcmMgPT09ICdzcG90aWZ5JyA/XG4gICAgICAnc3BvdGlmeVNvbmcnIDpcbiAgICAgIHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/XG4gICAgICAnYXBwbGVNdXNpY1NvbmcnIDpcbiAgICAgIHNyYyk7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgc3RyZWFtOiBudWxsIGFzIEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLlxuICAgICAgdGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKVxuICAgICAgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0sIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gdXNpbmcgZXh0cmFjdG9ycy4uLidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5jb250ZXh0LnByb3ZpZGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT4gci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICBkaXNhYmxlQ29tcHJlc3NvcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgICAgIGRpc2FibGVSZXZlcmI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgICAgIGRpc2FibGVTZWVrZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgICAgIGNvbXByZXNzb3I6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHJldmVyYjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgc2Vla2VyOiB7XG4gICAgICAgICAgICBzZWVrVGFyZ2V0OlxuICAgICAgICAgICAgb3B0aW9ucy50cmFuc2l0aW9uTW9kZSAmJiBvcHRpb25zLnNlZWsgIT0gbnVsbCA/XG4gICAgICAgICAgICBvcHRpb25zLnNlZWsgOlxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRvdGFsRHVyYXRpb246IHRyYWNrLmR1cmF0aW9uTVMgPz8gMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA/PyAoXG4gICAgICAgICAgdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgP1xuICAgICAgICAgIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOlxuICAgICAgICAgIHVuZGVmaW5lZCksXG4gICAgICAgICAgYmlxdWFkRmlsdGVyOlxuICAgICAgICAgIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXcsXG4gICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgIH0sXG4gICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgfTtcblxuICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZXIgPSByZXNvbHZlKTtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LldpbGxQbGF5VHJhY2ssXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIHRyYWNrLFxuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWUsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlU2Vla2VyXS5cbiAgICAgIGV2ZXJ5KChlKSA9PiAhIWUgPT09IHRydWUpO1xuXG4gICAgICBjb25zdCBuZWVkc0ZpbHRlcnMgPVxuICAgICAgISF0cmFja1N0cmVhbUNvbmZpZy5wbGF5ZXJDb25maWcuc2VlayB8fFxuICAgICAgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuc2tpcEZGbXBlZyAmJiAhbmVlZHNGaWx0ZXJzO1xuXG4gICAgICBsZXQgZmluYWxTdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgICBjb25zdCBkZW11eGFibGUgPSAoZm10OiBzdHJpbmcpID0+XG4gICAgICBbXG4gICAgICBTdHJlYW1UeXBlLk9wdXMsXG4gICAgICBTdHJlYW1UeXBlLldlYm1PcHVzLFxuICAgICAgU3RyZWFtVHlwZS5PZ2dPcHVzLFxuICAgICAgU3RyZWFtVHlwZS5SYXcsXG4gICAgICAncGNtJ10uXG4gICAgICBpbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgIGlmIChcbiAgICAgIHNob3VsZFNraXBGRm1wZWcgJiZcbiAgICAgICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJlxuICAgICAgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gIT09ICdzdHJpbmcnICYmXG4gICAgICBkZW11eGFibGUoc3RyZWFtU3JjLnN0cmVhbS4kZm10KSlcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyAkZm10LCBzdHJlYW0gfSA9IHN0cmVhbVNyYy5zdHJlYW07XG4gICAgICAgIGNvbnN0IHNob3VsZFBDTSA9ICFkYXNwRGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtcbiAgICAgICAgICBzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gXG5cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpc1JhdyA9ICRmbXQgPT09ICdwY20nIHx8ICRmbXQgPT09IFN0cmVhbVR5cGUuUmF3O1xuXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBvcHVzU3RyZWFtID1cbiAgICAgICAgaXNSYXcgfHwgJGZtdCA9PT0gU3RyZWFtVHlwZS5PcHVzID9cbiAgICAgICAgc3RyZWFtIDpcbiAgICAgICAgJGZtdCA9PT0gU3RyZWFtVHlwZS5PZ2dPcHVzID9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IE9nZ0RlbXV4ZXIoKSBhcyBhbnkpIDpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IFdlYm1EZW11eGVyKCkgYXMgYW55KTtcblxuICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgaWYgKGlzUmF3KSB7XG4gICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtO1xuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuT3B1cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc3Qgb3B1cyA9IGRhc3BEaXNhYmxlZCAmJiB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb247XG4gICAgICAgIC8vIGlmIChvcHVzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc2FibGluZyBQQ00gb3V0cHV0IHNpbmNlIGFsbCBmaWx0ZXJzIGFyZSBkaXNhYmxlZCBhbmQgb3B1cyBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuLi4nKTtcblxuICAgICAgICBmaW5hbFN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUgfHxcbiAgICAgICAgICB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gOlxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwXG4gICAgICAgICAgLy8gb3B1c1xuICAgICAgICApO1xuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyO1xuXG4gICAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgJ0Rpc3BhdGNoZXIgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIHF1ZXVlIGJlaW5nIGRlbGV0ZWQgaW4gdGhlIG1pZGRsZSBvZiBvcGVyYXRpb24uIENhbmNlbGxpbmcgdGhlIHN0cmVhbS4uLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmluYWxTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBkaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShcbiAgICAgICAgICBmaW5hbFN0cmVhbSxcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID1cbiAgICBuZXcgTm9SZXN1bHRFcnJvcihgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKTtcblxuXG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZVxuICAgICk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgIHRyYWNrXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdHRlbXB0ZWRFeHRyYWN0b3JzID1cbiAgICB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmdldENvbnRleHQoKT8uYXR0ZW1wdGVkRXh0cmFjdG9ycyB8fFxuICAgIG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuYmxvY2tTdHJlYW1Gcm9tPy5zb21lKFxuICAgICAgICAgIChleHQpID0+IGV4dCA9PT0gZXh0cmFjdG9yLmlkZW50aWZpZXJcbiAgICAgICAgKSlcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhdHRlbXB0ZWRFeHRyYWN0b3JzLmhhcyhleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBjYW5TdHJlYW0gPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgdHJhY2sudXJsLFxuICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG5cbiAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBHZW5lcmljIHN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCBhbmQgZmFsbGJhY2sgc3RyZWFtIGV4dHJhY3Rpb24gaXMgZW5hYmxlZGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke1xuICAgICAgdHJhY2sudGl0bGV9LCB1cmw6ICR7XG4gICAgICB0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtcbiAgICAgIHN0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgXG5cbiAgICApO1xuXG4gICAgcmV0dXJuIHN0cmVhbUluZm87XG4gIH1cblxuICBhc3luYyAjY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyBmYWxsYmFjayBzdHJlYW1pbmcgbWV0aG9kLi4uYFxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJpZnlGYWxsYmFja1N0cmVhbSA9IHRoaXMucXVldWUub3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcblxuICAgICAgICBpZiAodmVyaWZ5RmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhbGxiYWNrIHN0cmVhbSB2ZXJpZmljYXRpb24gaXMgZW5hYmxlZCwgdmFsaWRhdGluZyBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNob3VsZFByb2NlZWQgPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCB0cmFjay5zb3VyY2VcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFzaG91bGRQcm9jZWVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gdmFsaWRhdGUgcXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nICR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgUXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHdhcyB2YWxpZGF0ZWQgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uIFByb2NlZWRpbmcgd2l0aCBleHRyYWN0aW9uLi4uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrcyA9IGF3YWl0IGV4dHJhY3Rvci5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICByZXF1ZXN0ZWRCeTogdHJhY2sucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmFsbGJhY2tUcmFjayA9IGZhbGxiYWNrVHJhY2tzLnRyYWNrc1swXTtcblxuICAgICAgICBpZiAoIWZhbGxiYWNrVHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICAgIGlmICghc3RyZWFtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrID0gZmFsbGJhY2tUcmFjaztcblxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsXG4gIHRyYWNrOiBUcmFjayxcbiAgc2VlayA9IDAsXG4gIG9wdXM/OiBib29sZWFuKVxuICB7XG4gICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICBjcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnXG4gICAgfSkuXG4gICAgb24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtcbiAgICAgICAgZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gXG5cbiAgICAgICk7XG5cbiAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgfVxufSIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgLyoqXG4gICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAqXG4gICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSxcbiAgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKVxuICB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdW1lKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5jb25zdW1lKCk7XG4gICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzLCBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBFcXVhbGl6ZXIsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgfSxcbiAgICAoXywgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICB9KVxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XVxuICApLFxuICBDbHViOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIERhbmNlOiBtYWtlQmFuZHMoW1xuICA5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoW1xuICAtOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdXG4gICksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoW1xuICA3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF1cbiAgKSxcbiAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFtcbiAgLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XVxuICApLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoW1xuICA0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF1cbiAgKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoW1xuICAxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gIFBhcnR5OiBtYWtlQmFuZHMoW1xuICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdXG4gICksXG4gIFBvcDogbWFrZUJhbmRzKFtcbiAgLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdXG4gICksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoW1xuICAtMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XVxuICApLFxuICBTb2Z0OiBtYWtlQmFuZHMoW1xuICA0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdXG4gICksXG4gIFNvZnRSb2NrOiBtYWtlQmFuZHMoW1xuICA0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdXG4gICksXG4gIFRlY2hubzogbWFrZUJhbmRzKFtcbiAgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdXG4gIClcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSBhbnk+IHtcbiAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZmbXBlZyBtYXkgYmUgc2tpcHBlZFxuICAgKi9cbiAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgI3NldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKFxuICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICBxdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcHJldixcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgKi9cbiAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbnB1dCBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBhcmdzKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKVxuICAgIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbXG4gICAgLi4udGhpcy4jaW5wdXRBcmdzLFxuICAgIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG5cblxuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKFxuICBmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pXG4gIHtcbiAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID9cbiAgICAgIFtdIDpcbiAgICAgIE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLlxuICAgICAgZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSkuXG4gICAgICBtYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoXG4gICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZUZpbHRlcjpcbiAgU3RyZWFtQ29uZmlnWydkaXNwYXRjaGVyQ29uZmlnJ11bJ3NhbXBsZVJhdGVGaWx0ZXJzJ10gfFxuICBudWxsO1xuICBjb21wcmVzc29yOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsnY29tcHJlc3NvciddIHwgbnVsbDtcbiAgcmV2ZXJiOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsncmV2ZXJiJ10gfCBudWxsO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZXF1YWxpemVyUHJlc2V0cyA9IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ7XG4gIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgYmlxdWFkOiBudWxsLFxuICAgIGVxdWFsaXplcjogW10sXG4gICAgZmlsdGVyczogW10sXG4gICAgdm9sdW1lOiAxMDAsXG4gICAgc2FtcGxlUmF0ZTogLTEsXG4gICAgY29tcHJlc3NvcjogbnVsbCxcbiAgICByZXZlcmI6IG51bGwsXG4gICAgc2FtcGxlUmF0ZUZpbHRlcjogbnVsbFxuICB9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgLy8gICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWcpIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZ2l0YWwgYmlxdWFkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERTUCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgKi9cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzYW1wbGVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3NvciB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCBjb21wcmVzc29yKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcmIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJldmVyYiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBDTSBTZWVrZXIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Vla2VyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlayxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWc/LmZpbHRlcnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBtXG4gICAgfSkpIGFzIEVxdWFsaXplckJhbmRbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8XG4gICAgICAgIEJpcXVhZEZpbHRlcnMsXG4gICAgICAgIG51bWJlcj4gfFxuICAgICAgbnVsbCB8fCBudWxsKTtcblxuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmFmLmZpbHRlcnM/LmZpbHRlcnMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gIH1cblxuICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZmbXBlZzogdGhpcy5mZm1wZWcsXG4gICAgICBlcXVhbGl6ZXI6IHRoaXMuZXF1YWxpemVyLFxuICAgICAgYmlxdWFkOiB0aGlzLmJpcXVhZCxcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcbiAgICAgIHNhbXBsZVJhdGU6IHRoaXMucmVzYW1wbGVyPy5zYW1wbGVSYXRlIHx8IDQ4MDAwLFxuICAgICAgdm9sdW1lOiB0aGlzLnZvbHVtZT8udm9sdW1lID8/IDEwMFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcmFwaCB7XG4gIGZmbXBlZzogRmlsdGVyc1tdO1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkOiBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsO1xuICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59IiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGRm1wZWcsIGNyZWF0ZUZGbXBlZ0FyZ3MgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgZm10Pzogc3RyaW5nO1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICBzZWVrPzogbnVtYmVyO1xuICBza2lwPzogYm9vbGVhbjtcbiAgY29va2llcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1NUUklORyhcbnN0cmVhbTogc3RyaW5nLFxuZm10Pzogc3RyaW5nLFxuY29va2llcz86IHN0cmluZylcbntcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIHJlY29ubmVjdDogMSxcbiAgICByZWNvbm5lY3Rfc3RyZWFtZWQ6IDEsXG4gICAgcmVjb25uZWN0X2RlbGF5X21heDogNSxcbiAgICBpOiBzdHJlYW0sXG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbCxcbiAgICBjb29raWVzOlxuICAgIHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJyA/XG4gICAgIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/XG4gICAgY29va2llcyA6XG4gICAgYFwiJHtjb29raWVzfVwiYCA6XG4gICAgbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gY3JlYXRlRkZtcGVnQXJncyh7XG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKFxuc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZyxcbm9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKVxuOiBSZWFkYWJsZSB7XG4gIGlmIChvcHRpb25zPy5za2lwICYmIHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSByZXR1cm4gc3RyZWFtO1xuICBvcHRpb25zID8/PSB7fTtcbiAgY29uc3QgYXJncyA9XG4gIHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID9cbiAgRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOlxuICBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgY29uc3QgdHJhbnNjb2RlciA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6XG4gICAgICB0aGlzLnF1ZXVlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLmNoYW5uZWw/Lm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT4gIW0udXNlci5ib3RcbiAgICAgICkuc2l6ZSB8fCAwLFxuICAgICAgbWVtb3J5VXNhZ2U6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKSxcbiAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgcGxheWVyOiB0aGlzLnF1ZXVlLnBsYXllci52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICB9XG59IiwgImltcG9ydCB7IE5vdEV4aXN0aW5nRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7dGltZXN0YW1wOiBudW1iZXI7bGluZTogc3RyaW5nO307XG5cbmNvbnN0IHRpbWVzdGFtcFBhdHRlcm4gPSAvXFxbKFxcZHsyfSk6KFxcZHsyfSlcXC4oXFxkezJ9KVxcXS87XG5cbmV4cG9ydCBjbGFzcyBTeW5jZWRMeXJpY3NQcm92aWRlciB7XG4gICNsb29wOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAjY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrIHwgbnVsbCA9IG51bGw7XG4gICNvblVuc3Vic2NyaWJlOiBVbnN1YnNjcmliZSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcnZhbCA9IDEwMDtcbiAgcHVibGljIHJlYWRvbmx5IGx5cmljczogTHlyaWNzRGF0YSA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgcHVibGljIHJlYWRvbmx5IHJhdz86IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdClcbiAge1xuICAgIGlmIChyYXc/LnN5bmNlZEx5cmljcykgdGhpcy5sb2FkKHJhdz8uc3luY2VkTHlyaWNzKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGxvYWQobHlyaWNzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWx5cmljcykgdGhyb3cgbmV3IE5vdEV4aXN0aW5nRXJyb3IoJ3N5bmNlZEx5cmljcycpO1xuXG4gICAgdGhpcy5seXJpY3MuY2xlYXIoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGx5cmljcy5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aW1lc3RhbXBQYXR0ZXJuKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFssIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID1cbiAgICAgICAgcGFyc2VJbnQobWludXRlcykgKiA2MCAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChzZWNvbmRzKSAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgIHRoaXMubHlyaWNzLnNldCh0aW1lc3RhbXAsIGxpbmUucmVwbGFjZSh0aW1lc3RhbXBQYXR0ZXJuLCAnJykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbHlyaWNzIGF0IGEgc3BlY2lmaWMgdGltZSBvciBhdCB0aGUgY2xvc2VzdCB0aW1lIChcdTAwQjEyIHNlY29uZHMpXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIGF0KHRpbWU6IG51bWJlcik6IEx5cmljc0F0IHwgbnVsbCB7XG4gICAgY29uc3QgbG93ZXN0VGltZSA9IHRoaXMubHlyaWNzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGxvd2VzdFRpbWUgPT0gbnVsbCB8fCB0aW1lIDwgbG93ZXN0VGltZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubHlyaWNzLmhhcyh0aW1lKSlcbiAgICByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMubHlyaWNzLmtleXMoKSk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+XG4gICAgTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGFcbiAgICApO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKFxuICAgICAgbGFzdFZhbHVlICE9PSBudWxsICYmXG4gICAgICBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiZcbiAgICAgIGx5cmljcy50aW1lc3RhbXAgPT09IGxhc3RWYWx1ZS50aW1lc3RhbXApXG5cbiAgICAgIHJldHVybjtcblxuICAgICAgbGFzdFZhbHVlID0gbHlyaWNzO1xuXG4gICAgICB0aGlzLiNjYWxsYmFjayhseXJpY3MubGluZSwgbHlyaWNzLnRpbWVzdGFtcCk7XG4gICAgfSwgdGhpcy5pbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxufSIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgcHVibGljIGxpbWl0ID0gMTtcbiAgcHVibGljIHJlbWFpbmluZyA9IDE7XG4gIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgcHVibGljIHF1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIE1BWF9SRVRSSUVTID0gNTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBidWNrZXQgaXMgcmF0ZSBsaW1pdGVkLlxuICAgKi9cbiAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtYWluaW5nIDw9IDAgJiYgRGF0ZS5ub3coKSA8IHRoaXMucmVzZXRBZnRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVucXVldWUocmVxOiBSZXF1ZXN0RW50aXR5KSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLmFjcXVpcmUoKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW50cnkucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlcXVlc3QocmVxOiBSZXF1ZXN0RW50aXR5LCByZXRyaWVzID0gMCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICB3aGlsZSAodGhpcy5pc1JhdGVMaW1pdGVkKCkpIHtcbiAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgIH1cblxuICAgIGxldCBwYXNzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVxKCk7XG5cbiAgICAgIHRoaXMuX3BhdGNoSGVhZGVycyhyZXMpO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keToge1xuICAgICAgICAgICAgY29kZTogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgIH0gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHtjb2RlOiBudW1iZXI7fTtcblxuICAgICAgICAgIGVycm9yLm5hbWUgPSBib2R5Lm5hbWU7XG4gICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgIGVyciA9IGVycm9yO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoYEhUVFAgRXJyb3I6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhc3MgPSB0cnVlO1xuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocGFzcykgdGhyb3cgZTtcblxuICAgICAgY29uc3QgYmFkUmVxID0gZSBpbnN0YW5jZW9mIEVycm9yICYmIC9FcnJvcjogNFswLTldezJ9Ly50ZXN0KGUubWVzc2FnZSk7XG5cbiAgICAgIGlmICghYmFkUmVxICYmIHJldHJpZXMgPCB0aGlzLk1BWF9SRVRSSUVTKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSwgKytyZXRyaWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKSk7XG4gICAgY29uc3QgcmVtYWluaW5nID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJykpO1xuICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPVxuICAgIE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKFxuICAgICAgL1tBLVpdL2csXG4gICAgICAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PlxubmV3IFVSTFNlYXJjaFBhcmFtcyh0b1NuYWtlQ2FzZShwYXJhbXMpKS50b1N0cmluZygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICB0cmFja05hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwbGFpbkx5cmljczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHN5bmNlZEx5cmljcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTHJjR2V0UmVzdWx0ID0gT21pdDxMcmNTZWFyY2hSZXN1bHQsICduYW1lJz47XG5cbmV4cG9ydCBjbGFzcyBMcmNMaWIge1xuICAvKipcbiAgICogVGhlIEFQSSBVUkxcbiAgICovXG4gIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCB0aW1lb3V0LiBEZWZhdWx0IGlzIDE1IHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgdGltZW91dCA9IDE1XzAwMDtcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgKi9cbiAgcHVibGljIGJ1Y2tldCA9IG5ldyBTZXF1ZW50aWFsQnVja2V0KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTHJjTGliIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmV0cnkgbGltaXQuIERlZmF1bHQgaXMgNS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgKi9cbiAgcHVibGljIHNldFJldHJ5TGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIHRoaXMuYnVja2V0Lk1BWF9SRVRSSUVTID0gbGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzIGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0QnlJZChpZDogYCR7bnVtYmVyfWAgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4oYGdldC8ke2lkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2FjaGVkIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVkKHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGZvciBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChwYXJhbXM6IExyY1NlYXJjaFBhcmFtcykge1xuICAgIGlmICghcGFyYW1zLnEgJiYgIXBhcmFtcy50cmFja05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgJ3N0cmluZycsXG4gICAgICAgIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGBzZWFyY2g/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdFtdPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgQVBJXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gVXRpbC5nZXRSdW50aW1lKCk7XG5cbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID1cbiAgICAgIG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRoaXMudGltZW91dCksXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6IGBEaXNjb3JkLVBsYXllci8ke3RoaXMucGxheWVyLnZlcnNpb259ICR7XG4gICAgICAgICAgcnVudGltZVZlcnNpb24gPz8gJyd9YC5cbiAgICAgICAgICB0cmltRW5kKCksXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBbTHJjTGliXSBSZXF1ZXN0aW5nICR7cGF0aH1gKTtcblxuICAgICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCxcbiAgICAgICAgaW5pdFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5idWNrZXQuZW5xdWV1ZShkaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiByZXMuanNvbigpO1xuICB9XG59IiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIEF1ZGlvUGxheWVyIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gIC8qKlxuICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICogSXQgb25seSBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+ID0gbmV3IENvbGxlY3Rpb248XG4gICAgU25vd2ZsYWtlLFxuICAgIFN0cmVhbURpc3BhdGNoZXI+KFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBvcHRpb25zPzoge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAgOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoKTtcbiAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubixcbiAgICAgIGNoYW5uZWwsXG4gICAgICBvcHRpb25zLnF1ZXVlLFxuICAgICAgb3B0aW9ucy5tYXhUaW1lLFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gICAgcmV0dXJuIHN1YjtcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW4oXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICB9KVxuICB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25uZWN0aW9uID0gdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIG9wdGlvbnM/Lmdyb3VwXG4gICAgKTtcblxuICAgIGlmIChcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgIGV4aXN0aW5nQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQuXG4gICAgICB2b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIFN0cmVhbURpc3BhdGNoZXIpXG4gICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy9cbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgKiBAcmV0dXJucyB7U3RyZWFtRGlzcGF0Y2hlcn1cbiAgICovXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTsiLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICBnZXREYXRhKCk6IFByb21pc2U8RGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VD5bXT47XG4gIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICB9KVxuICB7XG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKFxuICAgICAgdGhpcy5jbGVhbnVwLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNoZWNrSW50ZXJ2YWxcbiAgICApLnVucmVmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICBpZiAoIXJlc3VsdClcbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIGRhdGE6IFQsXG4gIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKVxuICB7XG4gICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fFxuICAgIGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8XG4gICAgdGhpcy5leHBpcmVBZnRlciA8IDEpXG5cbiAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICBxdWVyeTogc3RyaW5nO1xuICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn0iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIFNub3dmbGFrZVV0aWwsXG4gIFZvaWNlU3RhdGUsXG4gIEludGVudHNCaXRGaWVsZCxcbiAgVXNlcixcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24sXG4gIEV2ZW50cyB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXlsaXN0LFxuICBUcmFjayxcbiAgU2VhcmNoUmVzdWx0LFxuICBTZWFyY2hPcHRpb25zLFxuICBQbGF5bGlzdEluaXREYXRhIH0gZnJvbVxuJy4vZmFicmljJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWVFdmVudHMsXG4gIFZvaWNlQ29ubmVjdENvbmZpZyxcbiAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgR3VpbGROb2RlTWFuYWdlcixcbiAgR3VpbGRRdWV1ZSxcbiAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbVxuJy4vcXVldWUnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHtcbiAgUXVlcnlSZXNvbHZlcixcbiAgUXVlcnlUeXBlLFxuICBSZXNvbHZlZFF1ZXJ5LFxuICBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tXG4nLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHtcbiAgQXVkaW9SZXNvdXJjZSxcbiAgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uLFxuICBTdHJlYW1UeXBlIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUsIFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IsIE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBDb250ZXh0LCBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBIb29rc0N0eCwgU1VQRVJfQ09OVEVYVCB9IGZyb20gJy4vaG9va3MvY29tbW9uJztcbmltcG9ydCB7IExyY0xpYiB9IGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBnZXRDb21wYXROYW1lLCBpc0NsaWVudFByb3h5IH0gZnJvbSAnLi9jb21wYXQvY29tbW9uJztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRwVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQge1xuICBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcixcbiAgdHlwZSBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMgfSBmcm9tXG4nLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckV2ZW50cyB7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIGVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiBhbnk7XG4gIHZvaWNlU3RhdGVVcGRhdGU6IChcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIG9sZFN0YXRlOiBWb2ljZVN0YXRlLFxuICBuZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbiAgPT4gYW55O1xufVxuXG5leHBvcnQgY29uc3QgUGxheWVyRXZlbnQgPSB7XG4gIGRlYnVnOiAnZGVidWcnLFxuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgZXJyb3I6ICdlcnJvcicsXG4gIEVycm9yOiAnZXJyb3InLFxuICB2b2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJ1xufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsYXllckV2ZW50ID0gKHR5cGVvZiBQbGF5ZXJFdmVudClba2V5b2YgdHlwZW9mIFBsYXllckV2ZW50XTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IGFueT4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCB0eXBlIFRyYWNrTGlrZSA9XG5zdHJpbmcgfFxuVHJhY2sgfFxuU2VhcmNoUmVzdWx0IHxcblRyYWNrW10gfFxuUGxheWxpc3QgfFxuQXVkaW9SZXNvdXJjZTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxubmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSlcbj0+IEF3YWl0ZWQ8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVySW5pdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICAgKi9cbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICovXG4gIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQcmV2ZW50IHZvaWNlIHN0YXRlIGhhbmRsZXIgZnJvbSBiZWluZyBvdmVycmlkZGVuXG4gICAqL1xuICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICAgKi9cbiAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgKi9cbiAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRdWVyeSBjYWNoZSBwcm92aWRlclxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGVQcm92aWRlcjxhbnk+IHwgbnVsbDtcbiAgLyoqXG4gICAqIFNraXAgZmZtcGVnIHByb2Nlc3Mgd2hlbiBwb3NzaWJsZVxuICAgKi9cbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcHJvYmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDUwMDAuXG4gICAqL1xuICBwcm9iZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgZmZtcGVnIHBhdGhcbiAgICovXG4gIGZmbXBlZ1BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBmYWxsYmFjayBjb250ZXh0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBvdmVycmlkZUZhbGxiYWNrQ29udGV4dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAjbGFnTW9uaXRvclRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAjbGFnTW9uaXRvckludGVydmFsOiBOb2RlSlMuVGltZW91dDtcbiAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICNob29rc0N0eDogQ29udGV4dDxIb29rc0N0eD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIGRpc2NvcmQtcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9IGRwVmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIC8qKlxuICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG5vZGVzIChxdWV1ZSkgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIG5vZGVzID0gbmV3IEd1aWxkTm9kZU1hbmFnZXIodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgYXBpIHV0aWxpdGllc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZvaWNlVXRpbHMgPSBuZXcgVm9pY2VVdGlscyh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIG1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIGV2ZW50cyBjaGFubmVsXG4gICAqL1xuICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oW1xuICBHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsXG4gIEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl1cbiAgKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSBQbGF5ZXIudmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSBseXJpY3MgYXBpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAjc3RyZWFtSW50ZXJjZXB0b3I6IFBsYXllclN0cmVhbUludGVyY2VwdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAqIEBwYXJhbSB7UGxheWVySW5pdE9wdGlvbnN9IFtvcHRpb25zXSBUaGUgcGxheWVyIGluaXQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoW1BsYXllckV2ZW50LkVycm9yXSk7XG5cbiAgICBpZiAob3B0aW9ucy5mZm1wZWdQYXRoKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aCAhPT0gJ3N0cmluZycpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgdHlwZSBcInN0cmluZ1wiIGZvciBvcHRpb25zLmZmbXBlZ1BhdGguIEdvdCAke3R5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGh9IGluc3RlYWRgXG4gICAgICApO1xuXG4gICAgICBwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCA9IG9wdGlvbnMuZmZtcGVnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NvbXBhdE1vZGUgPSBpc0NsaWVudFByb3h5KGNsaWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZCBjbGllbnRcbiAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAqL1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudCkpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICBgQ2xpZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBkaXNjb3JkLmpzQCR7ZGpzVmVyc2lvbn0gY2xpZW50LCBzb21lIHRoaW5ncyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGNvcnJ1cHQgZGVwZW5kZW5jaWVzIG9yIGhhdmluZyBtdWx0aXBsZSBpbnN0YWxsYXRpb25zIG9mIGRpc2NvcmQuanMuYCxcbiAgICAgICAgICAgICdJbnZhbGlkQ2xpZW50SW5zdGFuY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGliZiA9XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyBpbnN0YW5jZW9mIEludGVudHNCaXRGaWVsZCA/XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyA6XG4gICAgICAgIG5ldyBJbnRlbnRzQml0RmllbGQodGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzKTtcblxuICAgICAgICBpZiAoIWliZi5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsXG4gICAgICAgICAgICAnSW52YWxpZEludGVudHNCaXRGaWVsZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcblxuICAgICAgICAvLyBub29wXG4gICAgICB9fVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICBxdWVyeUNhY2hlOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID9cbiAgICAgIG51bGwgOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgc2tpcEZGbXBlZzogdHJ1ZSxcbiAgICAgIHByb2JlVGltZW91dDogNTAwMCxcbiAgICAgIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0OiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gc2F0aXNmaWVzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgIHRoaXMuY2xpZW50LmluY3JlbWVudE1heExpc3RlbmVycygpO1xuICAgICAgdGhpcy5jbGllbnQub24oRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgICAgdGhpcy5jbGllbnQuX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5KHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIGF0dGFjaCB2b2ljZSBzdGF0ZSB1cGRhdGUgcHJveHksIHZvaWNlIHN0YXRlIGhhbmRsZXIgd2lsbCBub3Qgd29yayBwcm9wZXJseScsXG4gICAgICAgICAgJ0NvbXBhdE1vZGVFcnJvcidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgdHlwZW9mIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID09PSAnbnVtYmVyJyAmJlxuICAgIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMClcbiAgICB7XG4gICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jbGFzdExhdGVuY3kgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICBgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgIHJldHVybiBpc0NsaWVudFByb3h5KHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChcbiAgICAgIEd1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgcXVldWUsXG4gICAgICBvbGRTdGF0ZSxcbiAgICAgIG5ld1N0YXRlXG4gICAgKTtcbiAgICAvLyBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIHJldHVybiBhc3N1bWluZyB0aGUgbGlzdGVuZXIgaW1wbGVtZW50ZWQgYWxsIG9mIHRoZSBsb2dpYyBiZWxvd1xuICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlKHRoaXMsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gcGFzc2luZyB2b2ljZSBzdGF0ZSB1cGRhdGUgZGF0YSB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdm9pY2Ugc3RhdGUgaGFuZGxlclxuICAgKlxuICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAqICAgLy8gdGhpcyBpcyBkZWZpbml0ZWx5IGEgcm9ja2V0IHNjaWVuY2UsIHJpZ2h0IGhlcmVcbiAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB2b2ljZSBzdGF0ZSBoYW5kbGVyIGlzIGxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgdHJhY2sgb3Igc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBxdWV1ZSBtYW5hZ2VtZW50LCBqdXN0IHVzZSB0aGlzIG1ldGhvZCBcdUQ4M0RcdURFMDRcbiAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAqIH0gY2F0Y2goZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gPSB7fSlcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgICdWb2ljZUJhc2VkQ2hhbm5lbCcsXG4gICAgICAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWBcbiAgICApO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPVxuICAgIHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0ID8gcXVlcnkgOiBhd2FpdCB0aGlzLnNlYXJjaChxdWVyeSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICBgTm8gcmVzdWx0cyBmb3VuZCBmb3IgXCIke3F1ZXJ5fVwiIChFeHRyYWN0b3I6ICR7XG4gICAgICAgIHJlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuY3JlYXRlKHZjLmd1aWxkLCBvcHRpb25zLm5vZGVPcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gQWNxdWlyaW5nIGFuIGVudHJ5Li4uYCk7XG4gICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFxdWV1ZS5jaGFubmVsKSBhd2FpdCBxdWV1ZS5jb25uZWN0KHZjLCBvcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgaWYgKCFyZXN1bHQucGxheWxpc3QpIHtcbiAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSlcbiAgICAgIGF3YWl0IHF1ZXVlLm5vZGUucGxheShudWxsLCBvcHRpb25zLmF1ZGlvUGxheWVyT3B0aW9ucyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRyYWNrc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2goXG4gIHNlYXJjaFF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSlcbiAgOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgQXVkaW9SZXNvdXJjZSkge1xuICAgICAgc2VhcmNoUXVlcnkgPSB0aGlzLmNyZWF0ZVRyYWNrRnJvbUF1ZGlvUmVzb3VyY2Uoc2VhcmNoUXVlcnkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RlZEJ5ICE9IG51bGwpXG4gICAgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuXG4gICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgIHRyYWNrczogW3NlYXJjaFF1ZXJ5XSxcbiAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBzZWFyY2hRdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnksXG4gICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkudHJhY2tzWzBdPy5leHRyYWN0b3IsXG4gICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHNlYXJjaFF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbCxcbiAgICAgIHByb3RvY29sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUTztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YFxuICAgICk7XG5cbiAgICBpZiAoL15cXHcrOi8udGVzdChzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IFtwcm90b2NvbE5hbWUsIC4uLnF1ZXJ5XSA9IHNlYXJjaFF1ZXJ5LnNwbGl0KCc6Jyk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKFxuICAgICAgICAoZSkgPT5cbiAgICAgICAgIXRoaXMuZXh0cmFjdG9ycy5pc0Rpc2FibGVkKGUuaWRlbnRpZmllcikgJiZcbiAgICAgICAgZS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2xOYW1lKVxuICAgICAgKTtcblxuICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gaXMgc3VwcG9ydGVkIGJ5ICR7bWF0Y2hpbmdFeHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIWBcbiAgICAgICAgKTtcbiAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gP1xuICAgIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6XG4gICAgeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgIGV4dHJhY3RvciAmJiBwcm90b2NvbCA/XG4gICAgICAnIGJ1dCBtaWdodCBub3QgYmUgdXNlZCBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIHByb3RvY29sJyA6XG4gICAgICAnJ31gXG5cbiAgICApO1xuXG4gICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICB9KSk/LlxuICAgICAgZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYFxuICAgICk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yLlxuICAgIGhhbmRsZShxdWVyeSwge1xuICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgIHByb3RvY29sXG4gICAgfSkuXG4gICAgY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgJ0ZhaWxlZCB0byBmaW5kIHJlc3VsdCB1c2luZyBhcHByb3ByaWF0ZSBleHRyYWN0b3IuIFF1ZXJ5aW5nIGFsbCBleHRyYWN0b3JzLi4uJ1xuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJiAoXG4gICAgICBhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgZXh0LmhhbmRsZShxdWVyeSwge1xuICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgcHJvdG9jb2xcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtcbiAgICAgICAgcmVzdWx0Py5leHRyYWN0b3IuaWRlbnRpZmllciB8fCAnTi9BJ30gZXh0cmFjdG9yLmBcblxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAqIGBgYFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICBjb25zdCBydW50aW1lID1cbiAgICAnQnVuJyBpbiBnbG9iYWxUaGlzID8gJ0J1bicgOiAnRGVubycgaW4gZ2xvYmFsVGhpcyA/ICdEZW5vJyA6ICdOb2RlJztcbiAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICdEaXNjb3JkIFBsYXllcicsXG4gICAgbGluZSxcbiAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn0ke1xuICAgIHRoaXMuaXNDb21wYXRNb2RlKCkgP1xuICAgIGAgKCR7Z2V0Q29tcGF0TmFtZSh0aGlzLmNsaWVudCl9IGNvbXBhdGliaWxpdHkgbW9kZSlgIDpcbiAgICAnJ31gLFxuXG4gICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAoKCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgcmV0dXJuIFtcbiAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsXG4gICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uXG4gICAgICBqb2luKCdcXG4nKTtcbiAgICB9KSgpLFxuICAgICdcXG4nLFxuICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgIGxpbmUsXG4gICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICB9KS5cbiAgICBqb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAnXFxuXFxuZGlzY29yZC12b2lwJyxcbiAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCldO1xuXG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFjayBmcm9tIGFuIGF1ZGlvIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gKHJlc291cmNlLm1ldGFkYXRhIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZWYgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtYXliZVRpdGxlID1cbiAgICAndGl0bGUnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGl0bGV9YCA6IGBUcmFjayAke3JlZn1gO1xuICAgIGNvbnN0IG1heWJlQXV0aG9yID1cbiAgICAnYXV0aG9yJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmF1dGhvcn1gIDogJ1Vua25vd24gYXV0aG9yJztcbiAgICBjb25zdCBtYXliZUR1cmF0aW9uID1cbiAgICAnZHVyYXRpb24nIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuZHVyYXRpb259YCA6ICcwMDowMCc7XG4gICAgY29uc3QgbWF5YmVUaHVtYm5haWwgPVxuICAgICd0aHVtYm5haWwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGh1bWJuYWlsfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWF5YmVVUkwgPVxuICAgICd1cmwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudXJsfWAgOiBgZGlzY29yZC1wbGF5ZXI6Ly9ibG9iLyR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9XG4gICAgJ2Rlc2NyaXB0aW9uJyBpbiBtZXRhZGF0YSA/XG4gICAgYCR7bWV0YWRhdGEuZGVzY3JpcHRpb259YCA6XG4gICAgJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nO1xuICAgIGNvbnN0IG1heWJlVmlld3MgPSAndmlld3MnIGluIG1ldGFkYXRhID8gTnVtYmVyKG1ldGFkYXRhLnZpZXdzKSB8fCAwIDogMDtcblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHtcbiAgICAgIHRpdGxlOiBtYXliZVRpdGxlLFxuICAgICAgYXV0aG9yOiBtYXliZUF1dGhvcixcbiAgICAgIGR1cmF0aW9uOiBtYXliZUR1cmF0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBtYXliZVRodW1ibmFpbCxcbiAgICAgIHVybDogbWF5YmVVUkwsXG4gICAgICBkZXNjcmlwdGlvbjogbWF5YmVEZXNjcmlwdGlvbixcbiAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsXG4gICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHZpZXdzOiBtYXliZVZpZXdzXG4gICAgfSk7XG5cbiAgICByZXNvdXJjZS5tZXRhZGF0YSA9IHRyYWNrO1xuXG4gICAgdHJhY2suc2V0UmVzb3VyY2UocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW50ZXJjZXB0aW5nIHN0cmVhbXNcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIHRvIGludGVyY2VwdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZUludGVyY2VwdGluZ1N0cmVhbShcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIHRyYWNrOiBUcmFjayxcbiAgZm9ybWF0OiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICB7XG4gICAgaWYgKCF0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yLmhhbmRsZShxdWV1ZSwgdHJhY2ssIGZvcm1hdCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ2xvYmFsIHN0cmVhbSBpbnRlcmNlcHRvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW1JbnRlcmNlcHRvcihvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgICB9XG5cbiAgICB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvciA9IG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgfVxufSIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcblxuZnVuY3Rpb24gaGFuZGxlRW1wdHlDaGFubmVsKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbmd1aWxkSWQ6IHN0cmluZylcbntcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpIHx8ICFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSlcbiAgICByZXR1cm47XG4gICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtndWlsZElkfWAsIHRpbWVvdXQpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVDaGFubmVsUG9wdWxhdGUoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke2d1aWxkSWR9YCk7XG4gICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVQYXVzZU9uRW1wdHkocXVldWU6IEd1aWxkUXVldWUpIHtcbiAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgY29uc3Qgd2FzUGF1c2VkT25FbXB0eSA9IFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5Jyk7XG5cbiAgaWYgKGlzRW1wdHkgJiYgIXdhc1BhdXNlZE9uRW1wdHkpIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCBwYXVzaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWlzRW1wdHkgJiYgd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIGZhbHNlKTtcbiAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgIHF1ZXVlLmRlYnVnKFxuICAgICAgICAnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxub2xkU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbntcbiAgaWYgKFxuICBuZXdTdGF0ZS5zZXJ2ZXJNdXRlICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc2VydmVyTXV0ZSAhPT0gbmV3U3RhdGUuc2VydmVyTXV0ZSlcbiAge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnNlcnZlck11dGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChcbiAgbmV3U3RhdGUuY2hhbm5lbD8udHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlICYmXG4gIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcihcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoIXF1ZXVlPy5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgY29uc3QgaXNCb3RTdGF0ZSA9IG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkO1xuICBjb25zdCBndWlsZElkID0gb2xkU3RhdGUuZ3VpbGQuaWQ7XG5cbiAgLy8gQm90IGRpc2Nvbm5lY3RlZFxuICBpZiAoaXNCb3RTdGF0ZSAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgJiYgIW5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIHRyeSB7XG4gICAgICBxdWV1ZS5kZWxldGUoKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgfVxuXG4gIGlmIChxdWV1ZS5vcHRpb25zLnBhdXNlT25FbXB0eSkge1xuICAgIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZSk7XG4gIH1cblxuICAvLyBCb3Qgam9pbmVkIGNoYW5uZWwgb3IgY2hhbmdlZCBzdGF0ZVxuICBpZiAoXG4gIGlzQm90U3RhdGUgJiZcbiAgbmV3U3RhdGUuY2hhbm5lbElkICYmIChcbiAgIW9sZFN0YXRlLmNoYW5uZWxJZCB8fCBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkpXG4gIHtcbiAgICBpZiAocXVldWUuY29ubmVjdGlvbikgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgIGhhbmRsZUJvdFZvaWNlU3RhdGVVcGRhdGUocXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyBIYW5kbGUgY2hhbm5lbCBlbXB0eS9wb3B1bGF0ZSBldmVudHNcbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBoYW5kbGVDaGFubmVsUG9wdWxhdGUocGxheWVyLCBxdWV1ZSwgZ3VpbGRJZCk7XG4gIH0gZWxzZSBpZiAob2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAoXG4gICAgbmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkICYmXG4gICAgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKVxuXG4gICAgcmV0dXJuO1xuICAgIGlmICghcXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke2d1aWxkSWR9YCkpIHtcbiAgICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gIGNvcmU6IHtcbiAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgJ2Rpc2NvcmQtdm9pcCc6IHN0cmluZztcbiAgfTtcbiAgbGlib3B1czoge1xuICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BkaXNjb3JkanMvb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ25vZGUtb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICB9O1xuICBsaWJzb2RpdW06IHtcbiAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIHNvZGl1bTogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGZmbXBlZzogRkZtcGVnUmVwb3J0O1xufVxuXG5leHBvcnQgdHlwZSBGRm1wZWdSZXBvcnQgPSBSZWNvcmQ8XG4gIEZGbXBlZ0xpYixcbiAgTWF5YmVOdWxsPHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaGFzTGlib3B1czogYm9vbGVhbjtcbiAgfT4+O1xuXG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBhIHBhY2thZ2UuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICogQHBhcmFtIGRlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGZpbmRQYWNrYWdlSlNPTihcbiAgZGlyOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGRlcHRoOiBudW1iZXIpXG4gIDogUGFja2FnZUpTT04gfCBudWxsIHtcbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcblxuICAgIGNvbnN0IG5leHQgPSAoKSA9PlxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgcmVzb2x2ZShkaXIsICcuLicpLFxuICAgICAgcGFja2FnZU5hbWUsXG4gICAgICBkZXB0aCAtIDFcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICBjb25zdCBwa2dKU09OOiBQYWNrYWdlSlNPTiA9IHJlcXVpcmUodGFyZ2V0KTtcblxuICAgICAgaWYgKHBrZ0pTT04ubmFtZSAhPT0gcGFja2FnZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBrZ0pTT047XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFRyaWVzIHRvIGZpbmQgdGhlIHZlcnNpb24gb2YgYSBkZXBlbmRlbmN5LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwYWNrYWdlIHRvIGZpbmQgdGhlIHZlcnNpb24gb2ZcbiAgICogQHBhcmFtIG1heExvb2t1cERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoIGZvciB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHJldHVybnMgVGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICB2ZXJzaW9uKG5hbWU6IHN0cmluZywgbWF4TG9va3VwRGVwdGggPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuYW1lID09PSAnZGlzY29yZC1wbGF5ZXInKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2cgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihcbiAgICAgICAgZGlybmFtZShyZXF1aXJlLnJlc29sdmUobmFtZSkpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBtYXhMb29rdXBEZXB0aFxuICAgICAgKTtcbiAgICAgIHJldHVybiBwa2c/LnZlcnNpb24gPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGRpc2NvcmQtcGxheWVyIG1vZHVsZS5cbiAgICogQHJldHVybnMgVGhlIHJlcG9ydCBvYmplY3RcbiAgICovXG4gIGdlbmVyYXRlKCk6IERlcGVuZGVuY2llc1JlcG9ydCB7XG4gICAgY29uc3QgZmZtcGVnUmVwb3J0ID0ge30gYXMgRkZtcGVnUmVwb3J0O1xuXG4gICAgZm9yIChjb25zdCBsaWIgb2YgRkZtcGVnLnNvdXJjZXMpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtsaWIubmFtZV0gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZmbXBlZyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuXG4gICAgaWYgKGZmbXBlZykge1xuICAgICAgZmZtcGVnUmVwb3J0W2ZmbXBlZy5uYW1lXSA9IHtcbiAgICAgICAgaGFzTGlib3B1czogZmZtcGVnLmNvbW1hbmQuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKSxcbiAgICAgICAgdmVyc2lvbjogZmZtcGVnLnZlcnNpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcmU6IHtcbiAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdkaXNjb3JkLXBsYXllcidcbiAgICAgICAgKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtdm9pcCdcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgIH0sXG4gICAgICBsaWJvcHVzOiB7XG4gICAgICAgIG1lZGlhcGxleDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdtZWRpYXBsZXgnKSxcbiAgICAgICAgJ0BkaXNjb3JkanMvb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQGRpc2NvcmRqcy9vcHVzJyksXG4gICAgICAgICdAZXZhbi9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZXZhbi9vcHVzJyksXG4gICAgICAgIG9wdXNzY3JpcHQ6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignb3B1c3NjcmlwdCcpLFxuICAgICAgICAnbm9kZS1vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdub2RlLW9wdXMnKVxuICAgICAgfSxcbiAgICAgIGxpYnNvZGl1bToge1xuICAgICAgICAnc29kaXVtLW5hdGl2ZSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLW5hdGl2ZScpLFxuICAgICAgICBzb2RpdW06IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtJyksXG4gICAgICAgICdsaWJzb2RpdW0td3JhcHBlcnMnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2xpYnNvZGl1bS13cmFwcGVycycpLFxuICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSdcbiAgICAgICAgKSxcbiAgICAgICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzpcbiAgICAgICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tamF2YXNjcmlwdCcpLFxuICAgICAgICAnQG5vYmVsL2NpcGhlcnMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0Bub2JlbC9jaXBoZXJzJylcbiAgICAgIH0sXG4gICAgICBmZm1wZWc6IGZmbXBlZ1JlcG9ydFxuICAgIH07XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcGVuZGVuY2llcyByZXBvcnQuXG4gICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGdlbmVyYXRlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVwb3J0ID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcblxuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAgIG91dHB1dC5wdXNoKCdEZXBlbmRlbmNpZXMgUmVwb3J0Jyk7XG4gICAgb3V0cHV0LnB1c2gobGluZSk7XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVwb3J0KSBhcyAoa2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0KVtdO1xuXG4gICAgZm9yIChjb25zdCBfa2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IF9rZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0O1xuXG4gICAgICBvdXRwdXQucHVzaChrZXkpO1xuXG4gICAgICBjb25zdCBzdWJLZXlzID0gT2JqZWN0LmtleXMocmVwb3J0W2tleV0pO1xuXG4gICAgICBmb3IgKGNvbnN0IF9zdWJLZXkgb2Ygc3ViS2V5cykge1xuICAgICAgICBjb25zdCBzdWJLZXkgPSBfc3ViS2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydFt0eXBlb2Yga2V5XTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXBvcnRba2V5XVtzdWJLZXldID8/ICdOL0EnO1xuXG4gICAgICAgIG91dHB1dC5wdXNoKFxuICAgICAgICAgIGAtICR7c3ViS2V5fTogJHtcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpIDogdmFsdWV9YFxuXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cbn07IiwgIlxuXG5cblxuXG5cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gLyogQF9fTUFDUk9fXyBnZXRWZXJzaW9uICovXCI3LjIuMC1kZXYuMFwiOyIsICJpbXBvcnQgeyBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcblxudHlwZSBBd2FpdGFibGU8VD4gPSBUIHwgUHJvbWlzZUxpa2U8VD47XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbiA9IDxUID0gYW55PihcbnF1ZXVlOiBHdWlsZFF1ZXVlPFQ+LFxudHJhY2s6IFRyYWNrLFxuZm9ybWF0OiBTdHJlYW1UeXBlLFxuc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbj0+IEF3YWl0YWJsZTxib29sZWFuPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgYmUgaW50ZXJjZXB0ZWQuXG4gICAqL1xuICBzaG91bGRJbnRlcmNlcHQ/OiBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllclN0cmVhbUludGVyY2VwdG9yIHtcbiAgI29uU3RyZWFtID0gbmV3IFNldDxPbkludGVyY2VwdGVkU3RyZWFtSGFuZGxlcj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBpbnRlcmNlcHRvciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpXG4gIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGludGVyY2VwdGVkIHN0cmVhbS5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBndWlsZCBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGludGVyY2VwdGVkIHN0cmVhbVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzdHJlYW0gd2FzIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlPFQgPSB1bmtub3duPihcbiAgcXVldWU6IEd1aWxkUXVldWU8VD4sXG4gIHRyYWNrOiBUcmFjayxcbiAgdHlwZTogU3RyZWFtVHlwZSxcbiAgc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuc2hvdWxkSW50ZXJjZXB0O1xuXG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlsdGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKTtcbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTGlzdGVuZXJzID0gdGhpcy4jb25TdHJlYW0uc2l6ZTtcblxuICAgIGlmICghaGFzTGlzdGVuZXJzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50aGlzLiNvblN0cmVhbV0ubWFwKChoYW5kbGVyKSA9PiBoYW5kbGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBpbnRlcmNlcHRlZCBzdHJlYW0gbGlzdGVuZXIuXG4gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIG9uU3RyZWFtKGhhbmRsZXI6IE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy4jb25TdHJlYW0uYWRkKGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuI29uU3RyZWFtLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDR0EsaUJBQW1EOzs7QUNINUMsSUFBTSw0QkFBNEIsT0FBTyxxQkFBcUI7QUFTOUQsU0FBUyxtQkFBbUIsUUFBYSxVQUF3QztBQUN0RixVQUFRLElBQUksUUFBUSwyQkFBMkIsUUFBUTtBQUN2RCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFOZ0I7QUFRVCxTQUFTLGNBQWMsUUFBc0I7QUFDbEQsU0FBTyxRQUFRLElBQUksUUFBUSx5QkFBeUIsS0FBSztBQUMzRDtBQUZnQjtBQUlULFNBQVMsY0FBYyxRQUFvQztBQUNoRSxTQUFPLFFBQVEsSUFBSSxRQUFRLHlCQUF5QixLQUFLO0FBQzNEO0FBRmdCO0FBSVQsU0FBUyxZQUFZLFFBQXNCO0FBQ2hELFNBQU8sY0FBYyxNQUFNLE1BQU07QUFDbkM7QUFGZ0I7QUFJVCxTQUFTLGVBQWUsUUFBc0I7QUFDbkQsU0FBTyxjQUFjLE1BQU0sTUFBTTtBQUNuQztBQUZnQjs7O0FDNUJoQixzQkFBMkI7OztBQ0QzQixxQkFNQTs7O0FDTk8sSUFBTSxzQkFBTixNQUFNLDRCQUEyQixNQUFNO0FBQUEsRUFJckMsWUFBWSxNQUFrQixTQUFpQjtBQUNwRCxVQUFNLE9BQU87QUFKZix3QkFBZ0I7QUFDaEIsd0JBQWdCLGFBQW9CLEtBQUssSUFBSTtBQUkzQyxTQUFLLE9BQU8sS0FBSyxZQUFZO0FBQzdCLFNBQUssT0FBTztBQUVaLFFBQUksTUFBTSxtQkFBbUI7QUFDM0IsWUFBTSxrQkFBa0IsTUFBTSxLQUFLLFdBQVc7QUFBQSxJQUNoRDtBQUFBLEVBQ0Y7QUFBQSxFQUVPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxNQUFNLEtBQUssWUFBWTtBQUFBLE1BQ3ZCLE1BQU0sS0FBSztBQUFBLE1BQ1gsU0FBUyxLQUFLO0FBQUEsTUFDZCxXQUFXLEtBQUs7QUFBQSxJQUNsQjtBQUFBLEVBQ0Y7QUFDRjtBQXRCOEM7QUFBdkMsSUFBTSxxQkFBTjtBQXdCQSxJQUFNLG1CQUFOLE1BQU0seUJBQXdCLG1CQUFtQjtBQUFBLEVBQ3RELFlBQVksUUFBZ0IsVUFBa0IsT0FBZTtBQUMzRDtBQUFBLE1BQ0UsV0FBVztBQUFBLE1BQ1gsNEJBQTRCLE1BQU0sY0FBYyxRQUFRLFVBQVUsS0FBSztBQUFBLElBQ3pFO0FBQUEsRUFDRjtBQUNGO0FBUHdEO0FBQWpELElBQU0sa0JBQU47QUFTQSxJQUFNLHVCQUFOLE1BQU0sNkJBQTRCLG1CQUFtQjtBQUFBLEVBQzFELFlBQVksUUFBZ0IsYUFBcUIsT0FBZTtBQUM5RDtBQUFBLE1BQ0UsV0FBVztBQUFBLE1BQ1gsWUFBWSxNQUFNLFdBQVcsV0FBVyxnQkFBZ0IsS0FBSztBQUFBLElBQy9EO0FBQUEsRUFDRjtBQUNGO0FBUDREO0FBQXJELElBQU0sc0JBQU47QUFTQSxJQUFNLGlCQUFOLE1BQU0sdUJBQXNCLG1CQUFtQjtBQUFBLEVBQ3BELFlBQVksU0FBaUI7QUFDM0IsVUFBTSxXQUFXLGVBQWUsT0FBTztBQUFBLEVBQ3pDO0FBQ0Y7QUFKc0Q7QUFBL0MsSUFBTSxnQkFBTjtBQU1BLElBQU0sdUJBQU4sTUFBTSw2QkFBNEIsbUJBQW1CO0FBQUEsRUFDMUQsWUFBWSxRQUFnQjtBQUMxQixVQUFNLFdBQVcscUJBQXFCLEdBQUcsTUFBTSx5QkFBeUI7QUFBQSxFQUMxRTtBQUNGO0FBSjREO0FBQXJELElBQU0sc0JBQU47QUFNQSxJQUFNLG9CQUFOLE1BQU0sMEJBQXlCLG1CQUFtQjtBQUFBLEVBQ3ZELFlBQVksUUFBZ0I7QUFDMUIsVUFBTSxXQUFXLGtCQUFrQixHQUFHLE1BQU0saUJBQWlCO0FBQUEsRUFDL0Q7QUFDRjtBQUp5RDtBQUFsRCxJQUFNLG1CQUFOO0FBTUEsSUFBTSxtQkFBTixNQUFNLHlCQUF3QixtQkFBbUI7QUFBQSxFQUN0RCxZQUFZLFFBQWdCLE9BQWUsU0FBaUIsU0FBaUI7QUFDM0U7QUFBQSxNQUNFLFdBQVc7QUFBQSxNQUNYLEdBQUcsTUFBTSxzQ0FBc0MsT0FBTyxnQkFBZ0IsT0FBTyxTQUFTLEtBQUs7QUFBQSxJQUM3RjtBQUFBLEVBQ0Y7QUFDRjtBQVB3RDtBQUFqRCxJQUFNLGtCQUFOO0FBU0EsSUFBTSwwQkFBTixNQUFNLGdDQUErQixtQkFBbUI7QUFBQSxFQUM3RCxZQUFZLFNBQWtCO0FBQzVCO0FBQUEsTUFDRSxXQUFXO0FBQUEsTUFDWCxXQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQVIrRDtBQUF4RCxJQUFNLHlCQUFOO0FBVUEsSUFBTSxpQ0FBTixNQUFNLHVDQUFzQyxtQkFBbUI7QUFBQSxFQUNwRSxjQUFjO0FBQ1o7QUFBQSxNQUNFLFdBQVc7QUFBQSxNQUNYO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQVBzRTtBQUEvRCxJQUFNLGdDQUFOO0FBU0EsSUFBTSx1QkFBTixNQUFNLDZCQUE0QixtQkFBbUI7QUFBQSxFQUMxRCxjQUFjO0FBQ1osVUFBTSxXQUFXLHNCQUFzQixpQ0FBaUM7QUFBQSxFQUMxRTtBQUNGO0FBSjREO0FBQXJELElBQU0sc0JBQU47QUE0QkEsSUFBTSx3QkFBTixNQUFNLDhCQUE2QixtQkFBbUI7QUFBQSxFQUMzRCxZQUFZLFNBQWtCO0FBQzVCO0FBQUEsTUFDRSxXQUFXO0FBQUEsTUFDWCxXQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFDRjtBQVA2RDtBQUF0RCxJQUFNLHVCQUFOO0FBU0EsSUFBTSxxQkFBTixNQUFNLDJCQUEwQixtQkFBbUI7QUFBQSxFQUN4RCxZQUFZLFNBQWtCO0FBQzVCLFVBQU0sV0FBVyxvQkFBb0IsV0FBVyx3QkFBd0I7QUFBQSxFQUMxRTtBQUNGO0FBSjBEO0FBQW5ELElBQU0sb0JBQU47QUFNQSxJQUFNLGdCQUFOLE1BQU0sc0JBQXFCLG1CQUFtQjtBQUFBLEVBQ25ELFlBQVksU0FBa0I7QUFDNUIsVUFBTSxXQUFXLGNBQWMsV0FBVyxrQkFBa0I7QUFBQSxFQUM5RDtBQUNGO0FBSnFEO0FBQTlDLElBQU0sZUFBTjtBQU1BLElBQU0scUJBQU4sTUFBTSwyQkFBMEIsbUJBQW1CO0FBQUEsRUFDeEQsWUFBWSxRQUFnQixRQUFnQjtBQUMxQztBQUFBLE1BQ0UsV0FBVztBQUFBLE1BQ1gsWUFBWSxNQUFNLFlBQVksTUFBTTtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUNGO0FBUDBEO0FBQW5ELElBQU0sb0JBQU47QUFTQSxJQUFNLHNCQUFOLE1BQU0sNEJBQTJCLG1CQUFtQjtBQUFBLEVBQ3pELGNBQWM7QUFDWjtBQUFBLE1BQ0UsV0FBVztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBUDJEO0FBQXBELElBQU0scUJBQU47QUFTQSxJQUFNLHdCQUFOLE1BQU0sOEJBQTZCLG1CQUFtQjtBQUFBLEVBQzNELGNBQWM7QUFDWjtBQUFBLE1BQ0UsV0FBVztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBUDZEO0FBQXRELElBQU0sdUJBQU47QUFTQSxJQUFNLDhCQUFOLE1BQU0sb0NBQW1DLG1CQUFtQjtBQUFBLEVBQ2pFLFlBQVksUUFBZ0IsU0FBa0I7QUFDNUM7QUFBQSxNQUNFLFdBQVc7QUFBQSxNQUNYLHlCQUF5QixNQUFNLFNBQVMsVUFBVSxJQUFJLE9BQU8sS0FBSyxFQUFFO0FBQUEsSUFDdEU7QUFBQSxFQUNGO0FBQ0Y7QUFQbUU7QUFBNUQsSUFBTSw2QkFBTjtBQW9CQSxJQUFNLHFCQUFOLE1BQU0sMkJBQTBCLG1CQUFtQjtBQUFBLEVBQ3hELFlBQVksSUFBbUIsT0FBZTtBQUM1QztBQUFBLE1BQ0UsV0FBVztBQUFBLE1BQ1gsR0FDQSxLQUFLLHNDQUFzQyxFQUFFLE1BQU0sRUFBRTtBQUFBLEVBQ3JELEtBQUs7QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUNGO0FBVDBEO0FBQW5ELElBQU0sb0JBQU47QUFZQSxJQUFNLGFBQWE7QUFBQSxFQUN4QixrQkFBa0I7QUFBQSxFQUNsQixzQkFBc0I7QUFBQSxFQUN0QixlQUFlO0FBQUEsRUFDZixxQkFBcUI7QUFBQSxFQUNyQixrQkFBa0I7QUFBQSxFQUNsQixrQkFBa0I7QUFBQSxFQUNsQix5QkFBeUI7QUFBQSxFQUN6QixnQ0FBZ0M7QUFBQSxFQUNoQyxzQkFBc0I7QUFBQSxFQUN0QiwyQkFBMkI7QUFBQSxFQUMzQixpQkFBaUI7QUFBQSxFQUNqQixvQkFBb0I7QUFBQSxFQUNwQix1QkFBdUI7QUFBQSxFQUN2QixvQkFBb0I7QUFBQSxFQUNwQixjQUFjO0FBQUEsRUFDZCxtQkFBbUI7QUFBQSxFQUNuQiwwQkFBMEI7QUFBQSxFQUMxQiw0QkFBNEI7QUFBQSxFQUM1Qiw2QkFBNkI7QUFBQSxFQUM3Qix5QkFBeUI7QUFBQSxFQUN6QixtQkFBbUI7QUFDckI7QUFNTyxTQUFTLHFCQUFxQixPQUF5QztBQUM1RSxTQUFPLFNBQVMsUUFBUSxpQkFBaUI7QUFDM0M7QUFGZ0I7OztBQzlOVCxJQUFNLFlBQU4sTUFBTSxVQUFTO0FBQUEsRUFDWixjQUFjO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQSxFQUdBLE9BQWMsV0FBVyxHQUEyQjtBQUNsRCxXQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3RCO0FBQUEsRUFFQSxPQUFjLFNBQVMsR0FBeUI7QUFDOUMsV0FBTyxPQUFPLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUFBLEVBQzFDO0FBQUEsRUFFQSxPQUFjLFNBQVMsR0FBeUI7QUFDOUMsV0FBTyxPQUFPLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBRUEsT0FBYyxVQUFVLEdBQTBCO0FBQ2hELFdBQU8sT0FBTyxNQUFNO0FBQUEsRUFDdEI7QUFBQSxFQUVBLE9BQWMsVUFBVSxHQUFtQztBQUN6RCxXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFQSxPQUFjLFFBQVEsR0FBNEI7QUFDaEQsV0FBTyxNQUFNLFFBQVEsQ0FBQztBQUFBLEVBQ3hCO0FBQUEsRUFFQSxPQUFjLFFBQVEsR0FBd0I7QUFDNUMsV0FBTyxhQUFhO0FBQUEsRUFDdEI7QUFBQSxFQUVBLE9BQWMscUJBQXFCLEdBQXFDO0FBQ3RFLFdBQU8scUJBQXFCLENBQUM7QUFBQSxFQUMvQjtBQUNGO0FBckNzQjtBQUFmLElBQU0sV0FBTjs7O0FDUVAsb0JBQXVCO0FBR2hCLElBQUssaUJBQUwsa0JBQUtDLG9CQUFMO0FBQ0wsRUFBQUEsZ0JBQUEsV0FBUTtBQUNSLEVBQUFBLGdCQUFBLGNBQVc7QUFGRCxTQUFBQTtBQUFBLEdBQUE7QUFPWixJQUFNLFVBQVUsd0JBQUMsU0FDakIsS0FBSyxVQUFVLHFCQURDO0FBRWhCLElBQU0sYUFBYSx3QkFBQyxTQUNwQixLQUFLLFVBQVUsMkJBREk7QUFHWixTQUFTLFVBQVUsTUFBOEI7QUFDdEQsTUFBSSxnQkFBZ0IsTUFBTyxRQUFPLEtBQUssVUFBVTtBQUNqRCxNQUFJLGdCQUFnQixTQUFVLFFBQU8sS0FBSyxVQUFVO0FBRXBELE1BQUk7QUFDRixXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3JCLFFBQVE7QUFDTixVQUFNLElBQUksbUJBQW1CO0FBQUEsRUFDL0I7QUFDRjtBQVRnQjtBQVdULFNBQVMsWUFBWSxRQUFnQixNQUFpQjtBQUMzRCxNQUFJLFFBQVEsSUFBSSxFQUFHLFFBQU8sTUFBTSxlQUFlLFFBQVEsSUFBSTtBQUMzRCxNQUFJLFdBQVcsSUFBSSxFQUFHLFFBQU8sU0FBUyxlQUFlLFFBQVEsSUFBSTtBQUVqRSxRQUFNLElBQUkscUJBQXFCO0FBQ2pDO0FBTGdCO0FBT1QsU0FBUyxPQUFPLE1BQWlCO0FBQ3RDLFFBQU0sTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUUvQixTQUFPLHFCQUFPLEtBQUssR0FBRyxFQUFFLFNBQVMsUUFBUTtBQUMzQztBQUpnQjtBQU1ULFNBQVMsT0FBTyxNQUFjO0FBQ25DLFFBQU0sTUFBTSxxQkFBTyxLQUFLLE1BQU0sUUFBUSxFQUFFLFNBQVM7QUFFakQsU0FBTyxLQUFLLE1BQU0sR0FBRztBQUN2QjtBQUpnQjtBQU1ULFNBQVMsdUJBQXVCLE1BQVc7QUFDaEQsTUFBSSxDQUFDLEtBQU0sUUFBTztBQUNsQixNQUFJO0FBQ0YsUUFBSSxTQUFTLFNBQVMsSUFBSSxFQUFHLFFBQU87QUFDcEMsV0FBTyxNQUFNLE9BQU8sTUFBTSxXQUFXLE9BQU87QUFBQSxFQUM5QyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVJnQjs7O0FIdkRoQjtBQThKTyxJQUFNLFNBQU4sTUFBTSxPQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQThCdkIsWUFDUyxRQUNoQixNQUNBO0FBRmdCO0FBOUJoQix3QkFBTztBQUNQLHdCQUFPO0FBQ1Asd0JBQU87QUFDUCx3QkFBTztBQUNQLHdCQUFPO0FBQ1Asd0JBQU87QUFDUCx3QkFBTztBQUNQLHdCQUFPLGVBQTJCO0FBQ2xDLHdCQUFPO0FBQ1Asd0JBQU8sYUFBZ0Q7QUFFdkQ7QUFBQSx3QkFBTztBQUNQLHdCQUFPLGFBQWtDO0FBQ3pDLHdCQUFnQixNQUFLLDZCQUFjLFNBQVMsRUFBRSxTQUFTO0FBQ3ZELHdCQUFRLGNBQXVCO0FBQy9CLHdCQUFRO0FBQ1Isd0JBQU87QUFDUCx3QkFBTyxRQUFnQjtBQUN2Qix3QkFBTyxvQkFBeUM7QUFDaEQsd0JBQU8sZ0JBQTZCO0FBRXBDLGdDQUF3RDtBQUN4RCxrQ0FBeUM7QUFXdkMsU0FBSyxZQUFRLCtCQUFlLEtBQUssU0FBUyxFQUFFO0FBQzVDLFNBQUssU0FBUyxLQUFLLFVBQVU7QUFDN0IsU0FBSyxNQUFNLEtBQUssT0FBTztBQUN2QixTQUFLLFlBQVksS0FBSyxhQUFhO0FBQ25DLFNBQUssV0FBVyxLQUFLLFlBQVk7QUFDakMsU0FBSyxRQUFRLEtBQUssU0FBUztBQUMzQixTQUFLLFlBQVksS0FBSztBQUN0QixTQUFLLGNBQWMsS0FBSyxlQUFlO0FBQ3ZDLFNBQUssV0FBVyxLQUFLO0FBQ3JCLFNBQUssY0FBYyxHQUFHLEtBQUssS0FBSyxPQUFPLEtBQUssTUFBTTtBQUNsRCxTQUFLLE1BQU0sT0FBTztBQUFBLE1BQ2hCLENBQUM7QUFBQSxNQUNELEVBQUUsUUFBUSxLQUFLLEtBQUssVUFBVSxLQUFLLE9BQU87QUFBQSxNQUMxQyxLQUFLLE9BQU87QUFBQSxJQUNkO0FBQ0EsU0FBSyxhQUFhLEtBQUssWUFBWTtBQUNuQyxTQUFLLGtCQUNMLEtBQUssb0JBQW9CLE1BQU0sUUFBUSxRQUFrQixJQUFJO0FBQzdELFNBQUssYUFDTCxLQUFLLGNBQWMsS0FBSyxXQUFXLEtBQUssT0FBTyxLQUFLLE1BQU07QUFDMUQsU0FBSyxPQUFPLEtBQUssUUFBUTtBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFdBQVc7QUFDcEIsV0FBTyxtQkFBSyxhQUFZO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sV0FBVyxJQUF5QztBQUN6RCx1QkFBSyxTQUFVO0FBQUEsRUFDakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxLQUFLLE9BQWtCO0FBQ2xDLFFBQUksbUJBQUssU0FBUyxRQUFPLG1CQUFLLFNBQUwsV0FBYTtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFlBQVksVUFBdUM7QUFDeEQsdUJBQUssV0FBWTtBQUFBLEVBQ25CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFdBQVc7QUFDcEIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsY0FBYztBQUN2QixXQUFPLG1CQUFLLGNBQWE7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYSxrQkFBa0I7QUFDN0IsVUFBTSxNQUFNLE1BQU0sS0FBSyxnQkFBZ0I7QUFFdkMsU0FBSyxZQUFZLEdBQUc7QUFFcEIsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFlBQVksR0FBYTtBQUM5QixTQUFLLGFBQWE7QUFBQSxFQUNwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxXQUFXO0FBQ3BCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsY0FBYztBQUN2QixXQUFPLEtBQUssWUFBWTtBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFFBQW9CO0FBQzdCLFdBQU8sS0FBSyxPQUFPLE1BQU0sTUFBTTtBQUFBLE1BQUssQ0FBQyxNQUNyQyxFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLEtBQUssRUFBRTtBQUFBLElBQ3ZDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxhQUFxQjtBQUM5QixVQUFNLFFBQVEsd0JBQUMsR0FBVyxNQUFjO0FBQ3RDLFVBQUksS0FBSztBQUNULGVBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFLLE9BQU07QUFDbEMsYUFBTyxLQUFLLElBQUksTUFBTyxLQUFLO0FBQUEsSUFDOUIsR0FKYztBQU1kLFdBQU8sS0FBSyxTQUNaLE1BQU0sR0FBRyxFQUNULFFBQVEsRUFDUixJQUFJLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFDeEMsT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxjQUFtRTtBQUN4RSxXQUFPLElBQUksS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNsQixXQUFPLEtBQUssS0FBSyxVQUFVO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQW1CO0FBQ3hCLFdBQU8sR0FBRyxLQUFLLEtBQUssT0FBTyxLQUFLLE1BQU07QUFBQSxFQUN4QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sT0FBTyxjQUF3QjtBQUNwQyxXQUFPO0FBQUEsTUFDTCxJQUFJLEtBQUs7QUFBQSxNQUNULE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsUUFBUSxLQUFLO0FBQUEsTUFDYixLQUFLLEtBQUs7QUFBQSxNQUNWLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFVBQVUsS0FBSztBQUFBLE1BQ2YsWUFBWSxLQUFLO0FBQUEsTUFDakIsT0FBTyxLQUFLO0FBQUEsTUFDWixhQUFhLEtBQUssYUFBYSxNQUFNO0FBQUEsTUFDckMsVUFBVSxlQUFlLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSztBQUFBLElBQzdEO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWTtBQUNqQixXQUFPO0FBQUEsTUFDTCxPQUFPLEtBQUs7QUFBQSxNQUNaLGFBQWEsS0FBSztBQUFBLE1BQ2xCLFFBQVEsS0FBSztBQUFBLE1BQ2IsS0FBSyxLQUFLO0FBQUEsTUFDVixXQUFXLFNBQVMsU0FBUyxLQUFLLFNBQVMsSUFDM0MsS0FBSyxZQUNMLHVCQUF1QixLQUFLLFNBQVM7QUFBQSxNQUNyQyxVQUFVLEtBQUs7QUFBQSxNQUNmLE9BQU8sS0FBSyxTQUFTO0FBQUEsTUFDckIsY0FBYyxLQUFLLGFBQWEsT0FBTyxLQUFLO0FBQUEsTUFDNUMsUUFBUSxLQUFLO0FBQUEsTUFDYixNQUFNO0FBQUEsTUFDTixZQUFZLEtBQUs7QUFBQSxNQUNqQixXQUFXLEtBQUssV0FBVyxjQUFjO0FBQUEsTUFDekMsVUFBVSxLQUFLO0FBQUEsTUFDZjtBQUFBLE1BQ0Esa0JBQWtCLEtBQUssT0FBTztBQUFBLElBQ2hDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQWMsZUFDZCxRQUNBLE1BQ0E7QUFDRSxRQUFJLEtBQUs7QUFDVCxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQ0EsVUFBTSxRQUFRLElBQUksT0FBTSxRQUFRO0FBQUEsTUFDOUIsR0FBRztBQUFBLE1BQ0gsYUFBYSxLQUFLLGdCQUNqQixNQUFNO0FBQ0wsY0FBTSxNQUFNLEtBQUs7QUFDakIsWUFBSTtBQUNGLGdCQUFNLFdBQVcsT0FBTyxPQUFPLE1BQU0sUUFBUSxJQUFJLEVBQUU7QUFDbkQsY0FBSSxTQUFVLFFBQU87QUFDckIsY0FBSSxPQUFPLE9BQU8sTUFBTSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3hDLG1CQUFPLE9BQU8sT0FBTyxNQUFNLE1BQU0sSUFBSSxJQUFJLEVBQUU7QUFFM0MsZ0JBQU0sT0FBTyxJQUFJLG9CQUFLLE9BQU8sUUFBUSxHQUFHO0FBQ3hDLGlCQUFPO0FBQUEsUUFDVCxRQUFRO0FBQ04saUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRixHQUFHLElBQ0g7QUFBQSxNQUNBLFdBQVcsS0FBSyxjQUFjO0FBQUEsSUFDaEMsQ0FBQztBQUVELFVBQU0sWUFBWSxLQUFLLFFBQVE7QUFFL0IsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLHFCQUFxQjtBQUMxQixVQUFNLFFBQVEsS0FBSyxPQUFPLE1BQU0sTUFBTTtBQUFBLE1BQU8sQ0FBQyxTQUM5QyxLQUFLLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEtBQUssRUFBRTtBQUFBLElBQ3hDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLEtBQ2IsU0FDQSxTQUM2QztBQUMzQyxVQUFNLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSyxLQUFLLE1BQU07QUFFNUMsV0FBTyxNQUFNLEdBQUcsU0FBUyxNQUFNLE9BQU87QUFBQSxFQUN4QztBQUNGO0FBNVFFO0FBQ0E7QUF2QjhCO0FBQXpCLElBQU0sUUFBTjs7O0FJNUNBLElBQU0sWUFBTixNQUFNLFVBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXFCcEIsWUFBWSxRQUFnQixNQUF3QjtBQXBCcEQsd0JBQWdCO0FBQ2hCLHdCQUFPO0FBQ1Asd0JBQU87QUFDUCx3QkFBTztBQUNQLHdCQUFPO0FBQ1Asd0JBQU87QUFDUCx3QkFBTztBQUNQLHdCQUFPO0FBSVAsd0JBQU87QUFDUCx3QkFBTztBQUNQLHdCQUFnQjtBQWNkLFNBQUssU0FBUztBQU9kLFNBQUssU0FBUyxLQUFLLFVBQVUsQ0FBQztBQU85QixTQUFLLFNBQVMsS0FBSztBQU9uQixTQUFLLGNBQWMsS0FBSztBQU94QixTQUFLLFlBQVksS0FBSztBQVN0QixTQUFLLE9BQU8sS0FBSztBQVdqQixTQUFLLFNBQVMsS0FBSztBQU9uQixTQUFLLEtBQUssS0FBSztBQU9mLFNBQUssTUFBTSxLQUFLO0FBTWhCLFNBQUssUUFBUSxLQUFLO0FBQUEsRUFPcEI7QUFBQSxFQUVBLEVBQUUsT0FBTyxRQUFRLElBQUk7QUFDbkIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxvQkFBb0I7QUFDN0IsV0FBTyxLQUFLLE9BQU8sT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEVBQUUsWUFBWSxDQUFDO0FBQUEsRUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzdCLFdBQU8sS0FBSyxjQUFjLEtBQUssUUFBUSxLQUFLLGlCQUFpQixDQUFDO0FBQUEsRUFDaEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFPLGFBQWEsTUFBTTtBQUN4QixVQUFNLFVBQVU7QUFBQSxNQUNkLElBQUksS0FBSztBQUFBLE1BQ1QsS0FBSyxLQUFLO0FBQUEsTUFDVixPQUFPLEtBQUs7QUFBQSxNQUNaLGFBQWEsS0FBSztBQUFBLE1BQ2xCLFdBQVcsS0FBSztBQUFBLE1BQ2hCLE1BQU0sS0FBSztBQUFBLE1BQ1gsUUFBUSxLQUFLO0FBQUEsTUFDYixRQUFRLEtBQUs7QUFBQSxNQUNiLFFBQVEsQ0FBQztBQUFBLElBQ1g7QUFFQSxRQUFJLFdBQVksU0FBUSxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBRXRFLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2pCLFdBQU87QUFBQSxNQUNMLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0FBQUEsTUFDNUMsT0FBTyxLQUFLO0FBQUEsTUFDWixhQUFhLEtBQUs7QUFBQSxNQUNsQixXQUFXLFNBQVMsU0FBUyxLQUFLLFNBQVMsSUFDM0MsS0FBSyxZQUNMLHVCQUF1QixLQUFLLFNBQVM7QUFBQSxNQUNyQyxNQUFNLEtBQUs7QUFBQSxNQUNYLFFBQVEsS0FBSztBQUFBLE1BQ2IsUUFBUSxLQUFLO0FBQUEsTUFDYixJQUFJLEtBQUs7QUFBQSxNQUNULEtBQUssS0FBSztBQUFBLE1BQ1Y7QUFBQSxNQUNBLGtCQUFrQixLQUFLLE9BQU87QUFBQSxJQUNoQztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLGVBQWUsUUFBZ0IsTUFBMEI7QUFDckUsUUFBSSxLQUFLO0FBQ1QsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUNBLFdBQU8sSUFBSSxVQUFTLFFBQVE7QUFBQSxNQUMxQixHQUFHO0FBQUEsTUFDSCxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxNQUFNLGVBQWUsUUFBUSxDQUFDLENBQUM7QUFBQSxJQUNoRSxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsS0FDYixTQUNBLFNBQzZDO0FBQzNDLFVBQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLEtBQUssTUFBTTtBQUU1QyxXQUFPLE1BQU0sR0FBRyxTQUFTLE1BQU0sT0FBTztBQUFBLEVBQ3hDO0FBQ0Y7QUF0TXNCO0FBQWYsSUFBTSxXQUFOOzs7QUNoSFAsb0JBQXNCO0FBR3RCLElBQU0sbUJBQ047QUFDQSxJQUFNLHVCQUNOO0FBQ0EsSUFBTSxvQkFDTjtBQUNBLElBQU0sYUFDTjtBQUNBLElBQU0sb0JBQ047QUFDQSxJQUFNLGtCQUFrQjtBQUN4QixJQUFNLHNCQUNOO0FBQ0EsSUFBTSwwQkFDTjtBQUNBLElBQU0sdUJBQ047QUFDQSxJQUFNLHVCQUNOO0FBQ0EsSUFBTSwwQkFDTjtBQUNBLElBQU0sdUJBQ047QUFDQSxJQUFNLHVCQUNOO0FBQ0EsSUFBTSxzQkFBc0I7QUFFNUIsSUFBTSx5QkFBeUI7QUFHL0IsSUFBTSxhQUFhO0FBQUEsRUFDakIsZUFBZSxDQUFDLGdCQUFnQjtBQUFBLEVBQ2hDLFNBQVM7QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUFlO0FBQUEsRUFFZixTQUFTLENBQUMsb0JBQW9CLG1CQUFtQjtBQUFBLEVBQ2pELE9BQU8sQ0FBQyxhQUFhLGtCQUFrQjtBQUFBLEVBQ3ZDLGNBQWMsQ0FBQyxrQkFBa0I7QUFBQSxFQUNqQyxZQUFZLENBQUMsZ0JBQWdCO0FBQUEsRUFDN0IsWUFBWSxDQUFDLGlCQUFpQjtBQUNoQztBQUdBLElBQU0sa0JBQWtCLG9CQUFJO0FBQUEsRUFBSTtBQUFBLElBQ2hDO0FBQUEsSUFDQTtBQUFBLEVBQW9EO0FBQ3BEO0FBK0JPLElBQU0sWUFBWTtBQUFBLEVBQ3ZCLE1BQU07QUFBQSxFQUNOLFNBQVM7QUFBQSxFQUNULGtCQUFrQjtBQUFBLEVBQ2xCLGtCQUFrQjtBQUFBLEVBQ2xCLHFCQUFxQjtBQUFBLEVBQ3JCLFlBQVk7QUFBQSxFQUNaLGNBQWM7QUFBQSxFQUNkLGVBQWU7QUFBQSxFQUNmLGtCQUFrQjtBQUFBLEVBQ2xCLGdCQUFnQjtBQUFBLEVBQ2hCLFVBQVU7QUFBQSxFQUNWLE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLG1CQUFtQjtBQUFBLEVBQ25CLGtCQUFrQjtBQUFBLEVBQ2xCLG1CQUFtQjtBQUFBLEVBQ25CLHNCQUFzQjtBQUFBLEVBQ3RCLG9CQUFvQjtBQUFBLEVBQ3BCLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLHFCQUFxQjtBQUN2QjtBQVdBLElBQU0saUJBQU4sTUFBTSxlQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVixjQUFjO0FBQUEsRUFBQztBQUFBO0FBQUEsRUFFdkIsV0FBVyxRQUFRO0FBQ2pCLFdBQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGFBQWEsV0FBVyxPQUFlLFdBQVcsR0FBb0I7QUFDcEUsUUFBSSxDQUFDLFNBQVMsU0FBUyxLQUFLO0FBQzVCLFlBQU0sSUFBSSxvQkFBb0IsT0FBTyxVQUFVLE9BQU8sS0FBSztBQUUzRCxlQUFXLFVBQVUsaUJBQWlCO0FBQ3BDLFVBQUksT0FBTyxLQUFLLEtBQUssR0FBRztBQUN0QixZQUFJO0FBQ0YsZ0JBQU0sTUFBTSxVQUFNLHFCQUFNLE9BQU87QUFBQSxZQUM3QixRQUFRO0FBQUEsWUFDUixVQUFVO0FBQUEsVUFDWixDQUFDO0FBRUQsY0FBSSxDQUFDLElBQUksR0FBSTtBQUdiLGNBQUksc0NBQXNDLEtBQUssSUFBSSxHQUFHLEdBQUc7QUFDdkQsa0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixrQkFBTSxTQUFTLEtBQ2YsTUFBTSxpQ0FBaUMsRUFBRSxDQUFDLEVBQzFDLE1BQU0sTUFBTSxFQUFFLENBQUM7QUFFZixnQkFBSSxDQUFDLE9BQVE7QUFFYixtQkFBTyxrQ0FBa0MsTUFBTTtBQUFBLFVBQ2pEO0FBQ0EsaUJBQU8sV0FBVyxJQUNsQixJQUFJLE1BQ0osS0FBSyxXQUFXLElBQUksS0FBSyxXQUFXLENBQUM7QUFBQSxRQUN2QyxRQUFRO0FBQ047QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxPQUFPLFFBQ1AsT0FDQSx1QkFBbUUsVUFBVSxhQUM3RDtBQUNkLFFBQUksQ0FBQyxTQUFTLFNBQVMsS0FBSztBQUM1QixZQUFNLElBQUksb0JBQW9CLE9BQU8sVUFBVSxPQUFPLEtBQUs7QUFDM0QsUUFBSSxDQUFDLE1BQU0sT0FBUSxPQUFNLElBQUksa0JBQWtCLFNBQVMsT0FBTyxLQUFLLENBQUM7QUFFckUsVUFBTSxXQUFXLHdCQUFDLE1BQW1DQyxZQUFtQjtBQUFBLE1BQ3RFO0FBQUEsTUFDQSxPQUFBQTtBQUFBLElBQ0YsSUFIaUI7QUFLakIsUUFBSSx1QkFBdUIsS0FBSyxLQUFLO0FBQ3JDLGFBQU8sU0FBUyxVQUFVLHFCQUFxQixLQUFLO0FBRXBELFFBQUk7QUFDRixZQUFNLE1BQU0sSUFBSSxJQUFJLEtBQUs7QUFFekIsVUFBSSxXQUFXLFFBQVEsU0FBUyxJQUFJLElBQUksR0FBRztBQUN6QyxnQkFBUSxNQUFNLFFBQVEsdUJBQXVCLEVBQUUsRUFBRSxLQUFLO0FBQ3RELGNBQU0sYUFBYSxJQUFJLGFBQWEsSUFBSSxNQUFNO0FBQzlDLGNBQU0sVUFBVSxJQUFJLGFBQWEsSUFBSSxHQUFHO0FBQ3hDLFlBQUksWUFBWTtBQUNkLGNBQUksV0FBVyxXQUFXLFdBQVcsSUFBSTtBQUN6QyxtQkFBTztBQUFBLGNBQ0wsVUFBVTtBQUFBLGNBQ1YsbUNBQW1DLE9BQU8sU0FBUyxVQUFVO0FBQUEsWUFDL0Q7QUFDQSxpQkFBTztBQUFBLFlBQ0wsVUFBVTtBQUFBLFlBQ1YseUNBQXlDLFVBQVU7QUFBQSxVQUNyRDtBQUFBLFFBQ0Y7QUFDQSxZQUFJLGVBQWMsV0FBVyxLQUFLLEtBQUssZUFBYyxZQUFZLEtBQUs7QUFDdEUsaUJBQU8sU0FBUyxVQUFVLGVBQWUsS0FBSztBQUM5QyxlQUFPLFNBQVMsc0JBQXNCLEtBQUs7QUFBQSxNQUM3QyxXQUFXLFdBQVcsUUFBUSxTQUFTLElBQUksSUFBSSxHQUFHO0FBQ2hELGdCQUFRLE1BQU0sUUFBUSxzQkFBc0IsRUFBRTtBQUM5QyxZQUFJLHFCQUFxQixLQUFLLEtBQUs7QUFDbkMsaUJBQU8sU0FBUyxVQUFVLGtCQUFrQixLQUFLO0FBQ2pELFlBQUksa0JBQWtCLEtBQUssS0FBSztBQUNoQyxpQkFBTyxTQUFTLFVBQVUsZUFBZSxLQUFLO0FBQzlDLFlBQUksaUJBQWlCLEtBQUssS0FBSztBQUMvQixpQkFBTyxTQUFTLFVBQVUsY0FBYyxLQUFLO0FBQzdDLGVBQU8sU0FBUyxzQkFBc0IsS0FBSztBQUFBLE1BQzdDLFdBQVcsV0FBVyxNQUFNLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFDOUMsWUFBSSxXQUFXLEtBQUssS0FBSyxFQUFHLFFBQU8sU0FBUyxVQUFVLE9BQU8sS0FBSztBQUNsRSxlQUFPLFNBQVMsc0JBQXNCLEtBQUs7QUFBQSxNQUM3QyxXQUFXLFdBQVcsYUFBYSxTQUFTLElBQUksSUFBSSxHQUFHO0FBQ3JELFlBQUksa0JBQWtCLEtBQUssS0FBSztBQUNoQyxpQkFBTyxTQUFTLFVBQVUsY0FBYyxLQUFLO0FBQzdDLGVBQU8sU0FBUyxzQkFBc0IsS0FBSztBQUFBLE1BQzdDLFdBQVcsV0FBVyxXQUFXLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFDbkQsWUFBSSx3QkFBd0IsS0FBSyxLQUFLO0FBQ3RDLGlCQUFPLFNBQVMsVUFBVSxxQkFBcUIsS0FBSztBQUNwRCxZQUFJLHFCQUFxQixLQUFLLEtBQUs7QUFDbkMsaUJBQU8sU0FBUyxVQUFVLGtCQUFrQixLQUFLO0FBQ2pELGVBQU8sU0FBUyxzQkFBc0IsS0FBSztBQUFBLE1BQzdDLFdBQVcsV0FBVyxXQUFXLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFDbkQsWUFBSSxxQkFBcUIsS0FBSyxLQUFLO0FBQ25DLGlCQUFPLFNBQVMsVUFBVSxtQkFBbUIsS0FBSztBQUNsRCxZQUFJLHdCQUF3QixLQUFLLEtBQUs7QUFDdEMsaUJBQU8sU0FBUyxVQUFVLHNCQUFzQixLQUFLO0FBQ3JELFlBQUksb0JBQW9CLEtBQUssS0FBSztBQUNsQyxpQkFBTyxTQUFTLFVBQVUsa0JBQWtCLEtBQUs7QUFDakQsZUFBTyxTQUFTLHNCQUFzQixLQUFLO0FBQUEsTUFDN0MsT0FBTztBQUNMLGVBQU8sU0FBUyxVQUFVLFdBQVcsS0FBSztBQUFBLE1BQzVDO0FBQUEsSUFDRixRQUFRO0FBQ04sYUFBTyxTQUFTLHNCQUFzQixLQUFLO0FBQUEsSUFDN0M7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxXQUFXLE9BQTBDO0FBQzFELFdBQU8sZUFBYyxRQUFRLEtBQUssRUFBRSxTQUFTLFVBQVUsUUFDdkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxPQUFPLE9BQU8sRUFBRSxJQUFJLElBQ3JDO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTyxXQUFXLEdBQVc7QUFDM0IsV0FBTyxvQkFBb0IsS0FBSyxDQUFDO0FBQUEsRUFDbkM7QUFBQSxFQUVBLE9BQU8sWUFBWSxHQUFXO0FBQzVCLFdBQU8scUJBQXFCLEtBQUssQ0FBQztBQUFBLEVBQ3BDO0FBQ0Y7QUFqS29CO0FBQXBCLElBQU0sZ0JBQU47OztBQ3JETyxJQUFNLGdCQUFOLE1BQU0sY0FBYTtBQUFBLEVBQ2pCLFlBQW1CLFFBQXdCLE9BQXlCO0FBQWpEO0FBQXdCO0FBQ2hELFNBQUssTUFBTSxRQUFRLFFBQVEsQ0FBQyxVQUFVO0FBQ3BDLFlBQU0sY0FBTixNQUFNLFlBQWMsS0FBSyxNQUFNLGFBQWE7QUFDNUMsWUFBTSxnQkFBTixNQUFNLGNBQWdCLE1BQU0sZUFBZTtBQUFBLElBQzdDLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFTyxhQUFhLE1BQThDO0FBQ2hFLFNBQUssTUFBTSxZQUFZO0FBQ3ZCLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFTyxlQUFlLE1BQVk7QUFDaEMsU0FBSyxNQUFNLGNBQWM7QUFDekIsU0FBSyxNQUFNLFFBQVEsUUFBUSxDQUFDLFVBQVU7QUFDcEMsWUFBTSxjQUFjO0FBQUEsSUFDdEIsQ0FBQztBQUNELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFTyxhQUFhLFdBQTBCO0FBQzVDLFNBQUssTUFBTSxZQUFZO0FBQ3ZCLFNBQUssTUFBTSxRQUFRLFFBQVEsQ0FBQyxVQUFVO0FBQ3BDLFlBQU0sWUFBWTtBQUFBLElBQ3BCLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRU8sVUFBVSxRQUFpQjtBQUNoQyxTQUFLLE1BQU0sU0FBUztBQUNwQixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRU8sU0FBUyxPQUFlO0FBQzdCLFNBQUssTUFBTSxRQUFRO0FBQ25CLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFTyxZQUFZLFVBQW9CO0FBQ3JDLFNBQUssTUFBTSxXQUFXO0FBQ3RCLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFFBQVE7QUFDakIsV0FBTyxLQUFLLE1BQU07QUFBQSxFQUNwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxZQUFZO0FBQ3JCLFdBQU8sS0FBSyxNQUFNLGFBQWEsVUFBVTtBQUFBLEVBQzNDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDckIsV0FBTyxLQUFLLE1BQU0sYUFBYTtBQUFBLEVBQ2pDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFdBQVc7QUFDcEIsV0FBTyxLQUFLLE1BQU07QUFBQSxFQUNwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxNQUFNLFVBQVUsQ0FBQztBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGNBQWM7QUFDdkIsV0FBTyxLQUFLLE1BQU0sZUFBZTtBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFhLFVBQVU7QUFDckIsV0FBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFBQSxNQUNwQyxjQUFjLEtBQUs7QUFBQSxNQUNuQixhQUFhLEtBQUs7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVTtBQUNmLFdBQU8sQ0FBQyxLQUFLLE9BQU87QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sY0FBYztBQUNuQixXQUFPLEtBQUssWUFBWTtBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2pCLFdBQU8sS0FBSyxPQUFPLFNBQVM7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNkLFdBQU87QUFBQSxNQUNMLE9BQU8sS0FBSztBQUFBLE1BQ1osV0FBVyxLQUFLO0FBQUEsTUFDaEIsVUFBVSxLQUFLLFVBQVUsT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUMxQyxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDN0MsV0FBVyxLQUFLLFdBQVcsY0FBYztBQUFBLE1BQ3pDLGFBQWEsS0FBSyxhQUFhLE9BQU8sS0FBSztBQUFBLElBQzdDO0FBQUEsRUFDRjtBQUNGO0FBbEkwQjtBQUFuQixJQUFNLGVBQU47OztBQzNCUCxJQUFNLE9BQU8sd0JBQUMsTUFBYyxVQUFVLENBQUMsZ0JBQTFCO0FBRU4sSUFBTSxnQkFBTixNQUFNLGNBQWE7QUFBQSxFQUNqQixjQUFjO0FBQ25CLFdBQU87QUFBQSxFQUNUO0FBQUEsRUEwQ0EsT0FBYyxJQUEyQixNQUFTO0FBQ2hELFdBQU8sS0FBSyxRQUFRLElBQUksS0FBSztBQUFBLEVBQy9CO0FBQUEsRUFFQSxPQUFjLElBQTJCLE1BQVM7QUFDaEQsV0FBTyxRQUFRLEtBQUs7QUFBQSxFQUN0QjtBQUFBLEVBRUEsU0FBZ0IsT0FBTyxRQUFRLElBRzVCO0FBQ0QsZUFBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sUUFBUSxLQUFLLE9BQU8sR0FBRztBQUNqRCxZQUFNLEVBQUUsTUFBTSxHQUFrQixPQUFPLEVBQVk7QUFBQSxJQUNyRDtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQWtCLFFBQVE7QUFDeEIsV0FBTyxPQUFPLEtBQUssS0FBSyxPQUFPO0FBQUEsRUFDakM7QUFBQTtBQUFBLEVBR0EsV0FBa0IsU0FBUztBQUN6QixXQUFPLEtBQUssTUFBTTtBQUFBLEVBQ3BCO0FBQUEsRUFFQSxPQUFjLFdBQVc7QUFDdkIsV0FBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLE1BQU8sS0FBYSxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQWMsT0FBOEIsU0FBMEI7QUFDcEUsUUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLFFBQVEsT0FBTyxFQUFHLFFBQU8sS0FBSyxTQUFTO0FBQzlELFdBQU8sUUFDUCxPQUFPLENBQUMsY0FBYyxPQUFPLGNBQWMsUUFBUSxFQUNuRCxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBTSxDQUFDLEVBQzNCLEtBQUssR0FBRztBQUFBLEVBQ1Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sWUFBb0IsT0FBZTtBQUN0RCxTQUFLLFFBQVEsVUFBeUIsSUFBSTtBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE9BQWMsV0FBVyxjQUErQztBQUN0RSxpQkFBYSxRQUFRLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDO0FBQUEsRUFDaEU7QUFDRjtBQXhHMEI7QUFLeEIsY0FMVyxlQUtHLFdBQXVDO0FBQUEsRUFDbkQsZUFBZSxLQUFLLEVBQUU7QUFBQSxFQUN0QixXQUFXLEtBQUssRUFBRTtBQUFBLEVBQ2xCLGdCQUFnQixLQUFLLEVBQUU7QUFBQSxFQUN2QixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFDVCxRQUFRO0FBQUEsRUFDUixhQUFhO0FBQUEsRUFDYixZQUFZO0FBQUEsRUFDWixhQUFhO0FBQUEsRUFDYixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxZQUFZO0FBQUEsRUFDWixVQUNBO0FBQUEsRUFDQSxhQUNBO0FBQUEsRUFDQSxRQUFRO0FBQUEsRUFDUixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixRQUFRO0FBQUEsRUFDUixLQUFLO0FBQUEsRUFDTCxTQUFTO0FBQUEsRUFDVCxlQUFlO0FBQ2pCO0FBM0NLLElBQU0sZUFBTjs7O0FSeENQLHlCQUEwQjtBQUMxQiw2QkFXQTtBQTRCQSxJQUFNLFFBQU4sTUFBTSxNQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJRCxjQUFjO0FBQUEsRUFBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLdkIsT0FBTyxhQUFzQjtBQUMzQixVQUFNQyxXQUNOLE9BQU8sY0FBYyxjQUFjLFVBQVUsWUFBWTtBQUd6RCxRQUFJLE9BQU8sU0FBUyxlQUFlLEtBQUssU0FBUztBQUUvQyxhQUFPLEVBQUUsTUFBTSxRQUFRLFNBQVMsS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUNwRDtBQUdBLFFBQUksT0FBTyxRQUFRLGVBQWUsSUFBSSxTQUFTO0FBRTdDLGFBQU8sRUFBRSxNQUFNLE9BQU8sU0FBUyxJQUFJLFFBQVE7QUFBQSxJQUM3QztBQUVBLFFBQUksT0FBTyxZQUFZLGVBQWUsUUFBUTtBQUM5QyxhQUFPLEVBQUUsTUFBTSxRQUFRLFNBQVMsUUFBUSxRQUFRO0FBRWhELFdBQU8sRUFBRSxNQUFNLFdBQVcsU0FBU0EsWUFBVyxVQUFVO0FBQUEsRUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFPLGVBQWUsUUFBZ0M7QUFDcEQsV0FBTyxPQUFPLE9BQU8sTUFBTSxFQUMzQixJQUFJLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsRUFDM0IsS0FBSyxHQUFHO0FBQUEsRUFDVjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQU8sUUFBUSxjQUFzQjtBQUNuQyxRQUFJLE1BQU0sWUFBWSxFQUFHLGdCQUFlO0FBQ3hDLFVBQU0sUUFBUSxlQUFlLElBQUksS0FBSyxRQUFRLEtBQUs7QUFFbkQsV0FBTztBQUFBLE1BQ0wsTUFBTSxNQUFNLGVBQWUsS0FBUTtBQUFBLE1BQ25DLE9BQU8sTUFBTSxlQUFlLElBQU8sSUFBSTtBQUFBLE1BQ3ZDLFNBQVMsTUFBTSxlQUFlLEdBQUssSUFBSTtBQUFBLE1BQ3ZDLFNBQVMsTUFBTSxlQUFlLEdBQUksSUFBSTtBQUFBLElBQ3hDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQU8sY0FBYyxVQUFvQjtBQUN2QyxVQUFNLFFBQVEsT0FBTyxLQUFLLFFBQVE7QUFDbEMsVUFBTSxXQUFXLENBQUMsUUFBUSxTQUFTLFdBQVcsU0FBUztBQUV2RCxVQUFNLFNBQVMsTUFDZixPQUFPLENBQUMsTUFBTSxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQ2xDLElBQUksQ0FBQyxNQUFNLFNBQVMsQ0FBbUIsQ0FBQztBQUN4QyxVQUFNLFFBQVEsT0FDZCxNQUFNLE9BQU8sVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsRUFDdEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsQ0FBQyxFQUN4QyxLQUFLLEdBQUc7QUFFUixXQUFPLE1BQU0sVUFBVSxJQUFJLEtBQUssTUFBTSxTQUFTLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSztBQUFBLEVBQ2xFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE9BQU8sZUFBZSxVQUFrQjtBQUN0QyxXQUFPLEtBQUssY0FBYyxLQUFLLFFBQVEsUUFBUSxDQUFDO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQU8sS0FBYyxLQUFhO0FBQ2hDLFFBQUksQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFHLFFBQU87QUFDaEMsV0FBTyxJQUFJLElBQUksU0FBUyxDQUFDO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFPLGFBQWEsU0FBc0M7QUFDeEQsV0FDRSxXQUFXLFFBQVEsUUFBUSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsU0FBUztBQUFBLEVBRTdFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFPLFdBQVcsT0FBZSxRQUFxQjtBQUNwRCxRQUFJO0FBQ0YsWUFBTSxhQUFhO0FBQUE7QUFBQSxRQUVqQixPQUFPO0FBQUEsVUFDUDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQW1CO0FBQUEsTUFFckI7QUFDQSxZQUFNLG9CQUFnQixxQ0FBYSxVQUFVO0FBQzdDLG9CQUFjLFdBQU8sNENBQW9CLENBQUM7QUFDMUMsWUFBTSxvQkFBZ0IscUNBQWEsVUFBVTtBQUU3QyxjQUFRLFFBQVE7QUFBQSxRQUNkLEtBQUs7QUFDSCxxQkFBTyxnQ0FBUSxLQUFLO0FBQUEsUUFDdEIsS0FBSztBQUNILGlCQUFPLGNBQWMsWUFBWSxTQUFTLEtBQUs7QUFBQSxRQUNqRDtBQUNFLGlCQUFPLGNBQWMsWUFBWSxTQUFTLEtBQUs7QUFBQSxNQUNuRDtBQUFBLElBQ0YsUUFBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQU8sUUFBUSxJQUFZO0FBQ3pCLFFBQUk7QUFDRixhQUFPLEVBQUUsUUFBUSxRQUFRLEVBQUUsR0FBRyxPQUFPLEtBQUs7QUFBQSxJQUM1QyxTQUFTLE9BQU87QUFDZCxhQUFPLEVBQUUsUUFBUSxNQUFNLE1BQU07QUFBQSxJQUMvQjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLGFBQWEsT0FBTyxJQUFZO0FBQzlCLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxPQUFPO0FBQ3pCLGFBQU8sRUFBRSxRQUFRLEtBQUssT0FBTyxLQUFLO0FBQUEsSUFDcEMsU0FBUyxPQUFPO0FBQ2QsYUFBTyxFQUFFLFFBQVEsTUFBTSxNQUFNO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxLQUFLLE1BQWM7QUFDeEIsZUFBTyw0QkFBVyxNQUFNLFFBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ25EO0FBQUEsRUFFQSxPQUFPLE9BQU87QUFBQSxFQUFDO0FBQUE7QUFBQSxFQUVmLGFBQWEsV0FBVztBQUN0QixRQUFJLFdBQVcsV0FBWSxRQUFPLFdBQVc7QUFDN0MsZUFBVyxPQUFPLENBQUMsY0FBYyxRQUFRLEdBQUc7QUFDMUMsVUFBSTtBQUNGLGVBQU8sTUFBTSxPQUFPLEtBQUs7QUFBQSxVQUN2QixDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUksU0FBUyxTQUFTLElBQUk7QUFBQSxRQUNsRDtBQUFBLE1BQ0YsUUFBUTtBQUNOLFlBQUk7QUFFRixnQkFBTSxNQUFNLFFBQVEsR0FBRztBQUN2QixjQUFJLElBQUssUUFBTyxJQUFJLFNBQVMsSUFBSSxTQUFTLFNBQVMsSUFBSTtBQUFBLFFBQ3pELFFBQVE7QUFBQSxRQUdSO0FBQUEsTUFBQztBQUFBLElBQ0w7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLEtBQUssU0FBaUIsT0FBTyxzQkFBc0IsUUFBaUI7QUFDekUsWUFBUSxZQUFZLFNBQVM7QUFBQSxNQUMzQjtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxPQUFPLGFBQWdCLEtBQWE7QUFDbEMsV0FBTyxRQUFJLDhCQUFVLElBQUksTUFBTSxDQUFDO0FBQUEsRUFDbEM7QUFBQSxFQUVBLE9BQU8sa0JBQXFCLEtBQWU7QUFDekMsVUFBTSxNQUFNLElBQUksTUFBTTtBQUV0QixRQUFJLElBQUksSUFBSTtBQUVaLFdBQU8sR0FBRztBQUNSLFlBQU0sSUFBSSxLQUFLLE1BQU0sS0FBSyxPQUFPLElBQUksR0FBRztBQUN4QyxPQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQ3BDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQTdOVztBQUFYLElBQU0sT0FBTjtBQStOTyxJQUFNLHFCQUFxQix3QkFDbEMsT0FDQSxVQUNBO0FBQ0UsTUFBSSxNQUFNLFVBQVUsS0FBSyxNQUFNLFlBQVksU0FBVTtBQUVyRCxRQUFNLFNBQ04sT0FBTyxVQUFVLFdBQ2pCLFNBQ0MsaUJBQWlCLFdBQ2xCLE1BQU0sU0FDTixNQUFNLFFBQVEsS0FBSyxJQUNuQixRQUNBLENBQUMsS0FBSyxHQUNOO0FBRUEsUUFBTSxTQUFTLE1BQU0sWUFBWTtBQUVqQyxNQUFJLFNBQVMsUUFBUTtBQUNuQixVQUFNLElBQUksZ0JBQWdCLGdCQUFnQixRQUFRLE1BQU07QUFBQSxFQUMxRDtBQUNGLEdBckJrQzs7O0FGblBsQyxJQUFNQyw2QkFBNEIsT0FBTyxxQkFBcUI7QUFZOUQsU0FBUyxnQkFBZ0IsUUFBYSxLQUFhLE9BQVk7QUFDN0QsVUFBUSxJQUFJLFFBQVEsS0FBSyxLQUFLO0FBQ2hDO0FBRlM7QUFJVCxTQUFTLFlBQWUsUUFBYSxLQUFnQjtBQUNuRCxTQUFPLFFBQVEsSUFBSSxRQUFRLEdBQUc7QUFDaEM7QUFGUztBQVNGLFNBQVMsaUJBQWlCLFFBQTZCO0FBQzVELFFBQU0sRUFBRSxRQUFBQyxTQUFRLE1BQU0sSUFBSSxLQUFLLFFBQVEsTUFBTTtBQUU3QyxNQUFJLE1BQU8sT0FBTTtBQUVqQixRQUFNLE9BQU9BO0FBRWIseUJBQXVCLE1BQU07QUFFN0IsUUFBTSxZQUFZLElBQUksTUFBTSxRQUFRO0FBQUEsSUFDbEMsSUFBSSxRQUFRLEdBQUc7QUFDYixjQUFRLEdBQUc7QUFBQSxRQUNULEtBQUs7QUFDSCxpQkFBTyxlQUFlLFFBQVEsSUFBSTtBQUFBLFFBQ3BDLEtBQUs7QUFDSCxpQkFBTyxnQkFBZ0IsUUFBUSxJQUFJO0FBQUEsUUFDckMsS0FBSztBQUNILGlCQUFPLGtCQUFrQixRQUFRLElBQUk7QUFBQSxRQUN2QyxLQUFLO0FBQ0gsaUJBQU8sQ0FBQyxZQUNSLDBCQUEwQixRQUFRLFdBQVcsT0FBTztBQUFBLFFBQ3RELEtBQUs7QUFDSCxpQkFBTyxNQUFNO0FBRVgsbUJBQU8sZ0JBQWdCLE9BQU8sZ0JBQWdCLElBQUksQ0FBQztBQUFBLFVBQ3JEO0FBQUEsUUFDRixLQUFLO0FBQ0gsaUJBQU8sTUFBTTtBQUVYLGtCQUFNLFlBQVksT0FBTyxnQkFBZ0IsSUFBSTtBQUc3QyxtQkFBTyxnQkFBZ0IsWUFBWSxJQUFJLElBQUksU0FBUztBQUFBLFVBQ3REO0FBQUEsUUFDRjtBQUVFLGlCQUFPLE9BQU8sQ0FBQztBQUFBLE1BQ25CO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUVELFVBQVEsSUFBSSxXQUFXQyw0QkFBMkIsTUFBTTtBQUV4RCxTQUFPLG1CQUFtQixXQUFXLE1BQU0sRUFBRTtBQUMvQztBQTVDZ0I7QUE4Q2hCLFNBQVMsMEJBQ1QsUUFDQSxPQUNBLFNBQ0E7QUFDRSxTQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxhQUFhO0FBQ2xELFFBQUk7QUFDRixZQUFNLGtCQUFrQjtBQUFBLFFBQ3RCLFdBQVcsU0FBUztBQUFBLFFBQ3BCLFlBQVksU0FBUztBQUFBLFFBQ3JCLFVBQVUsU0FBUztBQUFBLFFBQ25CLE9BQU87QUFBQSxVQUNMLElBQUksU0FBUyxNQUFNO0FBQUEsUUFDckI7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNOLElBQUksU0FBUyxLQUFLO0FBQUEsUUFDcEI7QUFBQSxNQUNGO0FBRUEsWUFBTSxLQUFLLE9BQU8sTUFBTSxRQUFRLElBQUksT0FBTyxLQUFLLEVBQUU7QUFDbEQsWUFBTSxrQkFBa0IsT0FBTyxNQUFNLFNBQVM7QUFBQSxRQUM1QyxPQUFPLFdBQVc7QUFBQSxNQUNwQjtBQUVBLFlBQU0sa0JBQWtCO0FBQUEsUUFDdEIsV0FBVyxPQUFPLFdBQVc7QUFBQSxRQUM3QixZQUFZLE9BQU8sV0FBVztBQUFBLFFBQzlCLFVBQVUsT0FBTyxXQUFXO0FBQUEsUUFDNUIsU0FBUyx5QkFBeUIsaUJBQWlCLE1BQU07QUFBQSxRQUN6RCxRQUFRO0FBQUEsVUFDTixJQUFJLE9BQU87QUFBQSxRQUNiO0FBQUEsUUFDQSxPQUFPO0FBQUEsVUFDTCxJQUFJLE9BQU8sTUFBTTtBQUFBLFVBQ2pCLFNBQVM7QUFBQSxZQUNQLElBQUk7QUFBQSxjQUNGLElBQUksSUFBSTtBQUFBLGNBQ1IsT0FBTztBQUFBLGdCQUNMLE1BQU0sa0JBQWtCLE9BQWdCO0FBRXRDLHlCQUFPLElBQUk7QUFBQSxnQkFJYjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsYUFBTyxRQUFRLGlCQUFpQixlQUFlO0FBQUEsSUFDakQsUUFBUTtBQUFBLElBRUk7QUFBQSxFQUNkLENBQUM7QUFDSDtBQXhEUztBQTBEVCxTQUFTLHVCQUF1QixRQUFxQjtBQUNuRCxNQUFJLFdBQVcsWUFBOEIsUUFBUSxVQUFVO0FBRS9ELE1BQUksQ0FBQyxVQUFVO0FBQ2IsVUFBTSxhQUFhLG9CQUFJLElBQWlCO0FBQ3hDLGVBQVc7QUFDWCxvQkFBZ0IsUUFBUSxZQUFZLFVBQVU7QUFBQSxFQUNoRDtBQUVBLFNBQU8sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLFlBQVk7QUFDM0MsZUFBVyxDQUFDLFNBQVMsT0FBTyxLQUFLLFNBQVMsUUFBUSxHQUFHO0FBQ25ELFVBQUksT0FBTyxPQUFPLElBQUksT0FBTyxHQUFHLE1BQU0sT0FBTyxTQUFTO0FBQ3BELGdCQUFRLFFBQVE7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPLEdBQUcsU0FBUyxDQUFDLFdBQVc7QUFDN0IsWUFBUSxPQUFPLEdBQUc7QUFBQSxNQUNoQixLQUFLLGlDQUFzQixtQkFBa0I7QUFDekMsY0FBTSxVQUFVLE9BQU87QUFDdkIsaUJBQVMsSUFBSSxRQUFRLFFBQVEsR0FBRyxvQkFBb0IsT0FBTztBQUMzRDtBQUFBLE1BQ0Y7QUFBQSxNQUNGLEtBQUssaUNBQXNCLGtCQUFpQjtBQUN4QyxjQUFNLFVBQVUsT0FBTztBQUV2QixZQUNBLFFBQVEsWUFDUixRQUFRLGNBQ1IsUUFBUSxZQUFZLE9BQU8sS0FBSyxJQUNoQztBQUNFLG1CQUFTLElBQUksUUFBUSxRQUFRLEdBQUcsbUJBQW1CLE9BQU87QUFBQSxRQUM1RDtBQUVBO0FBQUEsTUFDRjtBQUFBLE1BQ0Y7QUFDRTtBQUFBLElBQ0o7QUFBQSxFQUNGLENBQUM7QUFDSDtBQXpDUztBQTJDVCxTQUFTLGtCQUFrQixRQUFxQixNQUE2QjtBQUMzRSxRQUFNLFVBQVU7QUFBQSxJQUNkO0FBQUEsSUFDQSxJQUFJLFFBQVE7QUFDVixhQUFPO0FBQUEsUUFDTCxJQUFJLElBQVk7QUFDZCxpQkFBTyxPQUFPLFdBQVcsRUFBRTtBQUFBLFFBQzdCO0FBQUEsUUFDQSxJQUFJLElBQVk7QUFDZCxpQkFBTyxNQUFNLE9BQU87QUFBQSxRQUN0QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRLFlBQTRDO0FBQ2xELFVBQUksT0FBTyxlQUFlLFVBQVU7QUFDbEMsZUFBTztBQUFBLFVBQ0wsS0FBSyxPQUFPLFdBQVcsVUFBVTtBQUFBLFVBQ2pDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLHNCQUFzQixLQUFLLGNBQWM7QUFDM0MsZUFBTyx5QkFBeUIsWUFBWSxNQUFNO0FBQUEsTUFDcEQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxVQUFVLFlBQW1DO0FBQzNDLFlBQU0sVUFBVSxLQUFLLFFBQVEsVUFBVTtBQUN2QyxhQUFPLFNBQVM7QUFBQSxJQUNsQjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFoQ1M7QUFrQ1QsU0FBUyx5QkFDVCxTQUNBLFFBQ2dDO0FBQzlCLE1BQUksQ0FBQyxRQUFTO0FBRWQsU0FBTyxJQUFJLE1BQU0sU0FBUztBQUFBLElBQ3hCLElBQUksUUFBUSxHQUFHO0FBQ2IsY0FBUSxHQUFHO0FBQUEsUUFDVCxLQUFLO0FBQ0gsaUJBQU8sc0JBQXNCLE9BQU8sT0FBTyxNQUFNO0FBQUEsUUFDbkQsS0FBSztBQUNILGlCQUFRLE9BQTZCO0FBQUEsUUFDdkMsS0FBSztBQUNILGlCQUFPLE1BQ1AsT0FBTyxTQUFTLHVCQUFZLGNBQzVCLE9BQU8sU0FBUyx1QkFBWTtBQUFBLFFBQzlCLEtBQUs7QUFDSCxpQkFBTyxNQUFNLE9BQU8sU0FBUyx1QkFBWTtBQUFBLFFBQzNDLEtBQUs7QUFDSCxpQkFBTyxNQUFNLE9BQU8sU0FBUyx1QkFBWTtBQUFBLFFBQzNDO0FBRUUsaUJBQU8sT0FBTyxDQUFDO0FBQUEsTUFDbkI7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUEzQlM7QUE2QlQsU0FBUyxzQkFDVCxPQUNBLFFBQ3lCO0FBQ3ZCLE1BQUksQ0FBQyxNQUFPO0FBRVosU0FBTyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3RCLElBQUksUUFBUSxHQUFHO0FBQ2IsVUFBSSxNQUFNLHVCQUF1QjtBQUMvQixlQUFPLHdCQUF3QixRQUFRLE1BQU07QUFBQSxNQUMvQztBQUdBLGFBQU8sT0FBTyxDQUFDO0FBQUEsSUFDakI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQWhCUztBQWtCVCxTQUFTLHdCQUNULE9BQ0EsUUFDK0I7QUFDN0IsU0FBTyxDQUFDLFlBQVk7QUFDbEIsUUFBSSxXQUFXLFlBQXlDLFFBQVEsVUFBVTtBQUUxRSxRQUFJLENBQUMsVUFBVTtBQUNiLFlBQU0sYUFBYSxvQkFBSSxJQUE0QjtBQUNuRCxpQkFBVztBQUNYLHNCQUFnQixRQUFRLFlBQVksVUFBVTtBQUFBLElBQ2hEO0FBRUEsYUFBUyxJQUFJLE1BQU0sSUFBSSxPQUFPO0FBRTlCLFdBQU87QUFBQSxNQUNMLFlBQVksU0FBUztBQUNuQixZQUFJLE1BQU0sTUFBTSxXQUFXLFFBQVMsUUFBTztBQUMzQyxjQUFNLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUSxDQUFDO0FBQ3hDLGVBQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxVQUFVO0FBQ1IsaUJBQVMsT0FBTyxNQUFNLEVBQUU7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUExQlM7QUE0QlQsU0FBUyxnQkFBZ0IsUUFBcUIsTUFBNkI7QUFDekUsU0FBTyxJQUFJLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDOUIsSUFBSSxRQUFRLEdBQUc7QUFDYixVQUFJLE1BQU0sU0FBUztBQUNqQixlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUksTUFBTSxhQUFhLE1BQU0sYUFBYTtBQUN4QyxjQUFNLFdBQVcsZ0NBQVUsWUFBaUM7QUFDMUQsY0FBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxtQkFBTyxPQUFPLElBQUksVUFBVTtBQUFBLFVBQzlCO0FBRUEsY0FBSSxzQkFBc0IsS0FBSyxPQUFPO0FBQ3BDLG1CQUFPO0FBQUEsVUFDVDtBQUVBLGNBQ0Esc0JBQXNCLEtBQUssVUFDM0Isc0JBQXNCLEtBQUssU0FDM0Isc0JBQXNCLEtBQUssZ0JBQzNCLHNCQUFzQixLQUFLLE1BQzNCO0FBQ0UsbUJBQU8sV0FBVztBQUFBLFVBQ3BCO0FBQUEsUUFDRixHQWpCaUI7QUFtQmpCLFlBQUksTUFBTSxXQUFXO0FBQ25CLGlCQUFPO0FBQUEsUUFDVDtBQUVBLGVBQU8sQ0FBQyxlQUFvQztBQUMxQyxnQkFBTSxRQUFRLFNBQVMsVUFBVTtBQUNqQyxpQkFBTyxPQUFPO0FBQUEsUUFDaEI7QUFBQSxNQUNGO0FBR0EsYUFBTyxPQUFPLENBQUM7QUFBQSxJQUNqQjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBekNTO0FBMkNULFNBQVMsZUFBZSxRQUFxQixNQUE2QjtBQUN4RSxTQUFPLElBQUksTUFBTSxPQUFPLE9BQU87QUFBQSxJQUM3QixJQUFJLFFBQVEsR0FBRztBQUNiLFVBQUksTUFBTSxTQUFTO0FBQ2pCLGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxNQUFNLGFBQWEsTUFBTSxhQUFhO0FBQ3hDLGNBQU0sV0FBVyxnQ0FBVSxZQUFnQztBQUN6RCxjQUFJLE9BQU8sZUFBZSxVQUFVO0FBQ2xDLG1CQUFPLE9BQU8sSUFBSSxVQUFVO0FBQUEsVUFDOUI7QUFFQSxjQUFJLHNCQUFzQixLQUFLLE1BQU07QUFDbkMsbUJBQU87QUFBQSxVQUNUO0FBRUEsY0FBSSxzQkFBc0IsS0FBSyxRQUFRO0FBQ3JDLG1CQUFPLFdBQVc7QUFBQSxVQUNwQjtBQUFBLFFBQ0YsR0FaaUI7QUFjakIsWUFBSSxNQUFNLFdBQVc7QUFDbkIsaUJBQU87QUFBQSxRQUNUO0FBRUEsZUFBTyxDQUFDLGVBQW1DO0FBQ3pDLGdCQUFNLE9BQU8sU0FBUyxVQUFVO0FBQ2hDLGlCQUFPLE1BQU07QUFBQSxRQUNmO0FBQUEsTUFDRjtBQUdBLGFBQU8sT0FBTyxDQUFDO0FBQUEsSUFDakI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQXBDUzs7O0FXMVZULElBQUFDLGNBQW1EO0FBV25ELGNBQXlCO0FBV3pCLElBQU1DLDZCQUE0QixPQUFPLHFCQUFxQjtBQVk5RCxTQUFTQyxpQkFBZ0IsUUFBYSxLQUFhLE9BQWU7QUFDaEUsVUFBUSxJQUFJLFFBQVEsS0FBSyxLQUFLO0FBQ2hDO0FBRlMsT0FBQUEsa0JBQUE7QUFJVCxTQUFTQyxhQUFlLFFBQWEsS0FBZ0I7QUFDbkQsU0FBTyxRQUFRLElBQUksUUFBUSxHQUFHO0FBQ2hDO0FBRlMsT0FBQUEsY0FBQTtBQVNGLFNBQVMsb0JBQW9CLFFBQWdDO0FBQ2xFLFFBQU0sRUFBRSxRQUFBQyxTQUFRLE1BQU0sSUFBSSxLQUFLLFFBQVEsWUFBWTtBQUVuRCxNQUFJLE1BQU8sT0FBTTtBQUVqQixRQUFNLFVBQVVBO0FBRWhCLDRCQUEwQixNQUFNO0FBRWhDLFFBQU0sZUFBZSxJQUFJLE1BQU0sUUFBUTtBQUFBLElBQ3JDLElBQUksUUFBUSxHQUFHO0FBQ2IsY0FBUSxHQUFHO0FBQUEsUUFDVCxLQUFLO0FBQ0gsaUJBQU8sa0JBQWtCLFFBQVEsT0FBTztBQUFBLFFBQzFDLEtBQUs7QUFDSCxpQkFBTyxtQkFBbUIsUUFBUSxPQUFPO0FBQUEsUUFDM0MsS0FBSztBQUNILGlCQUFPLHFCQUFxQixRQUFRLE9BQU87QUFBQSxRQUM3QyxLQUFLO0FBQ0gsaUJBQU8sQ0FBQyxZQUNSLDZCQUE2QixRQUFRLGNBQWMsT0FBTztBQUFBLFFBQzVELEtBQUs7QUFDSCxpQkFBTyxNQUFNO0FBRVgsbUJBQU8sZ0JBQWdCLE9BQU8sZ0JBQWdCLElBQUksQ0FBQztBQUFBLFVBQ3JEO0FBQUEsUUFDRixLQUFLO0FBQ0gsaUJBQU8sTUFBTTtBQUVYLGtCQUFNLFlBQVksT0FBTyxnQkFBZ0IsSUFBSTtBQUc3QyxtQkFBTyxnQkFBZ0IsWUFBWSxJQUFJLElBQUksU0FBUztBQUFBLFVBQ3REO0FBQUEsUUFDRjtBQUVFLGlCQUFPLE9BQU8sQ0FBQztBQUFBLE1BQ25CO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUVELFVBQVEsSUFBSSxjQUFjQyw0QkFBMkIsU0FBUztBQUU5RCxTQUFPLG1CQUFtQixjQUFjLFNBQVMsRUFBRTtBQUNyRDtBQTVDZ0I7QUE4Q2hCLFNBQVMsNkJBQ1QsUUFDQSxPQUNBLFNBQ0E7QUFDRSxTQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxhQUFhO0FBQ2xELFFBQUk7QUFDRixZQUFNLGtCQUFrQjtBQUFBLFFBQ3RCLFdBQVcsU0FBUztBQUFBLFFBQ3BCLFlBQVksU0FBUztBQUFBLFFBQ3JCLFVBQVUsU0FBUztBQUFBLFFBQ25CLE9BQU87QUFBQSxVQUNMLElBQUksU0FBUyxNQUFNO0FBQUEsUUFDckI7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNOLElBQUksU0FBUyxLQUFLO0FBQUEsUUFDcEI7QUFBQSxNQUNGO0FBRUEsWUFBTSxLQUFLLE9BQU8sTUFBTSxRQUFRLElBQUksT0FBTyxLQUFLLEVBQUU7QUFDbEQsWUFBTSxrQkFBa0IsT0FBTyxNQUFNLFNBQVM7QUFBQSxRQUM1QyxPQUFPLFdBQVc7QUFBQSxNQUNwQjtBQUVBLFlBQU0sa0JBQWtCO0FBQUEsUUFDdEIsV0FBVyxPQUFPLFdBQVc7QUFBQSxRQUM3QixZQUFZLE9BQU8sV0FBVztBQUFBLFFBQzlCLFVBQVUsT0FBTyxXQUFXO0FBQUEsUUFDNUIsU0FBUyw0QkFBNEIsaUJBQWlCLE1BQU07QUFBQSxRQUM1RCxRQUFRO0FBQUEsVUFDTixJQUFJLE9BQU87QUFBQSxRQUNiO0FBQUEsUUFDQSxPQUFPO0FBQUEsVUFDTCxJQUFJLE9BQU8sTUFBTTtBQUFBLFVBQ2pCLFNBQVM7QUFBQSxZQUNQLElBQUk7QUFBQSxjQUNGLElBQUksSUFBSTtBQUFBLGNBQ1IsT0FBTztBQUFBLGdCQUNMLE1BQU0sa0JBQWtCLE9BQWdCO0FBRXRDLHlCQUFPLElBQUk7QUFBQSxnQkFJYjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsYUFBTyxRQUFRLGlCQUFpQixlQUFlO0FBQUEsSUFDakQsUUFBUTtBQUFBLElBRUk7QUFBQSxFQUNkLENBQUM7QUFDSDtBQXhEUztBQTBEVCxTQUFTLDBCQUEwQixRQUF3QjtBQUN6RCxNQUFJLFdBQVdGLGFBQThCLFFBQVEsVUFBVTtBQUUvRCxNQUFJLENBQUMsVUFBVTtBQUNiLFVBQU0sYUFBYSxvQkFBSSxJQUFpQjtBQUN4QyxlQUFXO0FBQ1gsSUFBQUQsaUJBQWdCLFFBQVEsWUFBWSxVQUFVO0FBQUEsRUFDaEQ7QUFFQSxTQUFPLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxZQUFZO0FBQzNDLGVBQVcsQ0FBQyxTQUFTLE9BQU8sS0FBSyxTQUFTLFFBQVEsR0FBRztBQUNuRCxVQUFJLE9BQU8sT0FBTyxJQUFJLE9BQU8sR0FBRyxNQUFNLE9BQU8sU0FBUztBQUNwRCxnQkFBUSxRQUFRO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXO0FBQzlCLFlBQVEsT0FBTyxHQUFHO0FBQUEsTUFDaEIsS0FBSyxrQ0FBc0IsbUJBQWtCO0FBQ3pDLGNBQU0sVUFBVSxPQUFPO0FBQ3ZCLGlCQUFTLElBQUksUUFBUSxRQUFRLEdBQUcsb0JBQW9CLE9BQU87QUFDM0Q7QUFBQSxNQUNGO0FBQUEsTUFDRixLQUFLLGtDQUFzQixrQkFBaUI7QUFDeEMsY0FBTSxVQUFVLE9BQU87QUFFdkIsWUFDQSxRQUFRLFlBQ1IsUUFBUSxjQUNSLFFBQVEsWUFBWSxPQUFPLEtBQUssSUFDaEM7QUFDRSxtQkFBUyxJQUFJLFFBQVEsUUFBUSxHQUFHLG1CQUFtQixPQUFPO0FBQUEsUUFDNUQ7QUFFQTtBQUFBLE1BQ0Y7QUFBQSxNQUNGO0FBQ0U7QUFBQSxJQUNKO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUF6Q1M7QUEyQ1QsU0FBUyxxQkFBcUIsUUFBd0IsU0FBc0M7QUFDMUYsUUFBTSxVQUFVO0FBQUEsSUFDZDtBQUFBLElBQ0EsSUFBSSxRQUFRO0FBQ1YsYUFBTztBQUFBLFFBQ0wsSUFBSSxJQUFZO0FBQ2QsaUJBQU8sT0FBTyxXQUFXLEVBQUU7QUFBQSxRQUM3QjtBQUFBLFFBQ0EsSUFBSSxJQUFZO0FBQ2QsaUJBQU8sTUFBTSxPQUFPO0FBQUEsUUFDdEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUSxZQUErQztBQUNyRCxVQUFJLE9BQU8sZUFBZSxVQUFVO0FBQ2xDLGVBQU87QUFBQSxVQUNMLEtBQUssT0FBTyxXQUFXLFVBQVU7QUFBQSxVQUNqQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxzQkFBOEIsc0JBQWM7QUFDOUMsZUFBTyw0QkFBNEIsWUFBWSxNQUFNO0FBQUEsTUFDdkQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxVQUFVLFlBQXNDO0FBQzlDLFlBQU0sVUFBVSxLQUFLLFFBQVEsVUFBVTtBQUN2QyxhQUFPLFNBQVM7QUFBQSxJQUNsQjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFoQ1M7QUFrQ1QsU0FBUyw0QkFDVCxTQUNBLFFBQ21DO0FBQ2pDLE1BQUksQ0FBQyxRQUFTO0FBRWQsU0FBTyxJQUFJLE1BQU0sU0FBUztBQUFBLElBQ3hCLElBQUksUUFBUSxHQUFHO0FBQ2IsY0FBUSxHQUFHO0FBQUEsUUFDVCxLQUFLO0FBQ0gsaUJBQU8seUJBQXlCLE9BQU8sT0FBTyxNQUFNO0FBQUEsUUFDdEQsS0FBSztBQUNILGlCQUFRLE9BQWdDO0FBQUEsUUFDMUMsS0FBSztBQUNILGlCQUFPLE1BQ1AsT0FBTyxTQUFTLHdCQUFZLGNBQzVCLE9BQU8sU0FBUyx3QkFBWTtBQUFBLFFBQzlCLEtBQUs7QUFDSCxpQkFBTyxNQUFNLE9BQU8sU0FBUyx3QkFBWTtBQUFBLFFBQzNDLEtBQUs7QUFDSCxpQkFBTyxNQUFNLE9BQU8sU0FBUyx3QkFBWTtBQUFBLFFBQzNDO0FBRUUsaUJBQU8sT0FBTyxDQUFDO0FBQUEsTUFDbkI7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUEzQlM7QUE2QlQsU0FBUyx5QkFDVCxPQUNBLFFBQzRCO0FBQzFCLE1BQUksQ0FBQyxNQUFPO0FBRVosU0FBTyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3RCLElBQUksUUFBUSxHQUFHO0FBQ2IsVUFBSSxNQUFNLHVCQUF1QjtBQUMvQixlQUFPLDJCQUEyQixRQUFRLE1BQU07QUFBQSxNQUNsRDtBQUdBLGFBQU8sT0FBTyxDQUFDO0FBQUEsSUFDakI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQWhCUztBQWtCVCxTQUFTLDJCQUNULE9BQ0EsUUFDK0I7QUFDN0IsU0FBTyxDQUFDLFlBQVk7QUFDbEIsUUFBSSxXQUFXQyxhQUF5QyxRQUFRLFVBQVU7QUFFMUUsUUFBSSxDQUFDLFVBQVU7QUFDYixZQUFNLGFBQWEsb0JBQUksSUFBNEI7QUFDbkQsaUJBQVc7QUFDWCxNQUFBRCxpQkFBZ0IsUUFBUSxZQUFZLFVBQVU7QUFBQSxJQUNoRDtBQUVBLGFBQVMsSUFBSSxNQUFNLElBQUksT0FBTztBQUU5QixXQUFPO0FBQUEsTUFDTCxZQUFZLFNBQVM7QUFDbkIsWUFBSSxNQUFNLE1BQU0sV0FBVyxRQUFTLFFBQU87QUFDM0MsY0FBTSxNQUFNLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQztBQUN0QyxlQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsVUFBVTtBQUNSLGlCQUFTLE9BQU8sTUFBTSxFQUFFO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBMUJTO0FBNEJULFNBQVMsbUJBQW1CLFFBQXdCLFNBQXNDO0FBQ3hGLFNBQU8sSUFBSSxNQUFNLE9BQU8sUUFBUTtBQUFBLElBQzlCLElBQUksUUFBUSxHQUFHO0FBQ2IsVUFBSSxNQUFNLFNBQVM7QUFDakIsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLE1BQU0sYUFBYSxNQUFNLGFBQWE7QUFDeEMsY0FBTSxXQUFXLGdDQUFVLFlBQW9DO0FBQzdELGNBQUksT0FBTyxlQUFlLFVBQVU7QUFDbEMsbUJBQU8sT0FBTyxJQUFJLFVBQVU7QUFBQSxVQUM5QjtBQUVBLGNBQUksc0JBQXNCLFFBQVEsT0FBTztBQUN2QyxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUNBLHNCQUFzQixRQUFRLFVBQzlCLHNCQUFzQixRQUFRLFNBQzlCLHNCQUFzQixRQUFRLGdCQUM5QixzQkFBc0IsUUFBUSxNQUM5QjtBQUNFLG1CQUFPLFdBQVc7QUFBQSxVQUNwQjtBQUFBLFFBQ0YsR0FqQmlCO0FBbUJqQixZQUFJLE1BQU0sV0FBVztBQUNuQixpQkFBTztBQUFBLFFBQ1Q7QUFFQSxlQUFPLENBQUMsZUFBdUM7QUFDN0MsZ0JBQU0sUUFBUSxTQUFTLFVBQVU7QUFDakMsaUJBQU8sT0FBTztBQUFBLFFBQ2hCO0FBQUEsTUFDRjtBQUdBLGFBQU8sT0FBTyxDQUFDO0FBQUEsSUFDakI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQXpDUztBQTJDVCxTQUFTLGtCQUFrQixRQUF3QixTQUFzQztBQUN2RixTQUFPLElBQUksTUFBTSxPQUFPLE9BQU87QUFBQSxJQUM3QixJQUFJLFFBQVEsR0FBRztBQUNiLFVBQUksTUFBTSxTQUFTO0FBQ2pCLGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxNQUFNLGFBQWEsTUFBTSxhQUFhO0FBQ3hDLGNBQU0sV0FBVyxnQ0FBVSxZQUFtQztBQUM1RCxjQUFJLE9BQU8sZUFBZSxVQUFVO0FBQ2xDLG1CQUFPLE9BQU8sSUFBSSxVQUFVO0FBQUEsVUFDOUI7QUFFQSxjQUFJLHNCQUFzQixRQUFRLE1BQU07QUFDdEMsbUJBQU87QUFBQSxVQUNUO0FBRUEsY0FBSSxzQkFBc0IsUUFBUSxRQUFRO0FBQ3hDLG1CQUFPLFdBQVc7QUFBQSxVQUNwQjtBQUFBLFFBQ0YsR0FaaUI7QUFjakIsWUFBSSxNQUFNLFdBQVc7QUFDbkIsaUJBQU87QUFBQSxRQUNUO0FBRUEsZUFBTyxDQUFDLGVBQXNDO0FBQzVDLGdCQUFNLE9BQU8sU0FBUyxVQUFVO0FBQ2hDLGlCQUFPLE1BQU07QUFBQSxRQUNmO0FBQUEsTUFDRjtBQUdBLGFBQU8sT0FBTyxDQUFDO0FBQUEsSUFDakI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQXBDUzs7O0FDM1ZULG1CQUE2QjtBQUY3QjtBQUtPLElBQU0sdUJBQU4sTUFBTSw2QkFFYiwwQkFBZ0I7QUFBQSxFQUVQLFlBQW1CLGlCQUFpQyxDQUFDLEdBQUc7QUFDN0QsVUFBTTtBQURrQjtBQUQxQixxQ0FBZTtBQUFBLEVBR2Y7QUFBQSxFQUVPLEdBQXNCLE1BQVMsVUFBZ0I7QUFDcEQsUUFBSSxTQUFTLFNBQVM7QUFDcEIseUJBQUssY0FBZTtBQUFBLElBQ3RCO0FBRUEsV0FBTyxNQUFNLEdBQUcsTUFBTSxRQUFRO0FBQUEsRUFDaEM7QUFBQSxFQUVPLEtBQXdCLE1BQVMsVUFBZ0I7QUFDdEQsUUFBSSxTQUFTLFNBQVM7QUFDcEIseUJBQUssY0FBZTtBQUFBLElBQ3RCO0FBRUEsV0FBTyxNQUFNLEtBQUssTUFBTSxRQUFRO0FBQUEsRUFDbEM7QUFBQSxFQUVPLFlBQStCLE1BQVMsVUFBZ0I7QUFDN0QsUUFBSSxTQUFTLFNBQVM7QUFDcEIseUJBQUssY0FBZTtBQUFBLElBQ3RCO0FBRUEsV0FBTyxNQUFNLFlBQVksTUFBTSxRQUFRO0FBQUEsRUFDekM7QUFBQSxFQUVPLElBQXVCLE1BQVMsVUFBZ0I7QUFDckQsdUJBQUssY0FBZSxLQUFLLGNBQWMsT0FBWSxJQUFJO0FBRXZELFdBQU8sTUFBTSxJQUFJLE1BQU0sUUFBUTtBQUFBLEVBQ2pDO0FBQUEsRUFFTyxlQUFrQyxNQUFTLFVBQWdCO0FBQ2hFLHVCQUFLLGNBQWUsS0FBSyxjQUFjLE9BQVksSUFBSTtBQUV2RCxXQUFPLE1BQU0sZUFBZSxNQUFNLFFBQVE7QUFBQSxFQUM1QztBQUFBLEVBRU8sbUJBQXNDLE1BQVU7QUFDckQsdUJBQUssY0FBZSxLQUFLLGNBQWMsT0FBWSxJQUFJO0FBRXZELFdBQU8sTUFBTSxtQkFBbUIsSUFBSTtBQUFBLEVBQ3RDO0FBQUEsRUFFTyxLQUF3QixTQUFZLE1BQXdCO0FBQ2pFLFFBQ0EsS0FBSyxlQUFlLFNBQVMsSUFBSSxLQUNqQyxDQUFDLEtBQUssV0FBVyxFQUFFLFNBQVMsSUFBSSxHQUNoQztBQUVFLGNBQVEsTUFBTSxHQUFHLElBQUk7QUFDckIsV0FBSztBQUFBLFFBQ0gsc0NBQXNDO0FBQUEsVUFDcEM7QUFBQSxRQUNGLENBQUMsYUFBYSxLQUFLLGVBQ25CLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxFQUMzQixLQUFLLElBQUksQ0FBQztBQUFBLFFBQ1Y7QUFBQSxNQUNGO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLE1BQU0sS0FBSyxNQUFNLEdBQUcsSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFFQSxJQUFXLGNBQWM7QUFDdkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFDRjtBQXZFRTtBQURjO0FBRlQsSUFBTSxzQkFBTjs7O0FDY0EsSUFBTSxpQkFBTixNQUFNLGVBQXlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBNEI3QyxZQUNBLFNBQ0EsVUFBaUIsQ0FBQyxHQUN6QjtBQUZPO0FBQ0E7QUFyQlA7QUFBQTtBQUFBO0FBQUEsd0JBQU8sWUFBVztBQUtsQjtBQUFBO0FBQUE7QUFBQSx3QkFBTyxhQUFzQixDQUFDO0FBTTlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBQU8scUJBQW9CLHdCQUFDLFVBQzVCLEdBQUcsTUFBTSxLQUFLLE9BQU8sTUFBTSxNQUFNLG1CQUROO0FBQUEsRUFXMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtELElBQVcsYUFBYTtBQUN0QixXQUFRLEtBQUssWUFBcUM7QUFBQSxFQUNwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLFlBQVksU0FBWTtBQUNuQyxTQUFLLFVBQVU7QUFDZixVQUFNLEtBQUssV0FBVztBQUN0QixVQUFNLEtBQUssU0FBUztBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFhLFdBQVc7QUFFdEI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFhLGFBQWE7QUFFeEI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsU0FDYixPQUNBLE1BQ21CO0FBRWpCLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsT0FBTyxNQUEyQztBQUU3RCxVQUFNLElBQUksb0JBQW9CLEdBQUcsS0FBSyxZQUFZLElBQUksV0FBVztBQUFBLEVBQ25FO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsT0FDYixPQUNBLFNBQ3lCO0FBRXZCLFVBQU0sSUFBSSxvQkFBb0IsR0FBRyxLQUFLLFlBQVksSUFBSSxXQUFXO0FBQUEsRUFDbkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxpQkFDYixPQUNBLFNBQ3lCO0FBR3ZCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsR0FBRyxLQUFLLFlBQVksSUFBSTtBQUFBLElBQzFCO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGlCQUFpQixRQUFrQixNQUFvQjtBQUM1RCxXQUFPLEtBQUssTUFBTSxNQUFNO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUNQLFVBQ0csTUFDSDtBQUNFLFdBQU8sS0FBSyxRQUFRLE9BQU8sS0FBSyxPQUFPLEdBQUcsSUFBSTtBQUFBLEVBQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sZUFDUCxVQUNBLFNBQWtCLFVBQVUsVUFBVSxDQUFDLEdBQ3ZCO0FBQ2QsV0FBTyxFQUFFLFVBQVUsWUFBWSxNQUFNLE9BQU87QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxNQUFNLFNBQWlCO0FBQzVCLFdBQU8sS0FBSyxRQUFRLE9BQU8sTUFBTSxPQUFPO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZ0JBQWdCO0FBQ3pCLFdBQU8sQ0FBQyxDQUFDLEtBQUssUUFBUSxPQUFPLFFBQVE7QUFBQSxFQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsT0FDYixPQUNBLGlCQUNzQztBQUVwQyxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBOUtzRDtBQUFBO0FBQUE7QUFBQTtBQUlwRCxjQUpXLGdCQUlHLGNBQWE7QUFKdEIsSUFBTSxnQkFBTjs7O0FDbEJQLElBQUFJLGdCQUEyQjs7O0FDRDNCLDhCQUFrQztBQVUzQixJQUFNLFdBQU4sTUFBTSxTQUFXO0FBQUEsRUFHZixZQUFvQixjQUFrQjtBQUFsQjtBQUYzQix3QkFBUSxXQUFVLElBQUksMENBQXFCO0FBQUEsRUFFRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS3ZDLEtBQUssT0FBOEI7QUFDeEMsU0FBSyxRQUFRLEtBQUssS0FBSztBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFNBQVM7QUFDbEIsV0FBTyxLQUFLLFFBQVEsU0FBUyxNQUFNO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQXlCO0FBQzlCLFVBQU0sT0FBTyxLQUFLLFFBQVEsU0FBUztBQUVuQyxRQUFJLFNBQVMsVUFBYSxLQUFLLGlCQUFpQjtBQUNoRCxhQUFPLEtBQUs7QUFFWixXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBb0IsT0FBVSxVQUFpQztBQUNwRSxRQUFJLFVBQVUsUUFBVztBQUN2QixZQUFNLElBQUksTUFBTSxvQ0FBb0M7QUFBQSxJQUN0RDtBQUVBLFFBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsWUFBTSxJQUFJLE1BQU0scUNBQXFDO0FBQUEsSUFDdkQ7QUFFQSxXQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sUUFBUTtBQUFBLEVBQ3pDO0FBQ0Y7QUE3Q3dCO0FBQWpCLElBQU0sVUFBTjtBQW9FQSxTQUFTLGNBQTBCLGNBQThCO0FBQ3RFLFNBQU8sSUFBSSxRQUFRLFlBQVk7QUFDakM7QUFGZ0I7QUFTVCxTQUFTLFdBQXVCLFNBQW9DO0FBQ3pFLFNBQU8sUUFBUSxRQUFRO0FBQ3pCO0FBRmdCOzs7QUN2RmhCLElBQUFDLGdCQUEyQjtBQUVwQixJQUFNLGlCQUFpQixJQUFJLHlCQUE0Qjs7O0FDQXZELFNBQVMsb0JBQW9CO0FBQ2xDLFNBQU87QUFDVDtBQUZnQjs7O0FDUVQsSUFBTSxnQkFBZ0IsY0FBc0I7QUFFbkQsSUFBTSxxQkFBcUIsNkJBQU07QUFDL0IsU0FBTyxrQkFBa0IsRUFBRSxJQUFJLFdBQVc7QUFDNUMsR0FGMkI7QUFPcEIsU0FBUyxnQkFBZ0IsVUFBa0IsV0FBVyxPQUFPO0FBQ2xFLE1BQUksYUFBYTtBQUVqQixNQUFJO0FBRUosTUFBSSxFQUFFLFNBQVMsY0FBYyxRQUFRLElBQUk7QUFDdkMsYUFBUyxtQkFBbUI7QUFDNUIsaUJBQWE7QUFBQSxFQUNmO0FBRUEsTUFBSSxDQUFDO0FBQ0wsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLE1BQ0Esb0NBQ0EsYUFDQSx1RUFDQSx1REFBdUQ7QUFBQSxJQUV6RDtBQUVBLE1BQUksU0FBVSxRQUFPLEVBQUUsUUFBUSxTQUFTLENBQUMsR0FBZSxXQUFXO0FBRW5FLE1BQUk7QUFFSixNQUFJLENBQUMsWUFBWTtBQUNmLGNBQVUsV0FBVyxPQUFPLE9BQU87QUFDbkMsUUFBSSxDQUFDO0FBQ0wsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLFFBQ0EsR0FBRyxRQUFRO0FBQUEsTUFDYjtBQUFBLEVBQ0YsT0FBTztBQUNMLGNBQVU7QUFBQSxNQUNSLElBQUksUUFBUTtBQUNWLGNBQU0sSUFBSTtBQUFBLFVBQ1I7QUFBQSxVQUNBLEdBQUcsUUFBUTtBQUFBLFFBQ2I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLEVBQUUsU0FBUyxRQUFRLFdBQVc7QUFDdkM7QUEzQ2dCOzs7QUNSVCxTQUFTLFdBQ2hCLE1BQ2lDO0FBQy9CLFFBQU0sRUFBRSxTQUFTLE9BQU8sSUFBSSxnQkFBZ0IsWUFBWTtBQUV4RCxRQUFNLFFBQVEsT0FBTyxPQUFPLElBQVUsUUFBUSxRQUFRLE1BQU0sRUFBRTtBQUM5RCxNQUFJLENBQUMsTUFBTyxRQUFPO0FBRW5CLFNBQU8sTUFBTTtBQUNmO0FBVGdCOzs7QUNBVCxTQUFTLFVBQ2hCLE1BQ29DO0FBQ2xDLFFBQU0sRUFBRSxTQUFTLE9BQU8sSUFBSSxnQkFBZ0IsV0FBVztBQUN2RCxRQUFNLFFBQVEsT0FBTyxPQUFPLElBQVUsUUFBUSxRQUFRLE1BQU0sRUFBRTtBQUM5RCxNQUFJLENBQUMsTUFBTyxRQUFPO0FBRW5CLFNBQU8sTUFBTTtBQUNmO0FBUmdCOzs7QUNBVCxTQUFTLFNBQ2hCLE1BQzBCO0FBQ3hCLFFBQU0sRUFBRSxTQUFTLE9BQU8sSUFBSSxnQkFBZ0IsVUFBVTtBQUN0RCxRQUFNLFFBQVEsT0FBTyxPQUFPLFFBQWMsUUFBUSxRQUFRLE1BQU0sRUFBRTtBQUNsRSxNQUFJLENBQUMsTUFBTyxRQUFPO0FBRW5CLFNBQU87QUFDVDtBQVJnQjs7O0FDTlQsU0FBUyxnQkFBZ0I7QUFDOUIsUUFBTSxFQUFFLE9BQU8sSUFBSSxnQkFBZ0IsaUJBQWlCLElBQUk7QUFFeEQsU0FBTztBQUNUO0FBSmdCOzs7QUNhVCxTQUFTLFlBQ2hCLE1BQ3NCO0FBQ3BCLFFBQU0sRUFBRSxTQUFTLE9BQU8sSUFBSSxnQkFBZ0IsYUFBYTtBQUN6RCxRQUFNLFFBQVEsT0FBTyxPQUFPLElBQU8sUUFBUSxRQUFRLE1BQU0sRUFBRTtBQUMzRCxRQUFNLFNBQVMsd0JBQUMsYUFBaUM7QUFDL0MsUUFBSSxPQUFPO0FBQ1QsVUFBSSxTQUFTLFdBQVcsUUFBUTtBQUNoQyxlQUFPLE1BQU0sWUFBWSxTQUFTLE1BQU0sUUFBUSxDQUFDO0FBQ2pELGFBQU8sTUFBTSxZQUFZLFFBQVE7QUFBQSxJQUNuQztBQUFBLEVBQ0YsR0FOZTtBQVFmLFFBQU0sU0FBUyw2QkFBTTtBQUNuQixXQUFPLE9BQU87QUFBQSxFQUNoQixHQUZlO0FBSWYsU0FBTyxDQUFDLFFBQVEsTUFBTTtBQUN4QjtBQWxCZ0I7OztBQ1VULFNBQVMsWUFDaEIsU0FDNEI7QUFDMUIsUUFBTSxFQUFFLFNBQVMsT0FBTyxJQUFJLGdCQUFnQixhQUFhO0FBQ3pELFFBQU0sUUFBUSxPQUFPLE9BQU8sSUFBSSxTQUFTLFFBQVEsUUFBUSxNQUFNLEVBQUU7QUFDakUsTUFBSSxDQUFDLE1BQU8sUUFBTztBQUVuQixRQUFNLFdBQVcsT0FBTyxrQkFBa0I7QUFBQSxJQUN4QyxJQUFJLFlBQVk7QUFDZCxhQUFPLE1BQU0sS0FBSyxhQUFhLFNBQVMsYUFBYTtBQUFBLElBQ3ZEO0FBQUEsSUFDQSxJQUFJLFNBQVM7QUFDWCxhQUFPLE1BQU0sS0FBSztBQUFBLElBQ3BCO0FBQUEsSUFDQSxJQUFJLFNBQVM7QUFDWCxhQUFPLE1BQU0sS0FBSyxTQUFTO0FBQUEsSUFDN0I7QUFBQSxJQUNBLElBQUksUUFBUTtBQUNWLGFBQU8sTUFBTTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFFBQVE7QUFDTixhQUFPLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLE1BQU0sS0FBSyxPQUFPO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFVBQVUsS0FBYTtBQUNyQixhQUFPLE1BQU0sS0FBSyxVQUFVLEdBQUc7QUFBQSxJQUNqQztBQUFBLElBQ0EsTUFBTSxZQUFZLE1BQWM7QUFDOUIsYUFBTyxNQUFNLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDN0I7QUFBQSxFQUNGLENBQThCO0FBRTlCLFNBQU87QUFDVDtBQW5DZ0I7OztBQ3JCVCxTQUFTLG9CQUFvQixTQUFxQztBQUN2RSxvQkFBa0IsRUFBRSxJQUFJLDBCQUEwQixPQUFPO0FBQzNEO0FBRmdCOzs7QUNBVCxTQUFTLHFCQUFxQixTQUFzQztBQUN6RSxvQkFBa0IsRUFBRSxJQUFJLDJCQUEyQixPQUFPO0FBQzVEO0FBRmdCOzs7QUNTVCxTQUFTLFVBQVUsTUFBdUM7QUFDL0QsUUFBTSxFQUFFLFNBQVMsT0FBTyxJQUFJLGdCQUFnQixXQUFXO0FBQ3ZELFFBQU0sUUFBUSxPQUFPLE9BQU8sSUFBSSxRQUFRLFFBQVEsTUFBTSxFQUFFO0FBQ3hELFFBQU0sU0FBUyx3QkFBQyxXQUE4QjtBQUM1QyxRQUFJLE9BQU87QUFDVCxVQUFJLFNBQVMsV0FBVyxNQUFNO0FBQzlCLGVBQU8sTUFBTSxLQUFLLFVBQVUsT0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ3JELGFBQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3BDO0FBQUEsRUFDRixHQU5lO0FBUWYsUUFBTSxTQUFTLDZCQUFNO0FBQ25CLFdBQU8sT0FBTyxLQUFLO0FBQUEsRUFDckIsR0FGZTtBQUlmLFNBQU8sQ0FBQyxRQUFRLE1BQU07QUFDeEI7QUFoQmdCOzs7QWJpRFQsSUFBTSw2QkFBTixNQUFNLG1DQUFrQyxvQkFBOEM7QUFBQSxFQVFwRixZQUFtQixRQUFnQjtBQUN4QyxVQUFNLENBQUMsT0FBTyxDQUFDO0FBRFM7QUFKMUI7QUFBQTtBQUFBO0FBQUEsd0JBQU8sU0FBUSxJQUFJLHlCQUFrQztBQUVyRCx3QkFBZ0IsV0FBVSxjQUFnQztBQUFBLEVBSTFEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxpQkFBZ0M7QUFDckMsV0FBTyxLQUFLLFFBQVEsUUFBUSxHQUFHLE1BQU07QUFBQSxFQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sYUFBYTtBQUNsQixXQUFPLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFBQSxFQUNuQztBQUFBLEVBRUEsTUFBYSxjQUFjO0FBQ3pCLFVBQU0sU0FBUztBQUFBO0FBRWYsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLEVBQWdHLE1BQU07QUFBQTtBQUFBLElBQ3hHO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxVQU9iLFFBQVcsVUFBYSxDQUFDLEdBQVE7QUFDL0IsV0FBTyxRQUFRLENBQUMsUUFBUTtBQUV0QixXQUFLLFNBQVMsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLElBQ3BELENBQUM7QUFFRCxXQUFPLEVBQUUsU0FBUyxNQUFNLE9BQU8sS0FBSztBQUFBLEVBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGFBQWEsWUFBb0I7QUFDdEMsV0FBTyxLQUFLLE1BQU0sSUFBSSxVQUFVO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsT0FBTztBQUNoQixXQUFPLEtBQUssTUFBTTtBQUFBLEVBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLElBQUksWUFBb0I7QUFDN0IsV0FBTyxLQUFLLE1BQU0sSUFBSSxVQUFVO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLFNBQ2IsWUFDQSxTQUNrQztBQUNoQyxRQUNBLE9BQU8sV0FBVyxlQUFlLFlBQ2pDLEtBQUssTUFBTSxJQUFJLFdBQVcsVUFBVTtBQUVwQyxhQUFPO0FBQ1AsVUFBTSxZQUFZLElBQUksV0FBVyxNQUFNLE9BQU87QUFFOUMsUUFBSTtBQUNGLFdBQUssTUFBTSxJQUFJLFdBQVcsWUFBWSxTQUFTO0FBQy9DLFVBQUksS0FBSyxPQUFPO0FBQ2hCLGFBQUssT0FBTyxNQUFNLEdBQUcsV0FBVyxVQUFVLG9CQUFvQjtBQUM5RCxXQUFLLEtBQUssY0FBYyxNQUFNLFNBQVM7QUFDdkMsWUFBTSxVQUFVLFNBQVM7QUFDekIsVUFBSSxLQUFLLE9BQU87QUFDaEIsYUFBSyxPQUFPLE1BQU0sR0FBRyxXQUFXLFVBQVUsdUJBQXVCO0FBQ2pFLFdBQUssS0FBSyxZQUFZLE1BQU0sU0FBUztBQUNyQyxhQUFPO0FBQUEsSUFDVCxTQUFTLEdBQUc7QUFDVixXQUFLLE1BQU0sT0FBTyxXQUFXLFVBQVU7QUFDdkMsVUFBSSxLQUFLLE9BQU87QUFDaEIsYUFBSyxPQUFPO0FBQUEsVUFDVixHQUFHLFdBQVcsVUFBVSx5Q0FBeUMsQ0FBQztBQUFBLFFBQ3BFO0FBQ0EsV0FBSyxLQUFLLFNBQVMsTUFBTSxXQUFXLENBQVU7QUFDOUMsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsV0FBNkMsWUFBZTtBQUN2RSxVQUFNLFlBQ04sT0FBTyxlQUFlLFdBQ3RCLEtBQUssTUFBTSxJQUFJLFVBQVUsSUFDekIsS0FBSyxNQUFNLEtBQUssQ0FBQyxNQUFNLE1BQU0sVUFBVTtBQUN2QyxRQUFJLENBQUMsVUFBVztBQUVoQixRQUFJO0FBQ0YsWUFBTSxNQUNOLFVBQVUsY0FBYyxLQUFLLE1BQU0sUUFBUSxDQUFDLE1BQU0sTUFBTSxTQUFTO0FBQ2pFLFdBQUssTUFBTSxPQUFPLEdBQUc7QUFDckIsVUFBSSxLQUFLLE9BQU87QUFDaEIsYUFBSyxPQUFPLE1BQU0sR0FBRyxVQUFVLFVBQVUsc0JBQXNCO0FBQy9ELFdBQUssS0FBSyxnQkFBZ0IsTUFBTSxTQUFTO0FBQ3pDLFlBQU0sVUFBVSxXQUFXO0FBQzNCLFVBQUksS0FBSyxPQUFPO0FBQ2hCLGFBQUssT0FBTyxNQUFNLEdBQUcsVUFBVSxVQUFVLHlCQUF5QjtBQUNsRSxXQUFLLEtBQUssY0FBYyxNQUFNLFNBQVM7QUFBQSxJQUN6QyxTQUFTLEdBQUc7QUFDVixVQUFJLEtBQUssT0FBTztBQUNoQixhQUFLLE9BQU87QUFBQSxVQUNWLEdBQUcsVUFBVSxVQUFVO0FBQUEsUUFDekI7QUFDQSxXQUFLLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBVTtBQUFBLElBQ2hEO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYSxnQkFBZ0I7QUFDM0IsUUFBSTtBQUNGLFlBQU0sUUFBUSxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUM3RCxRQUFRO0FBQUEsSUFHUjtBQUFBLEVBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPSCxNQUFhLElBQ2IsSUFDQSxnQkFBZ0IsTUFDaEI7QUFDRSxVQUFNLFVBQVUsS0FBSyxPQUFPLFFBQVEsbUJBQW1CLENBQUM7QUFFeEQsUUFBSSxDQUFDLEtBQUssTUFBTSxNQUFNO0FBQ3BCLFdBQUs7QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFDQTtBQUFBLElBQ0Y7QUFHQSxVQUFNLGFBQWEsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUTtBQUVwRSxRQUFJLE1BQW9CLE1BQ3RCLFVBQWdDO0FBRWxDLGVBQVcsT0FBTyxXQUFXLE9BQU8sR0FBRztBQUNyQyxVQUFJLGlCQUFpQixRQUFRLEtBQUssQ0FBQyxNQUFNLE1BQU0sSUFBSSxVQUFVLEVBQUc7QUFDaEUsVUFBSSxLQUFLLE9BQU87QUFDaEIsYUFBSyxPQUFPLE1BQU0sdUJBQXVCLElBQUksVUFBVSxLQUFLO0FBQzVELFlBQU0sU0FBUyxNQUFNLEdBQUcsR0FBRyxFQUFFO0FBQUEsUUFDM0IsQ0FBQyxRQUFRO0FBQ1AsaUJBQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxDQUFDLE1BQU07QUFDTCxjQUFJLEtBQUssT0FBTztBQUNoQixpQkFBSyxPQUFPO0FBQUEsY0FDVixhQUFhLElBQUksVUFBVSx1QkFBdUIsQ0FBQztBQUFBLFlBQ3JEO0FBRUEsaUJBQU8sU0FBUyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtBQUFBLFFBQ25EO0FBQUEsTUFDRjtBQUVBLGdCQUFVO0FBRVYsVUFBSSxVQUFVLENBQUMsU0FBUyxRQUFRLE1BQU0sR0FBRztBQUN2QyxZQUFJLEtBQUssT0FBTztBQUNoQixlQUFLLE9BQU87QUFBQSxZQUNWLGFBQWEsSUFBSSxVQUFVO0FBQUEsVUFDN0I7QUFFQSxlQUFPO0FBQUEsVUFDTCxXQUFXO0FBQUEsVUFDWCxPQUFPO0FBQUEsVUFDUDtBQUFBLFFBQ0Y7QUFBQSxNQUNGLFdBQVcsU0FBUyxRQUFRLE1BQU0sR0FBRztBQUNuQyxjQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFFQSxRQUFJO0FBQ0osYUFBTztBQUFBLFFBQ0wsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLE1BQ1Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxjQUNiLE9BQ0Esa0JBQXdDLE1BQU0sV0FDOUM7QUFDRSxVQUFNLHNCQUNOLEtBQUssV0FBVyxHQUFHLDZCQUE2QixvQkFBSSxJQUFZO0FBRWhFLFVBQU0sU0FBUyxNQUFNLEtBQUssSUFBeUIsT0FBTyxRQUFRO0FBQ2hFLFVBQUksbUJBQW1CLElBQUksZUFBZSxnQkFBZ0I7QUFDMUQsZUFBTztBQUNQLFVBQUksb0JBQW9CLElBQUksSUFBSSxVQUFVLEVBQUcsUUFBTztBQUVwRCwwQkFBb0IsSUFBSSxJQUFJLFVBQVU7QUFFdEMsWUFBTUMsVUFBUyxNQUFNLElBQUksT0FBTyxPQUFPLGVBQWU7QUFFdEQsVUFBSSxDQUFDQSxRQUFRLFFBQU87QUFFcEIsYUFBT0E7QUFBQSxJQUNULENBQUM7QUFFRCxRQUFJLENBQUMsUUFBUTtBQUNiLFlBQU0sSUFBSTtBQUFBLFFBQ1IsS0FBSyxlQUFlO0FBQUEsUUFDcEIsUUFBUSxPQUFPLFNBQ2YsUUFBUSxPQUFPLFdBQ2Y7QUFBQSxNQUNGO0FBRUEsVUFBTSxtQkFBbUIsT0FBTztBQUVoQyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxrQkFDYixPQUNBLGlCQUNBLGlCQUNBO0FBQ0UsVUFBTSxTQUFTLEtBQUssUUFBUSxlQUFlO0FBQzNDLFFBQUksQ0FBQyxPQUFRLFFBQU87QUFDcEIsV0FBTyxPQUFPLE9BQU8sT0FBTyxlQUFlO0FBQUEsRUFDN0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQVcsWUFBb0I7QUFDcEMsV0FBTyxLQUFLLE9BQU8sUUFBUSxpQkFBaUIsU0FBUyxVQUFVLEtBQUs7QUFBQSxFQUN0RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVSxZQUFvQjtBQUNuQyxXQUFPLENBQUMsS0FBSyxXQUFXLFVBQVU7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVSxZQUFpQztBQUNoRCxXQUFPLE9BQU8sZUFBZSxXQUFXLGFBQWEsV0FBVztBQUFBLEVBQ2xFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxRQUFRLFlBQWlDO0FBQzlDLFdBQU8sT0FBTyxlQUFlLFdBQVcsS0FBSyxJQUFJLFVBQVUsSUFBSTtBQUFBLEVBQ2pFO0FBQ0Y7QUFyVDZGO0FBQXRGLElBQU0sNEJBQU47OztBYzVEUCxJQUFBQyxnQkFBMEM7OztBQ0oxQyxJQUFBQyxrQkFNQTtBQUNBLElBQUFDLGdCQUFpRDs7O0FDUmpELDBCQVlBO0FBR0EsSUFBQUMsZ0JBQTZCO0FBRzdCLHVCQVdBOzs7QUM3QkEseUJBQWlFO0FBQWpFO0FBb0JPLElBQU0scUJBQU4sTUFBTSwyQkFBMEIsNkJBQVU7QUFBQSxFQUExQztBQUFBO0FBQ0wsd0JBQWdCLGdCQUFlLG9CQUFJLElBQWM7QUFDakQsc0NBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtULG9CQUEwQjtBQUMvQix1QkFBSyxlQUFnQjtBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLG1CQUF5QjtBQUM5Qix1QkFBSyxlQUFnQjtBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxpQkFBMEI7QUFDL0IsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQSxFQUVPLFdBQ1AsT0FDQSxVQUNBLFVBQ087QUFDTCxTQUFLLEtBQUssT0FBTyxRQUFRO0FBRXpCLFFBQUksbUJBQUssa0JBQWlCLEtBQUssYUFBYSxPQUFPLEdBQUc7QUFDcEQsaUJBQVcsWUFBWSxLQUFLLGNBQWM7QUFDeEMsaUJBQVMsTUFBTSxPQUFPLFFBQVE7QUFBQSxNQUNoQztBQUFBLElBQ0Y7QUFFQSxhQUFTO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxVQUFtQztBQUN4QyxlQUFXLFlBQVksS0FBSyxjQUFjO0FBQ3hDLGVBQVMsSUFBSTtBQUFBLElBQ2Y7QUFFQSxhQUFTO0FBQUEsRUFDWDtBQUFBLEVBRU8sU0FBUyxPQUFjLFVBQW1DO0FBQy9ELFVBQU0sY0FBYyxPQUFPLEtBQUssRUFBRSxTQUFTLDRCQUE0QjtBQUN2RSxVQUFNLE1BQU0sY0FBYyxTQUFZO0FBRXRDLGVBQVcsWUFBWSxLQUFLLGNBQWM7QUFDeEMsZUFBUyxRQUFRLEdBQUc7QUFBQSxJQUN0QjtBQUVBLFNBQUssYUFBYSxNQUFNO0FBRXhCLGFBQVMsR0FBRztBQUFBLEVBQ2Q7QUFDRjtBQTVERTtBQUYrQztBQUExQyxJQUFNLG9CQUFOOzs7QURwQlA7QUEwRkEsSUFBTSxvQkFBTixNQUFNLDBCQUF5QiwyQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWV2RCxZQUNBLFlBQ0EsU0FDTyxPQUNTLG9CQUE0QixLQUM1QyxhQUNBO0FBQ0UsVUFBTTtBQUpEO0FBQ1M7QUFsQmhCLHdCQUFPO0FBQ1Asd0JBQU87QUFDUCx3QkFBTztBQUNQLHdCQUFPO0FBQ1Asd0JBQU8sT0FBTSxJQUFJLDhCQUFhO0FBRTlCLHFDQUF5QztBQXFCdkMsU0FBSyxrQkFBa0I7QUFNdkIsU0FBSyxjQUNMLG1CQUNBLHVDQUFrQjtBQUFBLE1BQ2hCLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDcEIsQ0FBQztBQU1ELFNBQUssVUFBVTtBQUVmLFNBQUssZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE1BQU0sS0FBSyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7QUFDbEUsU0FBSyxnQkFBZ0I7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsQ0FBQyxVQUFVLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBeUI7QUFBQSxJQUM5RDtBQUNBLFNBQUssWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEtBQUssS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBQzlELFNBQUssWUFBWSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBRXRFLFNBQUssSUFBSSxXQUFXLE1BQU07QUFDeEIsVUFBSSxDQUFDLEtBQUssSUFBSztBQUVmLFVBQUksS0FBSyxJQUFJLFNBQVMsU0FBUztBQUM3QixhQUFLLEtBQUssT0FBTyxLQUFLLElBQUksU0FBUyxPQUFPO0FBQUEsTUFDNUM7QUFFQSxVQUFJLEtBQUssSUFBSSxRQUFRLFNBQVM7QUFDNUIsYUFBSyxLQUFLLFVBQVUsS0FBSyxJQUFJLFFBQVEsT0FBTztBQUFBLE1BQzlDO0FBRUEsVUFBSSxLQUFLLElBQUksV0FBVztBQUN0QixhQUFLLEtBQUssV0FBVyxLQUFLLElBQUksVUFBVSxNQUFNLENBQUM7QUFBQSxNQUNqRDtBQUVBLFVBQUksS0FBSyxJQUFJLFFBQVE7QUFDbkIsYUFBSyxLQUFLLFVBQVUsS0FBSyxJQUFJLE9BQU8sTUFBTTtBQUFBLE1BQzVDO0FBRUEsVUFBSSxLQUFLLElBQUksV0FBVztBQUN0QixhQUFLLEtBQUssY0FBYyxLQUFLLElBQUksVUFBVSxjQUFjLENBQUM7QUFBQSxNQUM1RDtBQUNBLFVBQUksS0FBSyxJQUFJLFlBQVk7QUFDdkIsYUFBSyxLQUFLLGNBQWMsS0FBSyxJQUFJLFdBQVcsY0FBYyxDQUFDO0FBQUEsTUFDN0Q7QUFFQSxVQUFJLEtBQUssSUFBSSxRQUFRO0FBQ25CLGFBQUssS0FBSyxVQUFVLEtBQUssSUFBSSxPQUFPLGNBQWMsQ0FBQztBQUFBLE1BQ3JEO0FBRUEsVUFBSSxLQUFLLElBQUksUUFBUTtBQUNuQixhQUFLLEtBQUssVUFBVSxLQUFLLElBQUksT0FBTyxjQUFjLENBQUM7QUFBQSxNQUNyRDtBQUFBLElBQ0Y7QUFFQSxTQUFLLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLFNBQVMsQ0FBcUI7QUFFbEUsU0FBSyxnQkFDTCxHQUFHLDBDQUFzQixjQUFjLE9BQU8sVUFBVSxhQUFhO0FBQ25FLFVBQUksU0FBUyxXQUFXLG9EQUFnQyxRQUFRO0FBQzlELGFBQUssUUFBUTtBQUNiO0FBQUEsTUFDRjtBQUVBLFVBQ0EsU0FBUyxXQUFXLG9EQUFnQyxrQkFDcEQsU0FBUyxjQUFjLE1BQ3ZCO0FBQ0UsWUFBSTtBQUNGLG9CQUFNO0FBQUEsWUFDSixLQUFLO0FBQUEsWUFDTCwwQ0FBc0I7QUFBQSxZQUN0QixLQUFLO0FBQUEsVUFDUDtBQUFBLFFBQ0YsUUFBUTtBQUNOLGNBQUk7QUFDRixnQkFDQSxLQUFLLGdCQUFnQixNQUFNLFdBQzNCLDBDQUFzQjtBQUV0QixtQkFBSyxRQUFRO0FBQUEsVUFDZixTQUFTLEtBQUs7QUFDWixpQkFBSyxLQUFLLFNBQVMsR0FBdUI7QUFBQSxVQUM1QztBQUFBLFFBQ0Y7QUFBQSxNQUNGLFdBQVcsS0FBSyxnQkFBZ0IsaUJBQWlCLEdBQUc7QUFDbEQsY0FBTSxLQUFLLE1BQU0sS0FBSyxnQkFBZ0IsaUJBQWlCLEtBQUssR0FBSTtBQUNoRSxhQUFLLGdCQUFnQixPQUFPO0FBQUEsTUFDOUIsT0FBTztBQUNMLFlBQUk7QUFDRixjQUNBLEtBQUssZ0JBQWdCLE1BQU0sV0FDM0IsMENBQXNCO0FBRXRCLGlCQUFLLFFBQVE7QUFBQSxRQUNmLFNBQVMsS0FBSztBQUNaLGVBQUssS0FBSyxTQUFTLEdBQXVCO0FBQUEsUUFDNUM7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDLEVBQ0QsR0FBRywwQ0FBc0IsV0FBVyxNQUFNO0FBQ3hDLFdBQUssSUFBSTtBQUNULFdBQUssTUFBTSxLQUFLLGdCQUFnQixxQkFBcUIsS0FBSyxLQUFLO0FBQUEsSUFDakUsQ0FBQztBQUVELFNBQUssWUFBWSxHQUFHLGVBQWUsQ0FBQyxVQUFVLGFBQWE7QUFDekQsVUFDQSxTQUFTLFdBQVcsc0NBQWtCLFVBQ3RDLFNBQVMsV0FBVyxzQ0FBa0IsUUFDdEM7QUFDRSxhQUFLLE1BQU0sS0FBSyxnQkFBZ0IsYUFBYSxLQUFLLEtBQUs7QUFBQSxNQUN6RDtBQUVBLFVBQ0EsU0FBUyxXQUFXLHNDQUFrQixVQUN0QyxTQUFTLFdBQVcsc0NBQWtCLFFBQ3RDO0FBQ0UsYUFBSyxNQUFNLEtBQUssZ0JBQWdCLGNBQWMsS0FBSyxLQUFLO0FBQUEsTUFDMUQ7QUFFQSxVQUFJLFNBQVMsV0FBVyxzQ0FBa0IsU0FBUztBQUNqRCxZQUNBLFNBQVMsV0FBVyxzQ0FBa0IsUUFDdEMsU0FBUyxXQUFXLHNDQUFrQixXQUN0QztBQUNFLGlCQUFPLEtBQUssS0FBSyxTQUFTLEtBQUssYUFBYztBQUFBLFFBQy9DO0FBQUEsTUFDRixXQUNBLFNBQVMsV0FBVyxzQ0FBa0IsUUFDdEMsU0FBUyxXQUFXLHNDQUFrQixNQUN0QztBQUNFLGFBQUssS0FBSyxVQUFVLEtBQUssYUFBYztBQUN2QyxhQUFLLElBQUksUUFBUTtBQUNqQixhQUFLLGdCQUFnQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRixDQUFDO0FBRUQsU0FBSyxnQkFBZ0IsVUFBVSxLQUFLLFdBQVc7QUFBQSxFQUNqRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxTQUFTO0FBQ1gsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLHNDQUFrQjtBQUFBLEVBQzdEO0FBQUEsRUFFQSxJQUFJLE9BQU8sS0FBYztBQUN2QixVQUFNLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxPQUFPO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQVc7QUFDVCxXQUNFLEtBQUssVUFDTCxLQUFLLFlBQVksTUFBTSxXQUFXLHNDQUFrQjtBQUFBLEVBRXhEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxjQUFjO0FBQ1osV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLHNDQUFrQjtBQUFBLEVBQzdEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxZQUFZO0FBQ1YsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLHNDQUFrQjtBQUFBLEVBQzdEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxTQUFTO0FBQ1AsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLHNDQUFrQjtBQUFBLEVBQzdEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxjQUFjO0FBQ1osV0FDRSxLQUFLLGdCQUFnQixNQUFNLFdBQVcsMENBQXNCO0FBQUEsRUFFaEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGlCQUFpQjtBQUNmLFdBQ0UsS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLDBDQUFzQjtBQUFBLEVBRWhFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxVQUFVO0FBQ1IsV0FBTyxLQUFLLGdCQUFnQixNQUFNLFdBQVcsMENBQXNCO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGVBQWU7QUFDYixXQUNFLEtBQUssZ0JBQWdCLE1BQU0sV0FBVywwQ0FBc0I7QUFBQSxFQUVoRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsZUFBZTtBQUNiLFdBQ0UsS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLDBDQUFzQjtBQUFBLEVBRWhFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFNLGFBQWEsS0FBZSxLQUFzQjtBQUN0RCxRQUFJLENBQUMsS0FBSyxrQkFBa0IsS0FBSyxNQUFNO0FBQ3ZDLFdBQUssTUFBTSxNQUFNLG9DQUFvQztBQUNyRCxVQUFNLFNBQVMsQ0FBQyxLQUFLLGlCQUNyQixLQUFLLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDbkIsS0FBSztBQUFBLFFBQ0gsU0FBUyxLQUFLO0FBQUEsUUFDZCxVQUFVLEtBQUs7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsUUFBUSxLQUFLLGVBQ2I7QUFBQSxRQUNFLFFBQVEsSUFBSTtBQUFBLFFBQ1osVUFBVSxLQUFLO0FBQUEsTUFDakIsSUFDQTtBQUFBLE1BQ0EsV0FBVyxLQUFLLGFBQ2hCO0FBQUEsUUFDRSxpQkFBaUI7QUFBQSxRQUNqQixrQkFBa0IsS0FBSztBQUFBLFFBQ3ZCLFVBQVUsS0FBSztBQUFBLE1BQ2pCLElBQ0E7QUFBQSxNQUNBLFdBQVc7QUFBQSxRQUNULGdCQUFnQixLQUFLO0FBQUEsUUFDckIsVUFBVSxLQUFLO0FBQUEsTUFDakI7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLFFBQVEsS0FBSztBQUFBLFFBQ2IsVUFBVSxLQUFLO0FBQUEsTUFDakI7QUFBQSxNQUNBLFlBQVksS0FBSyxhQUNqQjtBQUFBLFFBQ0UsV0FBVyxLQUFLLFdBQVc7QUFBQSxRQUMzQixPQUFPLEtBQUssV0FBVztBQUFBLFFBQ3ZCLFFBQVEsS0FBSyxXQUFXO0FBQUEsUUFDeEIsU0FBUyxLQUFLLFdBQVc7QUFBQSxRQUN6QixZQUFZLEtBQUssV0FBVztBQUFBLFFBQzVCLFVBQVUsS0FBSztBQUFBLFFBQ2YsV0FBVyxLQUFLLFdBQVc7QUFBQSxNQUM3QixJQUNBO0FBQUEsTUFDQSxRQUFRLEtBQUssU0FDYjtBQUFBLFFBQ0UsVUFBVSxLQUFLLE9BQU87QUFBQSxRQUN0QixTQUFTLEtBQUssT0FBTztBQUFBLFFBQ3JCLFVBQVUsS0FBSyxPQUFPO0FBQUEsUUFDdEIsVUFBVSxLQUFLLE9BQU87QUFBQSxRQUN0QixVQUFVLEtBQUs7QUFBQSxNQUNqQixJQUNBO0FBQUEsTUFDQSxRQUFRLEtBQUssU0FDYjtBQUFBLFFBQ0UsVUFBVSxLQUFLO0FBQUEsUUFDZixZQUFZLEtBQUssT0FBTztBQUFBLFFBQ3hCLFlBQVk7QUFBQSxRQUNaLFVBQVU7QUFBQSxRQUNWLGVBQWUsS0FBSyxPQUFPO0FBQUEsTUFDN0IsSUFDQTtBQUFBLElBQ0YsQ0FBQyxJQUNEO0FBRUEsUUFBSSxLQUFLLElBQUksUUFBUTtBQUVuQixXQUFLLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxTQUFvQjtBQUM5QyxhQUFLLE1BQU0sS0FBSyxZQUFZLElBQUksRUFBRSxNQUFNLE1BQU07QUFBQSxRQUFDLENBQUM7QUFBQSxNQUNsRCxDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksS0FBSyxNQUFNLGFBQWE7QUFDMUIsV0FBSyxNQUFNLE1BQU0sdUNBQXVDO0FBQUEsSUFDMUQ7QUFFQSxVQUFNLGFBQWEsTUFBTSxLQUFLLE1BQzlCLHNCQUFzQixRQUFRLEtBQUssT0FBTyxLQUFLLElBQUksRUFDbkQ7QUFBQSxNQUNFLE9BQ0M7QUFBQSxRQUNDO0FBQUEsUUFDQSxNQUFNLEtBQUssUUFBUSwrQkFBVztBQUFBLE1BQ2hDO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBSyxNQUFNLFlBQWEsTUFBSyxNQUFNLE1BQU0sNEJBQTRCO0FBRXpFLFVBQU0sU0FBUyxZQUFZLFFBQVEsS0FBSyxRQUFRLCtCQUFXO0FBRTNELFFBQUk7QUFFSixRQUFJLEtBQUssTUFBTSxhQUFhLEdBQUc7QUFDN0IseUJBQUssY0FBZSxJQUFJLGtCQUFrQjtBQUcxQyxPQUFDLFlBQVksVUFBVSxRQUFRLEtBQUssbUJBQUssYUFBWTtBQUVyRCxnQkFBVSxtQkFBSztBQUVmLFlBQU0sS0FBSyxNQUFNLE9BQU87QUFBQSxRQUN0QixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTDtBQUFBLFFBQ0EsbUJBQUs7QUFBQSxNQUNQO0FBQUEsSUFDRixPQUFPO0FBQ0wsZ0JBQVUsWUFBWSxVQUFVO0FBQUEsSUFDbEM7QUFFQSxTQUFLLG9CQUFnQix5Q0FBb0IsU0FBUztBQUFBLE1BQ2hELFdBQVc7QUFBQSxNQUNYLFVBQVUsS0FBSztBQUFBO0FBQUEsTUFFZixjQUFjO0FBQUEsSUFDaEIsQ0FBQztBQUVELFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVBLElBQVcsWUFBWTtBQUNyQixXQUFPLEtBQUssS0FBSztBQUFBLEVBQ25CO0FBQUEsRUFFQSxJQUFXLFVBQVU7QUFDbkIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNuQjtBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUM3QjtBQUFBLEVBRUEsSUFBVyxZQUFZO0FBQ3JCLFdBQU8sS0FBSyxLQUFLLGFBQWE7QUFBQSxFQUNoQztBQUFBLEVBRUEsSUFBVyxhQUFhO0FBQ3RCLFdBQU8sS0FBSyxLQUFLLGNBQWM7QUFBQSxFQUNqQztBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUM3QjtBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxJQUFJLFNBQVM7QUFDWCxXQUFPLEtBQUssWUFBWSxNQUFNO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsYUFBYTtBQUNYLFFBQUk7QUFDRixVQUFJLEtBQUssWUFBYSxNQUFLLFlBQVksS0FBSyxJQUFJO0FBQ2hELFVBQUksS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLDBDQUFzQjtBQUNoRSxhQUFLLGdCQUFnQixRQUFRO0FBQUEsSUFDL0IsUUFBUTtBQUFBLElBQUM7QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxVQUFVO0FBQ2YsU0FBSyxXQUFXO0FBRWhCLFNBQUssWUFBWSxtQkFBbUI7QUFFcEMsU0FBSyxnQkFBZ0IsbUJBQW1CO0FBQ3hDLFNBQUssSUFBSSxRQUFRO0FBQ2pCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssS0FBSyxXQUFXO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBTTtBQUNKLFFBQUk7QUFDRixXQUFLLFlBQVksS0FBSztBQUN0QixXQUFLLElBQUksUUFBUTtBQUFBLElBQ25CLFFBQVE7QUFBQSxJQUdSO0FBQUEsRUFBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ILE1BQU0sb0JBQThCO0FBQ2xDLFVBQU0sVUFBVSxLQUFLLFlBQVksTUFBTSxrQkFBa0I7QUFDekQsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsU0FBUztBQUNQLFVBQU0sVUFBVSxLQUFLLFlBQVksUUFBUTtBQUN6QyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBTSxXQUFXLFdBQWlDLEtBQUssZUFBZ0I7QUFDckUsUUFBSSxDQUFDLFVBQVU7QUFDYixZQUFNLElBQUkscUJBQXFCO0FBQUEsSUFDakM7QUFDQSxRQUFJLFNBQVMsT0FBTztBQUNsQixhQUFPLEtBQUssS0FBSyxLQUFLLFVBQVUsUUFBUTtBQUFBLElBQzFDO0FBQ0EsUUFBSSxDQUFDLEtBQUssY0FBZSxNQUFLLGdCQUFnQjtBQUM5QyxRQUFJLEtBQUssZ0JBQWdCLE1BQU0sV0FBVywwQ0FBc0IsT0FBTztBQUNyRSxVQUFJO0FBQ0Ysa0JBQU07QUFBQSxVQUNKLEtBQUs7QUFBQSxVQUNMLDBDQUFzQjtBQUFBLFVBQ3RCLEtBQUs7QUFBQSxRQUNQO0FBQUEsTUFDRixTQUFTLEtBQUs7QUFDWixlQUFPLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBdUI7QUFBQSxNQUN4RDtBQUFBLElBQ0Y7QUFFQSxRQUFJO0FBQ0YsV0FBSyxZQUFZLEtBQUssUUFBUTtBQUFBLElBQ2hDLFNBQVMsR0FBRztBQUNWLFdBQUssS0FBSyxTQUFTLENBQXFCO0FBQUEsSUFDMUM7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLFVBQVUsT0FBZTtBQUN2QixRQUFJLENBQUMsS0FBSyxJQUFJLE9BQVEsUUFBTztBQUM3QixXQUFPLEtBQUssSUFBSSxPQUFPLFVBQVUsS0FBSztBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLElBQUksU0FBUztBQUNYLFFBQUksQ0FBQyxLQUFLLElBQUksT0FBUSxRQUFPO0FBQzdCLFdBQU8sS0FBSyxJQUFJLE9BQU87QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxJQUFJLGFBQWE7QUFDZixRQUFJLENBQUMsS0FBSyxjQUFlLFFBQU87QUFDaEMsV0FBTyxLQUFLLGNBQWM7QUFBQSxFQUM1QjtBQUNGO0FBbmhCRTtBQVB1RDtBQUF6RCxJQUFNLG1CQUFOOzs7QUR0RUEsSUFBQUMsdUJBTUE7OztBRzFCQSxJQUFBQyxnQkFBc0I7QUFNZixJQUFNLHFCQUFOLE1BQU0sbUJBQThCO0FBQUEsRUFFbEMsWUFBbUIsT0FBeUI7QUFBekI7QUFEMUIsd0JBQU8sVUFBUyxJQUFJLG9CQUFhLE1BQU07QUFBQSxFQUNhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLcEQsSUFBVyxlQUFlO0FBQ3hCLFdBQ0UsS0FBSyxNQUFNLFlBQVksZUFBZTtBQUFBLElBRXJDLEtBQUssTUFBYztBQUFBLEVBRXhCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDckIsV0FBTyxLQUFLLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSztBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGdCQUFnQjtBQUN6QixXQUFPLEtBQUssT0FBTyxHQUFHLENBQUMsS0FBSztBQUFBLEVBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFdBQVc7QUFDcEIsV0FBTyxLQUFLLE1BQU0sUUFBUTtBQUFBLEVBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDaEIsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBLEVBRU8sVUFBVTtBQUNmLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDZixXQUFPLEtBQUssT0FBTyxPQUFPO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sS0FBSyxPQUF3QjtBQUNsQyxRQUFJLEtBQUssU0FBVSxRQUFPO0FBQzFCLFNBQUssT0FBTyxJQUFJLEtBQUs7QUFFckIsU0FBSyxPQUFPO0FBRVosV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFFBQVE7QUFDYixTQUFLLE9BQU8sTUFBTTtBQUFBLEVBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFhLE9BQU87QUFDbEIsVUFBTSxRQUFRLEtBQUs7QUFDbkIsUUFBSSxDQUFDLE9BQU87QUFDVixZQUFNLElBQUksY0FBYyw0QkFBNEI7QUFBQSxJQUN0RDtBQUVBLFNBQUssTUFBTSxLQUFLLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsYUFBYTtBQUFBLElBQ2YsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsU0FBUyxrQkFBa0IsTUFBTTtBQUM1QyxVQUFNLFFBQVEsS0FBSyxPQUFPLFNBQVM7QUFDbkMsUUFBSSxDQUFDLE9BQU87QUFDVixZQUFNLElBQUksY0FBYyxnQ0FBZ0M7QUFBQSxJQUMxRDtBQUVBLFVBQU0sVUFBVSxLQUFLO0FBRXJCLFVBQU0sS0FBSyxNQUFNLEtBQUssS0FBSyxPQUFPLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFDbEQsUUFBSSxXQUFXLGdCQUFpQixNQUFLLE1BQU0sS0FBSyxPQUFPLFNBQVMsQ0FBQztBQUFBLEVBQ25FO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxLQUFLLGtCQUFrQixNQUFNO0FBQ2xDLFdBQU8sS0FBSyxTQUFTLGVBQWU7QUFBQSxFQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNkLFFBQUksQ0FBQyxPQUFPLFNBQVMsS0FBSyxNQUFNLGNBQWMsRUFBRztBQUNqRCxRQUFJLEtBQUssT0FBTyxNQUFNLFNBQVMsS0FBSyxNQUFNLGVBQWdCO0FBQzFELFNBQUssT0FBTyxNQUFNLE9BQU8sS0FBSyxNQUFNLGNBQWM7QUFBQSxFQUNwRDtBQUNGO0FBdkgyQztBQUFwQyxJQUFNLG9CQUFOOzs7QUNOUCxJQUFBQyx1QkFBMEM7QUFDMUMsb0JBQXlCO0FBS3pCLElBQUFDLG1CQUFzQzs7O0FDTnRDLElBQUFDLGtCQUE4QjtBQVd2QixJQUFNLGNBQU4sTUFBTSxZQUFXO0FBQUEsRUFBakI7QUFJTDtBQUFBO0FBQUE7QUFBQSx3QkFBTyxXQUFrQyxDQUFDO0FBRTFDLHdCQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBTSxVQUFVLE9BQU87QUFDNUIsUUFBSSxTQUFTO0FBQ1gsV0FBSyxRQUFRLFFBQVEsQ0FBQyxVQUFVLE1BQU0sUUFBUSxDQUFDO0FBQUEsSUFDakQ7QUFFQSxTQUFLLFVBQVUsQ0FBQztBQUFBLEVBQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDaEIsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFlTyxRQUFRLFNBQXdDO0FBQ3JELFVBQU0sUUFBUSxJQUFJLGdCQUFnQixNQUFNLE9BQU87QUFFL0MsUUFBSSxLQUFLLGlCQUFrQixPQUFNLFFBQVEsRUFBRSxNQUFNLEtBQUssZ0JBQWdCO0FBRXRFLFFBQUksS0FBSyxRQUFRLFdBQVcsR0FBRztBQUM3QixXQUFLLFFBQVEsS0FBSyxLQUFLO0FBQ3ZCLFlBQU0sUUFBUTtBQUNkLGFBQU87QUFBQSxJQUNUO0FBRUEsU0FBSyxRQUFRLEtBQUssS0FBSztBQUN2QixXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBZ0I7QUFDckIsUUFBSSxDQUFDLEtBQUssUUFBUSxPQUFRO0FBRTFCLFNBQUssUUFBUSxNQUFNO0FBQ25CLFNBQUssUUFBUSxDQUFDLEdBQUcsUUFBUTtBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2pCLFNBQUssUUFBUSxRQUFRLENBQUMsVUFBVSxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFlBQVksT0FBd0I7QUFDekMsVUFBTSxXQUFXLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFFM0MsUUFBSSxhQUFhLElBQUk7QUFDbkIsV0FBSyxRQUFRLE9BQU8sVUFBVSxDQUFDO0FBQy9CLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQXRGd0I7QUFBakIsSUFBTSxhQUFOO0FBd0ZBLElBQU0sbUJBQU4sTUFBTSxpQkFBZ0I7QUFBQSxFQVFwQixZQUNBLE9BQ0EsU0FDUDtBQUZPO0FBQ0E7QUFUUCx3QkFBZ0IsTUFBSyw4QkFBYyxTQUFTLEVBQUUsU0FBUztBQUN2RCx3QkFBaUI7QUFDakIsd0JBQU8sVUFBNkI7QUFDcEMsd0JBQU8sV0FBK0I7QUFDdEMsd0JBQVE7QUFDUix3QkFBUTtBQU1OLFNBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQ0MsVUFBUyxXQUFXO0FBQzlDLFdBQUssVUFBVUE7QUFDZixXQUFLLFNBQVM7QUFBQSxJQUNoQixDQUFDO0FBRUQsUUFBSSxLQUFLLFNBQVMsUUFBUTtBQUN4QixXQUFLLGVBQWUsS0FBSyxRQUFRLE1BQU07QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFBQSxFQUVPLGVBQWUsUUFBcUI7QUFDekMsUUFBSSxPQUFPLFFBQVM7QUFDcEIsU0FBSyxTQUFTO0FBQ2QsU0FBSyxVQUFVLE1BQU07QUFDbkIsV0FBSyxNQUFNLFlBQVksSUFBSTtBQUMzQixXQUFLLE9BQU87QUFBQSxJQUNkO0FBRUEsU0FBSyxPQUFPLGlCQUFpQixTQUFTLEtBQUssT0FBTztBQUFBLEVBQ3BEO0FBQUEsRUFFTyxVQUFVO0FBQ2YsU0FBSyxRQUFRO0FBQ2IsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRU8sVUFBVTtBQUNmLFNBQUssUUFBUTtBQUNiLFNBQUssTUFBTSxRQUFRO0FBQUEsRUFDckI7QUFBQSxFQUVPLFNBQVM7QUFDZCxTQUFLLFFBQVE7QUFDYixTQUFLLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUFBLEVBQ3BDO0FBQUEsRUFFTyxVQUFVO0FBQ2YsUUFBSSxLQUFLLFFBQVMsTUFBSyxRQUFRLG9CQUFvQixTQUFTLEtBQUssT0FBTztBQUN4RSxTQUFLLFNBQVM7QUFDZCxTQUFLLFVBQVU7QUFBQSxFQUNqQjtBQUFBLEVBRU8sVUFBVTtBQUNmLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDRjtBQXpENkI7QUFBdEIsSUFBTSxrQkFBTjs7O0FEbEZQLGtCQUFxRDtBQUc5QyxJQUFNLHFCQUFxQjtBQXBCbEM7QUFrRk8sSUFBTSx3QkFBTixNQUFNLHNCQUFpQztBQUFBLEVBSXJDLFlBQW1CLE9BQXlCO0FBQXpCO0FBSnJCO0FBQ0wsa0NBQVk7QUFDWiwrQ0FBeUI7QUFDekIsd0JBQU8sY0FBYSxJQUFJLFdBQVc7QUFFakMsdUJBQUssd0JBQXlCLHNCQUFzQjtBQUFBLE1BQ2xELEtBQUssTUFBTSxPQUFPLFNBQVM7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFNBQVM7QUFDZCxXQUFPLENBQUMsQ0FBQyxLQUFLLE1BQU0sWUFBWSxPQUFPO0FBQUEsRUFDekM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGNBQWM7QUFDbkIsV0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLFlBQVksWUFBWTtBQUFBLEVBQzlDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2pCLFdBQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxZQUFZLFVBQVU7QUFBQSxFQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sV0FBVztBQUNoQixXQUFPLENBQUMsQ0FBQyxLQUFLLE1BQU0sWUFBWSxTQUFTO0FBQUEsRUFDM0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGdCQUFnQjtBQUNyQix1QkFBSyxXQUFZO0FBQUEsRUFDbkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFlBQVksVUFBa0I7QUFDbkMsdUJBQUssV0FBWTtBQUFBLEVBQ25CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGFBQWE7QUFDdEIsV0FBTyxLQUFLLE1BQU0sWUFBWSxjQUFjO0FBQUEsRUFDOUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZUFBZTtBQUN4QixRQUFJLEtBQUssTUFBTSxRQUFRLFFBQVE7QUFDN0IsWUFBTSxNQUFNLEtBQUssTUFBTSxRQUFRLE9BQU8sWUFBWTtBQUNsRCxVQUFJLE1BQU0sRUFBRyxRQUFPO0FBQUEsSUFDdEI7QUFFQSxVQUFNLE1BQU0sbUJBQUssYUFBWSxLQUFLO0FBRWxDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyx3QkFBd0I7QUFDN0IsVUFBTSxlQUFlLEtBQUssTUFBTSxRQUFRLE9BQ3hDLFFBQVEsRUFDUixPQUFPLENBQUMsT0FBTyxtQkFBbUIsS0FBSyxFQUFFLENBQUM7QUFDMUMsVUFBTSxjQUFjLGFBQ3BCLElBQUksQ0FBQyxNQUFNO0FBQ1QsYUFBTyxXQUFXLG1CQUFtQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQVc7QUFBQSxJQUM3RCxDQUFDLEVBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2QixXQUFPLENBQUMsWUFBWSxTQUNwQixJQUNBLFlBQVksT0FBTyxDQUFDLGFBQWEsWUFBWSxVQUFVLFdBQVc7QUFBQSxFQUNwRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyx3QkFBd0I7QUFDakMsVUFBTSxNQUFNLEtBQUs7QUFDakIsVUFBTSxNQUFNLEtBQUssc0JBQXNCLElBQUk7QUFFM0MsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzdCLFVBQU0sTUFBTSxLQUFLO0FBR2pCLFVBQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLHNCQUFzQixDQUFDO0FBR3pELFFBQUksS0FBSyxNQUFNLFFBQVEsV0FBVztBQUVoQyxZQUFNLFFBQVEsS0FBSyxNQUFNLFFBQVEsVUFBVSxTQUFTO0FBQ3BELFVBQUksU0FBUyxFQUFHLFFBQU87QUFFdkIsYUFBTyxLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsSUFDL0I7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxnQkFBZ0I7QUFDekIsVUFBTSx5QkFBeUIsS0FBSyxNQUFNLFFBQVE7QUFDbEQsVUFBTSxRQUFRLEtBQUssTUFBTTtBQUV6QixRQUFJLHdCQUF3QjtBQUMxQixZQUFNLHlCQUNOLE9BQU8sWUFBWSxRQUNuQixPQUFPLE1BQU0sYUFBYSxZQUMxQixZQUFZLE1BQU0sWUFDbEIsTUFBTSxTQUFTLFVBQVU7QUFDekIsWUFBTSxtQkFBbUIsT0FBTyxnQkFBZ0I7QUFFaEQsVUFBSSwwQkFBMEIsa0JBQWtCO0FBQzlDLGNBQU0sV0FDTixNQUFNLGNBQWMsY0FFcEIsTUFLQSxVQUFVLE9BQU87QUFFakIsWUFBSSxTQUFTLFNBQVMsUUFBUSxFQUFHLFFBQU87QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFFQSxXQUFPLE9BQU8sY0FBYztBQUFBLEVBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGFBQWEsZ0JBQWdCLE9BQStCO0FBQ2pFLFFBQUksQ0FBQyxLQUFLLE1BQU0sYUFBYyxRQUFPO0FBRXJDLFVBQU0sVUFBVSxnQkFDaEIsS0FBSyxlQUNMLEtBQUs7QUFDTCxVQUFNLFFBQVEsZ0JBQWdCLEtBQUssZ0JBQWdCLEtBQUs7QUFFeEQsV0FBTztBQUFBLE1BQ0wsU0FBUztBQUFBLFFBQ1AsT0FBTyxLQUFLLGNBQWMsS0FBSyxRQUFRLE9BQU8sQ0FBQztBQUFBLFFBQy9DLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCxPQUFPLEtBQUssY0FBYyxLQUFLLFFBQVEsS0FBSyxDQUFDO0FBQUEsUUFDN0MsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLFVBQVUsS0FBSyxNQUFNLFVBQVUsUUFBUSxHQUFHO0FBQUEsSUFDNUM7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGtCQUFrQixTQUFvQztBQUMzRCxVQUFNLFlBQVksS0FBSyxhQUFhO0FBQ3BDLFFBQUksQ0FBQyxVQUFXLFFBQU87QUFDdkIsVUFBTTtBQUFBLE1BQ0osWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLE1BQ1QsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLElBQ2QsSUFBSSxXQUFXLENBQUM7QUFDaEIsUUFBSSxNQUFNLE1BQU0sS0FBSyxTQUFTLEtBQUssQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHO0FBQzNELFlBQU0sSUFBSTtBQUFBLFFBQ1I7QUFBQSxRQUNBLE9BQU8sTUFBTTtBQUFBLFFBQ2I7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsS0FBSztBQUFBLE1BQ2pCLFVBQVUsUUFBUSxRQUFRLFVBQVUsTUFBTSxRQUFRO0FBQUEsSUFDcEQ7QUFDQSxRQUFJLFNBQVMsS0FBSyxTQUFTLFFBQVE7QUFDakMsWUFBTSxNQUFNLFNBQVMsT0FBTyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUU7QUFDL0MsVUFBSSxLQUFLLFNBQVM7QUFDbEIsVUFBSSxLQUFLLFVBQVUsT0FBTyxTQUFTLEtBQUssQ0FBQztBQUN6QyxVQUFJLFdBQVc7QUFDYixlQUFPLEdBQUcsVUFBVSxRQUFRLEtBQUssSUFBSSxTQUFTLElBQUksSUFBSTtBQUFBLFVBQ3BEO0FBQUEsUUFDRixDQUFDLElBQUksU0FBUyxJQUFJLFVBQVUsTUFBTSxLQUFLO0FBQUEsTUFDekMsT0FBTztBQUNMLGVBQU8sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQUEsTUFDeEI7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLFdBQVc7QUFDYixlQUFPLEdBQ1AsVUFBVSxRQUFRLEtBQUssSUFDdkIsU0FBUyxJQUFJLFNBQVMsR0FBRyxVQUFVO0FBQUEsVUFDakMsU0FBUztBQUFBLFFBQ1gsQ0FBQyxJQUFJLFNBQVMsSUFBSSxVQUFVLE1BQU0sS0FBSztBQUFBLE1BQ3pDLE9BQU87QUFDTCxlQUFPLEdBQUcsU0FBUyxHQUFHLFVBQVUsT0FBTyxTQUFTLENBQUMsQ0FBQztBQUFBLE1BQ3BEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxLQUFLLFVBQWtCO0FBQ2xDLFFBQUksQ0FBQyxLQUFLLE1BQU0sYUFBYyxRQUFPO0FBQ3JDLFFBQUksYUFBYSxLQUFLLHNCQUF1QixRQUFPO0FBQ3BELFFBQUksV0FBVyxLQUFLLGVBQWU7QUFDakMsYUFBTyxLQUFLLEtBQUs7QUFBQSxRQUNmO0FBQUEsUUFDQSxhQUFhLElBQUk7QUFBQSxVQUNmO0FBQUEsVUFDQSxPQUFPLFFBQVE7QUFBQSxVQUNmO0FBQUEsVUFDQSxPQUFPLEtBQUssYUFBYTtBQUFBLFFBQzNCLEVBQUU7QUFBQSxNQUNKLENBQUM7QUFBQSxJQUNIO0FBQ0EsUUFBSSxXQUFXLEVBQUcsWUFBVztBQUU3QixVQUFNLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFFbEMsUUFBSSxRQUFRO0FBQ1YsYUFBTyxLQUFLLFFBQVE7QUFDcEIsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLEtBQUssTUFBTSxRQUFRLGNBQWMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNO0FBQzVELFVBQUksR0FBRztBQUNMLGFBQUssTUFBTSxLQUFLLGdCQUFnQixZQUFZLEtBQUssT0FBTztBQUFBLFVBQ3RELGlCQUFpQixLQUFLO0FBQUEsVUFDdEIsWUFBWTtBQUFBLFVBQ1osZUFBZSxLQUFLO0FBQUEsUUFDdEIsQ0FBQztBQUFBLE1BQ0g7QUFFQSxhQUFPO0FBQUEsSUFDVCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxNQUFNLFlBQVksVUFBVTtBQUFBLEVBQzFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFVBQVUsS0FBYTtBQUM1QixRQUFJLENBQUMsS0FBSyxNQUFNLFdBQVksUUFBTztBQUNuQyxVQUFNLE1BQU0sS0FBSyxNQUFNLFdBQVcsVUFBVSxHQUFHO0FBQy9DLFFBQUksSUFBSyxNQUFLLE1BQU0sUUFBUSxrQkFBa0IsU0FBUztBQUN2RCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxXQUFXLE1BQXVCO0FBQ3ZDLFNBQUssTUFBTSxZQUFZLGVBQWUsU0FBUztBQUFBLE1BQzdDLFNBQVMsU0FBUyxLQUFLLE1BQU0sU0FBUyxXQUFXLE9BQVE7QUFBQSxJQUMzRDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sVUFBVSxPQUFnQjtBQUMvQixRQUFJLE1BQU8sUUFBTyxLQUFLLE1BQU0sWUFBWSxNQUFNLElBQUksS0FBSztBQUN4RCxXQUFPLEtBQUssTUFBTSxZQUFZLE9BQU8sS0FBSztBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxRQUFRO0FBQ2IsV0FBTyxLQUFLLFVBQVUsSUFBSTtBQUFBLEVBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxTQUFTO0FBQ2QsV0FBTyxLQUFLLFVBQVUsS0FBSztBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxLQUFLLFNBQXVCO0FBQ2pDLFFBQUksQ0FBQyxLQUFLLE1BQU0sV0FBWSxRQUFPO0FBQ25DLFVBQU0sUUFBUSxLQUFLLE1BQU07QUFDekIsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUNuQixTQUFLLE1BQU0saUJBQWlCLEtBQUs7QUFDakMsU0FBSyxNQUFNLFdBQVcsSUFBSTtBQUMxQixVQUFNLEVBQUUsUUFBUSxZQUFZLElBQUksV0FBVztBQUFBLE1BQ3pDO0FBQUEsTUFDQSxhQUFhO0FBQUEsSUFDZjtBQUNBLFNBQUssTUFBTTtBQUFBLE1BQ1QsZ0JBQWdCO0FBQUEsTUFDaEIsS0FBSztBQUFBLE1BQ0w7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE9BQU8sT0FBd0IsWUFBWSxNQUFNO0FBQ3RELFVBQU0sYUFBYSxLQUFLLE1BQU0sT0FBTyxLQUFLLENBQUMsR0FBRyxRQUFRO0FBQ3BELFVBQUksaUJBQWlCLFNBQVMsT0FBTyxVQUFVLFVBQVU7QUFDdkQsZ0JBQVEsT0FBTyxVQUFVLFdBQVcsUUFBUSxNQUFNLFFBQVEsRUFBRTtBQUFBLE1BQzlEO0FBQ0EsVUFBSSxPQUFPLFVBQVUsU0FBVSxRQUFPLFVBQVUsRUFBRTtBQUNsRCxhQUFPLFFBQVE7QUFBQSxJQUNqQixDQUFDO0FBQ0QsUUFBSSxDQUFDLFdBQVksUUFBTztBQUV4QixTQUFLLE1BQU0sT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sV0FBVyxFQUFFO0FBRXpELFFBQUk7QUFDSixXQUFLLE1BQU0sS0FBSyxnQkFBZ0Isa0JBQWtCLEtBQUssT0FBTyxVQUFVO0FBRXhFLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLEtBQUssT0FBd0I7QUFDbEMsVUFBTSxVQUFVLEtBQUssT0FBTyxPQUFPLEtBQUs7QUFDeEMsUUFBSSxDQUFDLFFBQVMsUUFBTztBQUNyQixTQUFLLE1BQU0sT0FBTyxNQUFNLFFBQVEsT0FBTztBQUN2QyxXQUFPLEtBQUssS0FBSztBQUFBLE1BQ2Y7QUFBQSxNQUNBLGFBQWE7QUFBQSxJQUNmLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGlCQUFpQixPQUFnQztBQUN0RCxXQUFPLEtBQUssTUFBTSxPQUFPLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRO0FBQ3ZELFVBQUksaUJBQWlCLFNBQVMsT0FBTyxVQUFVLFVBQVU7QUFDdkQsZ0JBQVEsT0FBTyxVQUFVLFdBQVcsUUFBUSxNQUFNLFFBQVEsRUFBRTtBQUFBLE1BQzlEO0FBQ0EsVUFBSSxPQUFPLFVBQVUsU0FBVSxRQUFPLFVBQVUsRUFBRTtBQUNsRCxhQUFPLFFBQVE7QUFBQSxJQUNqQixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxPQUFPLE9BQXdCO0FBQ3BDLFVBQU0sTUFBTSxLQUFLLGlCQUFpQixLQUFLO0FBQ3ZDLFFBQUksTUFBTSxFQUFHLFFBQU87QUFDcEIsVUFBTSxVQUFVLEtBQUssT0FBTyxHQUFHO0FBQy9CLFFBQUksQ0FBQyxRQUFTLFFBQU87QUFDckIsVUFBTSxXQUFXLEtBQUssTUFBTSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxLQUFLLEdBQUc7QUFDbEUsU0FBSyxNQUFNLE9BQU8sTUFBTSxPQUFPLEdBQUcsS0FBSyxPQUFPO0FBQzlDLFNBQUssTUFBTSxLQUFLLGdCQUFnQixtQkFBbUIsS0FBSyxPQUFPLFFBQVE7QUFDdkUsV0FBTyxLQUFLLEtBQUs7QUFBQSxNQUNmO0FBQUEsTUFDQSxhQUFhO0FBQUEsSUFDZixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE9BQU8sT0FBYyxRQUFRLEdBQUc7QUFDckMsUUFBSSxFQUFFLGlCQUFpQjtBQUN2QixZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFFBQ0EsT0FBTyxLQUFLO0FBQUEsTUFDZDtBQUNBLHVCQUFtQixLQUFLLE9BQU8sS0FBSztBQUNwQyxTQUFLLE1BQU0sT0FBTyxNQUFNLE9BQU8sT0FBTyxHQUFHLEtBQUs7QUFDOUMsUUFBSSxDQUFDLEtBQUssTUFBTSxRQUFRLGNBQWM7QUFDcEMsV0FBSyxNQUFNLEtBQUssZ0JBQWdCLGVBQWUsS0FBSyxPQUFPLEtBQUs7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFLLE1BQXVCLElBQVk7QUFDN0MsVUFBTSxVQUFVLEtBQUssT0FBTyxJQUFJO0FBQ2hDLFFBQUksQ0FBQyxTQUFTO0FBQ1osWUFBTSxJQUFJLGNBQWMsdUJBQXVCO0FBQUEsSUFDakQ7QUFDQSxTQUFLLE9BQU8sU0FBUyxFQUFFO0FBQUEsRUFDekI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFLLE1BQXVCLElBQVk7QUFDN0MsVUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLEdBQUcsS0FBSyxpQkFBaUIsSUFBSSxDQUFDO0FBQzVELFFBQUksQ0FBQyxLQUFLO0FBQ1IsWUFBTSxJQUFJLGNBQWMsdUJBQXVCO0FBQUEsSUFDakQ7QUFDQSxTQUFLLE9BQU8sS0FBSyxFQUFFO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFLLE9BQXdCLFFBQXlCO0FBQzNELFVBQU0sTUFBTSxLQUFLLGlCQUFpQixLQUFLO0FBQ3ZDLFFBQUksTUFBTSxFQUFHLE9BQU0sSUFBSSxjQUFjLDJCQUEyQjtBQUVoRSxVQUFNLE9BQU8sS0FBSyxpQkFBaUIsTUFBTTtBQUN6QyxRQUFJLE9BQU8sRUFBRyxPQUFNLElBQUksY0FBYyw0QkFBNEI7QUFFbEUsVUFBTSxPQUFPLEtBQUssTUFBTSxPQUFPLE1BQU0sR0FBRztBQUN4QyxVQUFNLFFBQVEsS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUFJO0FBRTFDLFNBQUssTUFBTSxPQUFPLE1BQU0sR0FBRyxJQUFJO0FBQy9CLFNBQUssTUFBTSxPQUFPLE1BQU0sSUFBSSxJQUFJO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sS0FBSyxRQUFRLE9BQU87QUFDekIsU0FBSyxNQUFNLE9BQU8sTUFBTTtBQUN4QixTQUFLLE1BQU0sUUFBUSxNQUFNO0FBQ3pCLFFBQUksQ0FBQyxLQUFLLE1BQU0sV0FBWSxRQUFPO0FBQ25DLFNBQUssTUFBTSxXQUFXLElBQUk7QUFDMUIsUUFBSSxPQUFPO0FBQ1QsV0FBSyxNQUFNLFdBQVcsUUFBUTtBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksS0FBSyxNQUFNLFFBQVEsYUFBYTtBQUNsQyxZQUFNLEtBQXFCLFdBQVcsTUFBTTtBQUMxQyxZQUFJLEtBQUssVUFBVSxLQUFLLEtBQUssTUFBTSxPQUFPLEtBQU0sUUFBTyxhQUFhLEVBQUU7QUFDdEUsYUFBSyxNQUFNLFlBQVksUUFBUTtBQUFBLE1BQ2pDLEdBQUcsS0FBSyxNQUFNLFFBQVEsbUJBQW1CLEVBQUUsTUFBTTtBQUFBLElBQ25EO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxZQUFZLE1BQWlCO0FBQ3hDLFVBQU0sUUFBUSxLQUFLLE1BQU07QUFDekIsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUVuQixRQUFJLE1BQU0sVUFBVTtBQUNsQixhQUFPLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDeEI7QUFFQSxXQUFPLEtBQUssTUFBTSxRQUFRLGNBQWMsS0FBSyxRQUFRO0FBQUEsRUFDdkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLEtBQUssS0FBb0IsU0FBK0I7QUFDbkUsUUFBSSxDQUFDLEtBQUssTUFBTSxZQUFZLGlCQUFpQjtBQUMzQyxZQUFNLElBQUksdUJBQXVCO0FBQUEsSUFDbkM7QUFFQSxRQUFJLEtBQUssTUFBTTtBQUNmLFdBQUssTUFBTTtBQUFBLFFBQ1Qsb0NBQW9DLEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxLQUFLLE1BQU0sTUFBTSxFQUFFO0FBQUEsTUFDdkY7QUFFQSxjQUFVLE9BQU87QUFBQSxNQUNmLENBQUM7QUFBQSxNQUNEO0FBQUEsUUFDRSxPQUFPLEtBQUssTUFBTSxnQkFBZ0I7QUFBQSxRQUNsQyxnQkFBZ0I7QUFBQSxRQUNoQixNQUFNO0FBQUEsTUFDUjtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsUUFBSSxPQUFPLFFBQVEsT0FBTztBQUN4QixVQUFJLEtBQUssTUFBTTtBQUNmLGFBQUssTUFBTTtBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsYUFBTyxLQUFLLE1BQU0sU0FBUyxHQUFHO0FBQUEsSUFDaEM7QUFFQSxVQUFNLFFBQVEsT0FBTyxLQUFLLE1BQU0sT0FBTyxTQUFTO0FBQ2hELFFBQUksQ0FBQyxPQUFPO0FBQ1YsWUFBTSxRQUFRLElBQUk7QUFBQSxRQUNoQjtBQUFBLE1BQ0Y7QUFDQSxXQUFLLE1BQU0sS0FBSyxnQkFBZ0IsT0FBTyxLQUFLLE9BQU8sS0FBSztBQUN4RDtBQUFBLElBQ0Y7QUFFQSxRQUFJLEtBQUssTUFBTTtBQUNmLFdBQUssTUFBTTtBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBRUEsUUFBSTtBQUNGLFlBQU0sbUJBQW1CLE1BQU07QUFFL0IsVUFBSSxrQkFBa0I7QUFDcEIsWUFBSSxLQUFLLE1BQU07QUFDZixlQUFLLE1BQU07QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUVBLGFBQUssTUFBTSxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsY0FBYztBQUVwRCxlQUFPLHNCQUFLLGlEQUFMLFdBQWtCO0FBQUEsTUFDM0I7QUFFQSxVQUFJLEtBQUssTUFBTTtBQUNmLGFBQUssTUFBTSxNQUFNLHlDQUF5QztBQUMxRCxZQUFNLE1BQU0sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUN2QyxZQUFNLEtBQ04sTUFBTSxjQUNOLFFBQVEsWUFDUixnQkFDQSxRQUFRLGdCQUNSLG1CQUNBO0FBQ0EsVUFBSSxLQUFLLE1BQU07QUFDZixhQUFLLE1BQU07QUFBQSxVQUNULG1EQUFtRCxFQUFFO0FBQUEsUUFDdkQ7QUFFQSxZQUFNLFlBQVk7QUFBQSxRQUNoQixPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsTUFDVjtBQUVBLFlBQU0sS0FBSyxNQUNYLHVCQUF1QixPQUFPLE1BQU0sYUFBYSxLQUFLLEtBQUssRUFDM0Q7QUFBQSxRQUNFLENBQUMsTUFBTTtBQUNMLGNBQUksR0FBRztBQUNMLHNCQUFVLFNBQVM7QUFBQSxVQUNyQjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLENBQUMsTUFBYSxVQUFVLFFBQVE7QUFBQSxNQUNsQztBQUdBLFVBQUksQ0FBQyxVQUFVLFVBQVUsVUFBVTtBQUNuQyxlQUFPLHNCQUFLLDJDQUFMLFdBQVksT0FBTyxVQUFVO0FBR3BDLFVBQUksQ0FBQyxVQUFVLFFBQVE7QUFDckIsWUFBSSxLQUFLLE1BQU07QUFDZixlQUFLLE1BQU07QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUNBLGNBQU0sS0FBSyxNQUFNLE9BQU8sV0FBVyxRQUFRO0FBQUEsVUFDekM7QUFBQSxZQUNFLElBQUksT0FBTyxXQUFXO0FBQUEsWUFDdEIscUJBQXFCLG9CQUFJLElBQVk7QUFBQSxZQUNyQywyQkFBMkIsb0JBQUksSUFBWTtBQUFBLFVBQzdDO0FBQUEsVUFDQSxNQUNBLHNCQUFLLHlEQUFMLFdBQTBCLE9BQU87QUFBQSxZQUMvQixDQUFDLE1BQU07QUFDTCxrQkFBSSxHQUFHLFFBQVE7QUFDYiwwQkFBVSxTQUFvQixFQUFFO0FBQ2hDO0FBQUEsY0FDRjtBQUVBLGtCQUFJLEdBQUcsT0FBTztBQUNaLDBCQUFVLFFBQVEsRUFBRTtBQUNwQjtBQUFBLGNBQ0Y7QUFFQSx3QkFBVSxTQUFTLFVBQVUsUUFBUTtBQUFBLFlBQ3ZDO0FBQUEsWUFDQSxDQUFDLE1BQWEsVUFBVSxRQUFRO0FBQUEsVUFDbEM7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLFVBQUksQ0FBQyxVQUFVLE9BQVEsUUFBTyxzQkFBSywyQ0FBTCxXQUFZLE9BQU8sVUFBVTtBQUUzRCxVQUFJLE9BQU8sUUFBUSxTQUFTLFlBQVksUUFBUSxRQUFRLEdBQUc7QUFDekQsMkJBQUssV0FBWSxRQUFRO0FBQUEsTUFDM0IsT0FBTztBQUNMLDJCQUFLLFdBQVk7QUFBQSxNQUNuQjtBQUVBLFlBQU0sb0JBQWtDO0FBQUEsUUFDdEMsa0JBQWtCO0FBQUEsVUFDaEIsZUFBZSxLQUFLLE1BQU0sUUFBUTtBQUFBLFVBQ2xDLGtCQUFrQixLQUFLLE1BQU0sUUFBUTtBQUFBLFVBQ3JDLGVBQWUsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNsQyxnQkFBZ0IsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNuQyxrQkFBa0IsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNyQyxtQkFBbUIsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUN0QyxlQUFlLEtBQUssTUFBTSxRQUFRO0FBQUEsVUFDbEMsZUFBZSxLQUFLLE1BQU0sUUFBUTtBQUFBLFVBQ2xDLFlBQ0EsS0FBSyxNQUFNLFFBQVEsa0JBQWtCLGNBQWM7QUFBQSxVQUNuRCxRQUFRLEtBQUssTUFBTSxRQUFRLGtCQUFrQixVQUFVO0FBQUEsVUFDdkQsUUFBUTtBQUFBLFlBQ04sWUFDQSxRQUFRLGtCQUFrQixRQUFRLFFBQVEsT0FDMUMsUUFBUSxPQUNSO0FBQUEsWUFDQSxlQUFlLE1BQU0sY0FBYztBQUFBLFVBQ3JDO0FBQUEsVUFDQSxZQUNBLEtBQUssTUFBTSxRQUFRLGtCQUFrQixlQUNyQyxPQUFPLEtBQUssTUFBTSxRQUFRLGNBQWMsWUFDeEMsS0FBSyxNQUFNLFFBQVEsWUFBWSxJQUMvQixLQUFLLE1BQU0sUUFBUSxZQUNuQjtBQUFBLFVBQ0EsY0FDQSxLQUFLLE1BQU0sUUFBUSxrQkFBa0IsVUFBVTtBQUFBLFVBQy9DLElBQUksS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0FBQUEsVUFDekMsZ0JBQWdCLEtBQUssTUFBTSxRQUFRLGtCQUFrQjtBQUFBLFVBQ3JELFFBQVEsS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0FBQUEsVUFDN0MsTUFBTTtBQUFBLFVBQ04sTUFBTSxnQ0FBVztBQUFBLFVBQ2pCLFlBQVksS0FBSyxNQUFNLE9BQU8sUUFBUTtBQUFBLFFBQ3hDO0FBQUEsUUFDQSxjQUFjO0FBQUEsTUFDaEI7QUFFQSxVQUFJLFdBQXVCLEtBQUs7QUFDaEMsWUFBTSxjQUFjLElBQUksUUFBYyxDQUFDQyxhQUFZLFdBQVdBLFFBQU87QUFFckUsWUFBTSxVQUFVLEtBQUssTUFBTTtBQUFBLFFBQ3pCLGdCQUFnQjtBQUFBLFFBQ2hCLEtBQUs7QUFBQSxRQUNMO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBR0EsVUFBSSxDQUFDLFFBQVMsVUFBUztBQUV2QixVQUFJLEtBQUssTUFBTTtBQUNmLGFBQUssTUFBTSxNQUFNLCtDQUErQztBQUVoRSxZQUFNO0FBRU4sWUFBTSxlQUFlO0FBQUEsUUFDckIsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25DLGtCQUFrQixpQkFBaUI7QUFBQSxRQUNuQyxrQkFBa0IsaUJBQWlCO0FBQUEsUUFDbkMsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25DLGtCQUFrQixpQkFBaUI7QUFBQSxRQUNuQyxrQkFBa0IsaUJBQWlCO0FBQUEsUUFDbkMsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25DLGtCQUFrQixpQkFBaUI7QUFBQSxNQUFhLEVBQ2hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLElBQUk7QUFFekIsWUFBTSxlQUNOLENBQUMsQ0FBQyxrQkFBa0IsYUFBYSxRQUNqQyxDQUFDLENBQUMsS0FBSyxNQUFNLFFBQVEsT0FBTyxLQUFLO0FBQ2pDLFlBQU0sbUJBQ04sQ0FBQyxDQUFDLGtCQUFrQixpQkFBaUIsY0FBYyxDQUFDO0FBRXBELFVBQUk7QUFFSixZQUFNLFlBQVksd0JBQUMsUUFDbkI7QUFBQSxRQUNBLGdDQUFXO0FBQUEsUUFDWCxnQ0FBVztBQUFBLFFBQ1gsZ0NBQVc7QUFBQSxRQUNYLGdDQUFXO0FBQUEsUUFDWDtBQUFBLE1BQUssRUFDTCxTQUFTLEdBQWlCLEdBUFI7QUFVbEIsVUFDQSxvQkFDQSxFQUFFLFVBQVUsa0JBQWtCLDJCQUM5QixPQUFPLFVBQVUsV0FBVyxZQUM1QixVQUFVLFVBQVUsT0FBTyxJQUFJLEdBQy9CO0FBQ0UsY0FBTSxFQUFFLE1BQU0sT0FBTyxJQUFJLFVBQVU7QUFDbkMsY0FBTSxZQUFZLENBQUM7QUFFbkIsWUFBSSxLQUFLLE1BQU07QUFDZixlQUFLLE1BQU07QUFBQSxZQUNULGdGQUNBLFlBQVksUUFBUSxNQUFNO0FBQUEsVUFFNUI7QUFFQSxjQUFNLFFBQVEsU0FBUyxTQUFTLFNBQVMsZ0NBQVc7QUFHcEQsY0FBTSxhQUNOLFNBQVMsU0FBUyxnQ0FBVyxPQUM3QixTQUNBLFNBQVMsZ0NBQVc7QUFBQTtBQUFBLFVBRXBCLE9BQU8sS0FBSyxJQUFJLHVCQUFXLENBQVE7QUFBQTtBQUFBO0FBQUEsVUFFbkMsT0FBTyxLQUFLLElBQUksd0JBQVksQ0FBUTtBQUFBO0FBRXBDLFlBQUksV0FBVztBQUNiLGNBQUksT0FBTztBQUNULDBCQUFjO0FBQUEsVUFDaEIsT0FBTztBQUVMLDBCQUFjLFdBQVc7QUFBQSxjQUN2QixJQUFJLHdCQUFZO0FBQUEsZ0JBQ2QsVUFBVTtBQUFBLGdCQUNWLFdBQVc7QUFBQSxnQkFDWCxNQUFNO0FBQUEsY0FDUixDQUFDO0FBQUEsWUFDSDtBQUNBLDhCQUFrQixpQkFBaUIsT0FBTyxnQ0FBVztBQUFBLFVBQ3ZEO0FBQUEsUUFDRixPQUFPO0FBQ0wsd0JBQWM7QUFDZCw0QkFBa0IsaUJBQWlCLE9BQU8sZ0NBQVc7QUFBQSxRQUN2RDtBQUFBLE1BQ0YsT0FBTztBQUlMLHNCQUFjLHNCQUFLLHdEQUFMLFdBQ1osVUFBVSxrQkFBa0IsMEJBQzVCLE9BQU8sVUFBVSxXQUFXLFdBQzVCLFVBQVUsU0FDVixVQUFVLE9BQU8sUUFDakIsT0FDQSxRQUFRLFFBQVE7QUFHbEIsMEJBQWtCLGlCQUFpQixPQUFPLGdDQUFXO0FBQUEsTUFHdkQ7QUFFQSxVQUFJLFFBQVEsZ0JBQWdCO0FBQzFCLFlBQUksS0FBSyxNQUFNO0FBQ2YsZUFBSyxNQUFNO0FBQUEsWUFDVCx3RkFBd0YsS0FBSyxNQUFNLFFBQVEsZ0JBQWdCO0FBQUEsVUFDN0g7QUFDQSxrQkFBTSxpQkFBQUMsWUFBUSxLQUFLLE1BQU0sUUFBUSxnQkFBZ0I7QUFDakQsWUFBSSxLQUFLLE1BQU07QUFDZixlQUFLLE1BQU0sTUFBTSxnQ0FBZ0M7QUFBQSxNQUNuRDtBQUVBLFVBQUksS0FBSyxNQUFNO0FBQ2YsYUFBSyxNQUFNO0FBQUEsVUFDVCxrQ0FBa0MsS0FBSztBQUFBLFlBQ3JDO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBRUEsWUFBTSxhQUFhLEtBQUssTUFBTTtBQUU5QixVQUFJLENBQUMsWUFBWTtBQUNmLFlBQUksS0FBSyxNQUFNLGFBQWE7QUFDMUIsZUFBSyxNQUFNO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBRUEsb0JBQVksUUFBUTtBQUFBLE1BQ3RCLE9BQU87QUFDTCxjQUFNLFdBQVcsTUFBTSxXQUFXO0FBQUEsVUFDaEM7QUFBQSxVQUNBLGtCQUFrQjtBQUFBLFFBQ3BCO0FBRUEsYUFBSyxNQUFNLGlCQUFpQixDQUFDLENBQUMsUUFBUSxjQUFjO0FBRXBELGNBQU0sc0JBQUssaURBQUwsV0FBa0I7QUFBQSxNQUMxQjtBQUFBLElBQ0YsU0FBUyxHQUFHO0FBQ1YsVUFBSSxLQUFLLE1BQU07QUFDZixhQUFLLE1BQU0sTUFBTSxzQ0FBc0MsQ0FBQyxFQUFFO0FBQzFELFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQWtORjtBQTdoQ0U7QUFDQTtBQUZLO0FBODBCTCxXQUFNLGdDQUFDLE9BQWMsT0FBNEI7QUFFL0MsUUFBTSw0REFDTixJQUFJLGNBQWMsMENBQTBDLFFBQVE7QUFBQTtBQUFBLEVBQU8sTUFBTSxTQUFTLEtBQUssS0FBSyxFQUFFLEVBQUU7QUFHeEcsT0FBSyxNQUFNO0FBQUEsSUFDVCxnQkFBZ0I7QUFBQSxJQUNoQixLQUFLO0FBQUEsSUFDTDtBQUFBO0FBQUEsSUFFQSwwREFBMEQ7QUFBQSxFQUM1RDtBQUNBLE9BQUssTUFBTTtBQUFBLElBQ1QsZ0JBQWdCO0FBQUEsSUFDaEIsS0FBSztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sWUFBWSxLQUFLLE1BQU0sT0FBTyxTQUFTO0FBQzdDLE1BQUksVUFBVyxRQUFPLEtBQUssS0FBSyxLQUFLLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUVoRSxPQUFLLE1BQU0sWUFBWSxLQUFLLFVBQVUsSUFBSTtBQUM1QyxHQXZCTTtBQXlCQSxpQkFBWSxzQ0FBQyxVQUFnQztBQUNqRCxNQUFJLENBQUMsS0FBSyxNQUFNLFlBQVk7QUFDMUIsUUFBSSxLQUFLLE1BQU0sYUFBYTtBQUMxQixXQUFLLE1BQU07QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGLE9BQU87QUFDTCxRQUFJLEtBQUssTUFBTTtBQUNmLFdBQUssTUFBTSxNQUFNLDhCQUE4QjtBQUMvQyxVQUFNLEtBQUssTUFBTSxXQUFXLFdBQVcsUUFBUTtBQUMvQyxRQUFJLEtBQUssTUFBTSxZQUFhLE1BQUssTUFBTSxNQUFNLHNCQUFzQjtBQUFBLEVBQ3JFO0FBQ0YsR0Fia0I7QUFlWix5QkFBb0Isc0NBQUMsT0FBYztBQUN2QyxNQUFJLEtBQUssTUFBTTtBQUNmLFNBQUssTUFBTTtBQUFBLE1BQ1QsbURBQW1ELE1BQU0sS0FBSyxVQUFVLE1BQU0sR0FBRztBQUFBLElBQ25GO0FBRUEsUUFBTSxzQkFDTixLQUFLLE1BQU0sT0FBTyxXQUFXLFdBQVcsR0FBRyx1QkFDM0Msb0JBQUksSUFBWTtBQUVoQixRQUFNLGFBQWEsTUFBTSxLQUFLLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDcEQsT0FBTyxjQUFjO0FBQ25CLFVBQ0EsS0FBSyxNQUFNLE9BQU8sUUFBUSxpQkFBaUI7QUFBQSxRQUN6QyxDQUFDLFFBQVEsUUFBUSxVQUFVO0FBQUEsTUFDN0I7QUFFQSxlQUFPO0FBQ1AsVUFBSSxvQkFBb0IsSUFBSSxVQUFVLFVBQVUsRUFBRyxRQUFPO0FBQzFELDBCQUFvQixJQUFJLFVBQVUsVUFBVTtBQUM1QyxZQUFNLFlBQVksTUFBTSxVQUFVO0FBQUEsUUFDaEMsTUFBTTtBQUFBLFFBQ04sTUFBTSxhQUFhLGNBQWMsUUFBUSxNQUFNLEdBQUcsRUFBRTtBQUFBLE1BQ3REO0FBQ0EsVUFBSSxDQUFDLFVBQVcsUUFBTztBQUN2QixhQUFPLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFBQSxJQUNyQztBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLFFBQVE7QUFDckMsUUFBSSxLQUFLLE1BQU0sYUFBYTtBQUMxQixXQUFLLE1BQU07QUFBQSxRQUNULCtDQUErQyxNQUFNLEtBQUssVUFBVSxNQUFNLEdBQUc7QUFBQSxNQUMvRTtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsS0FBSyxNQUFNLFFBQVEsdUJBQXVCO0FBQzdDLFVBQUksS0FBSyxNQUFNO0FBQ2YsYUFBSyxNQUFNO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFDQSxhQUFPLHNCQUFLLDBEQUFMLFdBQTJCO0FBQUEsSUFDcEM7QUFFQSxXQUFPLGNBQWM7QUFBQSxFQUN2QjtBQUVBLE1BQUksS0FBSyxNQUFNO0FBQ2YsU0FBSyxNQUFNO0FBQUEsTUFDVCx1REFDQSxNQUFNLEtBQUssVUFDWCxNQUFNLEdBQUcsa0JBQ1QsV0FBVyxXQUFXLGNBQWMsS0FBSztBQUFBLElBRTNDO0FBRUEsU0FBTztBQUNULEdBMUQwQjtBQTREcEIsMEJBQXFCLHNDQUFDLE9BQWM7QUFDeEMsTUFBSSxLQUFLLE1BQU07QUFDZixTQUFLLE1BQU07QUFBQSxNQUNULG1EQUFtRCxNQUFNLEtBQUssVUFBVSxNQUFNLEdBQUc7QUFBQSxJQUNuRjtBQUVBLFFBQU0sdUJBQXVCLEtBQUssTUFBTSxRQUFRO0FBRWhELFFBQU0saUJBQWlCLE1BQU0sS0FBSyxNQUFNLE9BQU8sV0FBVztBQUFBLElBQ3hELE9BQU8sY0FBYztBQUNuQixVQUFJLFVBQVUsZUFBZSxNQUFNLFdBQVcsV0FBWSxRQUFPO0FBQ2pFLFVBQ0EsS0FBSyxNQUFNLE9BQU8sUUFBUSxpQkFBaUI7QUFBQSxRQUN6QyxDQUFDLFFBQVEsUUFBUSxVQUFVO0FBQUEsTUFDN0IsR0FDQTtBQUNFLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLElBQUksTUFBTSxNQUFNO0FBRTVDLFVBQUksc0JBQXNCO0FBQ3hCLFlBQUksS0FBSyxNQUFNLGFBQWE7QUFDMUIsZUFBSyxNQUFNO0FBQUEsWUFDVCxnRkFBZ0YsTUFBTSxLQUFLLFVBQVUsTUFBTSxHQUFHLFlBQVksVUFBVSxVQUFVO0FBQUEsVUFDaEo7QUFBQSxRQUNGO0FBRUEsY0FBTSxnQkFBZ0IsTUFBTSxVQUFVO0FBQUEsVUFDcEM7QUFBQSxVQUNBLE1BQU0sYUFBYSxNQUFNO0FBQUEsUUFDM0I7QUFFQSxZQUFJLENBQUMsZUFBZTtBQUNsQixjQUFJLEtBQUssTUFBTTtBQUNmLGlCQUFLLE1BQU07QUFBQSxjQUNULCtDQUErQyxNQUFNLEtBQUssVUFBVSxNQUFNLEdBQUcsWUFBWSxVQUFVLFVBQVU7QUFBQSxZQUMvRztBQUNBLGlCQUFPO0FBQUEsUUFDVCxPQUFPO0FBQ0wsY0FBSSxLQUFLLE1BQU07QUFDZixpQkFBSyxNQUFNO0FBQUEsY0FDVCw0QkFBNEIsTUFBTSxLQUFLLFVBQVUsTUFBTSxHQUFHLDBCQUEwQixVQUFVLFVBQVU7QUFBQSxZQUMxRztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsWUFBTSxpQkFBaUIsTUFBTSxVQUFVLE9BQU8sT0FBTztBQUFBLFFBQ25ELGFBQWEsTUFBTTtBQUFBLE1BQ3JCLENBQUM7QUFFRCxZQUFNLGdCQUFnQixlQUFlLE9BQU8sQ0FBQztBQUU3QyxVQUFJLENBQUMsY0FBZSxRQUFPO0FBRTNCLFlBQU0sU0FBUyxNQUFNLFVBQVUsT0FBTyxhQUFhO0FBRW5ELFVBQUksQ0FBQyxPQUFRLFFBQU87QUFFcEIsWUFBTSxlQUFlO0FBRXJCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxRQUFRO0FBQzdDLFFBQUksS0FBSyxNQUFNO0FBQ2YsV0FBSyxNQUFNO0FBQUEsUUFDVCwrQ0FBK0MsTUFBTSxLQUFLLFVBQVUsTUFBTSxHQUFHO0FBQUEsTUFDL0U7QUFDQSxXQUFPLGtCQUFrQjtBQUFBLEVBQzNCO0FBRUEsUUFBTSxtQkFBbUIsZUFBZTtBQUV4QyxTQUFPO0FBQ1QsR0E3RTJCO0FBK0UzQix3QkFBbUIsZ0NBQ25CLFFBQ0EsT0FDQSxPQUFPLEdBQ1AsTUFDQTtBQUNFLFFBQU0sZUFBZSxLQUFLLE1BQU0sUUFBUSxPQUN4QyxhQUFhLFFBQVE7QUFBQSxJQUNuQixhQUFhLEtBQUssTUFBTSxRQUFRLE9BQU87QUFBQSxJQUN2QyxNQUFNLE9BQU87QUFBQSxJQUNiLEtBQUssT0FBTyxTQUFTO0FBQUEsRUFDdkIsQ0FBQyxFQUNELEdBQUcsU0FBUyxDQUFDLFFBQVE7QUFDbkIsVUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLFlBQVk7QUFFL0IsUUFBSSxLQUFLLE1BQU07QUFDZixXQUFLLE1BQU07QUFBQSxRQUNULHFEQUNBLElBQUksU0FBUyxJQUFJLFdBQVcsR0FBRztBQUFBLE1BRWpDO0FBRUEsUUFBSSxFQUFFLFNBQVMsaUJBQWlCLEtBQUssRUFBRSxTQUFTLE9BQU8sRUFBRztBQUUxRCxTQUFLLE1BQU0sS0FBSyxnQkFBZ0IsYUFBYSxLQUFLLE9BQU8sS0FBSyxLQUFLO0FBQUEsRUFDckUsQ0FBQztBQUVELFNBQU87QUFDVCxHQTVCbUI7QUFqZ0N5QjtBQUF2QyxJQUFNLHVCQUFOOzs7QUUvRVAsSUFBQUMsb0JBS0E7OztBQ1BBLG9CQUF5QztBQVVsQyxTQUFTLG1CQUNoQixRQUNBLEtBQ0EsU0FDQTtBQUNFLFFBQU0sV0FBTyxnQ0FBaUI7QUFBQSxJQUM1QixXQUFXO0FBQUEsSUFDWCxvQkFBb0I7QUFBQSxJQUNwQixxQkFBcUI7QUFBQSxJQUNyQixHQUFHO0FBQUEsSUFDSCxpQkFBaUI7QUFBQSxJQUNqQixVQUFVO0FBQUEsSUFDVixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixHQUFHLEdBQUcsT0FBTyxRQUFRLFdBQVcsTUFBTSxPQUFPO0FBQUEsSUFDN0MsUUFBUSxRQUFRLFNBQVMsWUFBWTtBQUFBLElBQ3JDLFNBQ0EsT0FBTyxZQUFZLFdBQ25CLENBQUMsUUFBUSxTQUFTLEdBQUcsSUFDckIsVUFDQSxJQUFJLE9BQU8sTUFDWDtBQUFBLEVBQ0YsQ0FBQztBQUVELFNBQU87QUFDVDtBQXpCZ0I7QUEyQlQsU0FBUyxrQkFBa0IsS0FBYztBQUM5QyxRQUFNLFdBQU8sZ0NBQWlCO0FBQUEsSUFDNUIsaUJBQWlCO0FBQUEsSUFDakIsVUFBVTtBQUFBLElBQ1YsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osR0FBRyxHQUFHLE9BQU8sUUFBUSxXQUFXLE1BQU0sT0FBTztBQUFBLElBQzdDLFFBQVEsUUFBUSxTQUFTLFlBQVk7QUFBQSxFQUN2QyxDQUFDO0FBRUQsU0FBTztBQUNUO0FBWGdCO0FBa0JULFNBQVMsbUJBQ2hCLFFBQ0EsU0FDVztBQUNULE1BQUksU0FBUyxRQUFRLE9BQU8sV0FBVyxTQUFVLFFBQU87QUFDeEQsd0JBQVksQ0FBQztBQUNiLFFBQU0sT0FDTixPQUFPLFdBQVcsV0FDbEIsbUJBQW1CLFFBQVEsUUFBUSxLQUFLLFFBQVEsT0FBTyxJQUN2RCxrQkFBa0IsUUFBUSxHQUFHO0FBRTdCLE1BQUksQ0FBQyxPQUFPLE1BQU0sUUFBUSxJQUFJLEVBQUcsTUFBSyxRQUFRLE9BQU8sT0FBTyxRQUFRLElBQUksQ0FBQztBQUN6RSxNQUFJLE1BQU0sUUFBUSxRQUFRLFdBQVcsRUFBRyxNQUFLLEtBQUssR0FBRyxRQUFRLFdBQVc7QUFFeEUsUUFBTSxhQUFhLElBQUkscUJBQU8sRUFBRSxPQUFPLE9BQU8sS0FBSyxDQUFDO0FBRXBELGFBQVcsR0FBRyxTQUFTLE1BQU0sV0FBVyxRQUFRLENBQUM7QUFFakQsTUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM5QixXQUFPLEdBQUcsU0FBUyxNQUFNLFdBQVcsUUFBUSxDQUFDO0FBRTdDLFdBQU8sS0FBSyxVQUFpQjtBQUFBLEVBQy9CO0FBRUEsU0FBTztBQUNUO0FBekJnQjs7O0FEekNoQixJQUFNLFlBQVksd0JBQUMsUUFBa0I7QUFDbkMsU0FBTyxNQUFNO0FBQUEsSUFDWDtBQUFBLE1BQ0UsUUFBUSw0QkFBVTtBQUFBLElBQ3BCO0FBQUEsSUFDQSxDQUFDLEdBQUcsT0FBTztBQUFBLE1BQ1QsTUFBTTtBQUFBLE1BQ04sTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBQ0YsR0FWa0I7QUFpQ1gsSUFBTSwrQkFBbUQsT0FBTyxPQUFPO0FBQUEsRUFDNUUsTUFBTSxVQUFVLENBQUMsQ0FBQztBQUFBLEVBQ2xCLFdBQVc7QUFBQSxJQUFVO0FBQUEsTUFDckI7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFDeEQ7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsSUFBSTtBQUFBLEVBQ3BDO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFBVTtBQUFBLE1BQ2hCO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQ3JEO0FBQUEsTUFBYztBQUFBLElBQVk7QUFBQSxFQUMxQjtBQUFBLEVBQ0EsT0FBTztBQUFBLElBQVU7QUFBQSxNQUNqQjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFDN0Q7QUFBQSxJQUFZO0FBQUEsRUFDWjtBQUFBLEVBQ0EsVUFBVTtBQUFBLElBQVU7QUFBQSxNQUNwQjtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLElBQUs7QUFBQSxFQUN6RDtBQUFBLEVBQ0EsZ0JBQWdCO0FBQUEsSUFBVTtBQUFBLE1BQzFCO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsSUFBSTtBQUFBLEVBQzlEO0FBQUEsRUFDQSxZQUFZO0FBQUEsSUFBVTtBQUFBLE1BQ3RCO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQUs7QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsSUFBSTtBQUFBLEVBQ3pEO0FBQUEsRUFDQSxZQUFZO0FBQUEsSUFBVTtBQUFBLE1BQ3RCO0FBQUEsTUFBSztBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFNO0FBQUEsSUFBSTtBQUFBLEVBQ3JEO0FBQUEsRUFDQSxXQUFXO0FBQUEsSUFBVTtBQUFBLE1BQ3JCO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQWM7QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUN0RDtBQUFBLElBQVk7QUFBQSxFQUNaO0FBQUEsRUFDQSxNQUFNLFVBQVUsQ0FBQyxNQUFNLGFBQWMsR0FBSyxLQUFLLEtBQUssS0FBSyxHQUFLLEtBQUssS0FBSyxHQUFHLENBQUM7QUFBQSxFQUM1RSxPQUFPO0FBQUEsSUFBVTtBQUFBLE1BQ2pCO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUNwRDtBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLElBQUc7QUFBQSxFQUNwQztBQUFBLEVBQ0EsS0FBSztBQUFBLElBQVU7QUFBQSxNQUNmO0FBQUEsTUFBTTtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsSUFBSTtBQUFBLEVBQzlEO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFBVTtBQUFBLE1BQ2xCO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQWM7QUFBQSxNQUFLO0FBQUEsTUFDbkU7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLElBQVk7QUFBQSxFQUN4QztBQUFBLEVBQ0EsTUFBTSxVQUFVLENBQUMsR0FBSyxLQUFLLE1BQU0sSUFBTSxNQUFNLEdBQUssS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDeEUsS0FBSztBQUFBLElBQVU7QUFBQSxNQUNmO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBYztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFNO0FBQUEsSUFBRztBQUFBLEVBQzdEO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFBVTtBQUFBLE1BQ2hCO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQWM7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFNO0FBQUEsSUFBSTtBQUFBLEVBQ3JFO0FBQUEsRUFDQSxVQUFVO0FBQUEsSUFBVTtBQUFBLE1BQ3BCO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQWM7QUFBQSxNQUFLO0FBQUEsSUFBRztBQUFBLEVBQ3JFO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFBVTtBQUFBLE1BQ2xCO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsSUFBRztBQUFBLEVBQ3BFO0FBQ0YsQ0FBQztBQXZHRDtBQTBHTyxJQUFNLGtCQUFOLE1BQU0sZ0JBQTJCO0FBQUEsRUFJL0IsWUFBbUIsSUFBa0M7QUFBbEM7QUFKckI7QUFDTCx1Q0FBNEIsQ0FBQztBQUM3QixtQ0FBdUIsQ0FBQztBQUFBLEVBRXFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLN0QsSUFBVyxZQUFZO0FBQ3JCLFdBQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLE9BQU8sUUFBUTtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUErQk8sYUFBYSxNQUFnQjtBQUNsQyxRQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxPQUFPLFFBQVEsUUFBUTtBQUNoRCxZQUFNLElBQUksb0JBQW9CLFFBQVEsaUJBQWlCLGlCQUFpQjtBQUN4RSx1QkFBSyxZQUFhO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsWUFBWTtBQUNyQixXQUFPLG1CQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxjQUFjO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLLFFBQVEsT0FBUSxRQUFPLENBQUM7QUFFbEMsV0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7QUFBQSxFQUNoQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxPQUFPO0FBQ2hCLFdBQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxXQUFXO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxhQUFhLFFBQTJCLFNBQThCO0FBQzNFLFFBQUksbUJBQUssWUFBVztBQUNwQixjQUFRLGNBQWM7QUFBQSxRQUN0QixHQUFHLG1CQUFLO0FBQUEsUUFDUixHQUFJLFFBQVEsZUFBZSxDQUFDO0FBQUEsTUFBRTtBQUc5QixVQUFNLFNBQVMsbUJBQW1CLFFBQVEsT0FBTztBQUVqRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxXQUNQLFNBQ0E7QUFDRSxRQUFJLFdBQXNCLENBQUM7QUFDM0IsUUFBSSxPQUFPLFlBQVksV0FBVztBQUNoQyxpQkFBVyxDQUFDLFVBQ1osQ0FBQyxJQUNELE9BQU8sS0FBSyxhQUFhLE9BQU87QUFBQSxJQUNsQyxXQUFXLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFDakMsaUJBQVc7QUFBQSxJQUNiLE9BQU87QUFDTCxpQkFBVyxPQUFPLFFBQVEsT0FBTyxFQUNqQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQy9CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFDakI7QUFFQSxXQUFPLHNCQUFLLDBDQUFMLFdBQWlCO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNuQixXQUFPLG1CQUFLO0FBQUEsRUFDZDtBQUFBLEVBRUEsSUFBVyxRQUFRLFNBQW9CO0FBQ3JDLFNBQUssV0FBVyxPQUFPO0FBQUEsRUFDekI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sT0FBTyxTQUE4QjtBQUMxQyxRQUFJLENBQUMsTUFBTSxRQUFRLE9BQU8sRUFBRyxXQUFVLENBQUMsT0FBTztBQUMvQyxVQUFNLFFBQW1CLENBQUM7QUFFMUIsWUFBUSxRQUFRLENBQUMsTUFBTTtBQUNyQixVQUFJLEtBQUssUUFBUSxTQUFTLENBQUMsRUFBRztBQUM5QixZQUFNLEtBQUssQ0FBQztBQUFBLElBQ2QsQ0FBQztBQUVELFdBQU8sc0JBQUssMENBQUwsV0FDTCxtQkFBSyxnQkFBZSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUs7QUFBQSxFQUV4RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxZQUFZLElBQWU7QUFDaEMsdUJBQUssZ0JBQWlCO0FBQUEsRUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLG9CQUFvQjtBQUN6QixXQUFPLG1CQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08scUJBQXFCO0FBQzFCLFdBQU8sYUFBYSxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQUssZ0JBQWUsU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxVQUE2QixRQUFvQjtBQUN0RCxXQUFPLG1CQUFLLGdCQUFlLFNBQVMsTUFBTTtBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQThCLFFBQW9CO0FBQ3ZELFdBQU8sQ0FBQyxLQUFLLFVBQVUsTUFBTTtBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGNBQWMsUUFBdUM7QUFDMUQsV0FBTyxhQUFhLElBQUksTUFBaUI7QUFBQSxFQUMzQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVTtBQUNmLFdBQU8sS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLGFBQWEsSUFBSSxNQUFNLENBQUM7QUFBQSxFQUM5RDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNkLFVBQU0sTUFBTSxDQUFDO0FBRWIsU0FBSyxRQUFRLFFBQVEsQ0FBQyxXQUFXLElBQUksTUFBTSxJQUFJLGFBQWEsSUFBSSxNQUFNLENBQUM7QUFFdkUsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQVc7QUFDaEIsV0FBTyxhQUFhLE9BQU8sS0FBSyxPQUFPO0FBQUEsRUFDekM7QUFDRjtBQWpORTtBQUNBO0FBRks7QUFhTCxnQkFBVyxnQ0FBQyxTQUFvQjtBQUM5QixRQUFNLEVBQUUsTUFBTSxJQUFJLEtBQUs7QUFFdkIsTUFDQSxRQUFRLE1BQU0sQ0FBQyxNQUFNLG1CQUFLLGdCQUFlLFNBQVMsQ0FBQyxDQUFDLEtBQ3BELG1CQUFLLGdCQUFlLE1BQU0sQ0FBQyxNQUFNLFFBQVEsU0FBUyxDQUFDLENBQUM7QUFFcEQsV0FBTyxRQUFRLFFBQVEsS0FBSztBQUM1QixRQUFNLGdCQUNOLEtBQUssUUFBUSxLQUFLLENBQUMsT0FBTyxPQUFPLGVBQWUsT0FBTyxXQUFXLEtBQ2xFLENBQUMsUUFBUSxLQUFLLENBQUMsT0FBTyxPQUFPLGVBQWUsT0FBTyxXQUFXO0FBQzlELFFBQU0sV0FBVyxNQUFNLEtBQUssYUFBYSxhQUFhLEdBQUcsUUFBUSxTQUFTO0FBQzFFLFFBQU0sT0FBTyxtQkFBSyxnQkFBZSxNQUFNO0FBQ3ZDLHFCQUFLLGdCQUFpQixDQUFDLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQztBQUUxQyxTQUFPLEtBQUssR0FBRyxjQUFjLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTTtBQUNqRCxVQUFNO0FBQUEsTUFDSixnQkFBZ0I7QUFBQSxNQUNoQjtBQUFBLE1BQ0E7QUFBQSxNQUNBLG1CQUFLLGdCQUFlLE1BQU07QUFBQSxJQUM1QjtBQUNBLFdBQU87QUFBQSxFQUNULENBQUM7QUFDSCxHQXhCVztBQWIyQjtBQUFqQyxJQUFNLGlCQUFOO0FBa09BLElBQU0sMEJBQU4sTUFBTSx3QkFBbUM7QUFBQSxFQWN2QyxZQUFtQixPQUF5QjtBQUF6QjtBQWIxQix3QkFBTyxTQUFRLElBQUksYUFBbUIsSUFBSTtBQUMxQyx3QkFBTyxVQUFTLElBQUksZUFBcUIsSUFBSTtBQUM3Qyx3QkFBTyxvQkFBbUI7QUFDMUIsd0JBQU8scUJBQTZDO0FBQUEsTUFDbEQsUUFBUTtBQUFBLE1BQ1IsV0FBVyxDQUFDO0FBQUEsTUFDWixTQUFTLENBQUM7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFFBQVE7QUFBQSxNQUNSLGtCQUFrQjtBQUFBLElBQ3BCO0FBRUUsUUFBSSxPQUFPLEtBQUssTUFBTSxRQUFRLFdBQVcsVUFBVTtBQUNqRCxXQUFLLGtCQUFrQixTQUFTLEtBQUssTUFBTSxRQUFRO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBbUJBLElBQVcsU0FBUztBQUNsQixXQUFPLEtBQUssTUFBTSxZQUFZLEtBQUssVUFBVTtBQUFBLEVBQy9DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDckIsV0FBTyxLQUFLLE1BQU0sWUFBWSxhQUFhO0FBQUEsRUFDN0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNsQixXQUFPLEtBQUssTUFBTSxZQUFZLFVBQVU7QUFBQSxFQUMxQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ25CLFdBQU8sS0FBSyxNQUFNLFlBQVksV0FBVztBQUFBLEVBQzNDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDckIsV0FBTyxLQUFLLE1BQU0sWUFBWSxhQUFhO0FBQUEsRUFDN0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsYUFBYTtBQUN0QixXQUFPLEtBQUssTUFBTSxZQUFZLGNBQWM7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxNQUFNLFlBQVksVUFBVTtBQUFBLEVBQzFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFNBQVM7QUFDbEIsV0FBTyxLQUFLLE1BQU0sWUFBWSxVQUFVO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxjQUFjLE9BQU8sR0FBRztBQUNuQyxRQUFJLENBQUMsS0FBSyxNQUFNLGFBQWMsUUFBTztBQUNyQyxVQUFNLFFBQVEsS0FBSyxNQUFNLEtBQUssV0FBVyxRQUFRO0FBQ2pELFFBQUk7QUFDRixZQUFNLE1BQU0sUUFBUTtBQUNwQixZQUFNLEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSyxNQUFNLGNBQWM7QUFBQSxRQUNsRCxPQUFPO0FBQUEsUUFDUDtBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsTUFDbEIsQ0FBQztBQUNELFdBQUssTUFBTSxLQUFLLFdBQVcsUUFBUTtBQUNuQyxhQUFPO0FBQUEsSUFDVCxRQUFRO0FBQ04sV0FBSyxNQUFNLEtBQUssV0FBVyxRQUFRO0FBQ25DLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUNGO0FBL0dnRDtBQUF6QyxJQUFNLHlCQUFOO0FBa0hBLElBQU0sZ0JBQU4sTUFBTSxjQUF5QjtBQUFBLEVBQzdCLFlBQW1CLElBQWtDO0FBQWxDO0FBQUEsRUFBbUM7QUFBQSxFQUU3RCxJQUFXLFNBQVM7QUFDbEIsV0FBTyxLQUFLLEdBQUcsUUFBUSxXQUFXLENBQUM7QUFBQSxFQUNyQztBQUFBLEVBRUEsSUFBVyxZQUFZO0FBQ3JCLFlBQVEsS0FBSyxHQUFHLFdBQVcsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPO0FBQUEsTUFDL0QsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1IsRUFBRTtBQUFBLEVBQ0o7QUFBQSxFQUVBLElBQVcsU0FBUztBQUNsQixXQUNFLEtBQUssR0FBRyxRQUFRLGNBQWMsS0FHdEI7QUFBQSxFQUVaO0FBQUEsRUFFQSxJQUFXLFVBQVU7QUFDbkIsV0FBTyxLQUFLLEdBQUcsU0FBUyxXQUFXLENBQUM7QUFBQSxFQUN0QztBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2xCLFdBQU8sS0FBSyxHQUFHO0FBQUEsRUFDakI7QUFBQSxFQUVBLElBQVcsWUFBWTtBQUNyQixXQUFPLEtBQUssR0FBRztBQUFBLEVBQ2pCO0FBQUEsRUFFTyxPQUFvQjtBQUN6QixXQUFPO0FBQUEsTUFDTCxRQUFRLEtBQUs7QUFBQSxNQUNiLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFFBQVEsS0FBSztBQUFBLE1BQ2IsU0FBUyxLQUFLO0FBQUEsTUFDZCxZQUFZLEtBQUssV0FBVyxjQUFjO0FBQUEsTUFDMUMsUUFBUSxLQUFLLFFBQVEsVUFBVTtBQUFBLElBQ2pDO0FBQUEsRUFDRjtBQUNGO0FBN0NzQztBQUEvQixJQUFNLGVBQU47OztBTjdaUCxvQkFBMkI7OztBUVJwQixJQUFNLHdCQUFOLE1BQU0sc0JBQWlDO0FBQUEsRUFDckMsWUFBbUIsT0FBeUI7QUFBekI7QUFBQSxFQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzdDLFdBQVc7QUFDaEIsV0FBTztBQUFBLE1BQ0wsU0FBUztBQUFBLFFBQ1AsV0FBVyxLQUFLLE1BQU0sT0FBTztBQUFBLFFBQzdCLGlCQUFpQixLQUFLLE1BQU07QUFBQSxNQUM5QjtBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ04sV0FBVyxLQUFLLE1BQU0sS0FBSyxZQUFZO0FBQUEsUUFDdkMsU0FBUyxLQUFLLE1BQU0sS0FBSyxVQUFVO0FBQUEsUUFDbkMsUUFBUSxLQUFLLE1BQU0sS0FBSyxTQUFTO0FBQUEsUUFDakMsTUFBTSxLQUFLLE1BQU0sS0FBSyxPQUFPO0FBQUEsTUFDL0I7QUFBQSxNQUNBLGFBQWEsS0FBSyxNQUFNLE9BQU87QUFBQSxNQUMvQixhQUFhLEtBQUssTUFBTSxRQUFRLE9BQU87QUFBQSxNQUN2QyxZQUFZLEtBQUssTUFBTSxPQUFPLFdBQVc7QUFBQSxNQUN6QyxXQUNBLEtBQUssTUFBTSxNQUFNLFFBQVEsSUFBSSxNQUFNLFNBQVMsUUFBUTtBQUFBLFFBQ2xELENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSztBQUFBLE1BQ2pCLEVBQUUsUUFBUTtBQUFBLE1BQ1YsYUFBYSxRQUFRLFlBQVk7QUFBQSxNQUNqQyxVQUFVO0FBQUEsUUFDUixNQUFNLFFBQVE7QUFBQSxRQUNkLFFBQVEsS0FBSyxNQUFNLE9BQU87QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFoQzhDO0FBQXZDLElBQU0sdUJBQU47OztBQ2hCUCxJQUFNLG1CQUFtQjtBQVR6QjtBQVdPLElBQU0sd0JBQU4sTUFBTSxzQkFBcUI7QUFBQSxFQVF6QixZQUNTLE9BQ0EsS0FDaEI7QUFGZ0I7QUFDQTtBQVZYO0FBQ0wsOEJBQStCO0FBQy9CLGtDQUFtQztBQUNuQyx1Q0FBcUM7QUFFckMsd0JBQU8sWUFBVztBQUNsQix3QkFBZ0IsVUFBcUIsb0JBQUksSUFBSTtBQU0zQyxRQUFJLEtBQUssYUFBYyxNQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsRUFDcEQ7QUFBQSxFQUVPLGVBQWU7QUFDcEIsV0FBTyxtQkFBSyxlQUFjO0FBQUEsRUFDNUI7QUFBQSxFQUVPLEtBQUssUUFBZ0I7QUFDMUIsUUFBSSxDQUFDLE9BQVEsT0FBTSxJQUFJLGlCQUFpQixjQUFjO0FBRXRELFNBQUssT0FBTyxNQUFNO0FBQ2xCLFNBQUssWUFBWTtBQUVqQixVQUFNLFFBQVEsT0FBTyxNQUFNLElBQUk7QUFFL0IsZUFBVyxRQUFRLE9BQU87QUFDeEIsWUFBTSxRQUFRLEtBQUssTUFBTSxnQkFBZ0I7QUFFekMsVUFBSSxPQUFPO0FBQ1QsY0FBTSxDQUFDLEVBQUUsU0FBUyxTQUFTLFlBQVksSUFBSTtBQUMzQyxjQUFNLFlBQ04sU0FBUyxPQUFPLElBQUksS0FBSyxNQUN6QixTQUFTLE9BQU8sSUFBSSxNQUNwQixTQUFTLFlBQVk7QUFFckIsYUFBSyxPQUFPLElBQUksV0FBVyxLQUFLLFFBQVEsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxNQUN0RTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLEdBQUcsTUFBK0I7QUFDdkMsVUFBTSxhQUFhLEtBQUssT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQzdDLFFBQUksY0FBYyxRQUFRLE9BQU8sV0FBWSxRQUFPO0FBQ3BELFFBQUksS0FBSyxPQUFPLElBQUksSUFBSTtBQUN4QixhQUFPLEVBQUUsTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLEdBQWEsV0FBVyxLQUFLO0FBRWhFLFVBQU0sT0FBTyxNQUFNLEtBQUssS0FBSyxPQUFPLEtBQUssQ0FBQztBQUUxQyxVQUFNLFVBQVUsS0FBSztBQUFBLE1BQU8sQ0FBQyxHQUFHLE1BQ2hDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBLElBQzlDO0FBRUEsUUFBSSxVQUFVLEtBQU0sUUFBTztBQUUzQixRQUFJLEtBQUssSUFBSSxVQUFVLElBQUksSUFBSSxJQUFNLFFBQU87QUFFNUMsVUFBTSxPQUFPLEtBQUssT0FBTyxJQUFJLE9BQU87QUFFcEMsUUFBSSxDQUFDLEtBQU0sUUFBTztBQUVsQixXQUFPLEVBQUUsV0FBVyxTQUFTLEtBQUs7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxTQUFTLFVBQTBCO0FBQ3hDLHVCQUFLLFdBQVk7QUFBQSxFQUNuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxjQUFjLFVBQXVCO0FBQzFDLHVCQUFLLGdCQUFpQjtBQUFBLEVBQ3hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxjQUFjO0FBQ25CLFFBQUksbUJBQUssT0FBTyxlQUFjLG1CQUFLLE1BQUs7QUFDeEMsUUFBSSxtQkFBSyxnQkFBZ0Isb0JBQUssZ0JBQUw7QUFFekIsdUJBQUssV0FBWTtBQUNqQix1QkFBSyxnQkFBaUI7QUFDdEIsdUJBQUssT0FBUTtBQUFBLEVBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sWUFBeUI7QUFDOUIsUUFBSSxtQkFBSyxPQUFPLFFBQU8sTUFBTSxLQUFLLFlBQVk7QUFFOUMsMEJBQUssZ0RBQUw7QUFFQSxXQUFPLE1BQU0sS0FBSyxZQUFZO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFFBQVE7QUFDYixVQUFNLFVBQVUsbUJBQUssV0FBVTtBQUUvQixRQUFJLFNBQVM7QUFDWCxvQkFBYyxtQkFBSyxNQUFNO0FBQ3pCLHlCQUFLLE9BQVE7QUFBQSxJQUNmO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFNBQVM7QUFDZCxVQUFNLFVBQVUsbUJBQUssV0FBVTtBQUUvQixRQUFJLENBQUMsUUFBUyx1QkFBSyxnREFBTDtBQUVkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFnQ0Y7QUFuS0U7QUFDQTtBQUNBO0FBSEs7QUFzSUwsZ0JBQVcsa0NBQUc7QUFDWixNQUFJLENBQUMsbUJBQUssV0FBVztBQUNyQixNQUFJLG1CQUFLLE9BQU8sZUFBYyxtQkFBSyxNQUFLO0FBRXhDLE1BQUksWUFBNkI7QUFFakMscUJBQUssT0FBUSxZQUFZLE1BQU07QUFDN0IsUUFBSSxLQUFLLE1BQU0sUUFBUyxRQUFPLEtBQUssWUFBWTtBQUVoRCxRQUFJLENBQUMsbUJBQUssY0FBYSxDQUFDLEtBQUssTUFBTSxVQUFVLEVBQUc7QUFFaEQsVUFBTSxPQUFPLEtBQUssTUFBTSxLQUFLLGFBQWE7QUFDMUMsUUFBSSxDQUFDLEtBQU07QUFFWCxVQUFNLFNBQVMsS0FBSyxHQUFHLEtBQUssUUFBUSxLQUFLO0FBRXpDLFFBQUksQ0FBQyxPQUFRO0FBRWIsUUFDQSxjQUFjLFFBQ2QsT0FBTyxTQUFTLFVBQVUsUUFDMUIsT0FBTyxjQUFjLFVBQVU7QUFFL0I7QUFFQSxnQkFBWTtBQUVaLHVCQUFLLFdBQUwsV0FBZSxPQUFPLE1BQU0sT0FBTztBQUFBLEVBQ3JDLEdBQUcsS0FBSyxRQUFRLEVBQUUsTUFBTTtBQUMxQixHQTdCVztBQXRJcUI7QUFBM0IsSUFBTSx1QkFBTjs7O0FUMEdBLElBQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVoscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVgsb0JBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJcEIsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsd0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJeEIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsWUFBWTtBQUNkO0FBS08sSUFBSyxrQkFBTCxrQkFBS0MscUJBQUw7QUFDTCxFQUFBQSxpQkFBQSxjQUFXO0FBQ1gsRUFBQUEsaUJBQUEsWUFBUztBQUNULEVBQUFBLGlCQUFBLHlCQUFzQjtBQUN0QixFQUFBQSxpQkFBQSxVQUFPO0FBQ1AsRUFBQUEsaUJBQUEsWUFBUztBQUNULEVBQUFBLGlCQUFBLGlCQUFjO0FBTkosU0FBQUE7QUFBQSxHQUFBO0FBOFRMLElBQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0IsS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUwsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsVUFBVTtBQUNaO0FBbGxCQTtBQXdsQk8sSUFBTSxjQUFOLE1BQU0sWUFBdUI7QUFBQSxFQXFCM0IsWUFDQSxRQUNBLFNBQ1A7QUFGTztBQUNBO0FBdkJGO0FBQ0wsdUNBQWlCO0FBQ2pCLGlDQUFXO0FBQ1gsaUNBQVc7QUFDWCx3QkFBUSxhQUEwQjtBQUNsQyx3QkFBTztBQUNQLHdCQUFPLFdBQVUsSUFBSSxrQkFBd0IsSUFBSTtBQUNqRCx3QkFBTyxjQUFzQztBQUM3Qyx3QkFBTyxRQUFPLElBQUkscUJBQTJCLElBQUk7QUFDakQsd0JBQU8sV0FBVSxJQUFJLHVCQUE2QixJQUFJO0FBQ3RELHdCQUFPLHdCQUFvRCxtQ0FBWSxNQUFaO0FBQzNELHdCQUFPLHVCQUFrRCw4QkFBTyxZQUFZO0FBQUEsTUFDMUU7QUFBQSxNQUNBLE1BQU0sZ0NBQVc7QUFBQSxJQUNuQixJQUh5RDtBQUl6RCx3QkFBTyxjQUE4QixnQkFBZ0I7QUFDckQsd0JBQU8sWUFBVyxJQUFJLHlCQUFtQztBQUN6RCx3QkFBTyxTQUFRLElBQUkscUJBQTJCLElBQUk7QUFDbEQsd0JBQU8sY0FBYSxJQUFJLFdBQVc7QUFDbkMsd0JBQU8sd0JBQXVCLElBQUkscUJBQXFCLElBQUk7QUFNekQsU0FBSyxTQUFTLElBQUksb0JBQWEsUUFBUSxhQUFhO0FBQ3BELFFBQUksU0FBUyxXQUFXLFFBQVEsb0JBQW9CO0FBQ3BELFdBQUssdUJBQXVCLFFBQVE7QUFDcEMsUUFBSSxTQUFTLFdBQVcsUUFBUSxtQkFBbUI7QUFDbkQsV0FBSyxzQkFBc0IsUUFBUTtBQUNuQyxRQUFJLENBQUMsU0FBUyxVQUFVLFFBQVEsVUFBVTtBQUMxQyxXQUFLLGFBQWEsUUFBUTtBQUUxQixZQUFRLGFBQVIsUUFBUSxXQUFhO0FBQ3JCLFlBQVEsWUFBUixRQUFRLFVBQVk7QUFDcEIsWUFBUSxtQkFBUixRQUFRLGlCQUFtQjtBQUMzQixZQUFRLGlCQUFSLFFBQVEsZUFBaUI7QUFFekIsUUFDQSxDQUFDLFNBQVMsVUFBVSxLQUFLLFFBQVEsTUFBTSxLQUN2QyxDQUFDLFNBQVMsVUFBVSxLQUFLLFFBQVEsTUFBTSxHQUN2QztBQUNFLFdBQUssUUFBUSxrQkFBa0IsU0FBUyxLQUFLLFFBQVE7QUFBQSxJQUN2RDtBQUVBLFFBQUksTUFBTSxRQUFRLEtBQUssUUFBUSxTQUFTLEdBQUc7QUFDekMsV0FBSyxRQUFRLGtCQUFrQixZQUFZLEtBQUssUUFBUTtBQUFBLElBQzFEO0FBRUEsUUFBSSxNQUFNLFFBQVEsS0FBSyxRQUFRLFFBQVEsR0FBRztBQUN4QyxXQUFLLFFBQVEsa0JBQWtCLFVBQVUsS0FBSyxRQUFRO0FBQUEsSUFDeEQ7QUFFQSxRQUFJLFNBQVMsU0FBUyxLQUFLLFFBQVEsU0FBUyxHQUFHO0FBQzdDLFdBQUssUUFBUSxrQkFBa0IsYUFBYSxLQUFLLFFBQVE7QUFBQSxJQUMzRDtBQUVBLFFBQUksU0FBUyxRQUFRLEtBQUssUUFBUSxhQUFhLEdBQUc7QUFDaEQsV0FBSyxRQUFRLE9BQU8sWUFBWSxLQUFLLFFBQVEsYUFBYTtBQUFBLElBQzVEO0FBRUEsUUFBSSxDQUFDLFNBQVMsU0FBUyxRQUFRLE9BQU8sR0FBRztBQUN2QyxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFFBQ0EsT0FBTyxRQUFRO0FBQUEsTUFDakI7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLFNBQVMsU0FBUyxRQUFRLGNBQWMsR0FBRztBQUM5QyxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFFBQ0EsT0FBTyxRQUFRO0FBQUEsTUFDakI7QUFBQSxJQUNGO0FBRUEsUUFBSSxRQUFRLFVBQVUsRUFBRyxTQUFRLFVBQVU7QUFDM0MsUUFBSSxRQUFRLGlCQUFpQixFQUFHLFNBQVEsaUJBQWlCO0FBRXpELFFBQUksS0FBSztBQUNULFdBQUs7QUFBQSxRQUNILG9DQUFvQyxLQUFLLFFBQVEsTUFBTSxJQUFJLFNBQVMsS0FBSyxRQUFRLE1BQU0sRUFBRTtBQUFBLE1BQzNGO0FBQ0EsU0FBSyxLQUFLLGdCQUFnQixhQUFhLElBQUk7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sZUFBZTtBQUNwQixXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLG9CQUFvQjtBQUM3QixXQUFPLEtBQUssT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxFQUFFLFlBQVksQ0FBQztBQUFBLEVBQy9EO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLG9CQUFvQjtBQUM3QixXQUFPLEtBQUssY0FBYyxLQUFLLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQztBQUFBLEVBQ2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWVPLGFBQWEsUUFBd0M7QUFDMUQsU0FBSyxxQkFBcUIsS0FBSyxRQUFRLGdCQUFnQixFQUFFO0FBQ3pELFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sTUFBTSxHQUFXO0FBQ3RCLFNBQUssS0FBSyxnQkFBZ0IsT0FBTyxNQUFNLENBQUM7QUFBQSxFQUMxQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxXQUFXO0FBQ3BCLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDdEI7QUFBQSxFQUVBLElBQVcsU0FBUyxHQUFTO0FBQzNCLFNBQUssUUFBUSxXQUFXO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sWUFBWSxHQUFTO0FBQzFCLFNBQUssUUFBUSxXQUFXO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZUFBZTtBQUN4QixXQUFPLEtBQUssWUFBWSxlQUFlLFlBQVksS0FBSztBQUFBLEVBQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFVBQVU7QUFDbkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNuQixXQUFPLEtBQUssWUFBWSxXQUFXO0FBQUEsRUFDckM7QUFBQSxFQUVBLElBQVcsUUFBUSxHQUE2QjtBQUM5QyxRQUFJLEtBQUssWUFBWTtBQUNuQixVQUFJLEdBQUc7QUFDTCxhQUFLLFdBQVcsVUFBVTtBQUFBLE1BQzVCLE9BQU87QUFDTCxhQUFLLE9BQU87QUFBQSxNQUNkO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsYUFBYTtBQUN0QixXQUFPLEtBQUssWUFBWSxtQkFBbUI7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxRQUFRO0FBQ2pCLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsS0FBSztBQUNkLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8saUJBQWlCLE9BQWdCO0FBQ3RDLHVCQUFLLGdCQUFpQjtBQUFBLEVBQ3hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxrQkFBa0I7QUFDdkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sY0FBYyxNQUF1QjtBQUMxQyxTQUFLLGFBQWE7QUFBQSxFQUNwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ25CLFdBQU8sS0FBSyxRQUFRLFdBQVc7QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sYUFBYTtBQUNsQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDaEIsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVTtBQUNmLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsaUJBQWlCO0FBQzFCLFdBQU8sS0FBSyxRQUFRLGtCQUFrQjtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxvQkFBb0I7QUFDekIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxrQkFBa0IsTUFBYztBQUNyQyxRQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUM1QixZQUFNLElBQUksb0JBQW9CLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUM3RDtBQUVBLFFBQUksT0FBTyxFQUFHLFFBQU87QUFFckIsU0FBSyxRQUFRLGlCQUFpQjtBQUFBLEVBQ2hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQVcsTUFBYztBQUM5QixRQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUM1QixZQUFNLElBQUksb0JBQW9CLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUM3RDtBQUVBLFFBQUksT0FBTyxFQUFHLFFBQU87QUFFckIsU0FBSyxRQUFRLFVBQVU7QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBUTtBQUNiLFNBQUssT0FBTyxNQUFNO0FBQ2xCLFNBQUssUUFBUSxNQUFNO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDZixXQUFPLEtBQUssT0FBTyxPQUFPO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFNBQVM7QUFDZCxXQUFPLEtBQUssT0FBTyxRQUFRLEtBQUs7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sY0FBYztBQUNuQixRQUFJLEtBQUssT0FBTyxFQUFHLFFBQU87QUFDMUIsVUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLO0FBQ2hDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2pCLFdBQ0UsS0FBSyxZQUFZLGlCQUFpQixRQUNsQyxDQUFDLEtBQUssV0FBVyxjQUFjO0FBQUEsRUFFbkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sU0FBUyxPQUFtQztBQUNqRCxVQUFNLFFBQVEsaUJBQWlCLFdBQVcsTUFBTSxTQUFTO0FBQ3pELFVBQU0sVUFBVSxNQUFNLFFBQVEsS0FBSztBQUVuQyx1QkFBbUIsTUFBTSxLQUFLO0FBRTlCLFNBQUssT0FBTyxJQUFJLEtBQUs7QUFFckIsUUFBSSxTQUFTO0FBQ1gsV0FBSyxLQUFLLGdCQUFnQixnQkFBZ0IsTUFBTSxLQUFLO0FBQUEsSUFDdkQsT0FBTztBQUNMLFdBQUssS0FBSyxnQkFBZ0IsZUFBZSxNQUFNLEtBQUs7QUFBQSxJQUN0RDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sWUFBWSxPQUF3QjtBQUN6QyxXQUFPLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFFBQVEsT0FBNEMsUUFBUSxHQUFTO0FBQzFFLFFBQUksUUFBUSxLQUFLLFFBQVEsS0FBSyxPQUFPLE1BQU07QUFDekMsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLFFBQ0EsR0FBRyxLQUFLO0FBQUEsUUFDUjtBQUFBLFFBQ0EsR0FBRyxLQUFLLE9BQU8sSUFBSTtBQUFBLE1BQ3JCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUSxNQUFNLFFBQVEsS0FBSyxJQUNqQyxNQUFNLFNBQ04saUJBQWlCLHNCQUNqQixNQUFNLE9BQ047QUFFQSx1QkFBbUIsTUFBTSxLQUFLO0FBRTlCLFVBQU0saUJBQWlCLFVBQVUsSUFBSSxJQUFJLFFBQVE7QUFFakQsUUFBSSxpQkFBaUIsT0FBTztBQUMxQixXQUFLLEtBQUssT0FBTyxPQUFPLGNBQWM7QUFDdEMsV0FBSyxLQUFLLGdCQUFnQixlQUFlLE1BQU0sS0FBSztBQUNwRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLFNBQVMsaUJBQWlCLHNCQUFRLE1BQU0sUUFBUTtBQUV0RCxTQUFLLE9BQU8sTUFBTSxPQUFPLGdCQUFnQixHQUFHLEdBQUcsTUFBTTtBQUVyRCxRQUFJLENBQUMsS0FBSyxRQUFRLGNBQWM7QUFDOUIsV0FBSyxLQUFLLGdCQUFnQixnQkFBZ0IsTUFBTSxNQUFNO0FBQUEsSUFDeEQ7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sT0FBTyxPQUE0QyxRQUFRLEdBQVM7QUFDekUsUUFBSSxRQUFRLEtBQUssUUFBUSxLQUFLLE9BQU8sTUFBTTtBQUN6QyxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQSxHQUFHLEtBQUs7QUFBQSxRQUNSO0FBQUEsUUFDQSxHQUFHLEtBQUssT0FBTyxJQUFJO0FBQUEsTUFDckI7QUFBQSxJQUNGO0FBRUEsVUFBTSxRQUFRLE1BQU0sUUFBUSxLQUFLLElBQ2pDLE1BQU0sU0FDTixpQkFBaUIsc0JBQ2pCLE1BQU0sT0FDTjtBQUVBLHVCQUFtQixNQUFNLEtBQUs7QUFFOUIsUUFBSSxpQkFBaUIsT0FBTztBQUMxQixXQUFLLEtBQUssT0FBTyxPQUFPLEtBQUs7QUFDN0IsV0FBSyxLQUFLLGdCQUFnQixlQUFlLE1BQU0sS0FBSztBQUNwRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLFNBQVMsaUJBQWlCLHNCQUFRLE1BQU0sUUFBUTtBQUV0RCxTQUFLLE9BQU8sTUFBTSxPQUFPLE9BQU8sR0FBRyxHQUFHLE1BQU07QUFFNUMsUUFBSSxDQUFDLEtBQUssUUFBUSxjQUFjO0FBQzlCLFdBQUssS0FBSyxnQkFBZ0IsZ0JBQWdCLE1BQU0sTUFBTTtBQUFBLElBQ3hEO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksT0FBYyxRQUFRLEdBQVM7QUFDaEQsV0FBTyxLQUFLLEtBQUssT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFVBQVUsT0FBd0IsUUFBUSxHQUFTO0FBQ3hELFdBQU8sS0FBSyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxVQUFVLE9BQXdCLFFBQVEsR0FBUztBQUN4RCxXQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sV0FBVyxLQUFzQixNQUE2QjtBQUNuRSxXQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ2pDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGlCQUNQLFlBQ0EsVUFBK0QsQ0FBQyxHQUNoRTtBQUNFLFFBQUksV0FBVyxNQUFNLFdBQVcsMkNBQXNCLFdBQVc7QUFDL0QsWUFBTSxJQUFJLDhCQUE4QjtBQUFBLElBQzFDO0FBRUEsVUFBTSxVQUFVLEtBQUssT0FBTyxPQUFPLFNBQVMsTUFBTTtBQUFBLE1BQ2hELFdBQVcsV0FBVztBQUFBLElBQ3hCO0FBQ0EsUUFBSSxDQUFDLFFBQVMsT0FBTSxJQUFJLG9CQUFvQjtBQUM1QyxRQUFJLENBQUMsUUFBUSxhQUFhO0FBQzFCLFlBQU0sSUFBSTtBQUFBLFFBQ1I7QUFBQSxRQUNBLDJCQUEyQiw0QkFBWSxVQUFVLElBQUksNEJBQVksZUFBZTtBQUFBLFFBQ2hGLE9BQU8sU0FBUyxJQUFJO0FBQUEsTUFDdEI7QUFFQSxRQUFJLEtBQUssWUFBWTtBQUNuQiw0QkFBSywyQ0FBTCxXQUFzQixLQUFLO0FBQzNCLFdBQUssV0FBVyxRQUFRO0FBQ3hCLFdBQUssYUFBYTtBQUFBLElBQ3BCO0FBRUEsU0FBSyxhQUFhLElBQUk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRLFdBQVcsS0FBSyxRQUFRO0FBQUEsTUFDaEMsUUFBUTtBQUFBLElBQ1Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxRQUNiLG1CQUNBLFVBQThCLENBQUMsR0FDL0I7QUFDRSxVQUFNLFVBQVUsS0FBSyxPQUFPLE9BQU8sU0FBUyxRQUFRLGlCQUFpQjtBQUNyRSxRQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsYUFBYSxHQUFHO0FBQ3ZDLFlBQU0sSUFBSTtBQUFBLFFBQ1I7QUFBQSxRQUNBLDJCQUEyQiw0QkFBWSxVQUFVLElBQUksNEJBQVksZUFBZTtBQUFBLFFBQ2hGLE9BQU8sU0FBUyxJQUFJO0FBQUEsTUFDdEI7QUFBQSxJQUNGO0FBRUEsUUFBSSxLQUFLO0FBQ1QsV0FBSztBQUFBLFFBQ0gsaUJBQ0EsUUFBUSxTQUFTLDRCQUFZLGtCQUFrQixVQUFVLE9BQU8sWUFDaEUsUUFBUSxJQUFJLFNBQVMsUUFBUSxFQUFFO0FBQUEsTUFDakM7QUFFQSxRQUFJLEtBQUssY0FBYyxRQUFRLE9BQU8sS0FBSyxXQUFXLFFBQVEsSUFBSTtBQUNoRSxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sMkJBQTJCO0FBQzVELDRCQUFLLDJDQUFMLFdBQXNCLEtBQUs7QUFDM0IsV0FBSyxXQUFXLFFBQVE7QUFDeEIsV0FBSyxhQUFhO0FBQUEsSUFDcEI7QUFFQSxTQUFLLGFBQWEsTUFBTSxLQUFLLE9BQU8sV0FBVyxRQUFRLFNBQVM7QUFBQSxNQUM5RCxNQUFNLFFBQVEsUUFBUSxLQUFLLFFBQVEsWUFBWTtBQUFBLE1BQy9DLFNBQVMsU0FBUyxXQUFXLEtBQUssUUFBUSxxQkFBcUI7QUFBQSxNQUMvRCxPQUFPO0FBQUEsTUFDUCxhQUFhLFNBQVM7QUFBQSxNQUN0QixPQUFPLFFBQVEsU0FBUyxLQUFLLE9BQU8sT0FBTyxNQUFNO0FBQUEsSUFDbkQsQ0FBQztBQUVELFNBQUssS0FBSyxnQkFBZ0IsWUFBWSxJQUFJO0FBRTFDLFFBQUksS0FBSyxRQUFTLFNBQVMsNEJBQVksaUJBQWlCO0FBQ3RELFlBQU0sS0FBSyxRQUFTLE1BQU0sUUFBUSxHQUFJLE1BQU0sY0FBYyxLQUFLLEVBQUU7QUFBQSxRQUMvRCxZQUFZO0FBQ1YsaUJBQU8sTUFBTSxLQUFLLFFBQVMsTUFBTSxRQUFRLEdBQUksTUFBTTtBQUFBLFlBQ2pEO0FBQUEsVUFDRixFQUFFLE1BQU0sS0FBSyxJQUFJO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLDBCQUFLLDJDQUFMLFdBQXNCLEtBQUs7QUFFM0IsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGNBQWMsVUFBVSxNQUFNO0FBQ25DLFFBQUksQ0FBQyxTQUFTO0FBQ1osV0FBSyxPQUFPLFFBQVE7QUFDcEIsYUFBTztBQUFBLElBQ1Q7QUFFQSx1QkFBSyxVQUFXO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxpQkFBaUI7QUFDdEIsdUJBQUssVUFBVztBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQWMsVUFBVSxNQUFNO0FBQ25DLFFBQUksU0FBUztBQUNYLHlCQUFLLFVBQVcsQ0FBQyxtQkFBSztBQUN0QixhQUFPLG1CQUFLO0FBQUEsSUFDZCxPQUFPO0FBQ0wsV0FBSyxPQUFPLFFBQVE7QUFDcEIsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGNBQWM7QUFDdkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsT0FBTztBQUNoQixXQUFPLEtBQUssWUFBWSxLQUFLLE9BQU87QUFBQSxFQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNkLFFBQUksS0FBSyxPQUFPLE1BQU0sT0FBTyxLQUFLLEVBQUUsR0FBRztBQUNyQyx5QkFBSyxVQUFXO0FBQ2hCLFdBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLGFBQWEsSUFBSTtBQUN6RCxXQUFLLEtBQUssV0FBVyxVQUFVO0FBQy9CLFdBQUssV0FBVyxVQUFVO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFNBQVM7QUFDZCxRQUFJLENBQUMsS0FBSyxXQUFXLEtBQUssT0FBTyxNQUFNLElBQUksS0FBSyxFQUFFLEVBQUc7QUFDckQsdUJBQUssVUFBVztBQUNoQixTQUFLLGlCQUFpQixLQUFLO0FBQzNCLFNBQUssT0FBTyxNQUFNLE1BQU0sSUFBSSxLQUFLLElBQUksSUFBSTtBQUN6QyxTQUFLLE9BQU8sT0FBTyxLQUFLLGdCQUFnQixhQUFhLElBQUk7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksTUFBZ0IsUUFBaUI7QUFDbEQsV0FBTyxLQUFLLE1BQU0sUUFBUSxHQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksTUFBZ0IsUUFBaUI7QUFDbEQsV0FBTyxLQUFLLE1BQU0sUUFBUSxHQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsS0FDYixPQUNBLFNBQ0E7QUFDRSxRQUFJLENBQUMsS0FBSyxRQUFTLE9BQU0sSUFBSSx1QkFBdUI7QUFFcEQsV0FBTyxLQUFLLE9BQU8sS0FBSyxLQUFLLFNBQVMsT0FBTyxPQUFPO0FBQUEsRUFDdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUNQLFVBQ0csTUFDTztBQUNSLFFBQUksS0FBSyxRQUFTLFFBQU87QUFDekIsV0FBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLE9BQU8sR0FBRyxJQUFJO0FBQUEsRUFDL0M7QUFBQSxFQStIQSxJQUFXLGNBQWM7QUFDdkIsV0FBTyxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQzVCO0FBc01GO0FBNy9CRTtBQUNBO0FBQ0E7QUFISztBQXlyQkwscUJBQWdCLGdDQUFDLFlBQThCO0FBQzdDLGFBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDdkUsYUFBVztBQUFBLElBQ1Q7QUFBQSxJQUNBLENBQUMsTUFBTSxLQUFLLGVBQWUsS0FBSyxLQUFLLGdCQUFnQixPQUFPLE1BQU0sQ0FBQztBQUFBLEVBQ3JFO0FBQ0EsYUFBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLHNCQUFLLHlDQUFMLFdBQW9CLEVBQUU7QUFDckQsYUFBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLHNCQUFLLHdDQUFMLFdBQW1CLEVBQUU7QUFDbkQsYUFBVyxHQUFHLGFBQWEsTUFBTTtBQUMvQiwwQkFBSywyQ0FBTCxXQUFzQjtBQUN0QixTQUFLLGFBQWE7QUFBQSxFQUNwQixDQUFDO0FBQ0QsYUFBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNO0FBQzFCLFFBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLGtCQUFrQixTQUFTLENBQUMsR0FBRztBQUN6RCxXQUFLO0FBQUEsUUFDSCxnQkFBZ0I7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsS0FBSyxRQUFRLGtCQUFrQjtBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxTQUFLLFFBQVEsa0JBQWtCLFVBQVU7QUFBQSxFQUMzQyxDQUFDO0FBQ0QsYUFBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQzdCLFFBQUksS0FBSyxRQUFRLGtCQUFrQixXQUFXLEdBQUc7QUFDL0MsV0FBSztBQUFBLFFBQ0gsZ0JBQWdCO0FBQUEsUUFDaEI7QUFBQSxRQUNBLEtBQUssUUFBUSxrQkFBa0I7QUFBQSxRQUMvQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsU0FBSyxRQUFRLGtCQUFrQixTQUFTO0FBQUEsRUFDMUMsQ0FBQztBQUNELGFBQVcsR0FBRyxXQUFXLENBQUMsTUFBTTtBQUM5QixRQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxRQUFRLGtCQUFrQixTQUFTLEdBQUc7QUFDM0QsV0FBSztBQUFBLFFBQ0gsZ0JBQWdCO0FBQUEsUUFDaEI7QUFBQSxRQUNBLEtBQUssUUFBUSxrQkFBa0I7QUFBQSxRQUMvQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsU0FBSyxRQUFRLGtCQUFrQixZQUFZO0FBQUEsRUFDN0MsQ0FBQztBQUNELGFBQVcsR0FBRyxVQUFVLENBQUMsTUFBTTtBQUM3QixRQUFJLEtBQUssUUFBUSxrQkFBa0IsV0FBVztBQUM5QyxXQUFLO0FBQUEsUUFDSCxnQkFBZ0I7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsS0FBSyxRQUFRLGtCQUFrQjtBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUNBLFNBQUssUUFBUSxrQkFBa0IsU0FBUztBQUFBLEVBQzFDLENBQUM7QUFHRCxRQUFNLHNCQUFzQix3QkFBQyxHQUFRLE1BQVc7QUFDOUMsUUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFHLFFBQU87QUFDckIsUUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFHLFFBQU87QUFDckIsUUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFLFdBQVcsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFRLFFBQU87QUFDNUQsV0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQUEsRUFDakQsR0FMNEI7QUFPNUIsYUFBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNO0FBQ2pDLFFBQUksS0FBSyxRQUFRLGtCQUFrQixlQUFlLEVBQUUsWUFBWTtBQUM5RCxXQUFLO0FBQUEsUUFDSCxnQkFBZ0I7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsS0FBSyxRQUFRLGtCQUFrQjtBQUFBLFFBQy9CLEVBQUU7QUFBQSxNQUNKO0FBRUEsV0FBSyxRQUFRLGtCQUFrQixhQUFhLEVBQUU7QUFFOUMsV0FBSyxRQUFRLFFBQVEsY0FBYyxFQUFFLFVBQVU7QUFDL0MsV0FBSyxRQUFRLFFBQVEsaUJBQWlCLEtBQUssS0FBSyxpQkFBaUI7QUFBQSxJQUNuRTtBQUVBLFFBQUksRUFBRSxrQkFBa0IsS0FBSyxRQUFRLGtCQUFrQixrQkFBa0I7QUFDdkUsV0FBSztBQUFBLFFBQ0gsZ0JBQWdCO0FBQUEsUUFDaEI7QUFBQSxRQUNBLEtBQUssUUFBUSxrQkFBa0Isb0JBQW9CO0FBQUEsUUFDbkQsRUFBRTtBQUFBLE1BQ0o7QUFDQSxXQUFLLFFBQVEsa0JBQWtCLG1CQUFtQixFQUFFO0FBQUEsSUFDdEQ7QUFBQSxFQUNGLENBQUM7QUFDRCxhQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDN0IsUUFBSSxvQkFBb0IsR0FBRyxLQUFLLFFBQVEsa0JBQWtCLE1BQU0sR0FBRztBQUNqRSxXQUFLO0FBQUEsUUFDSCxnQkFBZ0I7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsS0FBSyxRQUFRLGtCQUFrQixVQUFVO0FBQUEsUUFDekM7QUFBQSxNQUNGO0FBQ0EsV0FBSyxRQUFRLGtCQUFrQixTQUFTO0FBQUEsSUFDMUM7QUFBQSxFQUNGLENBQUM7QUFDRCxhQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDN0IsUUFBSSxLQUFLLGFBQWE7QUFDcEIsV0FBSztBQUFBLFFBQ0gsdUJBQXVCLEVBQUUsVUFBVSxnQkFBZ0IsS0FBSyxjQUFjLEtBQUs7QUFBQSxNQUM3RTtBQUFBLElBQ0Y7QUFFQSxRQUFJLEVBQUUsY0FBYyxLQUFNLE1BQUssS0FBSyxZQUFZLEVBQUUsVUFBVTtBQUU1RCxTQUFLLEtBQUssZ0JBQWdCLFlBQVksTUFBTSxDQUFDO0FBQUEsRUFDL0MsQ0FBQztBQUVELGFBQVcsR0FBRyxjQUFjLENBQUMsTUFBTTtBQUNqQyxRQUFJLG9CQUFvQixHQUFHLEtBQUssUUFBUSxrQkFBa0IsVUFBVSxHQUFHO0FBQ3JFLFdBQUs7QUFBQSxRQUNILGdCQUFnQjtBQUFBLFFBQ2hCO0FBQUEsUUFDQSxLQUFLLFFBQVEsa0JBQWtCLGNBQWM7QUFBQSxRQUM3QztBQUFBLE1BQ0Y7QUFDQSxXQUFLLFFBQVEsa0JBQWtCLGFBQWE7QUFBQSxJQUM5QztBQUFBLEVBQ0YsQ0FBQztBQUNILEdBM0hnQjtBQWlJaEIscUJBQWdFLGdDQUFDLFFBQVc7QUFDMUUsU0FBTyxtQkFBbUI7QUFDNUIsR0FGZ0U7QUFJaEUsa0JBQWEsZ0NBQUMsVUFBaUM7QUFDN0MsUUFBTSxRQUFRLFVBQVUsWUFBWSxLQUFLO0FBQ3pDLFFBQU0sU0FBUyxLQUFLLGdCQUFnQixJQUFJLFlBQVk7QUFFcEQsTUFBSSxLQUFLO0FBQ1QsU0FBSztBQUFBLE1BQ0gsOEJBQThCLEtBQUssVUFBVTtBQUFBLFFBQzNDLE9BQU8sT0FBTztBQUFBLFFBQ2Q7QUFBQSxNQUNGLENBQUMsQ0FBQztBQUFBLElBQ0o7QUFFQSxPQUFLLEtBQUssZ0JBQWdCLGVBQWUsTUFBTSxPQUFRLE1BQU07QUFDN0QsTUFBSSxTQUFTLENBQUMsS0FBSyxnQkFBZ0I7QUFDbkMsU0FBSyxLQUFLLGdCQUFnQixhQUFhLE1BQU0sS0FBSztBQUNsRCxPQUFLLGlCQUFpQixLQUFLO0FBQzdCLEdBaEJhO0FBa0JiLGtCQUFhLGtDQUFHO0FBQ2QsTUFBSSxDQUFDLEtBQUssYUFBYTtBQUNyQixXQUFPLEtBQUssT0FBTyxTQUFTO0FBQUEsRUFDOUI7QUFFQSxRQUFNLFFBQVEsS0FBSyxPQUFPO0FBRTFCLE1BQUksQ0FBQyxNQUFNLE9BQVE7QUFFbkIsUUFBTSxRQUFRLEtBQUssYUFBYSxLQUFLO0FBRXJDLE9BQUssT0FBTyxVQUFVLENBQUMsTUFBTTtBQUMzQixXQUFPLEVBQUUsT0FBTyxNQUFNO0FBQUEsRUFDeEIsQ0FBQztBQUVELFNBQU87QUFDVCxHQWhCYTtBQWtCYixtQkFBYyxnQ0FBQyxVQUFpQztBQUM5QyxRQUFNLFFBQVEsVUFBVSxZQUFZLEtBQUs7QUFFekMsTUFBSSxLQUFLO0FBQ1QsU0FBSztBQUFBLE1BQ0gsU0FBUyxLQUFLLFVBQVU7QUFBQSxRQUN0QixPQUFPLE9BQU87QUFBQSxRQUNkLGtCQUFrQixLQUFLLGdCQUFnQjtBQUFBLE1BQ3pDLENBQUMsQ0FBQztBQUFBLElBQ0o7QUFFQSxNQUFJLENBQUMsS0FBSyxnQkFBZ0IsR0FBRztBQUMzQixTQUFLLHFCQUFxQixZQUFZO0FBQ3RDLFNBQUsscUJBQXFCLE9BQU8sTUFBTTtBQUN2QyxRQUFJLEtBQUs7QUFDVCxXQUFLO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFDQSxRQUFJLE9BQU87QUFDVCxXQUFLLFFBQVEsS0FBSyxLQUFLO0FBQ3ZCLFdBQUssS0FBSyxjQUFjO0FBQ3hCLFdBQUssS0FBSyxnQkFBZ0IsY0FBYyxNQUFNLEtBQUs7QUFBQSxJQUNyRDtBQUNBLFFBQUksbUJBQUssVUFBVSxRQUFPLHNCQUFLLG1DQUFMO0FBQzFCLFFBQUksS0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLLGVBQWUsZ0JBQWdCLEtBQUs7QUFDbkUsVUFBSSxLQUFLO0FBQ1QsYUFBSztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQ0EsNEJBQUssbUNBQUw7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLEtBQUssZUFBZSxnQkFBZ0IsT0FBTztBQUM3QyxZQUFJLEtBQUs7QUFDVCxlQUFLO0FBQUEsWUFDSDtBQUFBLFVBQ0Y7QUFDQSxhQUFLLFlBQVksS0FBSyxRQUFRLE9BQU8sU0FBUyxLQUFLO0FBQ25ELGVBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxXQUFZLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxNQUN6RDtBQUNBLFVBQUksS0FBSyxlQUFlLGdCQUFnQixPQUFPO0FBQzdDLFlBQUksS0FBSztBQUNULGVBQUs7QUFBQSxZQUNIO0FBQUEsVUFDRjtBQUNBLGNBQU0sT0FBTyxLQUFLLFFBQVEsT0FBTyxTQUFTLEtBQUs7QUFDL0MsWUFBSSxLQUFNLE1BQUssT0FBTyxJQUFJLElBQUk7QUFBQSxNQUNoQztBQUNBLFVBQUksQ0FBQyxLQUFLLE9BQU8sUUFBUSxPQUFPO0FBQzlCLFlBQUksS0FBSyxlQUFlLGdCQUFnQixVQUFVO0FBQ2hELGNBQUksS0FBSztBQUNULGlCQUFLO0FBQUEsY0FDSDtBQUFBLFlBQ0Y7QUFDQSxnQ0FBSywwQ0FBTCxXQUFxQjtBQUNyQjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLE9BQU87QUFDTCxZQUFJLEtBQUs7QUFDVCxlQUFLLE1BQU0seUNBQXlDO0FBQ3BELGFBQUssWUFBWSxzQkFBSyx3Q0FBTDtBQUNqQixhQUFLLEtBQUssS0FBSyxLQUFLLFdBQVc7QUFBQSxVQUM3QixPQUFPO0FBQUEsUUFDVCxDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsR0FsRWM7QUFvRWQsYUFBUSxrQ0FBRztBQUNULE9BQUssWUFBWTtBQUNqQixPQUFLLEtBQUssZ0JBQWdCLFlBQVksSUFBSTtBQUMxQyxNQUFJLEtBQUssUUFBUSxZQUFZO0FBQzNCLFVBQU0sU0FBcUIsMEJBQVcsTUFBTTtBQUMxQyxVQUFJLEtBQUssVUFBVSxFQUFHLFFBQU8sYUFBYSxFQUFFO0FBQzVDLFdBQUssWUFBWSxXQUFXO0FBQUEsSUFDOUIsR0FBRyxLQUFLLFFBQVEsa0JBQWtCLEVBQUUsTUFBTTtBQUFBLEVBQzVDO0FBQ0YsR0FUUTtBQVdGLG9CQUFlLHNDQUFDLE9BQWM7QUFDbEMsTUFBSTtBQUNGLFFBQUksS0FBSztBQUNULFdBQUs7QUFBQSxRQUNILGdEQUFnRCxNQUFNLEtBQUssS0FDM0QsTUFBTSxHQUFHLFVBQ1QsTUFBTSxXQUFXLGNBQWMsS0FBSztBQUFBLE1BQ3RDO0FBQ0EsVUFBTSxVQUNMLE1BQU0sTUFBTSxXQUFXLGlCQUFpQixPQUFPLEtBQUssT0FBTyxJQUM1RCxXQUVBLE1BQU0sS0FBSyxPQUFPLFdBQVcsSUFBSSxPQUFPLFFBQVE7QUFDOUMsVUFBSSxLQUFLO0FBQ1QsYUFBSyxNQUFNLGtDQUFrQyxJQUFJLFVBQVUsRUFBRTtBQUM3RCxZQUFNLE1BQU0sTUFBTSxJQUFJLGlCQUFpQixPQUFPLEtBQUssT0FBTztBQUMxRCxVQUFJLENBQUMsSUFBSSxPQUFPLFFBQVE7QUFDdEIsWUFBSSxLQUFLO0FBQ1QsZUFBSztBQUFBLFlBQ0gseUJBQXlCLElBQUksVUFBVTtBQUFBLFVBQ3pDO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLEtBQUs7QUFDVCxhQUFLO0FBQUEsVUFDSCx5QkFBeUIsSUFBSSxVQUFVO0FBQUEsUUFDekM7QUFFQSxhQUFPLElBQUk7QUFBQSxJQUNiLENBQUMsSUFDRCxVQUNBLENBQUM7QUFFRCxRQUFJLFdBQTBDLEtBQUs7QUFDbkQsVUFBTSxjQUFjLElBQUk7QUFBQSxNQUN0QixDQUFDQyxhQUFZLFdBQVdBO0FBQUEsSUFDMUI7QUFFQSxVQUFNLFVBQVUsS0FBSztBQUFBLE1BQ25CLGdCQUFnQjtBQUFBLE1BQ2hCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBR0EsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLFFBQ0UsT0FBTyxVQUNOLE1BQU07QUFDTCxnQkFBTSxTQUFTLE9BQU87QUFBQSxZQUNwQixDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsR0FBRyxHQUFHO0FBQUEsVUFDM0Q7QUFDQSxpQkFBTyxTQUFTLENBQUMsS0FBSyxLQUFLLGFBQWEsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQUEsUUFDNUQsR0FBRyxJQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFlBQVksTUFBTTtBQUV4QixRQUFJLENBQUMsV0FBVztBQUNkLFVBQUksS0FBSztBQUNULGFBQUssTUFBTSx1REFBdUQ7QUFDbEUsWUFBTTtBQUFBLElBQ1I7QUFFQSxVQUFNLEtBQUssS0FBSyxLQUFLLFdBQVc7QUFBQSxNQUM5QixPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixnQkFBZ0I7QUFBQSxJQUNsQixDQUFDO0FBQUEsRUFDSCxRQUFRO0FBQ04sV0FBTyxzQkFBSyxtQ0FBTDtBQUFBLEVBQ1Q7QUFDRixHQTVFcUI7QUFqN0JhO0FBQTdCLElBQU1DLGNBQU47OztBRDFoQkEsSUFBTSxvQkFBTixNQUFNLGtCQUE2QjtBQUFBLEVBRWpDLFlBQW1CLFFBQWdCO0FBQWhCO0FBRDFCLHdCQUFPLFNBQVEsSUFBSSx5QkFBK0I7QUFBQSxFQUNQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT3BDLE9BQ1AsT0FDQSxVQUFxQyxDQUFDLEdBQ3RCO0FBQ2QsVUFBTSxTQUFTLEtBQUssT0FBTyxPQUFPLE9BQU8sUUFBUSxLQUFLO0FBQ3RELFFBQUksQ0FBQyxRQUFRO0FBQ1gsWUFBTSxJQUFJLGFBQWEsMEJBQTBCO0FBQUEsSUFDbkQ7QUFFQSxRQUFJLEtBQUssTUFBTSxJQUFJLE9BQU8sRUFBRSxHQUFHO0FBQzdCLGFBQU8sS0FBSyxNQUFNLElBQUksT0FBTyxFQUFFO0FBQUEsSUFDakM7QUFFQSxZQUFRLGFBQVIsUUFBUSxXQUFhO0FBQ3JCLFlBQVEsV0FBUixRQUFRLFNBQVc7QUFDbkIsWUFBUSxjQUFSLFFBQVEsWUFBYyxDQUFDO0FBQ3ZCLFlBQVEsYUFBUixRQUFRLFdBQWEsQ0FBQztBQUN0QixZQUFRLG1CQUFSLFFBQVEsaUJBQW1CO0FBQzNCLFlBQVEsaUJBQVIsUUFBUSxlQUFpQjtBQUN6QixZQUFRLHlCQUFSLFFBQVEsdUJBQXlCO0FBQ2pDLFlBQVEsZUFBUixRQUFRLGFBQWU7QUFDdkIsWUFBUSx1QkFBUixRQUFRLHFCQUF1QjtBQUMvQixZQUFRLGdCQUFSLFFBQVEsY0FBZ0I7QUFDeEIsWUFBUSx3QkFBUixRQUFRLHNCQUF3QjtBQUNoQyxZQUFRLGNBQVIsUUFBUSxZQUFjO0FBQ3RCLFlBQVEsYUFBUixRQUFRLFdBQWE7QUFDckIsWUFBUSxzQkFBUixRQUFRLG9CQUFzQixLQUFLLE9BQU8sUUFBUTtBQUNsRCxZQUFRLHFCQUFSLFFBQVEsbUJBQXFCO0FBQzdCLFlBQVEsWUFBUixRQUFRLFVBQVk7QUFDcEIsWUFBUSxtQkFBUixRQUFRLGlCQUFtQjtBQUMzQixZQUFRLDBCQUFSLFFBQVEsd0JBQTBCO0FBQ2xDLFlBQVEsaUJBQVIsUUFBUSxlQUFpQjtBQUd6QixZQUFRLGtCQUFSLFFBQVEsZ0JBQWtCO0FBQzFCLFlBQVEscUJBQVIsUUFBUSxtQkFBcUI7QUFDN0IsWUFBUSxvQkFBUixRQUFRLGtCQUFvQjtBQUM1QixZQUFRLGtCQUFSLFFBQVEsZ0JBQWtCO0FBQzFCLFlBQVEscUJBQVIsUUFBUSxtQkFBcUI7QUFDN0IsWUFBUSxzQkFBUixRQUFRLG9CQUFzQjtBQUM5QixZQUFRLGtCQUFSLFFBQVEsZ0JBQWtCO0FBQzFCLFlBQVEsa0JBQVIsUUFBUSxnQkFBa0I7QUFFMUIsWUFBUSwwQkFBUixRQUFRLHdCQUEwQjtBQUNsQyxZQUFRLDRCQUFSLFFBQVEsMEJBQTRCO0FBQ3BDLFlBQVEseUJBQVIsUUFBUSx1QkFBeUI7QUFFakMsUUFDQSxrQkFBa0IsRUFBRSxJQUFJLHlCQUF5QixLQUNqRCxDQUFDLFFBQVEsc0JBQ1Q7QUFDRSxjQUFRLHVCQUF1QixrQkFBa0IsRUFBRTtBQUFBLFFBQ2pEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxRQUNBLGtCQUFrQixFQUFFLElBQUksd0JBQXdCLEtBQ2hELENBQUMsUUFBUSxxQkFDVDtBQUNFLGNBQVEsc0JBQXNCLGtCQUFrQixFQUFFO0FBQUEsUUFDaEQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUSxJQUFJQyxZQUFjLEtBQUssUUFBUTtBQUFBLE1BQzNDLE9BQU87QUFBQSxNQUNQLGVBQWUsUUFBUTtBQUFBLE1BQ3ZCLFFBQVEsUUFBUTtBQUFBLE1BQ2hCLFdBQVcsUUFBUTtBQUFBLE1BQ25CLFVBQVUsUUFBUTtBQUFBLE1BQ2xCLFFBQVEsUUFBUTtBQUFBLE1BQ2hCLFdBQVcsUUFBUTtBQUFBLE1BQ25CLGdCQUFnQixRQUFRO0FBQUEsTUFDeEIsc0JBQXNCLFFBQVE7QUFBQSxNQUM5QixxQkFBcUIsUUFBUTtBQUFBLE1BQzdCLFlBQVksUUFBUTtBQUFBLE1BQ3BCLGNBQWMsUUFBUTtBQUFBLE1BQ3RCLHNCQUFzQixRQUFRO0FBQUEsTUFDOUIsWUFBWSxRQUFRO0FBQUEsTUFDcEIsb0JBQW9CLFFBQVE7QUFBQSxNQUM1QixhQUFhLFFBQVE7QUFBQSxNQUNyQixxQkFBcUIsUUFBUTtBQUFBLE1BQzdCLFVBQVUsUUFBUTtBQUFBLE1BQ2xCLG1CQUFtQixRQUFRLHFCQUFxQjtBQUFBLE1BQ2hELFVBQVUsUUFBUTtBQUFBLE1BQ2xCLGVBQWUsUUFBUSx3QkFBd0IsQ0FBQztBQUFBLE1BQ2hELGtCQUFrQixRQUFRO0FBQUEsTUFDMUIsY0FBYyxRQUFRLGdCQUFnQjtBQUFBLE1BQ3RDLHVCQUF1QixRQUFRO0FBQUEsTUFDL0IsZ0JBQWdCLFFBQVE7QUFBQSxNQUN4QixTQUFTLFFBQVE7QUFBQSxNQUNqQixjQUFjLFFBQVE7QUFBQSxNQUN0QixlQUFlLFFBQVE7QUFBQSxNQUN2QixrQkFBa0IsUUFBUTtBQUFBLE1BQzFCLGlCQUFpQixRQUFRO0FBQUEsTUFDekIsa0JBQWtCLFFBQVE7QUFBQSxNQUMxQixlQUFlLFFBQVE7QUFBQSxNQUN2Qix1QkFBdUIsUUFBUTtBQUFBLE1BQy9CLHlCQUF5QixRQUFRO0FBQUEsTUFDakMsc0JBQXNCLFFBQVE7QUFBQSxNQUM5QixtQkFBbUIsUUFBUTtBQUFBLE1BQzNCLGVBQWUsUUFBUTtBQUFBLE1BQ3ZCLGVBQWUsUUFBUTtBQUFBLElBQ3pCLENBQUM7QUFFRCxTQUFLLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSztBQUUvQixXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxJQUFjLE1BQXNCO0FBQ3pDLFVBQU0sUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUMvQixRQUFJLENBQUMsTUFBTyxRQUFPO0FBRW5CLFdBQU8sS0FBSyxNQUFNLElBQUksTUFBTSxFQUFFLEtBQXNCO0FBQUEsRUFDdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sSUFBSSxNQUFzQjtBQUMvQixVQUFNLEtBQ04sZ0JBQWdCQSxjQUNoQixLQUFLLEtBQ0wsS0FBSyxPQUFPLE9BQU8sT0FBTyxVQUFVLElBQUk7QUFDeEMsV0FBTyxLQUFLLE1BQU0sSUFBSSxFQUFFO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sT0FBTyxNQUFzQjtBQUNsQyxVQUFNLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFDL0IsUUFBSSxDQUFDLE9BQU87QUFDVixZQUFNLElBQUksa0JBQWtCLGtDQUFrQztBQUFBLElBQ2hFO0FBRUEsVUFBTSxpQkFBaUIsSUFBSTtBQUMzQixVQUFNLEtBQUssS0FBSyxJQUFJO0FBRXBCLFVBQU0sWUFBWSxtQkFBbUI7QUFDckMsVUFBTSxZQUFZLG1CQUFtQjtBQUNyQyxVQUFNLFlBQVksV0FBVztBQUM3QixVQUFNLFNBQVMsUUFBUSxDQUFDLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDL0MsVUFBTSxRQUFRLE1BQU07QUFDcEIsVUFBTSxPQUFPLE1BQU07QUFFbkIsV0FBTyxLQUFLLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxRQUFrQixNQUFpRDtBQUN4RSxRQUFJLGdCQUFnQkEsYUFBWTtBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQU8sS0FBSyxNQUFNO0FBQUEsTUFDaEIsS0FBSyxPQUFPLE9BQU8sT0FBTyxVQUFVLElBQUk7QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sVUFBVSxNQUFzQjtBQUNyQyxVQUFNLElBQUksS0FBSyxRQUFRLElBQUk7QUFDM0IsV0FBTyxHQUFHLE1BQU07QUFBQSxFQUNsQjtBQUNGO0FBNUwwQztBQUFuQyxJQUFNLG1CQUFOOzs7QVc5RFAsSUFBQUMsbUJBQTJCO0FBS3BCLElBQU0sb0JBQU4sTUFBTSxrQkFBaUI7QUFBQSxFQUF2QjtBQUNMLHdCQUFPLFNBQVE7QUFDZix3QkFBTyxhQUFZO0FBQ25CLHdCQUFPLGNBQWE7QUFDcEIsd0JBQU8sU0FBUSxJQUFJLFdBQVc7QUFDOUIsd0JBQU8sZUFBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZCxnQkFBZ0I7QUFDckIsV0FBTyxLQUFLLGFBQWEsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxRQUFRLEtBQW9CO0FBQ3ZDLFVBQU0sUUFBUSxLQUFLLE1BQU0sUUFBUTtBQUNqQyxVQUFNLE1BQU0sUUFBUTtBQUVwQixRQUFJO0FBQ0YsYUFBTyxLQUFLLFNBQVMsR0FBRztBQUFBLElBQzFCLFVBQUU7QUFDQSxZQUFNLFFBQVE7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQWMsU0FBUyxLQUFvQixVQUFVLEdBQXNCO0FBQ3pFLFdBQU8sS0FBSyxjQUFjLEdBQUc7QUFDM0IsWUFBTSxRQUFRLEtBQUssYUFBYSxLQUFLLElBQUk7QUFDekMsZ0JBQU0sNkJBQVcsS0FBSztBQUFBLElBQ3hCO0FBRUEsUUFBSSxPQUFPO0FBRVgsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLElBQUk7QUFFdEIsV0FBSyxjQUFjLEdBQUc7QUFFdEIsVUFBSSxJQUFJLFdBQVcsS0FBSztBQUN0QixjQUFNLFFBQVEsS0FBSyxhQUFhLEtBQUssSUFBSTtBQUN6QyxrQkFBTSw2QkFBVyxLQUFLO0FBQ3RCLGVBQU8sS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUMxQjtBQUVBLFVBQUksQ0FBQyxJQUFJLElBQUk7QUFDWCxZQUFJO0FBRUosWUFBSTtBQUNGLGdCQUFNLE9BSUYsTUFBTSxJQUFJLEtBQUs7QUFFbkIsZ0JBQU0sUUFBUSxJQUFJLE1BQU0sS0FBSyxPQUFPO0FBRXBDLGdCQUFNLE9BQU8sS0FBSztBQUNsQixnQkFBTSxPQUFPLEtBQUs7QUFFbEIsZ0JBQU07QUFBQSxRQUNSLFFBQVE7QUFDTixnQkFBTSxJQUFJLE1BQU0sZUFBZSxJQUFJLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRTtBQUFBLFFBQy9EO0FBRUEsZUFBTztBQUVQLGNBQU07QUFBQSxNQUNSO0FBRUEsYUFBTztBQUFBLElBQ1QsU0FBUyxHQUFHO0FBQ1YsVUFBSSxLQUFNLE9BQU07QUFFaEIsWUFBTSxTQUFTLGFBQWEsU0FBUyxtQkFBbUIsS0FBSyxFQUFFLE9BQU87QUFFdEUsVUFBSSxDQUFDLFVBQVUsVUFBVSxLQUFLLGFBQWE7QUFDekMsZUFBTyxLQUFLLFNBQVMsS0FBSyxFQUFFLE9BQU87QUFBQSxNQUNyQztBQUVBLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUFBLEVBRVEsY0FBYyxLQUFlO0FBQ25DLFVBQU0sUUFBUSxPQUFPLElBQUksUUFBUSxJQUFJLG1CQUFtQixDQUFDO0FBQ3pELFVBQU0sWUFBWSxPQUFPLElBQUksUUFBUSxJQUFJLHVCQUF1QixDQUFDO0FBQ2pFLFVBQU0sYUFDTixPQUFPLElBQUksUUFBUSxJQUFJLG1CQUFtQixDQUFDLElBQUksTUFBTyxLQUFLLElBQUk7QUFFL0QsUUFBSSxDQUFDLE9BQU8sTUFBTSxLQUFLLEVBQUcsTUFBSyxRQUFRO0FBQ3ZDLFFBQUksQ0FBQyxPQUFPLE1BQU0sU0FBUyxFQUFHLE1BQUssWUFBWTtBQUMvQyxRQUFJLENBQUMsT0FBTyxNQUFNLFVBQVUsRUFBRyxNQUFLLGFBQWE7QUFBQSxFQUNuRDtBQUNGO0FBakc4QjtBQUF2QixJQUFNLG1CQUFOOzs7QUMwQlAsSUFBTSxjQUFjLHdCQUFDLFFBQXdEO0FBQzNFLFFBQU0sV0FBbUMsQ0FBQztBQUUxQyxhQUFXLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTyxRQUFRLEdBQUcsR0FBRztBQUM5QyxRQUFJLFNBQVMsS0FBTTtBQUNuQixVQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ2pCO0FBQUEsTUFDQSxDQUFDLFdBQVcsSUFBSSxPQUFPLFlBQVksQ0FBQztBQUFBLElBQ3RDO0FBQ0EsYUFBUyxNQUFNLElBQUk7QUFBQSxFQUNyQjtBQUVBLFNBQU87QUFDVCxHQWJvQjtBQWdCcEIsSUFBTSxjQUFjLHdCQUFDLFdBQ3JCLElBQUksZ0JBQWdCLFlBQVksTUFBTSxDQUFDLEVBQUUsU0FBUyxHQUQ5QjtBQTRDYixJQUFNLFVBQU4sTUFBTSxRQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWtCWCxZQUE0QixRQUFnQjtBQUFoQjtBQWRuQztBQUFBO0FBQUE7QUFBQSx3QkFBTyxPQUFNO0FBSWI7QUFBQTtBQUFBO0FBQUEsd0JBQU8sV0FBVTtBQUlqQjtBQUFBO0FBQUE7QUFBQSx3QkFBTyxVQUFTLElBQUksaUJBQWlCO0FBQUEsRUFNZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNN0Msa0JBQWtCLFNBQWlCO0FBQ3hDLFNBQUssVUFBVTtBQUFBLEVBQ2pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGNBQWMsT0FBZTtBQUNsQyxTQUFLLE9BQU8sY0FBYztBQUFBLEVBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLElBQUksUUFBc0I7QUFDL0IsVUFBTSxPQUFPLE9BQU8sWUFBWSxNQUFNLENBQUM7QUFFdkMsV0FBTyxLQUFLLFFBQXlCLElBQUk7QUFBQSxFQUMzQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxRQUFRLElBQTBCO0FBQ3ZDLFdBQU8sS0FBSyxRQUF5QixPQUFPLEVBQUUsRUFBRTtBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFVBQVUsUUFBc0I7QUFDckMsVUFBTSxPQUFPLGNBQWMsWUFBWSxNQUFNLENBQUM7QUFFOUMsV0FBTyxLQUFLLFFBQXlCLElBQUk7QUFBQSxFQUMzQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxPQUFPLFFBQXlCO0FBQ3JDLFFBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxPQUFPLFdBQVc7QUFDbEMsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxRQUNBLENBQUMsT0FBTyxPQUFPLENBQUMsR0FBRyxPQUFPLE9BQU8sU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQUEsTUFDeEQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxPQUFPLFVBQVUsWUFBWSxNQUFNLENBQUM7QUFFMUMsV0FBTyxLQUFLLFFBQTJCLElBQUk7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsUUFBVyxNQUFjLFNBQW1DO0FBQ3ZFLFVBQU0sYUFBYSw2QkFBTTtBQUN2QixZQUFNLEVBQUUsTUFBTSxTQUFBQyxTQUFRLElBQUksS0FBSyxXQUFXO0FBRTFDLFlBQU0saUJBQ04sU0FBUyxZQUFZQSxXQUFVLEdBQUcsSUFBSSxJQUFJQSxRQUFPO0FBRWpELFlBQU0sT0FBb0I7QUFBQSxRQUN4QixRQUFRO0FBQUEsUUFDUixVQUFVO0FBQUEsUUFDVixRQUFRLFlBQVksUUFBUSxLQUFLLE9BQU87QUFBQSxRQUN4QyxHQUFHO0FBQUEsUUFDSCxTQUFTO0FBQUEsVUFDUCxjQUFjLGtCQUFrQixLQUFLLE9BQU8sT0FBTyxJQUNuRCxrQkFBa0IsRUFBRSxHQUNwQixRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixHQUFHLFNBQVM7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUVBLFdBQUssT0FBTyxNQUFNLHVCQUF1QixJQUFJLEVBQUU7QUFFL0MsYUFBTztBQUFBLFFBQ0wsR0FBRyxLQUFLLEdBQUcsR0FBRyxLQUFLLFdBQVcsR0FBRyxJQUFJLE9BQU8sTUFBTSxJQUFJO0FBQUEsUUFDdEQ7QUFBQSxNQUNGO0FBQUEsSUFDRixHQTFCbUI7QUE0Qm5CLFVBQU0sTUFBTSxNQUFNLEtBQUssT0FBTyxRQUFRLFVBQVU7QUFFaEQsV0FBTyxJQUFJLEtBQUs7QUFBQSxFQUNsQjtBQUNGO0FBeEhvQjtBQUFiLElBQU0sU0FBTjs7O0FDMUZQLElBQUFDLHVCQU9BO0FBRUEsSUFBQUMsZ0JBQTJCO0FBSzNCLElBQU0sY0FBTixNQUFNLFlBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWVmLFlBQW1CLFFBQWdCO0FBQWhCO0FBUm5CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUFPLFNBQWlELElBQUkseUJBRzVEO0FBQUEsRUFLb0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFwQyxNQUFhLFFBQ2IsU0FDQSxTQU80QjtBQUMxQixRQUFJLENBQUMsU0FBUyxNQUFPLE9BQU0sSUFBSSxrQkFBa0I7QUFDakQsVUFBTSxPQUFPLE1BQU0sS0FBSyxLQUFLLFNBQVMsT0FBTztBQUM3QyxVQUFNLE1BQU0sSUFBSTtBQUFBLE1BQ2Q7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsSUFDVjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLEtBQ2IsU0FDQSxTQUtBO0FBQ0UsVUFBTSxxQkFBcUIsS0FBSztBQUFBLE1BQzlCLFFBQVEsTUFBTTtBQUFBLE1BQ2QsU0FBUztBQUFBLElBQ1g7QUFFQSxRQUNBLG9CQUFvQixXQUFXLGNBQWMsU0FBUyxNQUN0RCxtQkFBbUIsTUFBTSxXQUFXLDJDQUFzQixXQUMxRDtBQUNFLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxXQUFPLHVDQUFpQjtBQUFBLE1BQzVCLFNBQVMsUUFBUSxNQUFNO0FBQUEsTUFDdkIsV0FBVyxRQUFRO0FBQUEsTUFDbkIsZ0JBQWdCLFFBQVEsTUFDeEI7QUFBQSxNQUNBLFVBQVUsUUFBUSxTQUFTLElBQUk7QUFBQSxNQUMvQixPQUFPLEtBQUssT0FBTyxPQUFPLGNBQWMsT0FBTyxJQUFJO0FBQUEsTUFDbkQsT0FBTyxTQUFTO0FBQUEsSUFDbEIsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sV0FBVyxZQUFnRDtBQUNoRSxRQUFJLHNCQUFzQjtBQUMxQixtQkFBYSxXQUFXO0FBRXhCLFFBQUk7QUFDRixVQUFJLFdBQVcsTUFBTSxXQUFXLDJDQUFzQjtBQUN0RCxlQUFPLFdBQVcsUUFBUTtBQUFBLElBQzVCLFFBQVE7QUFBQSxJQUdSO0FBQUEsRUFBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9JLGNBQWMsT0FBa0IsT0FBZ0I7QUFDckQsZUFBTyx5Q0FBbUIsT0FBTyxLQUFLO0FBQUEsRUFDeEM7QUFDRjtBQTdHaUI7QUFBakIsSUFBTSxhQUFOOzs7QUNKQSxJQUFNLHlCQUF5QjtBQVgvQjtBQW1CTyxJQUFNLGNBQU4sTUFBTSxZQUFnRDtBQUFBLEVBR3BELFlBQ0EsUUFDQSxVQUE2QjtBQUFBLElBQ2xDLGVBQWU7QUFBQSxFQUNqQixHQUNBO0FBSk87QUFDQTtBQUpQLHNDQUFnQixvQkFBSSxJQUFrRDtBQUN0RSx3QkFBTztBQU9MLFNBQUssUUFBUTtBQUFBLE1BQ1gsS0FBSyxRQUFRLEtBQUssSUFBSTtBQUFBLE1BQ3RCLEtBQUs7QUFBQSxJQUNQLEVBQUUsTUFBTTtBQUFBLEVBQ1Y7QUFBQSxFQUVBLElBQVcsZ0JBQWdCO0FBQ3pCLFdBQU8sS0FBSyxRQUFRLGlCQUFpQjtBQUFBLEVBQ3ZDO0FBQUEsRUFFQSxNQUFhLFVBQVU7QUFDckIsZUFBVyxDQUFDLElBQUksS0FBSyxLQUFLLG1CQUFLLGdCQUFlO0FBQzVDLFVBQUksTUFBTSxXQUFXLEdBQUc7QUFDdEIsMkJBQUssZUFBYyxPQUFPLEVBQUU7QUFBQSxNQUM5QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFhLFFBQVE7QUFDbkIsdUJBQUssZUFBYyxNQUFNO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE1BQWEsVUFBVTtBQUNyQixXQUFPLENBQUMsR0FBRyxtQkFBSyxlQUFjLE9BQU8sQ0FBQztBQUFBLEVBQ3hDO0FBQUEsRUFFQSxNQUFhLFFBQVEsTUFBb0I7QUFDdkMsU0FBSyxPQUFPLFFBQVEsQ0FBQyxNQUFNO0FBQ3pCLFVBQUksbUJBQUssZUFBYyxJQUFJLEVBQUUsR0FBRyxFQUFHO0FBQ25DLHlCQUFLLGVBQWMsSUFBSSxFQUFFLEtBQUssSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO0FBQUEsSUFDcEUsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLE1BQWEsUUFBUSxTQUFvQztBQUN2RCxVQUFNLFNBQVMsbUJBQUssZUFBYyxJQUFJLFFBQVEsS0FBSztBQUNuRCxRQUFJLENBQUM7QUFDTCxhQUFPLElBQUksYUFBYSxLQUFLLFFBQVE7QUFBQSxRQUNuQyxPQUFPLFFBQVE7QUFBQSxRQUNmLGFBQWEsUUFBUTtBQUFBLFFBQ3JCLFdBQVcsUUFBUTtBQUFBLE1BQ3JCLENBQUM7QUFFRCxXQUFPLElBQUksYUFBYSxLQUFLLFFBQVE7QUFBQSxNQUNuQyxPQUFPLFFBQVE7QUFBQSxNQUNmLFFBQVEsQ0FBQyxPQUFPLElBQUk7QUFBQSxNQUNwQixVQUFVO0FBQUEsTUFDVixXQUFXLFFBQVE7QUFBQSxNQUNuQixhQUFhLFFBQVE7QUFBQSxJQUN2QixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBMURFO0FBRDJEO0FBQXRELElBQU0sYUFBTjtBQTZEQSxJQUFNLGlDQUFOLE1BQU0sK0JBQTJDO0FBQUEsRUFFL0MsWUFDQSxNQUNQLGNBQXNCLHdCQUN0QjtBQUZPO0FBRlAsd0JBQU8sZUFBYztBQUtuQixRQUFJLE9BQU8sZ0JBQWdCLFVBQVU7QUFDbkMsV0FBSyxjQUFjLEtBQUssSUFBSSxJQUFJO0FBQUEsSUFDbEM7QUFBQSxFQUNGO0FBQUEsRUFFTyxhQUFhO0FBQ2xCLFFBQ0EsT0FBTyxLQUFLLGdCQUFnQixZQUM1QixNQUFNLEtBQUssV0FBVyxLQUN0QixLQUFLLGNBQWM7QUFFbkIsYUFBTztBQUNQLFdBQU8sS0FBSyxJQUFJLEtBQUssS0FBSztBQUFBLEVBQzVCO0FBQ0Y7QUFwQndEO0FBQWpELElBQU0sZ0NBQU47OztBM0M3RFAsd0JBQWMsbUNBbkJkOzs7QTRDQUEsSUFBQUMsaUJBQXVCO0FBQ3ZCLElBQUFDLGtCQVNBO0FBeUJBLElBQUFDLHVCQUlBOzs7QUN2Q0EsSUFBQUMsa0JBQXdDO0FBS3hDLFNBQVMsbUJBQ1QsUUFDQSxPQUNBLFNBQ0E7QUFDRSxRQUFNLFVBQVUsV0FBVyxNQUFNO0FBQy9CLFFBQUksQ0FBQyxLQUFLLGFBQWEsTUFBTSxPQUFRLEtBQUssQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLE1BQU0sRUFBRTtBQUMxRTtBQUNBLFFBQUksTUFBTSxRQUFRLGFBQWMsT0FBTSxPQUFPO0FBQzdDLFdBQU8sT0FBTyxLQUFLLGdCQUFnQixjQUFjLEtBQUs7QUFBQSxFQUN4RCxHQUFHLE1BQU0sUUFBUSx3QkFBd0IsQ0FBQyxFQUFFLE1BQU07QUFDbEQsUUFBTSxTQUFTLElBQUksU0FBUyxPQUFPLElBQUksT0FBTztBQUNoRDtBQVpTO0FBY1QsU0FBUyxzQkFDVCxRQUNBLE9BQ0EsU0FDQTtBQUNFLFFBQU0sZUFBZSxNQUFNLFNBQVMsSUFBSSxTQUFTLE9BQU8sRUFBRTtBQUMxRCxNQUFJLENBQUMsS0FBSyxhQUFhLE1BQU0sT0FBUSxLQUFLLGNBQWM7QUFDdEQsaUJBQWEsWUFBWTtBQUN6QixVQUFNLFNBQVMsT0FBTyxTQUFTLE9BQU8sRUFBRTtBQUN4QyxXQUFPLE9BQU8sS0FBSyxnQkFBZ0IsaUJBQWlCLEtBQUs7QUFBQSxFQUMzRDtBQUNGO0FBWFM7QUFhVCxTQUFTLG1CQUFtQixPQUFtQjtBQUM3QyxRQUFNLFVBQVUsS0FBSyxhQUFhLE1BQU0sT0FBUTtBQUNoRCxRQUFNLG1CQUFtQixRQUFRLElBQUksT0FBTyxpQkFBaUI7QUFFN0QsTUFBSSxXQUFXLENBQUMsa0JBQWtCO0FBQ2hDLFVBQU0sS0FBSyxVQUFVLElBQUk7QUFDekIsWUFBUSxJQUFJLE9BQU8sbUJBQW1CLElBQUk7QUFDMUMsUUFBSSxNQUFNLGFBQWE7QUFDckIsWUFBTTtBQUFBLFFBQ0o7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0YsV0FBVyxDQUFDLFdBQVcsa0JBQWtCO0FBQ3ZDLFVBQU0sS0FBSyxVQUFVLEtBQUs7QUFDMUIsWUFBUSxJQUFJLE9BQU8sbUJBQW1CLEtBQUs7QUFDM0MsUUFBSSxNQUFNLGFBQWE7QUFDckIsWUFBTTtBQUFBLFFBQ0o7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQXJCUztBQXVCVCxTQUFTLDBCQUNULE9BQ0EsVUFDQSxVQUNBO0FBQ0UsTUFDQSxTQUFTLGNBQWMsUUFDdkIsU0FBUyxlQUFlLFNBQVMsWUFDakM7QUFDRSxVQUFNLEtBQUssVUFBVSxTQUFTLFVBQVU7QUFDeEM7QUFBQSxFQUNGO0FBRUEsTUFDQSxTQUFTLFNBQVMsU0FBUyw0QkFBWSxtQkFDdkMsU0FBUyxZQUFZLFFBQ3JCLFNBQVMsYUFBYSxTQUFTLFVBQy9CO0FBQ0UsVUFBTSxLQUFLLFVBQVUsU0FBUyxRQUFRO0FBQ3RDLFFBQUksU0FBUyxVQUFVO0FBQ3JCLGVBQVMsTUFBTSxRQUFRLElBQUksTUFBTSxrQkFBa0IsSUFBSSxFQUFFLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBQ0Y7QUF2QlM7QUF5QlQsZUFBc0IseUJBQ3RCLFFBQ0EsT0FDQSxVQUNBLFVBQ0E7QUFDRSxNQUFJLENBQUMsT0FBTyxjQUFjLENBQUMsTUFBTSxRQUFTO0FBRTFDLFFBQU0sYUFBYSxTQUFTLFFBQVEsT0FBTyxTQUFTLE1BQU0sUUFBUSxJQUFJO0FBQ3RFLFFBQU0sVUFBVSxTQUFTLE1BQU07QUFHL0IsTUFBSSxjQUFjLFNBQVMsYUFBYSxDQUFDLFNBQVMsV0FBVztBQUMzRCxRQUFJO0FBQ0YsWUFBTSxPQUFPO0FBQUEsSUFDZixRQUFRO0FBQUEsSUFFSTtBQUNaLFdBQU8sS0FBSyxPQUFPLE9BQU8sS0FBSyxnQkFBZ0IsWUFBWSxLQUFLO0FBQUEsRUFDbEU7QUFFQSxNQUFJLE1BQU0sUUFBUSxjQUFjO0FBQzlCLHVCQUFtQixLQUFLO0FBQUEsRUFDMUI7QUFHQSxNQUNBLGNBQ0EsU0FBUyxjQUNULENBQUMsU0FBUyxhQUFhLFNBQVMsY0FBYyxTQUFTLFlBQ3ZEO0FBQ0UsUUFBSSxNQUFNLFdBQVksT0FBTSxVQUFVLFNBQVM7QUFDL0MsOEJBQTBCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDckQ7QUFHQSxNQUFJLENBQUMsU0FBUyxhQUFhLFNBQVMsY0FBYyxNQUFNLFFBQVEsSUFBSTtBQUNsRSxRQUFJLENBQUMsS0FBSyxhQUFhLE1BQU0sT0FBTyxFQUFHO0FBQ3ZDLHVCQUFtQixRQUFRLE9BQU8sT0FBTztBQUFBLEVBQzNDLFdBQVcsU0FBUyxjQUFjLE1BQU0sUUFBUSxJQUFJO0FBQ2xELDBCQUFzQixRQUFRLE9BQU8sT0FBTztBQUFBLEVBQzlDLFdBQVcsU0FBUyxjQUFjLFNBQVMsV0FBVztBQUNwRCxRQUNBLFNBQVMsY0FBYyxNQUFNLFFBQVEsTUFDckMsQ0FBQyxLQUFLLGFBQWEsTUFBTSxPQUFPO0FBRWhDO0FBQ0EsUUFBSSxDQUFDLE1BQU0sU0FBUyxJQUFJLFNBQVMsT0FBTyxFQUFFLEdBQUc7QUFDM0MseUJBQW1CLFFBQVEsT0FBTyxPQUFPO0FBQUEsSUFDM0M7QUFBQSxFQUNGO0FBQ0Y7QUFuRHNCOzs7QUNoRnRCLHVCQUFpQztBQUNqQyxJQUFBQyxpQkFBa0M7OztBQ0szQixJQUFNO0FBQUE7QUFBQSxFQUFxQztBQUFBOzs7QUR1QzNDLElBQU0sNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVF2QyxnQkFDQSxLQUNBLGFBQ0EsT0FDcUI7QUFDbkIsUUFBSSxVQUFVLEVBQUcsUUFBTztBQUV4QixVQUFNLGFBQVMsMEJBQVEsS0FBSyxjQUFjO0FBRTFDLFVBQU0sT0FBTyw2QkFDYiwwQkFBMEI7QUFBQSxVQUN4QiwwQkFBUSxLQUFLLElBQUk7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsUUFBUTtBQUFBLElBQ1YsR0FMYTtBQU9iLFFBQUk7QUFFRixZQUFNLFVBQXVCLFFBQVEsTUFBTTtBQUUzQyxVQUFJLFFBQVEsU0FBUyxhQUFhO0FBQ2hDLGVBQU8sS0FBSztBQUFBLE1BQ2Q7QUFFQSxhQUFPO0FBQUEsSUFDVCxRQUFRO0FBQ04sYUFBTyxLQUFLO0FBQUEsSUFDZDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLFFBQVEsTUFBYyxpQkFBaUIsR0FBa0I7QUFDdkQsUUFBSTtBQUNGLFVBQUksU0FBUyxrQkFBa0I7QUFDN0IsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLE1BQU0sMEJBQTBCO0FBQUEsWUFDcEMsMEJBQVEsUUFBUSxRQUFRLElBQUksQ0FBQztBQUFBLFFBQzdCO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFDQSxhQUFPLEtBQUssV0FBVztBQUFBLElBQ3pCLFFBQVE7QUFDTixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsV0FBK0I7QUFDN0IsVUFBTSxlQUFlLENBQUM7QUFFdEIsZUFBVyxPQUFPLHNCQUFPLFNBQVM7QUFDaEMsbUJBQWEsSUFBSSxJQUFJLElBQUk7QUFBQSxJQUMzQjtBQUVBLFVBQU0sU0FBUyxzQkFBTyxZQUFZO0FBRWxDLFFBQUksUUFBUTtBQUNWLG1CQUFhLE9BQU8sSUFBSSxJQUFJO0FBQUEsUUFDMUIsWUFBWSxPQUFPLFFBQVEsU0FBUyxrQkFBa0I7QUFBQSxRQUN0RCxTQUFTLE9BQU87QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsTUFDTCxNQUFNO0FBQUEsUUFDSixrQkFBa0IsMEJBQTBCO0FBQUEsVUFDMUM7QUFBQSxRQUNGO0FBQUEsUUFDQSxnQkFBZ0IsMEJBQTBCO0FBQUEsVUFDeEM7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1AsV0FBVywwQkFBMEIsUUFBUSxXQUFXO0FBQUEsUUFDeEQsbUJBQW1CLDBCQUEwQixRQUFRLGlCQUFpQjtBQUFBLFFBQ3RFLGNBQWMsMEJBQTBCLFFBQVEsWUFBWTtBQUFBLFFBQzVELFlBQVksMEJBQTBCLFFBQVEsWUFBWTtBQUFBLFFBQzFELGFBQWEsMEJBQTBCLFFBQVEsV0FBVztBQUFBLE1BQzVEO0FBQUEsTUFDQSxXQUFXO0FBQUEsUUFDVCxpQkFBaUIsMEJBQTBCLFFBQVEsZUFBZTtBQUFBLFFBQ2xFLFFBQVEsMEJBQTBCLFFBQVEsUUFBUTtBQUFBLFFBQ2xELHNCQUNBLDBCQUEwQixRQUFRLG9CQUFvQjtBQUFBLFFBQ3RELGdDQUFnQywwQkFBMEI7QUFBQSxVQUN4RDtBQUFBLFFBQ0Y7QUFBQSxRQUNBLHFCQUNBLDBCQUEwQixRQUFRLG1CQUFtQjtBQUFBLFFBQ3JELGtCQUFrQiwwQkFBMEIsUUFBUSxnQkFBZ0I7QUFBQSxNQUN0RTtBQUFBLE1BQ0EsUUFBUTtBQUFBLElBQ1Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGlCQUF5QjtBQUN2QixVQUFNLFNBQVMsMEJBQTBCLFNBQVM7QUFDbEQsVUFBTSxPQUFPLElBQUksT0FBTyxFQUFFO0FBRTFCLFVBQU0sU0FBbUIsQ0FBQztBQUUxQixXQUFPLEtBQUsscUJBQXFCO0FBQ2pDLFdBQU8sS0FBSyxJQUFJO0FBRWhCLFVBQU0sT0FBTyxPQUFPLEtBQUssTUFBTTtBQUUvQixlQUFXLFFBQVEsTUFBTTtBQUN2QixZQUFNLE1BQU07QUFFWixhQUFPLEtBQUssR0FBRztBQUVmLFlBQU0sVUFBVSxPQUFPLEtBQUssT0FBTyxHQUFHLENBQUM7QUFFdkMsaUJBQVcsV0FBVyxTQUFTO0FBQzdCLGNBQU0sU0FBUztBQUNmLGNBQU0sUUFBUSxPQUFPLEdBQUcsRUFBRSxNQUFNLEtBQUs7QUFFckMsZUFBTztBQUFBLFVBQ0wsS0FBSyxNQUFNLEtBQ1gsT0FBTyxVQUFVLFdBQVcsS0FBSyxVQUFVLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSztBQUFBLFFBRXBFO0FBQUEsTUFDRjtBQUVBLGFBQU8sS0FBSyxFQUFFO0FBQUEsSUFDaEI7QUFFQSxXQUFPLEtBQUssSUFBSTtBQUVoQixXQUFPLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDekI7QUFDRjs7O0FFbk1BO0FBK0JPLElBQU0sMkJBQU4sTUFBTSx5QkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRNUIsWUFDUyxRQUNDLFNBQ2pCO0FBRmdCO0FBQ0M7QUFUakIsa0NBQVksb0JBQUksSUFBZ0M7QUFBQSxFQVUvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTRCxNQUFhLE9BQ2IsT0FDQSxPQUNBLE1BQ0EsUUFDbUI7QUFDakIsVUFBTSxTQUFTLEtBQUssUUFBUTtBQUU1QixRQUFJLFFBQVE7QUFDVixZQUFNLFNBQVMsTUFBTSxPQUFPLE9BQU8sT0FBTyxNQUFNLE1BQU07QUFDdEQsVUFBSSxDQUFDLE9BQVEsUUFBTztBQUFBLElBQ3RCO0FBRUEsVUFBTSxlQUFlLG1CQUFLLFdBQVU7QUFFcEMsUUFBSSxDQUFDLGFBQWMsUUFBTztBQUUxQixVQUFNLFFBQVE7QUFBQSxNQUNaLENBQUMsR0FBRyxtQkFBSyxVQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksUUFBUSxPQUFPLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFBQSxJQUMxRTtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sU0FBUyxTQUFpRDtBQUMvRCx1QkFBSyxXQUFVLElBQUksT0FBTztBQUUxQixXQUFPLE1BQU07QUFDWCx5QkFBSyxXQUFVLE9BQU8sT0FBTztBQUFBLElBQy9CO0FBQUEsRUFDRjtBQUNGO0FBdkRFO0FBRG1DO0FBQTlCLElBQU0sMEJBQU47OztBSnVDQSxJQUFNLGNBQWM7QUFBQSxFQUN6QixPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxrQkFBa0I7QUFBQSxFQUNsQixrQkFBa0I7QUFDcEI7QUE3RUE7QUE0Sk8sSUFBTSxVQUFOLE1BQU0sZ0JBQWUsb0JBQWtDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBMERyRCxZQUFZLFFBQWdCLFVBQTZCLENBQUMsR0FBRztBQUNsRSxVQUFNLENBQUMsWUFBWSxLQUFLLENBQUM7QUExRDNCLHFDQUFlO0FBQ2Ysa0RBQTRCLEtBQUssaUJBQWlCLEtBQUssSUFBSTtBQUMzRDtBQUNBO0FBQ0EsNENBQXlDO0FBQ3pDLGtDQUFzQztBQVF0QztBQUFBO0FBQUE7QUFBQSx3QkFBZ0IsTUFBSyw4QkFBYyxTQUFTLEVBQUUsU0FBUztBQUl2RDtBQUFBO0FBQUE7QUFBQSx3QkFBZ0I7QUFJaEI7QUFBQTtBQUFBO0FBQUEsd0JBQWdCO0FBSWhCO0FBQUE7QUFBQTtBQUFBLHdCQUFPLFNBQVEsSUFBSSxpQkFBaUIsSUFBSTtBQUl4QztBQUFBO0FBQUE7QUFBQSx3QkFBZ0IsY0FBYSxJQUFJLFdBQVcsSUFBSTtBQUloRDtBQUFBO0FBQUE7QUFBQSx3QkFBTyxjQUFhLElBQUksMEJBQTBCLElBQUk7QUFJdEQ7QUFBQTtBQUFBO0FBQUEsd0JBQU8sVUFBUyxJQUFJO0FBQUEsTUFBc0M7QUFBQSxRQUMxRCxnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxNQUFXO0FBQUEsSUFDM0I7QUFJQTtBQUFBO0FBQUE7QUFBQSx3QkFBZ0IsV0FBVSxRQUFPO0FBSWpDO0FBQUE7QUFBQTtBQUFBLHdCQUFnQixVQUFTLElBQUksT0FBTyxJQUFJO0FBRXhDLDJDQUFxRDtBQVVuRCxRQUFJLFFBQVEsWUFBWTtBQUN0QixVQUFJLE9BQU8sUUFBUSxlQUFlO0FBQ2xDLGNBQU0sSUFBSTtBQUFBLFVBQ1Isc0RBQXNELE9BQU8sUUFBUSxVQUFVO0FBQUEsUUFDakY7QUFFQSxjQUFRLElBQUksY0FBYyxRQUFRO0FBQUEsSUFDcEM7QUFFQSxVQUFNLGVBQWUsY0FBYyxNQUFNO0FBTXpDLFNBQUssU0FBUztBQUVkLFFBQUksQ0FBQyxjQUFjO0FBQ2pCLFVBQUk7QUFDRixZQUFJLEVBQUUsa0JBQWtCLHlCQUFTO0FBQy9CLGVBQUs7QUFBQSxZQUNILDJDQUEyQyxnQkFBQUMsT0FBVTtBQUFBLFlBQ3JEO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLE1BQ04sS0FBSyxPQUFPLFFBQVEsbUJBQW1CLGtDQUN2QyxLQUFLLE9BQU8sUUFBUSxVQUNwQixJQUFJLGdDQUFnQixLQUFLLE9BQU8sUUFBUSxPQUFPO0FBRS9DLFlBQUksQ0FBQyxJQUFJLElBQUksZ0NBQWdCLE1BQU0sZ0JBQWdCLEdBQUc7QUFDcEQsZUFBSztBQUFBLFlBQ0g7QUFBQSxZQUNBO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLFFBQVE7QUFBQSxNQUdSO0FBQUEsSUFBQztBQUVILFNBQUssVUFBVTtBQUFBLE1BQ2IsdUJBQXVCO0FBQUEsTUFDdkIsaUJBQWlCLENBQUM7QUFBQSxNQUNsQixpQkFBaUIsQ0FBQztBQUFBLE1BQ2xCLG1CQUFtQjtBQUFBLE1BQ25CLFlBQVk7QUFBQSxNQUNaLFlBQ0EsUUFBUSxlQUFlLE9BQ3ZCLE9BQ0EsUUFBUSxjQUFjLElBQUksV0FBVyxJQUFJO0FBQUEsTUFDekMsWUFBWTtBQUFBLE1BQ1osY0FBYztBQUFBLE1BQ2QseUJBQXlCO0FBQUEsTUFDekIsR0FBRztBQUFBLElBQ0w7QUFFQSxRQUFJLENBQUMsY0FBYztBQUVqQixXQUFLLE9BQU8sc0JBQXNCO0FBQ2xDLFdBQUssT0FBTyxHQUFHLHVCQUFPLGtCQUFrQixtQkFBSywwQkFBeUI7QUFBQSxJQUN4RSxPQUFPO0FBQ0wsVUFBSTtBQUVGLGFBQUssT0FBTyw0QkFBNEIsbUJBQUssMEJBQXlCO0FBQUEsTUFDeEUsU0FBUyxHQUFHO0FBQ1YsYUFBSztBQUFBLFVBQ0g7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsUUFDQSxPQUFPLEtBQUssUUFBUSxlQUFlLFlBQ25DLEtBQUssUUFBUSxhQUFhLEdBQzFCO0FBQ0UseUJBQUsscUJBQXNCLFlBQVksTUFBTTtBQUMzQyxjQUFNLFFBQVEsWUFBWSxJQUFJO0FBQzlCLDJCQUFLLG9CQUFxQixXQUFXLE1BQU07QUFDekMsNkJBQUssY0FBZSxZQUFZLElBQUksSUFBSTtBQUN4QyxjQUFJLEtBQUs7QUFDVCxpQkFBSztBQUFBLGNBQ0gscUNBQXFDLG1CQUFLLGFBQVk7QUFBQSxZQUN4RDtBQUFBLFFBQ0YsR0FBRyxDQUFDLEVBQUUsTUFBTTtBQUFBLE1BQ2QsR0FBRyxLQUFLLFFBQVEsVUFBVSxFQUFFLE1BQU07QUFBQSxJQUNwQztBQUVBLFFBQUksS0FBSyxRQUFRLHlCQUF5QjtBQUN4Qyx3QkFBa0IsRUFBRSxJQUFJLGFBQWEsSUFBSTtBQUFBLElBQzNDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ25CLFFBQUksQ0FBQyxtQkFBSyxZQUFXO0FBQ25CLHlCQUFLLFdBQVksY0FBYztBQUUvQixZQUFNLG1CQUFtQixtQkFBSyxXQUFVLFFBQVEsS0FBSyxtQkFBSyxVQUFTO0FBRW5FLHlCQUFLLFdBQVUsVUFBVSxDQUFDLE9BQU8sYUFBYTtBQUM1QyxlQUFPLGNBQWMsUUFBUSxNQUFNLE1BQU07QUFDdkMsaUJBQU8saUJBQWlCLE9BQU8sTUFBTTtBQUNuQyxtQkFBTyxTQUFTO0FBQUEsVUFDbEIsQ0FBQztBQUFBLFFBQ0gsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBRUEsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sbUJBQW1CLFNBQTRCO0FBQ3BELHVCQUFLLHFCQUFzQjtBQUFBLEVBQzdCO0FBQUEsRUFFTyxNQUFNLEdBQVc7QUFDdEIsV0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sUUFBZ0IsVUFBNkIsQ0FBQyxHQUFHO0FBQ3BFLFdBQU8sSUFBSSxRQUFPLFFBQVEsT0FBTztBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGFBQWE7QUFDdEIsV0FBTyxLQUFLLFFBQVEsY0FBYztBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFNBQVM7QUFDbEIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQVcsZUFBZTtBQUN4QixXQUFPLG1CQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXNCTyxxQkFBcUI7QUFDMUIsV0FBTztBQUFBLE1BQ0wsYUFBYSxLQUFLLE9BQU8sTUFBTTtBQUFBLE1BQy9CLG1CQUFtQixLQUFLLGNBQWM7QUFBQSxNQUN0QyxRQUFRLEtBQUssT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGVBQWU7QUFDcEIsV0FBTyxjQUFjLEtBQUssTUFBTTtBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE1BQWEsVUFBVTtBQUNyQixTQUFLLE1BQU0sTUFBTSxRQUFRLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUVoRCxRQUFJLENBQUMsS0FBSyxhQUFhLEdBQUc7QUFDeEIsV0FBSyxPQUFPLElBQUksdUJBQU8sa0JBQWtCLG1CQUFLLDBCQUF5QjtBQUV2RSxXQUFLLE9BQU8sc0JBQXNCO0FBQUEsSUFDcEM7QUFFQSxTQUFLLG1CQUFtQjtBQUN4QixTQUFLLE9BQU8sbUJBQW1CO0FBQy9CLFVBQU0sS0FBSyxXQUFXLGNBQWM7QUFDcEMsUUFBSSxtQkFBSyxxQkFBcUIsZUFBYyxtQkFBSyxvQkFBbUI7QUFDcEUsUUFBSSxtQkFBSyxvQkFBb0IsZUFBYyxtQkFBSyxtQkFBa0I7QUFBQSxFQUNwRTtBQUFBLEVBRVEsa0JBQWtCLFVBQXNCLFVBQXNCO0FBQ3BFLFVBQU0sUUFBUSxLQUFLLE1BQU0sSUFBSSxTQUFTLE1BQU0sRUFBRTtBQUM5QyxRQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sUUFBUztBQUduRCxVQUFNLGFBQWEsS0FBSyxPQUFPO0FBQUEsTUFDN0IsZ0JBQWdCO0FBQUEsTUFDaEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFFQSxRQUFJLGNBQWMsQ0FBQyxLQUFLLFFBQVEsc0JBQXVCO0FBRXZELFdBQU8sbUJBQUsscUJBQUwsV0FBeUIsTUFBTSxPQUFPLFVBQVU7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCTyxpQkFBaUIsVUFBc0IsVUFBNEI7QUFDeEUsU0FBSyxrQkFBa0IsVUFBVSxRQUFRO0FBQUEsRUFDM0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLHdCQUF3QjtBQUM3QixTQUFLLFFBQVEsd0JBQXdCO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLDBCQUEwQjtBQUMvQixTQUFLLFFBQVEsd0JBQXdCO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLDRCQUE0QjtBQUNqQyxXQUFPLENBQUMsQ0FBQyxLQUFLLFFBQVE7QUFBQSxFQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW1CQSxNQUFhLEtBQ2IsU0FDQSxPQUNBLFVBQTJDLENBQUMsR0FDQztBQUMzQyxVQUFNLEtBQUssS0FBSyxPQUFPLFNBQVMsUUFBUSxPQUFPO0FBQy9DLFFBQUksQ0FBQyxJQUFJLGFBQWE7QUFDdEIsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxRQUNBLENBQUMsS0FBSyxjQUFjLGdCQUFnQixHQUFHLElBQUk7QUFBQSxNQUM3QztBQUVBLFVBQU0saUJBQ04saUJBQWlCLGVBQWUsUUFBUSxNQUFNLEtBQUssT0FBTyxPQUFPLE9BQU87QUFDeEUsVUFBTSxTQUNMLE1BQU0sUUFBUSxjQUFjLGNBQWMsS0FBTTtBQUNqRCxRQUFJLE9BQU8sUUFBUSxHQUFHO0FBQ3BCLFlBQU0sSUFBSTtBQUFBLFFBQ1IseUJBQXlCLEtBQUssaUJBQzlCLE9BQU8sV0FBVyxjQUFjLEtBQUs7QUFBQSxNQUV2QztBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsS0FBSyxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsV0FBVztBQUU3RCxRQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sb0NBQW9DO0FBQ3JFLFVBQU0sUUFBUSxNQUFNLFdBQVcsUUFBUSxFQUFFLFFBQVEsUUFBUSxPQUFPLENBQUM7QUFDakUsUUFBSSxLQUFLO0FBQ1QsV0FBSyxNQUFNLHNCQUFzQixNQUFNLEVBQUUsNkJBQTZCO0FBRXRFLFFBQUksS0FBSztBQUNULFdBQUssTUFBTSxrREFBa0Q7QUFDN0QsVUFBTSxNQUFNLFFBQVE7QUFDcEIsUUFBSSxLQUFLO0FBQ1QsV0FBSyxNQUFNLHNCQUFzQixNQUFNLEVBQUUsZ0JBQWdCO0FBRXpELFFBQUk7QUFDRixVQUFJLENBQUMsTUFBTSxRQUFTLE9BQU0sTUFBTSxRQUFRLElBQUksUUFBUSxpQkFBaUI7QUFFckUsVUFBSSxDQUFDLE9BQU8sVUFBVTtBQUNwQixjQUFNLFNBQVMsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUFBLE1BQ2pDLE9BQU87QUFDTCxjQUFNLFNBQVMsT0FBTyxRQUFRO0FBQUEsTUFDaEM7QUFDQSxVQUFJLENBQUMsTUFBTSxVQUFVO0FBQ3JCLGNBQU0sTUFBTSxLQUFLLEtBQUssTUFBTSxRQUFRLGtCQUFrQjtBQUFBLElBQ3hELFVBQUU7QUFDQSxVQUFJLEtBQUs7QUFDVCxhQUFLLE1BQU0sbURBQW1EO0FBQzlELFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDM0I7QUFFQSxXQUFPO0FBQUEsTUFDTCxPQUFPLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDdEIsV0FBVyxPQUFPO0FBQUEsTUFDbEIsY0FBYztBQUFBLE1BQ2Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY0EsTUFBYSxPQUNiLGFBQ0EsVUFBeUIsQ0FBQyxHQUNGO0FBQ3RCLFFBQUksdUJBQXVCLGFBQWMsUUFBTztBQUVoRCxRQUFJLHVCQUF1QixvQ0FBZTtBQUN4QyxvQkFBYyxLQUFLLDZCQUE2QixXQUFXO0FBQUEsSUFDN0Q7QUFFQSxRQUFJLFFBQVEsZUFBZTtBQUMzQixjQUFRLGNBQWMsS0FBSyxPQUFPLE1BQU0sUUFBUSxRQUFRLFdBQVc7QUFFbkUsWUFBUSxvQkFBUixRQUFRLGtCQUFvQixLQUFLLFFBQVE7QUFDekMsWUFBUSx5QkFBUixRQUFRLHVCQUF5QixVQUFVO0FBRTNDLFFBQUksdUJBQXVCLE9BQU87QUFDaEMsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzVCLFVBQVUsWUFBWSxZQUFZO0FBQUEsUUFDbEMsUUFBUSxDQUFDLFdBQVc7QUFBQSxRQUNwQixPQUFPLFlBQVk7QUFBQSxRQUNuQixXQUFXLFlBQVk7QUFBQSxRQUN2QixXQUFXLFlBQVk7QUFBQSxRQUN2QixhQUFhLFFBQVE7QUFBQSxNQUN2QixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksdUJBQXVCLFVBQVU7QUFDbkMsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzVCLFVBQVU7QUFBQSxRQUNWLFFBQVEsWUFBWTtBQUFBLFFBQ3BCLE9BQU8sWUFBWTtBQUFBLFFBQ25CLFdBQVcsWUFBWSxPQUFPLENBQUMsR0FBRztBQUFBLFFBQ2xDLFdBQVcsVUFBVTtBQUFBLFFBQ3JCLGFBQWEsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBRUEsUUFBSSxNQUFNLFFBQVEsV0FBVyxHQUFHO0FBQzlCLFlBQU0sU0FBUyxZQUFZLE9BQU8sQ0FBQyxNQUFNLGFBQWEsS0FBSztBQUMzRCxhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDNUIsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxRQUNBLE9BQU87QUFBQSxRQUNQLFdBQVc7QUFBQSxRQUNYLFdBQVcsVUFBVTtBQUFBLFFBQ3JCLGFBQWEsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBRUEsUUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLGFBQWEsV0FBVyxFQUFFO0FBRTNELFFBQUksWUFBa0MsTUFDcEMsV0FBMEI7QUFFNUIsWUFBUSxpQkFBUixRQUFRLGVBQWlCLFVBQVU7QUFDbkMsWUFBUSx5QkFBUixRQUFRLHVCQUF5QixVQUFVO0FBRTNDLFFBQUksS0FBSztBQUNULFdBQUs7QUFBQSxRQUNILHdCQUF3QixRQUFRLFlBQVksbUNBQW1DLFFBQVEsb0JBQW9CO0FBQUEsTUFDN0c7QUFFQSxRQUFJLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFDN0IsWUFBTSxDQUFDLGNBQWMsR0FBR0MsTUFBSyxJQUFJLFlBQVksTUFBTSxHQUFHO0FBQ3RELFVBQUksS0FBSztBQUNULGFBQUssTUFBTSxZQUFZLFlBQVksb0JBQW9CO0FBRXZELFlBQU0sb0JBQW9CLEtBQUssV0FBVyxNQUFNO0FBQUEsUUFDOUMsQ0FBQyxNQUNELENBQUMsS0FBSyxXQUFXLFdBQVcsRUFBRSxVQUFVLEtBQ3hDLEVBQUUsVUFBVSxTQUFTLFlBQVk7QUFBQSxNQUNuQztBQUVBLFVBQUksbUJBQW1CO0FBQ3JCLFlBQUksS0FBSztBQUNULGVBQUs7QUFBQSxZQUNILFlBQVksWUFBWSxvQkFBb0Isa0JBQWtCLFVBQVU7QUFBQSxVQUMxRTtBQUNBLG9CQUFZO0FBQ1osc0JBQWNBLE9BQU0sS0FBSyxHQUFHO0FBQzVCLG1CQUFXO0FBQUEsTUFDYixPQUFPO0FBQ0wsWUFBSSxLQUFLO0FBQ1QsZUFBSztBQUFBLFlBQ0gsNkNBQTZDLFlBQVk7QUFBQSxVQUMzRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhLE1BQU0sY0FBYyxXQUFXLFdBQVc7QUFDN0QsVUFBTSxFQUFFLE1BQU0sV0FBVyxNQUFNLElBQy9CLFFBQVEsaUJBQWlCLFVBQVUsT0FDbkMsY0FBYyxRQUFRLFlBQVksUUFBUSxvQkFBb0IsSUFDOUQsRUFBRSxNQUFNLFFBQVEsY0FBYyxPQUFPLFdBQVc7QUFFaEQsUUFBSSxLQUFLO0FBQ1QsV0FBSztBQUFBLFFBQ0gsNEJBQTRCLFNBQVMsR0FDckMsYUFBYSxXQUNiLDJEQUNBLEVBQUU7QUFBQSxNQUVKO0FBR0EsUUFBSSxRQUFRLGFBQWEsV0FBVyxNQUFNLEdBQUc7QUFDM0MsVUFBSSxLQUFLO0FBQ1QsYUFBSyxNQUFNLFdBQVcsUUFBUSxhQUFhLFVBQVUsQ0FBQyxDQUFDLGVBQWU7QUFDdEUsa0JBQVksS0FBSyxXQUFXLElBQUksUUFBUSxhQUFhLFVBQVUsQ0FBQyxDQUFDO0FBQ2pFLFVBQUksQ0FBQztBQUNMLGVBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxVQUM1QjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxhQUFhLFFBQVE7QUFBQSxRQUN2QixDQUFDO0FBQUEsSUFDSDtBQUdBLFFBQUksQ0FBQyxXQUFXO0FBRWQsVUFBSSxDQUFDLFFBQVEsYUFBYTtBQUN4QixZQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sbUJBQW1CO0FBQ3BELGNBQU1DLE9BQU0sTUFBTSxLQUFLLFlBQVksUUFBUTtBQUFBLFVBQ3pDO0FBQUEsVUFDQTtBQUFBLFVBQ0EsYUFBYSxRQUFRO0FBQUEsUUFDdkIsQ0FBQztBQUVELFlBQUlBLE1BQUssVUFBVSxHQUFHO0FBQ3BCLGNBQUksS0FBSyxZQUFhLE1BQUssTUFBTSx1QkFBdUIsS0FBSyxFQUFFO0FBQy9ELGlCQUFPQTtBQUFBLFFBQ1Q7QUFFQSxZQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sd0JBQXdCLEtBQUssRUFBRTtBQUFBLE1BQ2xFO0FBRUEsVUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLHlCQUF5QjtBQUcxRCxtQkFFQSxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sUUFBUTtBQUN2QyxZQUFJLFFBQVEsaUJBQWlCLFNBQVMsSUFBSSxVQUFVLEVBQUcsUUFBTztBQUM5RCxlQUFPLElBQUksU0FBUyxPQUFPLFNBQTRCO0FBQUEsTUFDekQsQ0FBQyxJQUNELGFBQWE7QUFBQSxJQUNmO0FBR0EsUUFBSSxDQUFDLFdBQVc7QUFDZCxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sc0NBQXNDO0FBQ3ZFLGFBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxRQUM1QjtBQUFBLFFBQ0E7QUFBQSxRQUNBLGFBQWEsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBRUEsUUFBSSxLQUFLO0FBQ1QsV0FBSztBQUFBLFFBQ0gsa0NBQWtDLFVBQVUsVUFBVTtBQUFBLE1BQ3hEO0FBQ0EsVUFBTSxNQUFNLE1BQU0sVUFDbEIsT0FBTyxPQUFPO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixhQUFhLFFBQVE7QUFBQSxNQUNyQixnQkFBZ0IsUUFBUTtBQUFBLE1BQ3hCO0FBQUEsSUFDRixDQUFDLEVBQ0QsTUFBTSxNQUFNLElBQUk7QUFFaEIsUUFBSSxLQUFLO0FBQ1AsVUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLGdDQUFnQztBQUNqRSxZQUFNQyxVQUFTLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDcEM7QUFBQSxRQUNBO0FBQUEsUUFDQSxVQUFVLElBQUk7QUFBQSxRQUNkLFFBQVEsSUFBSTtBQUFBLFFBQ1o7QUFBQSxRQUNBLGFBQWEsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFFRCxVQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3hCLFlBQUksS0FBSyxZQUFhLE1BQUssTUFBTSx5QkFBeUI7QUFDMUQsY0FBTSxLQUFLLFlBQVksUUFBUUEsT0FBTTtBQUFBLE1BQ3ZDO0FBRUEsYUFBT0E7QUFBQSxJQUNUO0FBRUEsUUFBSSxLQUFLO0FBQ1QsV0FBSztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQ0EsVUFBTSxTQUFTLE1BQU0sS0FBSyxXQUFXO0FBQUEsTUFDbkMsT0FBTyxRQUNQLENBQUMsUUFBUSxpQkFBaUIsU0FBUyxJQUFJLFVBQVUsS0FDakQsTUFBTSxJQUFJLFNBQVMsS0FBSyxLQUN4QixJQUFJLE9BQU8sT0FBTztBQUFBLFFBQ2hCLE1BQU07QUFBQSxRQUNOLGFBQWEsUUFBUTtBQUFBLFFBQ3JCLGdCQUFnQixRQUFRO0FBQUEsUUFDeEI7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQ0EsUUFBSSxDQUFDLFFBQVEsUUFBUTtBQUNuQixVQUFJLEtBQUs7QUFDVCxhQUFLO0FBQUEsVUFDSCx3Q0FDQSxRQUFRLFVBQVUsY0FBYyxLQUFLO0FBQUEsUUFFdkM7QUFDQSxhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDNUI7QUFBQSxRQUNBO0FBQUEsUUFDQSxhQUFhLFFBQVE7QUFBQSxRQUNyQixXQUFXLFFBQVE7QUFBQSxNQUNyQixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksS0FBSztBQUNULFdBQUs7QUFBQSxRQUNILHVDQUF1QyxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQ3BFO0FBRUEsVUFBTSxPQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsTUFDbEM7QUFBQSxNQUNBO0FBQUEsTUFDQSxVQUFVLE9BQU8sT0FBTztBQUFBLE1BQ3hCLFFBQVEsT0FBTyxPQUFPO0FBQUEsTUFDdEIsV0FBVyxPQUFPO0FBQUEsTUFDbEIsYUFBYSxRQUFRO0FBQUEsSUFDdkIsQ0FBQztBQUVELFFBQUksQ0FBQyxRQUFRLGFBQWE7QUFDeEIsVUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLHlCQUF5QjtBQUMxRCxZQUFNLEtBQUssWUFBWSxRQUFRLElBQUk7QUFBQSxJQUNyQztBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8sV0FBVztBQUNoQixVQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7QUFDMUIsVUFBTSxVQUNOLFNBQVMsYUFBYSxRQUFRLFVBQVUsYUFBYSxTQUFTO0FBQzlELFVBQU0sYUFBYTtBQUFBLE1BQ25CO0FBQUEsTUFDQTtBQUFBLE1BQ0EscUJBQXFCLFFBQU8sT0FBTyxHQUNuQyxLQUFLLGFBQWEsSUFDbEIsS0FBSyxjQUFjLEtBQUssTUFBTSxDQUFDLHlCQUMvQixFQUFFO0FBQUEsTUFFRixtQkFBbUIscUJBQUFDLE9BQWE7QUFBQSxNQUNoQyxpQkFBaUIsZ0JBQUFKLE9BQVU7QUFBQSxNQUMzQixtQkFBbUIsUUFBUSxPQUFPLHVCQUF1QixPQUFPLGVBQWUsUUFBUSxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQUEsT0FDL0csTUFBTTtBQUNMLGNBQU0sT0FBTyxzQkFBTyxZQUFZO0FBQ2hDLFlBQUksQ0FBQyxLQUFNLFFBQU87QUFFbEIsZUFBTztBQUFBLFVBQ1AsYUFBYSxLQUFLLE9BQU87QUFBQSxVQUN6QixjQUFjLEtBQUssT0FBTztBQUFBLFVBQzFCLGFBQWEsS0FBSyxNQUFNO0FBQUEsVUFDeEIsY0FBYyxLQUFLLE9BQVEsU0FBUyxrQkFBa0IsQ0FBQztBQUFBLFFBQUUsRUFDekQsS0FBSyxJQUFJO0FBQUEsTUFDWCxHQUFHO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxLQUFLLFdBQVcsTUFDaEIsSUFBSSxDQUFDLE1BQU07QUFDVCxlQUFPLEVBQUU7QUFBQSxNQUNYLENBQUMsRUFDRCxLQUFLLElBQUksS0FBSztBQUFBLE1BQ2Q7QUFBQSxNQUNBLDBCQUEwQixlQUFlO0FBQUEsSUFBQztBQUcxQyxXQUFPLFdBQVcsS0FBSyxJQUFJO0FBQUEsRUFDN0I7QUFBQSxFQUVBLEVBQVMsT0FBTyxRQUFRLElBQUk7QUFDMUIsV0FBTyxLQUFLLE1BQU0sTUFBTSxPQUFPO0FBQUEsRUFDakM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sZUFBZSxNQUF3QjtBQUM1QyxXQUFPLElBQUksU0FBUyxNQUFNLElBQUk7QUFBQSxFQUNoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyw2QkFBNkIsVUFBeUI7QUFDM0QsVUFBTSxXQUFZLFNBQVMsWUFBWSxDQUFDO0FBQ3hDLFVBQU0sTUFBTSw4QkFBYyxTQUFTLEVBQUUsU0FBUztBQUM5QyxVQUFNLGFBQ04sV0FBVyxXQUFXLEdBQUcsU0FBUyxLQUFLLEtBQUssU0FBUyxHQUFHO0FBQ3hELFVBQU0sY0FDTixZQUFZLFdBQVcsR0FBRyxTQUFTLE1BQU0sS0FBSztBQUM5QyxVQUFNLGdCQUNOLGNBQWMsV0FBVyxHQUFHLFNBQVMsUUFBUSxLQUFLO0FBQ2xELFVBQU0saUJBQ04sZUFBZSxXQUFXLEdBQUcsU0FBUyxTQUFTLEtBQUs7QUFDcEQsVUFBTSxXQUNOLFNBQVMsV0FBVyxHQUFHLFNBQVMsR0FBRyxLQUFLLHlCQUF5QixHQUFHO0FBQ3BFLFVBQU0sbUJBQ04saUJBQWlCLFdBQ2pCLEdBQUcsU0FBUyxXQUFXLEtBQ3ZCO0FBQ0EsVUFBTSxhQUFhLFdBQVcsV0FBVyxPQUFPLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFFdkUsVUFBTSxRQUFRLElBQUksTUFBTSxNQUFNO0FBQUEsTUFDNUIsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsS0FBSztBQUFBLE1BQ0wsYUFBYTtBQUFBLE1BQ2IsV0FBVyxVQUFVO0FBQUEsTUFDckIsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxJQUNULENBQUM7QUFFRCxhQUFTLFdBQVc7QUFFcEIsVUFBTSxZQUFZLFFBQWdDO0FBRWxELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEseUJBQ2IsT0FDQSxPQUNBLFFBQ0EsUUFDQTtBQUNFLFFBQUksQ0FBQyxtQkFBSyxvQkFBb0I7QUFFOUIsV0FBTyxtQkFBSyxvQkFBbUIsT0FBTyxPQUFPLE9BQU8sUUFBUSxNQUFNO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sd0JBQXdCLFNBQXlDO0FBQ3RFLFFBQUksbUJBQUsscUJBQW9CO0FBQzNCLGFBQU8sbUJBQUs7QUFBQSxJQUNkO0FBRUEsdUJBQUssb0JBQXFCLElBQUksd0JBQXdCLE1BQU0sT0FBTztBQUVuRSxXQUFPLG1CQUFLO0FBQUEsRUFDZDtBQUNGO0FBbHlCRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE2Q0E7QUFuRDREO0FBQUE7QUFBQTtBQUFBO0FBVTVELGNBVlcsU0FVWSxXQUFrQjtBQVZwQyxJQUFNLFNBQU47OztBNUNsSVAsSUFBQUssb0JBV0E7QUFDQSxJQUFBQyx1QkFXQTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJTZXJpYWxpemVkVHlwZSIsICJxdWVyeSIsICJ2ZXJzaW9uIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAibW9kdWxlIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAiaW1wb3J0X3YxMCIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgImRlY2xhcmVQcm9wZXJ0eSIsICJnZXRQcm9wZXJ0eSIsICJtb2R1bGUiLCAiRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgInJlc3VsdCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJyZXNvbHZlIiwgInJlc29sdmUiLCAid2FpdEZvciIsICJpbXBvcnRfZXF1YWxpemVyIiwgIlRyYWNrU2tpcFJlYXNvbiIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2ZmbXBlZyIsICJkanNWZXJzaW9uIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiXQp9Cg==
7527
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvY29tcGF0L2NvbW1vbi50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2NvbXBhdC9jcmVhdGVPY2VhbmljQ29tcGF0LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9zdHJlYW0vVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL3ZlcnNpb24udHMiLCAiLi4vc3JjL1BsYXllclN0cmVhbUludGVyY2VwdG9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBjcmVhdGVFcmlzQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgeyBjcmVhdGVPY2VhbmljQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlT2NlYW5pY0NvbXBhdCc7XG5leHBvcnQgeyBpc0VyaXNQcm94eSwgaXNPY2VhbmljUHJveHkgfSBmcm9tICcuL2NvbXBhdC9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vZmFicmljJztcbmV4cG9ydCAqIGZyb20gJy4vcXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5leHBvcnQgKiBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuZXhwb3J0ICogZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2VyZGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyU3RyZWFtSW50ZXJjZXB0b3InO1xuZXhwb3J0IHtcbiAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gIHR5cGUgUENNRmlsdGVycyxcbiAgUV9CVVRURVJXT1JUSCxcbiAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gIEJBU1NfRVFfQkFORFMsXG4gIEFGX05JR0hUQ09SRV9SQVRFLFxuICBBRl9WQVBPUldBVkVfUkFURSxcbiAgRmlsdGVyc0NoYWluIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFN0cmVhbVR5cGUsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGF0Q2xpZW50LCBDb21wYXRQcm92aWRlciB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcblxuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgVm9pY2VTdGF0ZSB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIEVyaXMgZnJvbSAnZXJpcyc7XG5cbnR5cGUgRXJpc1VzZXJSZXNvbHZhYmxlID0gRXJpcy5Vc2VyIHwgc3RyaW5nIHwgRXJpcy5NZW1iZXI7XG50eXBlIEVyaXNHdWlsZFJlc29sdmFibGUgPVxuRXJpcy5HdWlsZCB8XG5zdHJpbmcgfFxuRXJpcy5NZW1iZXIgfFxuRXJpcy5HdWlsZENoYW5uZWwgfFxuRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBjcmVhdGVDb21wYXRDbGllbnQoZXJpc1Byb3h5LCAnRXJpcycpLmNsaWVudCBhcyB1bmtub3duIGFzIENsaWVudDtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlU3RhdGVVcGRhdGVQcm94eShcbmNsaWVudDogRXJpcy5DbGllbnQsXG5wcm94eTogRXJpcy5DbGllbnQsXG5oYW5kbGVyOiAoYSwgYikgPT4gdm9pZClcbntcbiAgY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG1lbWJlciwgb2xkU3RhdGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJveGllZE9sZFN0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG9sZFN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogb2xkU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG9sZFN0YXRlLnN1cHByZXNzLFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS5ndWlsZC5pZFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUudXNlci5pZFxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIGNvbnN0IG1lID0gbWVtYmVyLmd1aWxkLm1lbWJlcnMuZ2V0KGNsaWVudC51c2VyLmlkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2hhbm5lbCA9IG1lbWJlci5ndWlsZC5jaGFubmVscy5nZXQoXG4gICAgICAgIG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcHJveGllZE5ld1N0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogbWVtYmVyLnZvaWNlU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG1lbWJlci52b2ljZVN0YXRlLnN1cHByZXNzLFxuICAgICAgICBjaGFubmVsOiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2ZWRDaGFubmVsLCBjbGllbnQpLFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmlkXG4gICAgICAgIH0sXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5ndWlsZC5pZCxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBtZToge1xuICAgICAgICAgICAgICBpZDogbWU/LmlkLFxuICAgICAgICAgICAgICB2b2ljZToge1xuICAgICAgICAgICAgICAgIGFzeW5jIHNldFJlcXVlc3RUb1NwZWFrKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICB2b2lkIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lPy52b2ljZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgLy8gaWYgKG1lKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBtZS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyKHByb3hpZWROZXdTdGF0ZSwgcHJveGllZE9sZFN0YXRlKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50OiBFcmlzLkNsaWVudCkge1xuICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gIGlmICghYWRhcHRlcnMpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gIH1cblxuICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZ3VpbGRJZCwgYWRhcHRlcl0gb2YgYWRhcHRlcnMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2xpZW50Lmd1aWxkcy5nZXQoZ3VpbGRJZCk/LnNoYXJkLmlkID09PSBzaGFyZElkKSB7XG4gICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY2xpZW50Lm9uKCdyYXdXUycsIChwYWNrZXQpID0+IHtcbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVNlcnZlclVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YTtcbiAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTZXJ2ZXJVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGE7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcGF5bG9hZC5ndWlsZF9pZCAmJlxuICAgICAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCAmJlxuICAgICAgICAgIHBheWxvYWQudXNlcl9pZCA9PT0gY2xpZW50LnVzZXIuaWQpXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU3RhdGVVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzQ2hhbm5lbHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgY29uc3QgaGFuZGxlciA9IHtcbiAgICBjbGllbnQsXG4gICAgZ2V0IGNhY2hlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50LmdldENoYW5uZWwoaWQpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBpZCBpbiBjbGllbnQuY2hhbm5lbEd1aWxkTWFwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgcmVzb2x2ZShyZXNvbHZhYmxlOiBzdHJpbmcgfCBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShcbiAgICAgICAgICB0aGlzLmNsaWVudC5nZXRDaGFubmVsKHJlc29sdmFibGUpIGFzIEVyaXMuR3VpbGRDaGFubmVsLFxuICAgICAgICAgIGNsaWVudFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGRDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2YWJsZSwgY2xpZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnJlc29sdmUocmVzb2x2YWJsZSk7XG4gICAgICByZXR1cm4gY2hhbm5lbD8uaWQ7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG5jaGFubmVsOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFubmVsKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShjaGFubmVsLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ2d1aWxkJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlclByb3h5KHRhcmdldC5ndWlsZCwgY2xpZW50KTtcbiAgICAgICAgY2FzZSAnbWVtYmVycyc6XG4gICAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgRXJpcy5Wb2ljZUNoYW5uZWwpLnZvaWNlTWVtYmVycztcbiAgICAgICAgY2FzZSAnaXNWb2ljZUJhc2VkJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT5cbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fFxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNTdGFnZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlclByb3h5KFxuZ3VpbGQ6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFndWlsZCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoZ3VpbGQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ3ZvaWNlQWRhcHRlckNyZWF0b3InKSB7XG4gICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcih0YXJnZXQsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IoXG5ndWlsZDogRXJpcy5HdWlsZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3Ige1xuICByZXR1cm4gKG1ldGhvZHMpID0+IHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgYWRhcHRlcnMuc2V0KGd1aWxkLmlkLCBtZXRob2RzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChndWlsZC5zaGFyZC5zdGF0dXMgIT09ICdyZWFkeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZ3VpbGQuc2hhcmQuc2VuZFdTKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1VzZXJzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJleHBvcnQgY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgdHlwZSBDb21wYXRQcm92aWRlciA9ICdFcmlzJyB8ICdPY2VhbmljJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXRDbGllbnQge1xuICBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXI7XG4gIGNsaWVudDogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGF0Q2xpZW50KGNsaWVudDogYW55LCBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXIpOiBDb21wYXRDbGllbnQge1xuICBSZWZsZWN0LnNldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsIHByb3ZpZGVyKTtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcixcbiAgICBjbGllbnRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBDb21wYXRQcm92aWRlciB8IG51bGwge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPY2VhbmljUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ09jZWFuaWMnO1xufSIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IE91dE9mU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQgfSBmcm9tXG4nQHdlYi1zY3JvYmJsZXIvbWV0YWRhdGEtZmlsdGVyJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWUge1xuICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIFV0aWxzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAvKipcbiAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgY29uc3QgdmVyc2lvbiA9XG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogbnVsbDtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIERlbm8udmVyc2lvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHsgbmFtZTogJ2Rlbm8nLCB2ZXJzaW9uOiBEZW5vLnZlcnNpb24uZGVubyB9O1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9uKVxuICAgIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICByZXR1cm4geyBuYW1lOiAndW5rbm93bicsIHZlcnNpb246IHZlcnNpb24gPz8gJ3Vua25vd24nIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKS5cbiAgICBtYXAoKG0pID0+IGlzTmFOKG0pID8gMCA6IG0pLlxuICAgIGpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICB9IGFzIFRpbWVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5cbiAgICBmaWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5cbiAgICBtYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICBjb25zdCBmaW5hbCA9IHBhcnNlZC5cbiAgICBzbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSkuXG4gICAgbWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSkuXG4gICAgam9pbignOicpO1xuXG4gICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZHVyYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAqL1xuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbHRlck9wdHMgPSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFjazogW1xuICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XVxuXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3BvdGlmeUZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcbiAgICAgIHNwb3RpZnlGaWx0ZXIuZXh0ZW5kKGNyZWF0ZVNwb3RpZnlGaWx0ZXIoKSk7XG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICByZXR1cm4geW91dHViZSh0aXRsZSk7XG4gICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgIHJldHVybiBzcG90aWZ5RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdEZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVyIHJlcXVpcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gIH1cblxuICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oXG4gICAgICAgICAgKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgY29uc3QgcmVzID0gcmVxdWlyZShsaWIpO1xuICAgICAgICAgIGlmIChyZXMpIHJldHVybiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0O1xuICAgICAgICB9IGNhdGNoIHtcblxuICAgICAgICAgIC8vIG5vP1xuICAgICAgICB9fVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHtcbiAgICAgIGNvZGUsXG4gICAgICBkZXRhaWxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICByZXR1cm4gc3JjW3JhbmRvbUludChzcmMubGVuZ3RoKV07XG4gIH1cblxuICBzdGF0aWMgYXJyYXlDbG9uZVNodWZmbGU8VD4oc3JjOiBUW10pOiBUW10ge1xuICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgbGV0IG0gPSBhcnIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKG0pIHtcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtLS0pO1xuICAgICAgW2FyclttXSwgYXJyW2ldXSA9IFthcnJbaV0sIGFyclttXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKFxucXVldWU6IEd1aWxkUXVldWUsXG5pdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10gfCBudW1iZXIpID0+XG57XG4gIGlmIChxdWV1ZS5tYXhTaXplIDwgMSB8fCBxdWV1ZS5tYXhTaXplID09PSBJbmZpbml0eSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRyYWNrcyA9XG4gIHR5cGVvZiBpdGVtcyA9PT0gJ251bWJlcicgP1xuICBpdGVtcyA6XG4gIChpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID9cbiAgaXRlbXMudHJhY2tzIDpcbiAgQXJyYXkuaXNBcnJheShpdGVtcykgP1xuICBpdGVtcyA6XG4gIFtpdGVtc10pLlxuICBsZW5ndGg7XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzKSB7XG4gICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFcnJvcigndHJhY2tzIHF1ZXVlJywgbWF4Q2FwLCB0cmFja3MpO1xuICB9XG59O1xuXG5leHBvcnQgeyBVdGlsIH07IiwgImltcG9ydCB7XG4gIFVzZXIsXG4gIGVzY2FwZU1hcmtkb3duLFxuICBTbm93Zmxha2VVdGlsLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIEFQSVVzZXIgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBQbGF5ZXIsXG4gIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCxcbiAgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb21cbicuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFBsYXlsaXN0SlNPTiB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTZWVrRXZlbnQgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gIG1ldGFkYXRhOiBNO1xuICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPVxuJ3NvdW5kY2xvdWQnIHxcbid5b3V0dWJlJyB8XG4nc3BvdGlmeScgfFxuJ2FwcGxlX211c2ljJyB8XG4nYXJiaXRyYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAvKipcbiAgICogVGhlIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICB2aWV3czogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0XG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAvKipcbiAgICogVGhlIHNvdXJjZVxuICAgKi9cbiAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgZW5naW5lXG4gICAqL1xuICBlbmdpbmU/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByYXcgZGF0YVxuICAgKi9cbiAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0eXBlXG4gICAqL1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWFsaXplZCB0aXRsZVxuICAgKi9cbiAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdmlld3NcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICAgKi9cbiAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHJhdzogYW55O1xuICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuICBwdWJsaWMgY2xlYW5UaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYnJpZGdlZEV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgYnJpZGdlZFRyYWNrOiBUcmFjayB8IG51bGwgPSBudWxsO1xuXG4gICNvblNlZWs6ICgoZXZlbnQ6IFNlZWtFdmVudCkgPT4gQXdhaXRlZDx2b2lkPikgfCBudWxsID0gbnVsbDtcbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pXG4gIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sXG4gICAgICBkYXRhLnJhdyA/PyBkYXRhXG4gICAgKTtcbiAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPVxuICAgIGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPVxuICAgIGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgdHJhY2sgY2FuIGJlIHNlZWtlZFxuICAgKi9cbiAgcHVibGljIGdldCBzZWVrYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jb25TZWVrICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25TZWVrIGV2ZW50XG4gICAqIEBwYXJhbSBmbiBUaGUgb25TZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgaGFuZGxlU2VlayhmbjogKGV2ZW50OiBTZWVrRXZlbnQpID0+IEF3YWl0ZWQ8dm9pZD4pIHtcbiAgICB0aGlzLiNvblNlZWsgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHNlZWtcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBzZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhldmVudDogU2Vla0V2ZW50KSB7XG4gICAgaWYgKHRoaXMuI29uU2VlaykgcmV0dXJuIHRoaXMuI29uU2VlayhldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFjay4gVGhpcyBpcyBub3QgdXNlZnVsIG91dHNpZGUgb2YgdGhlIGxpYnJhcnkuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBBdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHNldFJlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXVkaW8gcmVzb3VyY2UgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT5cbiAgICBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MgPz8gMCxcbiAgICAgIHJlcXVlc3RlZF9ieTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHF1ZXJ5X3R5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciA/PyBudWxsLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuVHJhY2ssXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFjayBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQoXG4gIHBsYXllcjogUGxheWVyLFxuICBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pXG4gIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnZGF0YScsXG4gICAgICAnU2VyaWFsaXplZFRyYWNrJyxcbiAgICAgICdtYWxmb3JtZWQgZGF0YSdcbiAgICApO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpXG4gICAgICAgICAgcmV0dXJuIHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuZ2V0KHJlcy5pZCkhO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pKCkgOlxuICAgICAgbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogZGF0YS5xdWVyeV90eXBlID8/IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlbG9uZ2luZyBxdWV1ZXMgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT5cbiAgICBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKVxuICAgICk7XG5cbiAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJleHBvcnQgY2xhc3MgRGlzY29yZFBsYXllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlcztcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29kZTogRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy50aW1lc3RhbXBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlNwYWNlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLFxuICAgICAgYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJnVHlwZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVzdWx0RXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19SRVNVTFQsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfSU1QTEVNRU5URUQsIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RFeGlzdGluZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfRVhJU1RJTkcsIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3V0T2ZSYW5nZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfUkFOR0UsXG4gICAgICBgJHt0YXJnZXR9IGlzIG91dCBvZiByYW5nZSAoRXhwZWN0ZWQgbWluaW11bSAke21pbmltdW19IGFuZCBtYXhpbXVtICR7bWF4aW11bX0sIGdvdCAke3ZhbHVlfSlgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04sXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PydcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQsXG4gICAgICAnQ2Fubm90IHVzZSBkZXN0cm95ZWQgdm9pY2UgY29ubmVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCwgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMLCAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVjZWl2ZXJFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1JFQ0VJVkVSLFxuICAgICAgbWVzc2FnZSB8fFxuICAgICAgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX0FVRElPX1JFU09VUkNFLFxuICAgICAgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTkZPX1JFUVVJUkVELFxuICAgICAgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCxcbiAgICAgIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtcbiAgICAgIGlkID8gYChFeHRyYWN0b3IgRXhlY3V0aW9uIENvbnRleHQgSUQgaXMgJHtpZH0pYCA6ICcnfUZhaWxlZCB0byBicmlkZ2UgdGhpcyBxdWVyeTpcXG4ke1xuICAgICAgZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgRVJSX09VVF9PRl9TUEFDRTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgRVJSX05PX1JFU1VMVDogJ0VSUl9OT19SRVNVTFQnLFxuICBFUlJfTk9UX0lNUExFTUVOVEVEOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gIEVSUl9OT1RfRVhJU1RJTkc6ICdFUlJfTk9UX0VYSVNUSU5HJyxcbiAgRVJSX09VVF9PRl9SQU5HRTogJ0VSUl9PVVRfT0ZfUkFOR0UnLFxuICBFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTjogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6ICdFUlJfTk9fVk9JQ0VfQ0hBTk5FTCcsXG4gIEVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUw6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX05PX1JFQ0VJVkVSOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgRVJSX0ZGTVBFR19MT0NBVE9SOiAnRVJSX0ZGTVBFR19MT0NBVE9SJyxcbiAgRVJSX05PX0FVRElPX1JFU09VUkNFOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgRVJSX05PX0dVSUxEX1FVRVVFOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgRVJSX05PX0dVSUxEOiAnRVJSX05PX0dVSUxEJyxcbiAgRVJSX0lORk9fUkVRVUlSRUQ6ICdFUlJfSU5GT19SRVFVSVJFRCcsXG4gIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ0VSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRTogJ0VSUl9OT1RfRVhJU1RJTkdfTU9EVUxFJyxcbiAgRVJSX0JSSURHRV9GQUlMRUQ6ICdFUlJfQlJJREdFX0ZBSUxFRCdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVycm9yQ29kZXMgPSAodHlwZW9mIEVycm9yQ29kZXMpW2tleW9mIHR5cGVvZiBFcnJvckNvZGVzXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3I6IGFueSk6IGVycm9yIGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIHJldHVybiBlcnJvciAhPSBudWxsICYmIGVycm9yIGluc3RhbmNlb2YgRGlzY29yZFBsYXllckVycm9yO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhIGBEaXNjb3JkUGxheWVyRXJyb3JgIGVycm9yLlxuICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBoYW5kbGVcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIGVycm9yIGlzIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAuXG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGhhbmRsZXJcbiAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIC8vIC4uLlxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IsIChlcnJvcikgPT4ge1xuICogICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZnJvbSBkaXNjb3JkLXBsYXllcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICogIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3I8XG4gIFQgZXh0ZW5kcyBhbnlbXSxcbiAgRiBleHRlbmRzIChlcnJvcjogRGlzY29yZFBsYXllckVycm9yLCAuLi5hcmdzOiBUKSA9PiBhbnksXG4gIFIgZXh0ZW5kcyBSZXR1cm5UeXBlPEY+PihcbmVycm9yOiBhbnksIGhhbmRsZXI6IEYsIGFyZ3M6IFQpOiBSIHtcbiAgaWYgKGlzRGlzY29yZFBsYXllckVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBoYW5kbGVyKGVycm9yLCAuLi5hcmdzKSBhcyBSO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8iLCAiaW1wb3J0IHsgRGlzY29yZFBsYXllckVycm9yLCBpc0Rpc2NvcmRQbGF5ZXJFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgcmV0dXJuIFR5cGVVdGlsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU3RyaW5nKHQ6IHVua25vd24pOiB0IGlzIHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheSh0OiB1bmtub3duKTogdCBpcyB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0OiB1bmtub3duKTogdCBpcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICAgIHJldHVybiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0KTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IERlc2VyaWFsaXphdGlvbkVycm9yLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUGxheWxpc3QsXG4gIHR5cGUgU2VyaWFsaXplZFRyYWNrLFxuICBUcmFjayxcbiAgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbVxuJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCBlbnVtIFNlcmlhbGl6ZWRUeXBlIHtcbiAgVHJhY2sgPSAndHJhY2snLFxuICBQbGF5bGlzdCA9ICdwbGF5bGlzdCcsXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PlxuZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBUcmFjayB8IFBsYXlsaXN0IHwgYW55KSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgaWYgKGlzVHJhY2soZGF0YSkpIHJldHVybiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShkYXRhOiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKFR5cGVVdGlsLmlzU3RyaW5nKGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IiwgImltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tKU09OLCBUcmFja1NvdXJjZSB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgdHJhY2tzOiBUcmFja1tdO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAgICovXG4gIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICovXG4gIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIHB1YmxpYyBhdXRob3I6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgLyoqXG4gICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllclxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICogLSBgYWxidW1gXG4gICAgICogLSBgcGxheWxpc3RgXG4gICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgKi9cbiAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgfTtcblxuICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdClcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkUGxheWxpc3QnLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEluZm9SZXF1aXJlZEVycm9yLCBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPVxuL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9XG4vXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvKHNvbmd8YWxidW0pXFwvLis/KFxcLy4rP1xcP2k9fFxcLykoWzAtOV0rKSQvO1xuY29uc3QgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPVxuL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8od3d3Lik/eW91dHViZS5jb21cXC9wbGF5bGlzdFxcP2xpc3Q9KChQTHxGTHxVVXxMTHxSRHxPTClbYS16QS1aMC05LV9dezE2LDQxfSkkLztcbmNvbnN0IHlvdXR1YmVWaWRlb1VSTFJlZ2V4ID1cbi9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyBkaXNjb3JkLXBsYXllcjovL2Jsb2IvdXVpZC12NFxuY29uc3QgZGlzY29yZFBsYXllckJsb2JSZWdleCA9IC9eZGlzY29yZC1wbGF5ZXI6XFwvXFwvYmxvYlxcL1xcZCskLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jb25zdCBEb21haW5zTWFwID0ge1xuICBEaXNjb3JkUGxheWVyOiBbJ2Rpc2NvcmQtcGxheWVyJ10sXG4gIFlvdVR1YmU6IFtcbiAgJ3lvdXR1YmUuY29tJyxcbiAgJ3lvdXR1LmJlJyxcbiAgJ211c2ljLnlvdXR1YmUuY29tJyxcbiAgJ2dhbWluZy55b3V0dWJlLmNvbScsXG4gICd3d3cueW91dHViZS5jb20nLFxuICAnbS55b3V0dWJlLmNvbSddLFxuXG4gIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4vXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmxpbmtcXC9bQS1aYS16MC05XSskLyxcbi9eaHR0cHM6XFwvXFwvb25cXC5zb3VuZGNsb3VkXFwuY29tXFwvW2EtekEtWjEtOV17MCwxN30kL11cbik7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIC0gRElTQ09SRF9QTEFZRVJfQkxPQlxuICogQHR5cGVkZWYge3N0cmluZ30gUXVlcnlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeVR5cGUgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICBZT1VUVUJFX1BMQVlMSVNUOiAneW91dHViZVBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICBTT1VORENMT1VEOiAnc291bmRjbG91ZCcsXG4gIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gIFNQT1RJRllfUExBWUxJU1Q6ICdzcG90aWZ5UGxheWxpc3QnLFxuICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgVklNRU86ICd2aW1lbycsXG4gIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gIFlPVVRVQkVfU0VBUkNIOiAneW91dHViZVNlYXJjaCcsXG4gIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICBBUFBMRV9NVVNJQ19TT05HOiAnYXBwbGVNdXNpY1NvbmcnLFxuICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgQVBQTEVfTVVTSUNfU0VBUkNIOiAnYXBwbGVNdXNpY1NlYXJjaCcsXG4gIEZJTEU6ICdmaWxlJyxcbiAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJyxcbiAgRElTQ09SRF9QTEFZRVJfQkxPQjogJ2Rpc2NvcmRQbGF5ZXJCbG9iJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUXVlcnlUeXBlID0gKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgUXVlcnlUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gIHF1ZXJ5OiBzdHJpbmc7XG59XG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAvKipcbiAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgdmltZW9SZWdleCxcbiAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXgsXG4gICAgICBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtcmVzb2x2ZSByZWRpcmVjdCB1cmxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHJlUmVzb2x2ZShxdWVyeTogc3RyaW5nLCBtYXhEZXB0aCA9IDUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgIGZvciAoY29uc3QgZG9tYWluIG9mIHJlZGlyZWN0RG9tYWlucykge1xuICAgICAgaWYgKGRvbWFpbi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHF1ZXJ5LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgIGlmICgvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmFwcC5saW5rXFwvKC4rKSQvLnRlc3QocmVzLnVybCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYm9keS5cbiAgICAgICAgICAgIHNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uXG4gICAgICAgICAgICBzcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgP1xuICAgICAgICAgIHJlcy51cmwgOlxuICAgICAgICAgIHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEluZm9SZXF1aXJlZEVycm9yKCdxdWVyeScsIFN0cmluZyhxdWVyeSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeTogc3RyaW5nKSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIHF1ZXJ5XG4gICAgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsIHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnbGlzdCcpO1xuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgaWYgKHBsYXlsaXN0SWQpIHtcbiAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9Jmxpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID9cbiAgICBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6XG4gICAgbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICBzb2Z0bGltaXRlcjpcbiAgICAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgIHNpbGVuY2VyZW1vdmU6ICdzaWxlbmNlcmVtb3ZlPTE6MDotNTBkQidcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHtcbiAgICBuYW1lOiBGaWx0ZXJzTmFtZTtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9PiB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgeWllbGQgeyBuYW1lOiBrIGFzIEZpbHRlcnNOYW1lLCB2YWx1ZTogdiBhcyBzdHJpbmcgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKSBhcyBGaWx0ZXJzTmFtZVtdO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IChLIHwgc3RyaW5nKVtdKSB7XG4gICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIHJldHVybiBmaWx0ZXJzLlxuICAgIGZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJykuXG4gICAgbWFwKChtKSA9PiB0aGlzLmdldChtIGFzIEspKS5cbiAgICBqb2luKCcsJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheToge25hbWU6IHN0cmluZzt2YWx1ZTogc3RyaW5nO31bXSkge1xuICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vLyBAdHMtbm9jaGVja1xuXG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR2F0ZXdheURpc3BhdGNoRXZlbnRzIH0gZnJvbSAnZGlzY29yZC1hcGktdHlwZXMvdjEwJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBhdENsaWVudCwgQ29tcGF0UHJvdmlkZXIgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSBPY2VhbmljIGZyb20gJ29jZWFuaWMuanMnO1xuXG50eXBlIE9jZWFuaWNVc2VyUmVzb2x2YWJsZSA9IE9jZWFuaWMuVXNlciB8IHN0cmluZyB8IE9jZWFuaWMuTWVtYmVyO1xudHlwZSBPY2VhbmljR3VpbGRSZXNvbHZhYmxlID1cbk9jZWFuaWMuR3VpbGQgfFxuc3RyaW5nIHxcbk9jZWFuaWMuTWVtYmVyIHxcbk9jZWFuaWMuR3VpbGRDaGFubmVsIHxcbk9jZWFuaWMuUm9sZTtcbnR5cGUgT2NlYW5pY0NoYW5uZWxSZXNvbHZhYmxlID0gT2NlYW5pYy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2NlYW5pY0NsaWVudChjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBPY2VhbmljLkNsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdvY2VhbmljLmpzJyk7XG5cbiAgaWYgKGVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIG9jZWFuaWMuQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBkZWNsYXJlUHJvcGVydHkodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogVCB7XG4gIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PFQ+KHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IFQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXkpO1xufVxuXG4vKipcbiAqIEFsbG93cyBPY2VhbmljLmpzIGNsaWVudHMgdG8gYmUgdXNlZCB3aXRoIGRpc2NvcmQtcGxheWVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgY3JlYXRlcyBhIHByb3h5IG9iamVjdCB0aGF0IGludGVyY2VwdHMgY2VydGFpbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIGRpc2NvcmQtcGxheWVyLlxuICogQHBhcmFtIGNsaWVudCBUaGUgT2NlYW5pYy5qcyBjbGllbnQgdG8gYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSBPY2VhbmljLmpzIGNsaWVudCB3aXRoIGRpc2NvcmQtcGxheWVyIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPY2VhbmljQ29tcGF0KGNsaWVudDogT2NlYW5pYy5DbGllbnQpOiBDbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnb2NlYW5pYy5qcycpO1xuXG4gIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgb2NlYW5pY1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQpO1xuXG4gIGNvbnN0IG9jZWFuaWNQcm94eSA9IG5ldyBQcm94eShjbGllbnQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAndXNlcnMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVXNlcnNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdndWlsZHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljR3VpbGRzUHJveHkodGFyZ2V0LCBvY2VhbmljKTtcbiAgICAgICAgY2FzZSAnY2hhbm5lbHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljQ2hhbm5lbHNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdfX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHknOlxuICAgICAgICAgIHJldHVybiAoaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpID0+XG4gICAgICAgICAgb2NlYW5pY1ZvaWNlU3RhdGVVcGRhdGVQcm94eSh0YXJnZXQsIG9jZWFuaWNQcm94eSwgaGFuZGxlcik7XG4gICAgICAgIGNhc2UgJ2luY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNsaWVudC5zZXRNYXhMaXN0ZW5lcnMoY2xpZW50LmdldE1heExpc3RlbmVycygpICsgMSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZGVjcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2xpZW50LmdldE1heExpc3RlbmVycygpIC0gMTtcblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhsaXN0ZW5lcnMgPCAwID8gMSA6IGxpc3RlbmVycyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIFJlZmxlY3Quc2V0KG9jZWFuaWNQcm94eSwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgJ09jZWFuaWMnKTtcblxuICByZXR1cm4gY3JlYXRlQ29tcGF0Q2xpZW50KG9jZWFuaWNQcm94eSwgJ09jZWFuaWMnKS5jbGllbnQgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IE9jZWFuaWMuQ2xpZW50LFxucHJveHk6IE9jZWFuaWMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogT2NlYW5pYy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncGFja2V0JywgKHBhY2tldCkgPT4ge1xuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU2VydmVyVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhO1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVNlcnZlclVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICBwYXlsb2FkLmd1aWxkX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNDaGFubmVsc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuICAgICAgICAgIHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgT2NlYW5pYy5HdWlsZENoYW5uZWwsXG4gICAgICAgICAgY2xpZW50XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgT2NlYW5pYy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IE9jZWFuaWMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogT2NlYW5pYy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBPY2VhbmljLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlIHx8XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNWb2ljZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlO1xuICAgICAgICBjYXNlICdpc1N0YWdlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkoXG5ndWlsZDogT2NlYW5pYy5HdWlsZCB8IHVuZGVmaW5lZCxcbmNsaWVudDogT2NlYW5pYy5DbGllbnQpXG46IE9jZWFuaWMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyQ3JlYXRvcihcbmd1aWxkOiBPY2VhbmljLkd1aWxkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gIHJldHVybiAobWV0aG9kcykgPT4ge1xuICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgIGlmICghYWRhcHRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+KCk7XG4gICAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRQYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBndWlsZC5zaGFyZC5zZW5kKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY0d1aWxkc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY1VzZXJzUHJveHkoY2xpZW50OiBPY2VhbmljLkNsaWVudCwgb2NlYW5pYzogdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBPY2VhbmljVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogT2NlYW5pY1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxcbiAgTCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzXG5FdmVudEVtaXR0ZXI8TD4ge1xuICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICBpZiAoXG4gICAgdGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSlcbiAgICB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+XG4gIGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgcHVibGljIG9wdGlvbnM6IFQgPSA8VD4ge30pXG4gIHt9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VFeHRyYWN0b3IpLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25maWd1cmVzIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY29uZmlndXJlKG9wdGlvbnM6IFQpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgIGF3YWl0IHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGluY29taW5nIHF1ZXJ5XG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpXG4gIDogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCBjb250ZXh0O1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3MoXG4gIHRyYWNrOiBUcmFjayxcbiAgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCB0cmFjaztcbiAgICB2b2lkIGhpc3Rvcnk7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPilcbiAge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKFxuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCxcbiAgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSlcbiAgOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbClcbiAgOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgdm9pZCBzb3VyY2VFeHRyYWN0b3I7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufSIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yLCBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IEJyaWRnZUZhaWxlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgYXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG4gIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAqL1xuICBhY3RpdmF0ZTogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBkZWFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLFxuICBlcnJvcjogRXJyb3IpXG4gID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAqL1xuICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEV4dHJhY3RvclNlc3Npb24+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpZFxuICAgKi9cbiAgcHVibGljIGdldEV4ZWN1dGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uc3VtZSgpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCkgPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBgXFx0aW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcXG5cXHRhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO2A7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSBleHRyYWN0b3JzLmxvYWRNdWx0aSBpbnN0ZWFkLiBFeGFtcGxlOlxcbiR7c2FtcGxlfVxcbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBidW5kbGUgb2YgZXh0cmFjdG9ycy5cbiAgICogQGV4YW1wbGUgaW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcbiAgICpcbiAgICogYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgTyBleHRlbmRzIG9iamVjdCxcbiAgICBUIGV4dGVuZHMgKHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+KVtdLFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgICBUW251bWJlcl1bJ2lkZW50aWZpZXInXSxcbiAgICAgIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPj4oXG5cbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmIChcbiAgICB0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fFxuICAgIHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIHJldHVybiBleHRyYWN0b3IgYXMgdW5rbm93biBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgY29uc3QgZXh0cmFjdG9yID1cbiAgICB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgP1xuICAgIHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDpcbiAgICB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgIGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhcbiAgICAgICAgYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KFxuICBmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sXG4gIGZpbHRlckJsb2NrZWQgPSB0cnVlKVxuICB7XG4gICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLFxuICAgICAgICAnTm9FeHRyYWN0b3JzJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgIGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyKVxuICAgIHJldHVybiB7XG4gICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgZXJyb3I6IGVycixcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZm9yIGEgdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpXG4gIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID1cbiAgICB0aGlzLmdldENvbnRleHQoKT8uYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9ycyA/PyBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8XG4gICAgICByZXN1bHQ/LmVycm9yPy5tZXNzYWdlIHx8XG4gICAgICAnTm8gZXh0cmFjdG9ycyBhdmFpbGFibGUgdG8gYnJpZGdlJ1xuICAgICk7XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gcmVzdWx0LmV4dHJhY3RvcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKiBAcGFyYW0gdGFyZ2V0RXh0cmFjdG9yIFRoZSB0YXJnZXQgZXh0cmFjdG9yIHRvIGJyaWRnZSB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2VGcm9tKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsXG4gIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSlcbiAge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZSh0YXJnZXRFeHRyYWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoXG5leHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG49PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7IiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFQ+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVmYXVsdFZhbHVlPzogVCkge31cblxuICAvKipcbiAgICogRXhpdCBvdXQgb2YgdGhpcyBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgdGhpcy5zdG9yYWdlLmV4aXQoc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdW1lKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHZhbHVlIG1heSBub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0XG4gKiBAZXhhbXBsZSBjb25zdCB1c2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAqXG4gKiAgLy8gdGhlIHZhbHVlIHRvIHByb3ZpZGVcbiAqICBjb25zdCB1c2VyID0ge1xuICogICBpZDogMSxcbiAqICAgbmFtZTogJ0pvaG4gRG9lJ1xuICogIH07XG4gKlxuICogIC8vIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUgdG8gdGhlIHJlY2VpdmVyXG4gKiAgY29udGV4dC5wcm92aWRlKHVzZXIsIGhhbmRsZXIpO1xuICpcbiAqICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICogICAgLy8gZ2V0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICpcbiAqICAgIGNvbnNvbGUubG9nKGlkLCBuYW1lKTsgLy8gMSwgSm9obiBEb2VcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQgPSB1bnNhZmU+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn0iLCAiaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTsiLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGQgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0L2FzeW5jLWNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzQ3R4IHtcbiAgZ3VpbGQ6IEd1aWxkO1xufVxuXG5leHBvcnQgY29uc3QgU1VQRVJfQ09OVEVYVCA9IGNyZWF0ZUNvbnRleHQ8UGxheWVyPigpO1xuXG5jb25zdCBnZXRGYWxsYmFja0NvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtwbGF5ZXJdJykgYXMgUGxheWVyIHwgdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9va3NDb250ZXh0KGhvb2tOYW1lOiBzdHJpbmcsIG1haW5Pbmx5ID0gZmFsc2UpIHtcbiAgbGV0IGlzRmFsbGJhY2sgPSBmYWxzZTtcblxuICBsZXQgcGxheWVyOiBQbGF5ZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCEocGxheWVyID0gU1VQRVJfQ09OVEVYVC5jb25zdW1lKCkpKSB7XG4gICAgcGxheWVyID0gZ2V0RmFsbGJhY2tDb250ZXh0KCk7XG4gICAgaXNGYWxsYmFjayA9IHRydWU7XG4gIH1cblxuICBpZiAoIXBsYXllcilcbiAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICdkaXNjb3JkLXBsYXllcicsXG4gICAgYFBsYXllciBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUsICR7XG4gICAgaXNGYWxsYmFjayA/XG4gICAgJ2RpZCB5b3UgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIHBsYXllciB3aXRoIGBuZXcgUGxheWVyKGNsaWVudClgPycgOlxuICAgICdpcyBpdCBiZWluZyBjYWxsZWQgaW5zaWRlIDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpPyd9YFxuXG4gICk7XG5cbiAgaWYgKG1haW5Pbmx5KSByZXR1cm4geyBwbGF5ZXIsIGNvbnRleHQ6IHt9IGFzIEhvb2tzQ3R4LCBpc0ZhbGxiYWNrIH07XG5cbiAgbGV0IGNvbnRleHQ6IEhvb2tzQ3R4IHwgdW5kZWZpbmVkO1xuXG4gIGlmICghaXNGYWxsYmFjaykge1xuICAgIGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpXG4gICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgaG9va05hbWUsXG4gICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgcGxheWVyIGNvbnRleHQgY3JlYXRlZCBieSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKWBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQgPSB7XG4gICAgICBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvcihcbiAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleHBsaWNpdCBndWlsZCBhcmd1bWVudCB3aGVuIG5vdCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGFzIHVua25vd24gYXMgSG9va3NDdHg7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0LCBwbGF5ZXIsIGlzRmFsbGJhY2sgfTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VQbGF5ZXInKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUubm9kZTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUuXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGUuIERlZmF1bHRzIHRvIGluZmVycmVkIGd1aWxkIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVF1ZXVlJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5yZXNvbHZlPE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZTtcbn0iLCAiaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICBjb25zdCB7IHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNYWluUGxheWVyJywgdHJ1ZSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IHR5cGUgU2V0dGVyRk48VCwgUD4gPSAocHJldmlvdXM6IFApID0+IFQ7XG5leHBvcnQgdHlwZSBNZXRhZGF0YURpc3BhdGNoPFQ+ID0gcmVhZG9ubHkgW1xuICAoKSA9PiBULFxuICAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPigpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSlcbiAgICAgIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUsIFBsYXllclRpbWVzdGFtcCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZTogTm9kZVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVRpbWVsaW5lIHtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBQbGF5ZXJUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IHZvbHVtZTogbnVtYmVyO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYWNrOiBUcmFjazx1bmtub3duPiB8IG51bGw7XG4gIHBhdXNlKCk6IGJvb2xlYW47XG4gIHJlc3VtZSgpOiBib29sZWFuO1xuICBzZXRWb2x1bWUodm9sOiBudW1iZXIpOiBib29sZWFuO1xuICBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGltZWxpbmUgZGlzcGF0Y2hlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoKTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pXG46IEd1aWxkUXVldWVUaW1lbGluZSB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoXG5vcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0gc2F0aXNmaWVzIEd1aWxkUXVldWVUaW1lbGluZSk7XG5cbiAgcmV0dXJuIHRpbWVsaW5lO1xufSIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25BZnRlckNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbnR5cGUgU2V0dGVyRk4gPSAocHJldmlvdXM6IG51bWJlcikgPT4gbnVtYmVyO1xudHlwZSBWb2x1bWVEaXNwYXRjaCA9IHJlYWRvbmx5IFtcbiAgKCkgPT4gbnVtYmVyLFxuICAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKCk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlOiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlPzogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVZvbHVtZScpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGNvbnN0IHNldHRlciA9ICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiB7XG4gICAgaWYgKHF1ZXVlKSB7XG4gICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbih2b2x1bWUpKVxuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHtcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgQmlxdWFkRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgR3VpbGRRdWV1ZSxcbiAgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsXG4gIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgUXVldWVSZXBlYXRNb2RlIH0gZnJvbVxuJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBOb0d1aWxkRXJyb3IsIE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gYW55PiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZGlzYWJsZVNlZWtlcj86IGJvb2xlYW47XG4gIGRpc2FibGVSZXZlcmI/OiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW0/OiBib29sZWFuO1xuICBlbmFibGVTdHJlYW1JbnRlcmNlcHRvcj86IGJvb2xlYW47XG4gIHZlcmlmeUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkTm9kZU1hbmFnZXI8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU+KCk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBndWlsZCBxdWV1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihcbiAgZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSxcbiAgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KVxuICA6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgLy8gdG9kbyh0d2xpdGUpOiBtYXliZSBkaXNhYmxlIHRoZXNlIGJ5IGRlZmF1bHQ/XG4gICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlQ29tcHJlc3NvciA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmRpc2FibGVTZWVrZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlUmV2ZXJiID8/PSB0cnVlO1xuXG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMudmVyaWZ5RmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IsXG4gICAgICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogb3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbSxcbiAgICAgIGRpc2FibGVDb21wcmVzc29yOiBvcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgZGlzYWJsZVNlZWtlcjogb3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgZGlzYWJsZVJldmVyYjogb3B0aW9ucy5kaXNhYmxlUmV2ZXJiXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhpc3RpbmcgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGdldDxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBpZCA9XG4gICAgbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgP1xuICAgIG5vZGUuaWQgOlxuICAgIHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpITtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgIHJldHVybiBub2RlIGFzIEd1aWxkUXVldWU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhXG4gICAgKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgQ2hhbm5lbFR5cGUsXG4gIEd1aWxkLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIFZvaWNlQmFzZWRDaGFubmVsLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgQmlxdWFkRmlsdGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBDb21wcmVzc29yUGFyYW1ldGVycyxcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgUmV2ZXJiUGFyYW1ldGVycyxcbiAgU2Vla2VyUGFyYW1ldGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7XG4gIHR5cGUgQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUmVzb3VyY2UsXG4gIFN0cmVhbVR5cGUsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9Wb2ljZUNoYW5uZWxFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gYW55PiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yOiBib29sZWFuO1xuICBkaXNhYmxlUmV2ZXJiOiBib29sZWFuO1xuICBkaXNhYmxlU2Vla2VyOiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yOiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyPFQgPSB1bmtub3duPiA9IChcbnN0cmVhbTogUmVhZGFibGUsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbnRyYWNrOiBUcmFjazxUPilcbj0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqL1xuICBTYW1wbGVSYXRlVXBkYXRlOiAnc2FtcGxlUmF0ZVVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZTogJ3NhbXBsZVJhdGVGaWx0ZXJVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgUmV2ZXJiVXBkYXRlOiAncmV2ZXJiVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqL1xuICBDb21wcmVzc29yVXBkYXRlOiAnY29tcHJlc3NvclVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICovXG4gIFBsYXllclNlZWs6ICdwbGF5ZXJTZWVrJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgR3VpbGRRdWV1ZUV2ZW50ID1cbih0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50KVtrZXlvZiB0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50XTtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgTm9TdHJlYW0gPSAnRVJSX05PX1NUUkVBTScsXG4gIE1hbnVhbCA9ICdNQU5VQUwnLFxuICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICBKdW1wID0gJ0pVTVBFRF9UT19BTk9USEVSX1RSQUNLJyxcbiAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSycsXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IGFueT4ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrUmVtb3ZlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25EZXN0cm95ZWRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG1lc3NhZ2U6IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcnJvcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWxdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eVF1ZXVlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBlcnJvcjogRXJyb3IsXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2hdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBza2lwcGluZ1xuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTa2lwXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrLFxuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbixcbiAgZGVzY3JpcHRpb246IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlcl06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgbmV3U3RhdGU6IFZvaWNlU3RhdGUpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRWb2x1bWU6IG51bWJlcixcbiAgbmV3Vm9sdW1lOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sXG4gIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsXG4gIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSxcbiAgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pXG4gID0+IHVua25vd247XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgKiBMaXN0ZW5pbmcgdG8gdGhpcyBldmVudCB3aWxsIHBhdXNlIHRoZSBleGVjdXRpb24gb2YgYXVkaW8gcGxheWVyIHVudGlsIGBkb25lKClgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25zIGZvciBzdHJlYW1pbmdcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrPHVua25vd24+LFxuICBjb25maWc6IFN0cmVhbUNvbmZpZyxcbiAgZG9uZTogKCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXldOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFja3M6IFRyYWNrW10sXG4gIGRvbmU6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNhbXBsZSByYXRlIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRSYXRlIFRoZSBvbGQgc2FtcGxlIHJhdGVcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkUmF0ZTogbnVtYmVyLFxuICBuZXdSYXRlOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFJhdGUgVGhlIG9sZCBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcjogQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0IHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21tb25SZXNhbXBsZXJGaWx0ZXJQcmVzZXQgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlciBUaGUgb2xkIHJldmVyYiBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IHJldmVyYiBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUmV2ZXJiVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVyIFRoZSBvbGQgY29tcHJlc3NvciBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IGNvbXByZXNzb3IgZmlsdGVyXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbXByZXNzb3JVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXI6IENvbXByZXNzb3JQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21wcmVzc29yUGFyYW1ldGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgc2VlayBwb3NpdGlvblxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgcGFyYW1ldGVyczogU2Vla2VyUGFyYW1ldGVycylcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPVxuKHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGUpW2tleW9mIHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGVdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IGFueT4ge1xuICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAjZGVsZXRlZCA9IGZhbHNlO1xuICAjc2h1ZmZsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICBzdHJlYW0sXG4gICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgfSk7XG4gIHB1YmxpYyByZXBlYXRNb2RlOiBRdWV1ZVJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIHN5bmNlZEx5cmljc1Byb3ZpZGVyID0gbmV3IFN5bmNlZEx5cmljc1Byb3ZpZGVyKHRoaXMpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPilcbiAge1xuICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKVxuICAgIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpXG4gICAgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgaWYgKFxuICAgICFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiZcbiAgICAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKVxuICAgIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnW0d1aWxkTm9kZUluaXQubWF4SGlzdG9yeVNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heEhpc3RvcnlTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYFxuICAgICk7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHF1ZXVlIGNhbiBpbnRlcmNlcHQgc3RyZWFtc1xuICAgKi9cbiAgcHVibGljIGNhbkludGVyY2VwdCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVuYWJsZVN0cmVhbUludGVyY2VwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmXG4gICAgICAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGJlZm9yZSB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIHByZXBlbmQodHJhY2s6IFRyYWNrIHwgUXVldWU8VHJhY2s+IHwgQXJyYXk8VHJhY2s+LCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy50cmFja3Muc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ2luZGV4JyxcbiAgICAgICAgYCR7aW5kZXh9YCxcbiAgICAgICAgJzAnLFxuICAgICAgICBgJHt0aGlzLnRyYWNrcy5zaXplfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBBcnJheS5pc0FycmF5KHRyYWNrKSA/XG4gICAgdHJhY2subGVuZ3RoIDpcbiAgICB0cmFjayBpbnN0YW5jZW9mIFF1ZXVlID9cbiAgICB0cmFjay5zaXplIDpcbiAgICAxO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIGNvdW50KTtcblxuICAgIGNvbnN0IGluc2VydGlvbkluZGV4ID0gaW5kZXggPT09IDAgPyAwIDogaW5kZXggLSAxO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluc2VydGlvbkluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluc2VydGlvbkluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgdHJhY2sgb3IgdHJhY2sgcmVzb2x2YWJsZSB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayByZXNvbHZhYmxlIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApLiBJZiA+IDAsIHRoZSBpbnNlcnRlZCB0cmFjayB3aWxsIGJlIHBsYWNlZCBhZnRlciB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGFwcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgKi9cbiAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSlcbiAge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoXG4gICAgICBjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkIVxuICAgICk7XG4gICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgTm9Wb2ljZUNoYW5uZWxFcnJvcigpO1xuICAgIGlmICghY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgY2hhbm5lbCxcbiAgICAgIHRoaXMsXG4gICAgICBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0LFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICBjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSlcbiAge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgQ29ubmVjdGluZyB0byAke1xuICAgICAgY2hhbm5lbC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgPyAnc3RhZ2UnIDogJ3ZvaWNlJ30gY2hhbm5lbCAke1xuICAgICAgY2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgfSk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsoXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIGJlIHNodWZmbGVkIGltbWVkaWF0ZWx5IGluLXBsYWNlLCB3aGljaCBjYW5ub3QgYmUgdW5kb25lLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVTaHVmZmxlKCkge1xuICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2h1ZmZsZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoZHluYW1pYykge1xuICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBsYXRlbmN5IG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgcmV2aXZlKCkge1xuICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIGRlYWZcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBtdXRlXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkoXG4gIHRyYWNrOiBUcmFja0xpa2UsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KVxuICB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIucGxheSh0aGlzLmNoYW5uZWwsIHRyYWNrLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIGV2ZW50IG9uIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pXG4gIDogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLCBlKSk7XG4gICAgZGlzcGF0Y2hlci5vbihcbiAgICAgICdkZWJ1ZycsXG4gICAgICAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKVxuICAgICk7XG4gICAgZGlzcGF0Y2hlci5vbignZmluaXNoJywgKHIpID0+IHRoaXMuI3BlcmZvcm1GaW5pc2gocikpO1xuICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkJpcXVhZEZpbHRlcnNVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZilcbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvbHVtZUNoYW5nZSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgZlxuICAgICAgKTtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBhcmVPYmplY3RzRGlmZmVyZW50ID0gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICBpZiAoIWEgJiYgIWIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYSB8fCAhYikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGEpLnNvbWUoKGspID0+IGFba10gIT09IGJba10pO1xuICAgIH07XG5cbiAgICBkaXNwYXRjaGVyLm9uKCdzYW1wbGVSYXRlJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSAhPT0gZi5zYW1wbGVSYXRlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlLFxuICAgICAgICAgIGYuc2FtcGxlUmF0ZVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gZi5zYW1wbGVSYXRlO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5zZWVrZXI/LnNldFNhbXBsZVJhdGUoZi5zYW1wbGVSYXRlKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzLnNlZWtlcj8uc2V0VG90YWxEdXJhdGlvbih0aGlzLm5vZGUuZXN0aW1hdGVkRHVyYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5jdXJyZW50RmlsdGVyICE9PSB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlcikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlNhbXBsZVJhdGVGaWx0ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA/PyBudWxsLFxuICAgICAgICAgIGYuY3VycmVudEZpbHRlclxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA9IGYuY3VycmVudEZpbHRlcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdyZXZlcmInLCAoZikgPT4ge1xuICAgICAgaWYgKGFyZU9iamVjdHNEaWZmZXJlbnQoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5SZXZlcmJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID8/IG51bGwsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdzZWVrZXInLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICBgU2Vla2VyID4+IFNlZWtlZCB0byAke2Yuc2Vla1RhcmdldH1tcyBmb3IgVHJhY2sgJHt0aGlzLmN1cnJlbnRUcmFjaz8udGl0bGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5zZWVrVGFyZ2V0ICE9IG51bGwpIHRoaXMubm9kZS5zZXRQcm9ncmVzcyhmLnNlZWtUYXJnZXQpO1xuXG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNlZWssIHRoaXMsIGYpO1xuICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hlci5vbignY29tcHJlc3NvcicsIChmKSA9PiB7XG4gICAgICBpZiAoYXJlT2JqZWN0c0RpZmZlcmVudChmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuY29tcHJlc3NvcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5Db21wcmVzc29yVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gbnVsbCxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5jb21wcmVzc29yID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbixcbiAgQ29tcHJlc3NvclBhcmFtZXRlcnMsXG4gIFJldmVyYlBhcmFtZXRlcnMsXG4gIFNlZWtlclBhcmFtZXRlcnMsXG4gIFJlc2FtcGxlUGFyYW1ldGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBTZWVrRXZlbnQgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBOb0F1ZGlvUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gIHR5cGU/OiBTdHJlYW1UeXBlO1xuICBkYXRhOiBUcmFjaztcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZUNvbXByZXNzb3I/OiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJldmVyYj86IGJvb2xlYW47XG4gIGRpc2FibGVTZWVrZXI/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlRmlsdGVycz86IENvbW1vblJlc2FtcGxlckZpbHRlclByZXNldDtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgcmF0aW86IG51bWJlcjtcbiAgICBhdHRhY2s6IG51bWJlcjtcbiAgICByZWxlYXNlOiBudW1iZXI7XG4gICAgbWFrZXVwR2FpbjogbnVtYmVyO1xuICAgIGtuZWVXaWR0aDogbnVtYmVyO1xuICB9O1xuICByZXZlcmI/OiB7XG4gICAgcm9vbVNpemU6IG51bWJlcjtcbiAgICBkYW1waW5nOiBudW1iZXI7XG4gICAgd2V0TGV2ZWw6IG51bWJlcjtcbiAgICBkcnlMZXZlbDogbnVtYmVyO1xuICB9O1xuICBzZWVrZXI/OiB7XG4gICAgc2Vla1RhcmdldDogbnVtYmVyIHwgbnVsbDtcbiAgICB0b3RhbER1cmF0aW9uOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBSZXNhbXBsZVBhcmFtZXRlcnMpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICBjb21wcmVzc29yOiAoZmlsdGVyczogQ29tcHJlc3NvclBhcmFtZXRlcnMpID0+IGFueTtcbiAgcmV2ZXJiOiAoZmlsdGVyczogUmV2ZXJiUGFyYW1ldGVycykgPT4gYW55O1xuICBzZWVrZXI6IChmaWx0ZXJzOiBTZWVrZXJQYXJhbWV0ZXJzKSA9PiBhbnk7XG4gIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICNpbnRlcmNlcHRvcjogSW50ZXJjZXB0ZWRTdHJlYW0gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gIGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbixcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsXG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpXG4gIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICovXG4gICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgYXVkaW9QbGF5ZXIgfHxcbiAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgKi9cbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbihcbiAgICAgICdlcnJvcicsXG4gICAgICAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpXG4gICAgKTtcbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycykge1xuICAgICAgICB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kc3AuY29tcHJlc3Nvcikge1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXByZXNzb3InLCB0aGlzLmRzcC5jb21wcmVzc29yLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXZlcmIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXZlcmInLCB0aGlzLmRzcC5yZXZlcmIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLnNlZWtlcikge1xuICAgICAgICB0aGlzLmVtaXQoJ3NlZWtlcicsIHRoaXMuZHNwLnNlZWtlci5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5NYW51YWwpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgbmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmXG4gICAgICBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpXG4gICAgICB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcblxuICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgdGhpcy5lbmQoKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8XG4gICAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSAmJlxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKVxuICAgICAge1xuICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICovXG4gIGdldCBwYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gIH1cblxuICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucGF1c2VkIHx8XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICovXG4gIGlzQnVmZmVyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICovXG4gIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaWRsZVxuICAgKi9cbiAgaXNJZGxlKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGVzdHJveWVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAqL1xuICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHBsYXlcbiAgICovXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICovXG4gIGlzU2lnbmFsbGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAqL1xuICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBzdHJlYW1cbiAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAqIEByZXR1cm5zIHtBdWRpb1Jlc291cmNlfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wczogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzID9cbiAgICB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICBkc3A6IHtcbiAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyID9cbiAgICAgIHtcbiAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJlc2FtcGxlcjogb3BzPy5zYW1wbGVSYXRlID9cbiAgICAgIHtcbiAgICAgICAgaW5wdXRTYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgfSxcbiAgICAgIHZvbHVtZToge1xuICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICB9LFxuICAgICAgY29tcHJlc3Nvcjogb3BzPy5jb21wcmVzc29yID9cbiAgICAgIHtcbiAgICAgICAgdGhyZXNob2xkOiBvcHM/LmNvbXByZXNzb3IudGhyZXNob2xkLFxuICAgICAgICByYXRpbzogb3BzPy5jb21wcmVzc29yLnJhdGlvLFxuICAgICAgICBhdHRhY2s6IG9wcz8uY29tcHJlc3Nvci5hdHRhY2ssXG4gICAgICAgIHJlbGVhc2U6IG9wcz8uY29tcHJlc3Nvci5yZWxlYXNlLFxuICAgICAgICBtYWtldXBHYWluOiBvcHM/LmNvbXByZXNzb3IubWFrZXVwR2FpbixcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICAgIGtuZWVXaWR0aDogb3BzPy5jb21wcmVzc29yLmtuZWVXaWR0aFxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICByZXZlcmI6IG9wcz8ucmV2ZXJiID9cbiAgICAgIHtcbiAgICAgICAgcm9vbVNpemU6IG9wcz8ucmV2ZXJiLnJvb21TaXplLFxuICAgICAgICBkYW1waW5nOiBvcHM/LnJldmVyYi5kYW1waW5nLFxuICAgICAgICB3ZXRMZXZlbDogb3BzPy5yZXZlcmIud2V0TGV2ZWwsXG4gICAgICAgIGRyeUxldmVsOiBvcHM/LnJldmVyYi5kcnlMZXZlbCxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJldmVyYlxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzZWVrZXI6IG9wcz8uc2Vla2VyID9cbiAgICAgIHtcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVNlZWtlcixcbiAgICAgICAgc2Vla1RhcmdldDogb3BzPy5zZWVrZXIuc2Vla1RhcmdldCxcbiAgICAgICAgc2FtcGxlUmF0ZTogNDgwMDAsXG4gICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICB0b3RhbER1cmF0aW9uOiBvcHM/LnNlZWtlci50b3RhbER1cmF0aW9uXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZFxuICAgIH0pIDpcbiAgICBzcmM7XG5cbiAgICBpZiAodGhpcy5kc3Auc2Vla2VyKSB7XG4gICAgICAvLyB1c2VkIHRvIGhhbmRsZSBiYWNrd2FyZCBzZWVraW5nXG4gICAgICB0aGlzLmRzcC5zZWVrZXIub24oJ3NlZWsnLCAoZGF0YTogU2Vla0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMucXVldWUubm9kZS5yZXF1ZXN0U2VlayhkYXRhKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUsIG9wcz8uZGF0YSkuXG4gICAgY2F0Y2goXG4gICAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeVxuICAgICAgfSkgYXMgUG9zdFByb2Nlc3NlZFJlc3VsdFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcblxuICAgIGNvbnN0IGZvcm1hdCA9IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5O1xuXG4gICAgbGV0IF9zdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgaWYgKHRoaXMucXVldWUuY2FuSW50ZXJjZXB0KCkpIHtcbiAgICAgIHRoaXMuI2ludGVyY2VwdG9yID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIChwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtKS5waXBlKHRoaXMuI2ludGVyY2VwdG9yKTtcblxuICAgICAgX3N0cmVhbSA9IHRoaXMuI2ludGVyY2VwdG9yO1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5oYW5kbGVJbnRlcmNlcHRpbmdTdHJlYW0oXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIG9wcz8uZGF0YSxcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICB0aGlzLiNpbnRlcmNlcHRvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3N0cmVhbSA9IHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW07XG4gICAgfVxuXG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShfc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IGZvcm1hdCxcbiAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEgYXMgVHJhY2ssXG4gICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29tcHJlc3NvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmV2ZXJiIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlZWtlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBzdHJlYW1cbiAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B1cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gdXNlIG9wdXNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9BdWRpb1Jlc291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24sXG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LFxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblRpbWVvdXRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgVHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybUNhbGxiYWNrLCB0eXBlIFdyaXRhYmxlIH0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJlYW0gdGhhdCBjYW4gYmUgaW50ZXJjZXB0ZWQgYW5kIGNvbnN1bWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjb25zdW1lci5cbiAqIEBleGFtcGxlIGNvbnN0IHN0cmVhbSA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuICpcbiAqIC8vIHJlYWwgY29uc3VtZXJcbiAqIHN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKCdmaWxlLnR4dCcpKTtcbiAqXG4gKiAvLyBtYW4gaW4gdGhlIG1pZGRsZSBjb25zdW1lclxuICogY29uc3QgbWFuSW5UaGVNaWRkbGUgPSBuZXcgV3JpdGFibGUoe1xuICogIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAqICAgY29uc29sZS5sb2coY2h1bmsudG9TdHJpbmcoKSk7XG4gKiAgIGNhbGxiYWNrKCk7XG4gKiAgfVxuICogfSk7XG4gKlxuICogLy8gc3RyZWFtLmludGVyY2VwdG9ycyBpcyBhIFNldCBvZiBXcml0YWJsZSBzdHJlYW1zXG4gKiBzdHJlYW0uaW50ZXJjZXB0b3JzLmFkZChtYW5JblRoZU1pZGRsZSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRlZFN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnMgPSBuZXcgU2V0PFdyaXRhYmxlPigpO1xuICAjaW50ZXJjZXB0aW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3RhcnQgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RhdGUgb2YgSW50ZXJjZXB0ZWRTdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgc3RhcnRJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGludGVyY2VwdGluZyB0aGUgc3RyZWFtLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgY29uc3VtZWQgYnkgdGhlIGludGVyY2VwdG9ycy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdGVtcG9yYXJpbHkgc3RvcCB0aGUgaW50ZXJjZXB0aW9uLiBUaGUgc3RvcHBlZCBzdGF0ZSBjYW4gYmUgcmVzdW1lZCBieSBjYWxsaW5nIHN0YXJ0SW50ZXJjZXB0aW5nIGFnYWluLlxuICAgKi9cbiAgcHVibGljIHN0b3BJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RyZWFtIGlzIGJlaW5nIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgaXNJbnRlcmNlcHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVyY2VwdGluZztcbiAgfVxuXG4gIHB1YmxpYyBfdHJhbnNmb3JtKFxuICBjaHVuazogQnVmZmVyLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcsXG4gIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjaylcbiAgOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goY2h1bmssIGVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLiNpbnRlcmNlcHRpbmcgJiYgdGhpcy5pbnRlcmNlcHRvcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgY29uc3VtZXIud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmVuZCgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2Rlc3Ryb3koZXJyb3I6IEVycm9yLCBjYWxsYmFjazogVHJhbnNmb3JtQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBpZ25vcmVFcnJvciA9IFN0cmluZyhlcnJvcikuaW5jbHVkZXMoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJyk7XG4gICAgY29uc3QgZXJyID0gaWdub3JlRXJyb3IgPyB1bmRlZmluZWQgOiBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmRlc3Ryb3koZXJyKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyY2VwdG9ycy5jbGVhcigpO1xuXG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufSIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuXG4gIH1cblxuICAvKipcbiAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAqL1xuICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICB9XG59IiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vUmVzdWx0RXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcbmltcG9ydCB7IFNlZWtFdmVudCB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgKi9cbiAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXIgbGVuZ3RoXG4gICAqL1xuICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICovXG4gIHJpZ2h0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aW1lc3RhbXAgYW5kIGxpbmVcbiAgICovXG4gIGluZGljYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRpY2F0b3JcbiAgICovXG4gIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gYW55PiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QoXG4gICAgICB0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgKi9cbiAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcikge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlci5nZXRQb3NpdGlvbigpO1xuICAgICAgaWYgKHBvcyA+IDApIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICByZXR1cm4gZHVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuXG4gICAgdG9BcnJheSgpLlxuICAgIGZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnMuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgfSkuXG4gICAgZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggP1xuICAgIDEgOlxuICAgIG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXI7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIC8vIGR1cmF0aW9uIG11bHRpcGxpZXIgY2hlY2tzIGZmbXBlZyBmaWx0ZXJzIHRoYXQgbWF5IGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuXG4gICAgLy8gd2UgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSBuYXRpdmUgcmVzYW1wbGVyIGZpbHRlciBhcyBpdCBtYXkgYWxzbyBhZmZlY3QgdGhlIGR1cmF0aW9uXG4gICAgaWYgKHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIpIHtcbiAgICAgIC8vIGdldCB0aGUgcmVzYW1wbGVyIHJhdGlvIGlmIHdlIGhhdmUgb25lXG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIuZ2V0UmF0aW8oKTtcbiAgICAgIGlmIChyYXRpbyA8PSAwKSByZXR1cm4gdmFsO1xuXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWwgLyByYXRpbyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSkge1xuICAgICAgY29uc3QgdHJhY2tIYXNMZWdhY3lNZXRhZGF0YSA9XG4gICAgICB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEgJiZcbiAgICAgIHRyYWNrLm1ldGFkYXRhLmJyaWRnZSAhPSBudWxsO1xuICAgICAgY29uc3QgdHJhY2tIYXNNZXRhZGF0YSA9IHRyYWNrPy5icmlkZ2VkVHJhY2sgIT0gbnVsbDtcblxuICAgICAgaWYgKHRyYWNrSGFzTGVnYWN5TWV0YWRhdGEgfHwgdHJhY2tIYXNNZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgIHRyYWNrLmJyaWRnZWRUcmFjaz8uZHVyYXRpb25NUyA/P1xuICAgICAgICAoXG4gICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICBicmlkZ2U6IHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfT4pLlxuICAgICAgICBtZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXJzIElnbm9yZSBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VycmVudCA9IGlnbm9yZUZpbHRlcnMgP1xuICAgIHRoaXMucGxheWJhY2tUaW1lIDpcbiAgICB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgfSxcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgfSxcbiAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKGN1cnJlbnQgLyB0b3RhbCAqIDEwMClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLFxuICAgICAgbGVmdENoYXIgPSAnXFx1MjVBQycsXG4gICAgICByaWdodENoYXIgPSAnXFx1MjVBQycsXG4gICAgICBsZW5ndGggPSAxNSxcbiAgICAgIHRpbWVjb2RlcyA9IHRydWUsXG4gICAgICBzZXBhcmF0b3IgPSAnXFx1MjUwMydcbiAgICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsXG4gICAgICAgIFN0cmluZyhsZW5ndGgpLFxuICAgICAgICAnMCcsXG4gICAgICAgICdGaW5pdGUgTnVtYmVyJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKFxuICAgICAgdGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUgKiBsZW5ndGhcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAxICYmIGluZGV4IDw9IGxlbmd0aCkge1xuICAgICAgY29uc3QgYmFyID0gbGVmdENoYXIucmVwZWF0KGluZGV4IC0gMSkuc3BsaXQoJycpO1xuICAgICAgYmFyLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgIGJhci5wdXNoKHJpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbihcbiAgICAgICAgICAnJ1xuICAgICAgICApfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtiYXIuam9pbignJyl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7XG4gICAgICAgIHRpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke1xuICAgICAgICBzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChcbiAgICAgICAgICBsZW5ndGggLSAxXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlayB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZHVyYXRpb24gPT09IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZHVyYXRpb24gPiB0aGlzLnRvdGFsRHVyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5TRUVLX09WRVJfVEhSRVNIT0xELFxuICAgICAgICBkZXNjcmlwdGlvbjogbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgICAnW2R1cmF0aW9uXScsXG4gICAgICAgICAgU3RyaW5nKGR1cmF0aW9uKSxcbiAgICAgICAgICAnMCcsXG4gICAgICAgICAgU3RyaW5nKHRoaXMudG90YWxEdXJhdGlvbilcbiAgICAgICAgKS5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuXG4gICAgY29uc3Qgc2Vla2VyID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcjtcblxuICAgIGlmIChzZWVrZXIpIHtcbiAgICAgIHNlZWtlci5zZWVrKGR1cmF0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbikudGhlbigodikgPT4ge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrLCB0aGlzLnF1ZXVlLCB7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSxcbiAgICAgICAgICBzZWVrVGFyZ2V0OiBkdXJhdGlvbixcbiAgICAgICAgICB0b3RhbER1cmF0aW9uOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHZvbHVtZVxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdm9sdW1lXG4gICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGJpdCByYXRlXG4gICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRCaXRyYXRlKHJhdGU6IG51bWJlciB8ICdhdXRvJykge1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShcbiAgICAgIHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSkgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGF1c2UodHJ1ZSkgfHwgZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBza2lwKG9wdGlvbnM/OiBTa2lwT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgY29uc3QgeyByZWFzb24sIGRlc2NyaXB0aW9uIH0gPSBvcHRpb25zIHx8IHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLk1hbnVhbCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBza2lwcGVkIG1hbnVhbGx5J1xuICAgIH07XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICByZWFzb24sXG4gICAgICBkZXNjcmlwdGlvblxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgV2hldGhlciBvciBub3QgdG8gZW1pdCB0aGUgZXZlbnQgQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGVtaXRFdmVudCA9IHRydWUpIHtcbiAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgaWYgKGVtaXRFdmVudClcbiAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrLCBmYWxzZSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUudW5zaGlmdChyZW1vdmVkKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkp1bXAsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMganVtcGVkIHRvIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICovXG4gIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0bywgZGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICd0cmFjayB2YWx1ZScsXG4gICAgICAnaW5zdGFuY2Ugb2YgVHJhY2snLFxuICAgICAgU3RyaW5nKHRyYWNrKVxuICAgICk7XG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIHRyYWNrKTtcbiAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICovXG4gIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgaWYgKCFzcmMpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICBpZiAoc3JjIDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICBpZiAoZGVzdCA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgY29uc3QgZGVzdFQgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XTtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNvdXJjZSB0byBzZWVrXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzZWVrIHBhcmFtZXRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0U2VlayhkYXRhOiBTZWVrRXZlbnQpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0cmFjay5zZWVrYWJsZSkge1xuICAgICAgcmV0dXJuIHRyYWNrLnNlZWsoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGRhdGEucG9zaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSByZXMgVGhlIHRyYWNrIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KHJlcz86IFRyYWNrIHwgbnVsbCwgb3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgXG4gICAgKTtcblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDBcbiAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgIG9wdGlvbnNcbiAgICApITtcblxuICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLidcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTm9SZXN1bHRFcnJvcihcbiAgICAgICAgJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCdcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHBsYXkgdGhlIHRyYWNrLCBpbml0aWFsaXppbmcuLi4nXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3NpZ25lZFJlc291cmNlID0gdHJhY2sucmVzb3VyY2U7XG5cbiAgICAgIGlmIChhc3NpZ25lZFJlc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdUcmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2UgYXNzaWduZWQsIHBsYXllciB3aWxsIG5vdyBwbGF5IHRoZSByZXNvdXJjZSBkaXJlY3RseS4uLidcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID1cbiAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCAoXG4gICAgICBzcmMgPT09ICdzcG90aWZ5JyA/XG4gICAgICAnc3BvdGlmeVNvbmcnIDpcbiAgICAgIHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/XG4gICAgICAnYXBwbGVNdXNpY1NvbmcnIDpcbiAgICAgIHNyYyk7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgc3RyZWFtOiBudWxsIGFzIEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLlxuICAgICAgdGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKVxuICAgICAgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0sIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gdXNpbmcgZXh0cmFjdG9ycy4uLidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5jb250ZXh0LnByb3ZpZGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT4gci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICBkaXNhYmxlQ29tcHJlc3NvcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgICAgIGRpc2FibGVSZXZlcmI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgICAgIGRpc2FibGVTZWVrZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgICAgIGNvbXByZXNzb3I6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHJldmVyYjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgc2Vla2VyOiB7XG4gICAgICAgICAgICBzZWVrVGFyZ2V0OlxuICAgICAgICAgICAgb3B0aW9ucy50cmFuc2l0aW9uTW9kZSAmJiBvcHRpb25zLnNlZWsgIT0gbnVsbCA/XG4gICAgICAgICAgICBvcHRpb25zLnNlZWsgOlxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRvdGFsRHVyYXRpb246IHRyYWNrLmR1cmF0aW9uTVMgPz8gMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA/PyAoXG4gICAgICAgICAgdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgP1xuICAgICAgICAgIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOlxuICAgICAgICAgIHVuZGVmaW5lZCksXG4gICAgICAgICAgYmlxdWFkRmlsdGVyOlxuICAgICAgICAgIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXcsXG4gICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgIH0sXG4gICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgfTtcblxuICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZXIgPSByZXNvbHZlKTtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LldpbGxQbGF5VHJhY2ssXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIHRyYWNrLFxuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWUsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlU2Vla2VyXS5cbiAgICAgIGV2ZXJ5KChlKSA9PiAhIWUgPT09IHRydWUpO1xuXG4gICAgICBjb25zdCBuZWVkc0ZpbHRlcnMgPVxuICAgICAgISF0cmFja1N0cmVhbUNvbmZpZy5wbGF5ZXJDb25maWcuc2VlayB8fFxuICAgICAgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuc2tpcEZGbXBlZyAmJiAhbmVlZHNGaWx0ZXJzO1xuXG4gICAgICBsZXQgZmluYWxTdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgICBjb25zdCBkZW11eGFibGUgPSAoZm10OiBzdHJpbmcpID0+XG4gICAgICBbXG4gICAgICBTdHJlYW1UeXBlLk9wdXMsXG4gICAgICBTdHJlYW1UeXBlLldlYm1PcHVzLFxuICAgICAgU3RyZWFtVHlwZS5PZ2dPcHVzLFxuICAgICAgU3RyZWFtVHlwZS5SYXcsXG4gICAgICAncGNtJ10uXG4gICAgICBpbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgIGlmIChcbiAgICAgIHNob3VsZFNraXBGRm1wZWcgJiZcbiAgICAgICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJlxuICAgICAgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gIT09ICdzdHJpbmcnICYmXG4gICAgICBkZW11eGFibGUoc3RyZWFtU3JjLnN0cmVhbS4kZm10KSlcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyAkZm10LCBzdHJlYW0gfSA9IHN0cmVhbVNyYy5zdHJlYW07XG4gICAgICAgIGNvbnN0IHNob3VsZFBDTSA9ICFkYXNwRGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtcbiAgICAgICAgICBzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gXG5cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpc1JhdyA9ICRmbXQgPT09ICdwY20nIHx8ICRmbXQgPT09IFN0cmVhbVR5cGUuUmF3O1xuXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBvcHVzU3RyZWFtID1cbiAgICAgICAgaXNSYXcgfHwgJGZtdCA9PT0gU3RyZWFtVHlwZS5PcHVzID9cbiAgICAgICAgc3RyZWFtIDpcbiAgICAgICAgJGZtdCA9PT0gU3RyZWFtVHlwZS5PZ2dPcHVzID9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IE9nZ0RlbXV4ZXIoKSBhcyBhbnkpIDpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IFdlYm1EZW11eGVyKCkgYXMgYW55KTtcblxuICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgaWYgKGlzUmF3KSB7XG4gICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtO1xuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuT3B1cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc3Qgb3B1cyA9IGRhc3BEaXNhYmxlZCAmJiB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb247XG4gICAgICAgIC8vIGlmIChvcHVzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc2FibGluZyBQQ00gb3V0cHV0IHNpbmNlIGFsbCBmaWx0ZXJzIGFyZSBkaXNhYmxlZCBhbmQgb3B1cyBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuLi4nKTtcblxuICAgICAgICBmaW5hbFN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUgfHxcbiAgICAgICAgICB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gOlxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwXG4gICAgICAgICAgLy8gb3B1c1xuICAgICAgICApO1xuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyO1xuXG4gICAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgJ0Rpc3BhdGNoZXIgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIHF1ZXVlIGJlaW5nIGRlbGV0ZWQgaW4gdGhlIG1pZGRsZSBvZiBvcGVyYXRpb24uIENhbmNlbGxpbmcgdGhlIHN0cmVhbS4uLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmluYWxTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBkaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShcbiAgICAgICAgICBmaW5hbFN0cmVhbSxcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID1cbiAgICBuZXcgTm9SZXN1bHRFcnJvcihgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKTtcblxuXG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZVxuICAgICk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgIHRyYWNrXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdHRlbXB0ZWRFeHRyYWN0b3JzID1cbiAgICB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmdldENvbnRleHQoKT8uYXR0ZW1wdGVkRXh0cmFjdG9ycyB8fFxuICAgIG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuYmxvY2tTdHJlYW1Gcm9tPy5zb21lKFxuICAgICAgICAgIChleHQpID0+IGV4dCA9PT0gZXh0cmFjdG9yLmlkZW50aWZpZXJcbiAgICAgICAgKSlcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhdHRlbXB0ZWRFeHRyYWN0b3JzLmhhcyhleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBjYW5TdHJlYW0gPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgdHJhY2sudXJsLFxuICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG5cbiAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBHZW5lcmljIHN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCBhbmQgZmFsbGJhY2sgc3RyZWFtIGV4dHJhY3Rpb24gaXMgZW5hYmxlZGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke1xuICAgICAgdHJhY2sudGl0bGV9LCB1cmw6ICR7XG4gICAgICB0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtcbiAgICAgIHN0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgXG5cbiAgICApO1xuXG4gICAgcmV0dXJuIHN0cmVhbUluZm87XG4gIH1cblxuICBhc3luYyAjY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyBmYWxsYmFjayBzdHJlYW1pbmcgbWV0aG9kLi4uYFxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJpZnlGYWxsYmFja1N0cmVhbSA9IHRoaXMucXVldWUub3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcblxuICAgICAgICBpZiAodmVyaWZ5RmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhbGxiYWNrIHN0cmVhbSB2ZXJpZmljYXRpb24gaXMgZW5hYmxlZCwgdmFsaWRhdGluZyBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNob3VsZFByb2NlZWQgPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCB0cmFjay5zb3VyY2VcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFzaG91bGRQcm9jZWVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gdmFsaWRhdGUgcXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nICR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgUXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHdhcyB2YWxpZGF0ZWQgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uIFByb2NlZWRpbmcgd2l0aCBleHRyYWN0aW9uLi4uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrcyA9IGF3YWl0IGV4dHJhY3Rvci5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICByZXF1ZXN0ZWRCeTogdHJhY2sucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmFsbGJhY2tUcmFjayA9IGZhbGxiYWNrVHJhY2tzLnRyYWNrc1swXTtcblxuICAgICAgICBpZiAoIWZhbGxiYWNrVHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICAgIGlmICghc3RyZWFtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrID0gZmFsbGJhY2tUcmFjaztcblxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsXG4gIHRyYWNrOiBUcmFjayxcbiAgc2VlayA9IDAsXG4gIG9wdXM/OiBib29sZWFuKVxuICB7XG4gICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICBjcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnXG4gICAgfSkuXG4gICAgb24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtcbiAgICAgICAgZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gXG5cbiAgICAgICk7XG5cbiAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgfVxufSIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgLyoqXG4gICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAqXG4gICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSxcbiAgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKVxuICB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdW1lKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5jb25zdW1lKCk7XG4gICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzLCBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBFcXVhbGl6ZXIsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgfSxcbiAgICAoXywgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICB9KVxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XVxuICApLFxuICBDbHViOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIERhbmNlOiBtYWtlQmFuZHMoW1xuICA5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoW1xuICAtOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdXG4gICksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoW1xuICA3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF1cbiAgKSxcbiAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFtcbiAgLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XVxuICApLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoW1xuICA0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF1cbiAgKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoW1xuICAxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gIFBhcnR5OiBtYWtlQmFuZHMoW1xuICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdXG4gICksXG4gIFBvcDogbWFrZUJhbmRzKFtcbiAgLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdXG4gICksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoW1xuICAtMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XVxuICApLFxuICBTb2Z0OiBtYWtlQmFuZHMoW1xuICA0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdXG4gICksXG4gIFNvZnRSb2NrOiBtYWtlQmFuZHMoW1xuICA0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdXG4gICksXG4gIFRlY2hubzogbWFrZUJhbmRzKFtcbiAgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdXG4gIClcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSBhbnk+IHtcbiAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZmbXBlZyBtYXkgYmUgc2tpcHBlZFxuICAgKi9cbiAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgI3NldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKFxuICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICBxdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcHJldixcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgKi9cbiAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbnB1dCBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBhcmdzKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKVxuICAgIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbXG4gICAgLi4udGhpcy4jaW5wdXRBcmdzLFxuICAgIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG5cblxuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKFxuICBmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pXG4gIHtcbiAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID9cbiAgICAgIFtdIDpcbiAgICAgIE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLlxuICAgICAgZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSkuXG4gICAgICBtYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoXG4gICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZUZpbHRlcjpcbiAgU3RyZWFtQ29uZmlnWydkaXNwYXRjaGVyQ29uZmlnJ11bJ3NhbXBsZVJhdGVGaWx0ZXJzJ10gfFxuICBudWxsO1xuICBjb21wcmVzc29yOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsnY29tcHJlc3NvciddIHwgbnVsbDtcbiAgcmV2ZXJiOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsncmV2ZXJiJ10gfCBudWxsO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZXF1YWxpemVyUHJlc2V0cyA9IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ7XG4gIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgYmlxdWFkOiBudWxsLFxuICAgIGVxdWFsaXplcjogW10sXG4gICAgZmlsdGVyczogW10sXG4gICAgdm9sdW1lOiAxMDAsXG4gICAgc2FtcGxlUmF0ZTogLTEsXG4gICAgY29tcHJlc3NvcjogbnVsbCxcbiAgICByZXZlcmI6IG51bGwsXG4gICAgc2FtcGxlUmF0ZUZpbHRlcjogbnVsbFxuICB9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgLy8gICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWcpIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZ2l0YWwgYmlxdWFkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERTUCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgKi9cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzYW1wbGVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3NvciB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCBjb21wcmVzc29yKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcmIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJldmVyYiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBDTSBTZWVrZXIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Vla2VyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlayxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWc/LmZpbHRlcnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBtXG4gICAgfSkpIGFzIEVxdWFsaXplckJhbmRbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8XG4gICAgICAgIEJpcXVhZEZpbHRlcnMsXG4gICAgICAgIG51bWJlcj4gfFxuICAgICAgbnVsbCB8fCBudWxsKTtcblxuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmFmLmZpbHRlcnM/LmZpbHRlcnMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gIH1cblxuICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZmbXBlZzogdGhpcy5mZm1wZWcsXG4gICAgICBlcXVhbGl6ZXI6IHRoaXMuZXF1YWxpemVyLFxuICAgICAgYmlxdWFkOiB0aGlzLmJpcXVhZCxcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcbiAgICAgIHNhbXBsZVJhdGU6IHRoaXMucmVzYW1wbGVyPy5zYW1wbGVSYXRlIHx8IDQ4MDAwLFxuICAgICAgdm9sdW1lOiB0aGlzLnZvbHVtZT8udm9sdW1lID8/IDEwMFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcmFwaCB7XG4gIGZmbXBlZzogRmlsdGVyc1tdO1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkOiBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsO1xuICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59IiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGRm1wZWcsIGNyZWF0ZUZGbXBlZ0FyZ3MgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgZm10Pzogc3RyaW5nO1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICBzZWVrPzogbnVtYmVyO1xuICBza2lwPzogYm9vbGVhbjtcbiAgY29va2llcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1NUUklORyhcbnN0cmVhbTogc3RyaW5nLFxuZm10Pzogc3RyaW5nLFxuY29va2llcz86IHN0cmluZylcbntcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIHJlY29ubmVjdDogMSxcbiAgICByZWNvbm5lY3Rfc3RyZWFtZWQ6IDEsXG4gICAgcmVjb25uZWN0X2RlbGF5X21heDogNSxcbiAgICBpOiBzdHJlYW0sXG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbCxcbiAgICBjb29raWVzOlxuICAgIHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJyA/XG4gICAgIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/XG4gICAgY29va2llcyA6XG4gICAgYFwiJHtjb29raWVzfVwiYCA6XG4gICAgbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gY3JlYXRlRkZtcGVnQXJncyh7XG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKFxuc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZyxcbm9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKVxuOiBSZWFkYWJsZSB7XG4gIGlmIChvcHRpb25zPy5za2lwICYmIHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSByZXR1cm4gc3RyZWFtO1xuICBvcHRpb25zID8/PSB7fTtcbiAgY29uc3QgYXJncyA9XG4gIHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID9cbiAgRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOlxuICBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgY29uc3QgdHJhbnNjb2RlciA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6XG4gICAgICB0aGlzLnF1ZXVlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLmNoYW5uZWw/Lm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT4gIW0udXNlci5ib3RcbiAgICAgICkuc2l6ZSB8fCAwLFxuICAgICAgbWVtb3J5VXNhZ2U6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKSxcbiAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgcGxheWVyOiB0aGlzLnF1ZXVlLnBsYXllci52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICB9XG59IiwgImltcG9ydCB7IE5vdEV4aXN0aW5nRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7dGltZXN0YW1wOiBudW1iZXI7bGluZTogc3RyaW5nO307XG5cbmNvbnN0IHRpbWVzdGFtcFBhdHRlcm4gPSAvXFxbKFxcZHsyfSk6KFxcZHsyfSlcXC4oXFxkezJ9KVxcXS87XG5cbmV4cG9ydCBjbGFzcyBTeW5jZWRMeXJpY3NQcm92aWRlciB7XG4gICNsb29wOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAjY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrIHwgbnVsbCA9IG51bGw7XG4gICNvblVuc3Vic2NyaWJlOiBVbnN1YnNjcmliZSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcnZhbCA9IDEwMDtcbiAgcHVibGljIHJlYWRvbmx5IGx5cmljczogTHlyaWNzRGF0YSA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgcHVibGljIHJlYWRvbmx5IHJhdz86IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdClcbiAge1xuICAgIGlmIChyYXc/LnN5bmNlZEx5cmljcykgdGhpcy5sb2FkKHJhdz8uc3luY2VkTHlyaWNzKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGxvYWQobHlyaWNzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWx5cmljcykgdGhyb3cgbmV3IE5vdEV4aXN0aW5nRXJyb3IoJ3N5bmNlZEx5cmljcycpO1xuXG4gICAgdGhpcy5seXJpY3MuY2xlYXIoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGx5cmljcy5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aW1lc3RhbXBQYXR0ZXJuKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFssIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID1cbiAgICAgICAgcGFyc2VJbnQobWludXRlcykgKiA2MCAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChzZWNvbmRzKSAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgIHRoaXMubHlyaWNzLnNldCh0aW1lc3RhbXAsIGxpbmUucmVwbGFjZSh0aW1lc3RhbXBQYXR0ZXJuLCAnJykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbHlyaWNzIGF0IGEgc3BlY2lmaWMgdGltZSBvciBhdCB0aGUgY2xvc2VzdCB0aW1lIChcdTAwQjEyIHNlY29uZHMpXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIGF0KHRpbWU6IG51bWJlcik6IEx5cmljc0F0IHwgbnVsbCB7XG4gICAgY29uc3QgbG93ZXN0VGltZSA9IHRoaXMubHlyaWNzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGxvd2VzdFRpbWUgPT0gbnVsbCB8fCB0aW1lIDwgbG93ZXN0VGltZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubHlyaWNzLmhhcyh0aW1lKSlcbiAgICByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMubHlyaWNzLmtleXMoKSk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+XG4gICAgTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGFcbiAgICApO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKFxuICAgICAgbGFzdFZhbHVlICE9PSBudWxsICYmXG4gICAgICBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiZcbiAgICAgIGx5cmljcy50aW1lc3RhbXAgPT09IGxhc3RWYWx1ZS50aW1lc3RhbXApXG5cbiAgICAgIHJldHVybjtcblxuICAgICAgbGFzdFZhbHVlID0gbHlyaWNzO1xuXG4gICAgICB0aGlzLiNjYWxsYmFjayhseXJpY3MubGluZSwgbHlyaWNzLnRpbWVzdGFtcCk7XG4gICAgfSwgdGhpcy5pbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxufSIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgcHVibGljIGxpbWl0ID0gMTtcbiAgcHVibGljIHJlbWFpbmluZyA9IDE7XG4gIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgcHVibGljIHF1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIE1BWF9SRVRSSUVTID0gNTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBidWNrZXQgaXMgcmF0ZSBsaW1pdGVkLlxuICAgKi9cbiAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtYWluaW5nIDw9IDAgJiYgRGF0ZS5ub3coKSA8IHRoaXMucmVzZXRBZnRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVucXVldWUocmVxOiBSZXF1ZXN0RW50aXR5KSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLmFjcXVpcmUoKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW50cnkucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlcXVlc3QocmVxOiBSZXF1ZXN0RW50aXR5LCByZXRyaWVzID0gMCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICB3aGlsZSAodGhpcy5pc1JhdGVMaW1pdGVkKCkpIHtcbiAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgIH1cblxuICAgIGxldCBwYXNzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVxKCk7XG5cbiAgICAgIHRoaXMuX3BhdGNoSGVhZGVycyhyZXMpO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keToge1xuICAgICAgICAgICAgY29kZTogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgIH0gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHtjb2RlOiBudW1iZXI7fTtcblxuICAgICAgICAgIGVycm9yLm5hbWUgPSBib2R5Lm5hbWU7XG4gICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgIGVyciA9IGVycm9yO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoYEhUVFAgRXJyb3I6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhc3MgPSB0cnVlO1xuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocGFzcykgdGhyb3cgZTtcblxuICAgICAgY29uc3QgYmFkUmVxID0gZSBpbnN0YW5jZW9mIEVycm9yICYmIC9FcnJvcjogNFswLTldezJ9Ly50ZXN0KGUubWVzc2FnZSk7XG5cbiAgICAgIGlmICghYmFkUmVxICYmIHJldHJpZXMgPCB0aGlzLk1BWF9SRVRSSUVTKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSwgKytyZXRyaWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKSk7XG4gICAgY29uc3QgcmVtYWluaW5nID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJykpO1xuICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPVxuICAgIE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKFxuICAgICAgL1tBLVpdL2csXG4gICAgICAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PlxubmV3IFVSTFNlYXJjaFBhcmFtcyh0b1NuYWtlQ2FzZShwYXJhbXMpKS50b1N0cmluZygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICB0cmFja05hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwbGFpbkx5cmljczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHN5bmNlZEx5cmljcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTHJjR2V0UmVzdWx0ID0gT21pdDxMcmNTZWFyY2hSZXN1bHQsICduYW1lJz47XG5cbmV4cG9ydCBjbGFzcyBMcmNMaWIge1xuICAvKipcbiAgICogVGhlIEFQSSBVUkxcbiAgICovXG4gIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCB0aW1lb3V0LiBEZWZhdWx0IGlzIDE1IHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgdGltZW91dCA9IDE1XzAwMDtcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgKi9cbiAgcHVibGljIGJ1Y2tldCA9IG5ldyBTZXF1ZW50aWFsQnVja2V0KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTHJjTGliIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmV0cnkgbGltaXQuIERlZmF1bHQgaXMgNS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgKi9cbiAgcHVibGljIHNldFJldHJ5TGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIHRoaXMuYnVja2V0Lk1BWF9SRVRSSUVTID0gbGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzIGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0QnlJZChpZDogYCR7bnVtYmVyfWAgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4oYGdldC8ke2lkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2FjaGVkIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVkKHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGZvciBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChwYXJhbXM6IExyY1NlYXJjaFBhcmFtcykge1xuICAgIGlmICghcGFyYW1zLnEgJiYgIXBhcmFtcy50cmFja05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgJ3N0cmluZycsXG4gICAgICAgIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGBzZWFyY2g/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdFtdPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgQVBJXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gVXRpbC5nZXRSdW50aW1lKCk7XG5cbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID1cbiAgICAgIG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRoaXMudGltZW91dCksXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6IGBEaXNjb3JkLVBsYXllci8ke3RoaXMucGxheWVyLnZlcnNpb259ICR7XG4gICAgICAgICAgcnVudGltZVZlcnNpb24gPz8gJyd9YC5cbiAgICAgICAgICB0cmltRW5kKCksXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBbTHJjTGliXSBSZXF1ZXN0aW5nICR7cGF0aH1gKTtcblxuICAgICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCxcbiAgICAgICAgaW5pdFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5idWNrZXQuZW5xdWV1ZShkaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiByZXMuanNvbigpO1xuICB9XG59IiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIEF1ZGlvUGxheWVyIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gIC8qKlxuICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICogSXQgb25seSBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+ID0gbmV3IENvbGxlY3Rpb248XG4gICAgU25vd2ZsYWtlLFxuICAgIFN0cmVhbURpc3BhdGNoZXI+KFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBvcHRpb25zPzoge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAgOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoKTtcbiAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubixcbiAgICAgIGNoYW5uZWwsXG4gICAgICBvcHRpb25zLnF1ZXVlLFxuICAgICAgb3B0aW9ucy5tYXhUaW1lLFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gICAgcmV0dXJuIHN1YjtcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW4oXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICB9KVxuICB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25uZWN0aW9uID0gdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIG9wdGlvbnM/Lmdyb3VwXG4gICAgKTtcblxuICAgIGlmIChcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgIGV4aXN0aW5nQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQuXG4gICAgICB2b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIFN0cmVhbURpc3BhdGNoZXIpXG4gICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy9cbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgKiBAcmV0dXJucyB7U3RyZWFtRGlzcGF0Y2hlcn1cbiAgICovXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTsiLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICBnZXREYXRhKCk6IFByb21pc2U8RGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VD5bXT47XG4gIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICB9KVxuICB7XG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKFxuICAgICAgdGhpcy5jbGVhbnVwLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNoZWNrSW50ZXJ2YWxcbiAgICApLnVucmVmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICBpZiAoIXJlc3VsdClcbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIGRhdGE6IFQsXG4gIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKVxuICB7XG4gICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fFxuICAgIGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8XG4gICAgdGhpcy5leHBpcmVBZnRlciA8IDEpXG5cbiAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICBxdWVyeTogc3RyaW5nO1xuICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn0iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIFNub3dmbGFrZVV0aWwsXG4gIFZvaWNlU3RhdGUsXG4gIEludGVudHNCaXRGaWVsZCxcbiAgVXNlcixcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24sXG4gIEV2ZW50cyB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXlsaXN0LFxuICBUcmFjayxcbiAgU2VhcmNoUmVzdWx0LFxuICBTZWFyY2hPcHRpb25zLFxuICBQbGF5bGlzdEluaXREYXRhIH0gZnJvbVxuJy4vZmFicmljJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWVFdmVudHMsXG4gIFZvaWNlQ29ubmVjdENvbmZpZyxcbiAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgR3VpbGROb2RlTWFuYWdlcixcbiAgR3VpbGRRdWV1ZSxcbiAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbVxuJy4vcXVldWUnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHtcbiAgUXVlcnlSZXNvbHZlcixcbiAgUXVlcnlUeXBlLFxuICBSZXNvbHZlZFF1ZXJ5LFxuICBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tXG4nLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHtcbiAgQXVkaW9SZXNvdXJjZSxcbiAgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uLFxuICBTdHJlYW1UeXBlIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUsIFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IsIE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBDb250ZXh0LCBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBIb29rc0N0eCwgU1VQRVJfQ09OVEVYVCB9IGZyb20gJy4vaG9va3MvY29tbW9uJztcbmltcG9ydCB7IExyY0xpYiB9IGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBnZXRDb21wYXROYW1lLCBpc0NsaWVudFByb3h5IH0gZnJvbSAnLi9jb21wYXQvY29tbW9uJztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRwVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQge1xuICBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcixcbiAgdHlwZSBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMgfSBmcm9tXG4nLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckV2ZW50cyB7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIGVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiBhbnk7XG4gIHZvaWNlU3RhdGVVcGRhdGU6IChcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIG9sZFN0YXRlOiBWb2ljZVN0YXRlLFxuICBuZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbiAgPT4gYW55O1xufVxuXG5leHBvcnQgY29uc3QgUGxheWVyRXZlbnQgPSB7XG4gIGRlYnVnOiAnZGVidWcnLFxuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgZXJyb3I6ICdlcnJvcicsXG4gIEVycm9yOiAnZXJyb3InLFxuICB2b2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJ1xufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsYXllckV2ZW50ID0gKHR5cGVvZiBQbGF5ZXJFdmVudClba2V5b2YgdHlwZW9mIFBsYXllckV2ZW50XTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IGFueT4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCB0eXBlIFRyYWNrTGlrZSA9XG5zdHJpbmcgfFxuVHJhY2sgfFxuU2VhcmNoUmVzdWx0IHxcblRyYWNrW10gfFxuUGxheWxpc3QgfFxuQXVkaW9SZXNvdXJjZTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxubmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSlcbj0+IEF3YWl0ZWQ8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVySW5pdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICAgKi9cbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICovXG4gIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQcmV2ZW50IHZvaWNlIHN0YXRlIGhhbmRsZXIgZnJvbSBiZWluZyBvdmVycmlkZGVuXG4gICAqL1xuICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICAgKi9cbiAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgKi9cbiAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRdWVyeSBjYWNoZSBwcm92aWRlclxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGVQcm92aWRlcjxhbnk+IHwgbnVsbDtcbiAgLyoqXG4gICAqIFNraXAgZmZtcGVnIHByb2Nlc3Mgd2hlbiBwb3NzaWJsZVxuICAgKi9cbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcHJvYmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDUwMDAuXG4gICAqL1xuICBwcm9iZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgZmZtcGVnIHBhdGhcbiAgICovXG4gIGZmbXBlZ1BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBmYWxsYmFjayBjb250ZXh0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBvdmVycmlkZUZhbGxiYWNrQ29udGV4dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAjbGFnTW9uaXRvclRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAjbGFnTW9uaXRvckludGVydmFsOiBOb2RlSlMuVGltZW91dDtcbiAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICNob29rc0N0eDogQ29udGV4dDxIb29rc0N0eD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIGRpc2NvcmQtcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9IGRwVmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIC8qKlxuICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG5vZGVzIChxdWV1ZSkgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIG5vZGVzID0gbmV3IEd1aWxkTm9kZU1hbmFnZXIodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgYXBpIHV0aWxpdGllc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZvaWNlVXRpbHMgPSBuZXcgVm9pY2VVdGlscyh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIG1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIGV2ZW50cyBjaGFubmVsXG4gICAqL1xuICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oW1xuICBHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsXG4gIEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl1cbiAgKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSBQbGF5ZXIudmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSBseXJpY3MgYXBpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAjc3RyZWFtSW50ZXJjZXB0b3I6IFBsYXllclN0cmVhbUludGVyY2VwdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAqIEBwYXJhbSB7UGxheWVySW5pdE9wdGlvbnN9IFtvcHRpb25zXSBUaGUgcGxheWVyIGluaXQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoW1BsYXllckV2ZW50LkVycm9yXSk7XG5cbiAgICBpZiAob3B0aW9ucy5mZm1wZWdQYXRoKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aCAhPT0gJ3N0cmluZycpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgdHlwZSBcInN0cmluZ1wiIGZvciBvcHRpb25zLmZmbXBlZ1BhdGguIEdvdCAke3R5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGh9IGluc3RlYWRgXG4gICAgICApO1xuXG4gICAgICBwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCA9IG9wdGlvbnMuZmZtcGVnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NvbXBhdE1vZGUgPSBpc0NsaWVudFByb3h5KGNsaWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZCBjbGllbnRcbiAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAqL1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudCkpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICBgQ2xpZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBkaXNjb3JkLmpzQCR7ZGpzVmVyc2lvbn0gY2xpZW50LCBzb21lIHRoaW5ncyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGNvcnJ1cHQgZGVwZW5kZW5jaWVzIG9yIGhhdmluZyBtdWx0aXBsZSBpbnN0YWxsYXRpb25zIG9mIGRpc2NvcmQuanMuYCxcbiAgICAgICAgICAgICdJbnZhbGlkQ2xpZW50SW5zdGFuY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGliZiA9XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyBpbnN0YW5jZW9mIEludGVudHNCaXRGaWVsZCA/XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyA6XG4gICAgICAgIG5ldyBJbnRlbnRzQml0RmllbGQodGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzKTtcblxuICAgICAgICBpZiAoIWliZi5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsXG4gICAgICAgICAgICAnSW52YWxpZEludGVudHNCaXRGaWVsZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcblxuICAgICAgICAvLyBub29wXG4gICAgICB9fVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICBxdWVyeUNhY2hlOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID9cbiAgICAgIG51bGwgOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgc2tpcEZGbXBlZzogdHJ1ZSxcbiAgICAgIHByb2JlVGltZW91dDogNTAwMCxcbiAgICAgIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0OiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gc2F0aXNmaWVzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgIHRoaXMuY2xpZW50LmluY3JlbWVudE1heExpc3RlbmVycygpO1xuICAgICAgdGhpcy5jbGllbnQub24oRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgICAgdGhpcy5jbGllbnQuX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5KHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIGF0dGFjaCB2b2ljZSBzdGF0ZSB1cGRhdGUgcHJveHksIHZvaWNlIHN0YXRlIGhhbmRsZXIgd2lsbCBub3Qgd29yayBwcm9wZXJseScsXG4gICAgICAgICAgJ0NvbXBhdE1vZGVFcnJvcidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgdHlwZW9mIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID09PSAnbnVtYmVyJyAmJlxuICAgIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMClcbiAgICB7XG4gICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jbGFzdExhdGVuY3kgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICBgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgIHJldHVybiBpc0NsaWVudFByb3h5KHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChcbiAgICAgIEd1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgcXVldWUsXG4gICAgICBvbGRTdGF0ZSxcbiAgICAgIG5ld1N0YXRlXG4gICAgKTtcbiAgICAvLyBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIHJldHVybiBhc3N1bWluZyB0aGUgbGlzdGVuZXIgaW1wbGVtZW50ZWQgYWxsIG9mIHRoZSBsb2dpYyBiZWxvd1xuICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlKHRoaXMsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gcGFzc2luZyB2b2ljZSBzdGF0ZSB1cGRhdGUgZGF0YSB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdm9pY2Ugc3RhdGUgaGFuZGxlclxuICAgKlxuICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAqICAgLy8gdGhpcyBpcyBkZWZpbml0ZWx5IGEgcm9ja2V0IHNjaWVuY2UsIHJpZ2h0IGhlcmVcbiAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB2b2ljZSBzdGF0ZSBoYW5kbGVyIGlzIGxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgdHJhY2sgb3Igc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBxdWV1ZSBtYW5hZ2VtZW50LCBqdXN0IHVzZSB0aGlzIG1ldGhvZCBcdUQ4M0RcdURFMDRcbiAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAqIH0gY2F0Y2goZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gPSB7fSlcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgICdWb2ljZUJhc2VkQ2hhbm5lbCcsXG4gICAgICAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWBcbiAgICApO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPVxuICAgIHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0ID8gcXVlcnkgOiBhd2FpdCB0aGlzLnNlYXJjaChxdWVyeSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICBgTm8gcmVzdWx0cyBmb3VuZCBmb3IgXCIke3F1ZXJ5fVwiIChFeHRyYWN0b3I6ICR7XG4gICAgICAgIHJlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuY3JlYXRlKHZjLmd1aWxkLCBvcHRpb25zLm5vZGVPcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gQWNxdWlyaW5nIGFuIGVudHJ5Li4uYCk7XG4gICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFxdWV1ZS5jaGFubmVsKSBhd2FpdCBxdWV1ZS5jb25uZWN0KHZjLCBvcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgaWYgKCFyZXN1bHQucGxheWxpc3QpIHtcbiAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSlcbiAgICAgIGF3YWl0IHF1ZXVlLm5vZGUucGxheShudWxsLCBvcHRpb25zLmF1ZGlvUGxheWVyT3B0aW9ucyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRyYWNrc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2goXG4gIHNlYXJjaFF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSlcbiAgOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgQXVkaW9SZXNvdXJjZSkge1xuICAgICAgc2VhcmNoUXVlcnkgPSB0aGlzLmNyZWF0ZVRyYWNrRnJvbUF1ZGlvUmVzb3VyY2Uoc2VhcmNoUXVlcnkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RlZEJ5ICE9IG51bGwpXG4gICAgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuXG4gICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgIHRyYWNrczogW3NlYXJjaFF1ZXJ5XSxcbiAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBzZWFyY2hRdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnksXG4gICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkudHJhY2tzWzBdPy5leHRyYWN0b3IsXG4gICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHNlYXJjaFF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbCxcbiAgICAgIHByb3RvY29sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUTztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YFxuICAgICk7XG5cbiAgICBpZiAoL15cXHcrOi8udGVzdChzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IFtwcm90b2NvbE5hbWUsIC4uLnF1ZXJ5XSA9IHNlYXJjaFF1ZXJ5LnNwbGl0KCc6Jyk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKFxuICAgICAgICAoZSkgPT5cbiAgICAgICAgIXRoaXMuZXh0cmFjdG9ycy5pc0Rpc2FibGVkKGUuaWRlbnRpZmllcikgJiZcbiAgICAgICAgZS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2xOYW1lKVxuICAgICAgKTtcblxuICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gaXMgc3VwcG9ydGVkIGJ5ICR7bWF0Y2hpbmdFeHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIWBcbiAgICAgICAgKTtcbiAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gP1xuICAgIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6XG4gICAgeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgIGV4dHJhY3RvciAmJiBwcm90b2NvbCA/XG4gICAgICAnIGJ1dCBtaWdodCBub3QgYmUgdXNlZCBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIHByb3RvY29sJyA6XG4gICAgICAnJ31gXG5cbiAgICApO1xuXG4gICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICB9KSk/LlxuICAgICAgZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYFxuICAgICk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yLlxuICAgIGhhbmRsZShxdWVyeSwge1xuICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgIHByb3RvY29sXG4gICAgfSkuXG4gICAgY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgJ0ZhaWxlZCB0byBmaW5kIHJlc3VsdCB1c2luZyBhcHByb3ByaWF0ZSBleHRyYWN0b3IuIFF1ZXJ5aW5nIGFsbCBleHRyYWN0b3JzLi4uJ1xuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJiAoXG4gICAgICBhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgZXh0LmhhbmRsZShxdWVyeSwge1xuICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgcHJvdG9jb2xcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtcbiAgICAgICAgcmVzdWx0Py5leHRyYWN0b3IuaWRlbnRpZmllciB8fCAnTi9BJ30gZXh0cmFjdG9yLmBcblxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAqIGBgYFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICBjb25zdCBydW50aW1lID1cbiAgICAnQnVuJyBpbiBnbG9iYWxUaGlzID8gJ0J1bicgOiAnRGVubycgaW4gZ2xvYmFsVGhpcyA/ICdEZW5vJyA6ICdOb2RlJztcbiAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICdEaXNjb3JkIFBsYXllcicsXG4gICAgbGluZSxcbiAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn0ke1xuICAgIHRoaXMuaXNDb21wYXRNb2RlKCkgP1xuICAgIGAgKCR7Z2V0Q29tcGF0TmFtZSh0aGlzLmNsaWVudCl9IGNvbXBhdGliaWxpdHkgbW9kZSlgIDpcbiAgICAnJ31gLFxuXG4gICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAoKCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgcmV0dXJuIFtcbiAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsXG4gICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uXG4gICAgICBqb2luKCdcXG4nKTtcbiAgICB9KSgpLFxuICAgICdcXG4nLFxuICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgIGxpbmUsXG4gICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICB9KS5cbiAgICBqb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAnXFxuXFxuZGlzY29yZC12b2lwJyxcbiAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCldO1xuXG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFjayBmcm9tIGFuIGF1ZGlvIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gKHJlc291cmNlLm1ldGFkYXRhIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZWYgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtYXliZVRpdGxlID1cbiAgICAndGl0bGUnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGl0bGV9YCA6IGBUcmFjayAke3JlZn1gO1xuICAgIGNvbnN0IG1heWJlQXV0aG9yID1cbiAgICAnYXV0aG9yJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmF1dGhvcn1gIDogJ1Vua25vd24gYXV0aG9yJztcbiAgICBjb25zdCBtYXliZUR1cmF0aW9uID1cbiAgICAnZHVyYXRpb24nIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuZHVyYXRpb259YCA6ICcwMDowMCc7XG4gICAgY29uc3QgbWF5YmVUaHVtYm5haWwgPVxuICAgICd0aHVtYm5haWwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGh1bWJuYWlsfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWF5YmVVUkwgPVxuICAgICd1cmwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudXJsfWAgOiBgZGlzY29yZC1wbGF5ZXI6Ly9ibG9iLyR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9XG4gICAgJ2Rlc2NyaXB0aW9uJyBpbiBtZXRhZGF0YSA/XG4gICAgYCR7bWV0YWRhdGEuZGVzY3JpcHRpb259YCA6XG4gICAgJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nO1xuICAgIGNvbnN0IG1heWJlVmlld3MgPSAndmlld3MnIGluIG1ldGFkYXRhID8gTnVtYmVyKG1ldGFkYXRhLnZpZXdzKSB8fCAwIDogMDtcblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHtcbiAgICAgIHRpdGxlOiBtYXliZVRpdGxlLFxuICAgICAgYXV0aG9yOiBtYXliZUF1dGhvcixcbiAgICAgIGR1cmF0aW9uOiBtYXliZUR1cmF0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBtYXliZVRodW1ibmFpbCxcbiAgICAgIHVybDogbWF5YmVVUkwsXG4gICAgICBkZXNjcmlwdGlvbjogbWF5YmVEZXNjcmlwdGlvbixcbiAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsXG4gICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHZpZXdzOiBtYXliZVZpZXdzXG4gICAgfSk7XG5cbiAgICByZXNvdXJjZS5tZXRhZGF0YSA9IHRyYWNrO1xuXG4gICAgdHJhY2suc2V0UmVzb3VyY2UocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW50ZXJjZXB0aW5nIHN0cmVhbXNcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIHRvIGludGVyY2VwdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZUludGVyY2VwdGluZ1N0cmVhbShcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIHRyYWNrOiBUcmFjayxcbiAgZm9ybWF0OiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICB7XG4gICAgaWYgKCF0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yLmhhbmRsZShxdWV1ZSwgdHJhY2ssIGZvcm1hdCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ2xvYmFsIHN0cmVhbSBpbnRlcmNlcHRvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW1JbnRlcmNlcHRvcihvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgICB9XG5cbiAgICB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvciA9IG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgfVxufSIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcblxuZnVuY3Rpb24gaGFuZGxlRW1wdHlDaGFubmVsKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbmd1aWxkSWQ6IHN0cmluZylcbntcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpIHx8ICFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSlcbiAgICByZXR1cm47XG4gICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtndWlsZElkfWAsIHRpbWVvdXQpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVDaGFubmVsUG9wdWxhdGUoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke2d1aWxkSWR9YCk7XG4gICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVQYXVzZU9uRW1wdHkocXVldWU6IEd1aWxkUXVldWUpIHtcbiAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgY29uc3Qgd2FzUGF1c2VkT25FbXB0eSA9IFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5Jyk7XG5cbiAgaWYgKGlzRW1wdHkgJiYgIXdhc1BhdXNlZE9uRW1wdHkpIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCBwYXVzaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWlzRW1wdHkgJiYgd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIGZhbHNlKTtcbiAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgIHF1ZXVlLmRlYnVnKFxuICAgICAgICAnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxub2xkU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbntcbiAgaWYgKFxuICBuZXdTdGF0ZS5zZXJ2ZXJNdXRlICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc2VydmVyTXV0ZSAhPT0gbmV3U3RhdGUuc2VydmVyTXV0ZSlcbiAge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnNlcnZlck11dGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChcbiAgbmV3U3RhdGUuY2hhbm5lbD8udHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlICYmXG4gIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcihcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoIXF1ZXVlPy5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgY29uc3QgaXNCb3RTdGF0ZSA9IG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkO1xuICBjb25zdCBndWlsZElkID0gb2xkU3RhdGUuZ3VpbGQuaWQ7XG5cbiAgLy8gQm90IGRpc2Nvbm5lY3RlZFxuICBpZiAoaXNCb3RTdGF0ZSAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgJiYgIW5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIHRyeSB7XG4gICAgICBxdWV1ZS5kZWxldGUoKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgfVxuXG4gIGlmIChxdWV1ZS5vcHRpb25zLnBhdXNlT25FbXB0eSkge1xuICAgIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZSk7XG4gIH1cblxuICAvLyBCb3Qgam9pbmVkIGNoYW5uZWwgb3IgY2hhbmdlZCBzdGF0ZVxuICBpZiAoXG4gIGlzQm90U3RhdGUgJiZcbiAgbmV3U3RhdGUuY2hhbm5lbElkICYmIChcbiAgIW9sZFN0YXRlLmNoYW5uZWxJZCB8fCBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkpXG4gIHtcbiAgICBpZiAocXVldWUuY29ubmVjdGlvbikgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgIGhhbmRsZUJvdFZvaWNlU3RhdGVVcGRhdGUocXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyBIYW5kbGUgY2hhbm5lbCBlbXB0eS9wb3B1bGF0ZSBldmVudHNcbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBoYW5kbGVDaGFubmVsUG9wdWxhdGUocGxheWVyLCBxdWV1ZSwgZ3VpbGRJZCk7XG4gIH0gZWxzZSBpZiAob2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAoXG4gICAgbmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkICYmXG4gICAgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKVxuXG4gICAgcmV0dXJuO1xuICAgIGlmICghcXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke2d1aWxkSWR9YCkpIHtcbiAgICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gIGNvcmU6IHtcbiAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgJ2Rpc2NvcmQtdm9pcCc6IHN0cmluZztcbiAgfTtcbiAgbGlib3B1czoge1xuICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BkaXNjb3JkanMvb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ25vZGUtb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICB9O1xuICBsaWJzb2RpdW06IHtcbiAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIHNvZGl1bTogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGZmbXBlZzogRkZtcGVnUmVwb3J0O1xufVxuXG5leHBvcnQgdHlwZSBGRm1wZWdSZXBvcnQgPSBSZWNvcmQ8XG4gIEZGbXBlZ0xpYixcbiAgTWF5YmVOdWxsPHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaGFzTGlib3B1czogYm9vbGVhbjtcbiAgfT4+O1xuXG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBhIHBhY2thZ2UuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICogQHBhcmFtIGRlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGZpbmRQYWNrYWdlSlNPTihcbiAgZGlyOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGRlcHRoOiBudW1iZXIpXG4gIDogUGFja2FnZUpTT04gfCBudWxsIHtcbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcblxuICAgIGNvbnN0IG5leHQgPSAoKSA9PlxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgcmVzb2x2ZShkaXIsICcuLicpLFxuICAgICAgcGFja2FnZU5hbWUsXG4gICAgICBkZXB0aCAtIDFcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICBjb25zdCBwa2dKU09OOiBQYWNrYWdlSlNPTiA9IHJlcXVpcmUodGFyZ2V0KTtcblxuICAgICAgaWYgKHBrZ0pTT04ubmFtZSAhPT0gcGFja2FnZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBrZ0pTT047XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFRyaWVzIHRvIGZpbmQgdGhlIHZlcnNpb24gb2YgYSBkZXBlbmRlbmN5LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwYWNrYWdlIHRvIGZpbmQgdGhlIHZlcnNpb24gb2ZcbiAgICogQHBhcmFtIG1heExvb2t1cERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoIGZvciB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHJldHVybnMgVGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICB2ZXJzaW9uKG5hbWU6IHN0cmluZywgbWF4TG9va3VwRGVwdGggPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuYW1lID09PSAnZGlzY29yZC1wbGF5ZXInKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2cgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihcbiAgICAgICAgZGlybmFtZShyZXF1aXJlLnJlc29sdmUobmFtZSkpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBtYXhMb29rdXBEZXB0aFxuICAgICAgKTtcbiAgICAgIHJldHVybiBwa2c/LnZlcnNpb24gPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGRpc2NvcmQtcGxheWVyIG1vZHVsZS5cbiAgICogQHJldHVybnMgVGhlIHJlcG9ydCBvYmplY3RcbiAgICovXG4gIGdlbmVyYXRlKCk6IERlcGVuZGVuY2llc1JlcG9ydCB7XG4gICAgY29uc3QgZmZtcGVnUmVwb3J0ID0ge30gYXMgRkZtcGVnUmVwb3J0O1xuXG4gICAgZm9yIChjb25zdCBsaWIgb2YgRkZtcGVnLnNvdXJjZXMpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtsaWIubmFtZV0gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZmbXBlZyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuXG4gICAgaWYgKGZmbXBlZykge1xuICAgICAgZmZtcGVnUmVwb3J0W2ZmbXBlZy5uYW1lXSA9IHtcbiAgICAgICAgaGFzTGlib3B1czogZmZtcGVnLmNvbW1hbmQuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKSxcbiAgICAgICAgdmVyc2lvbjogZmZtcGVnLnZlcnNpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcmU6IHtcbiAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdkaXNjb3JkLXBsYXllcidcbiAgICAgICAgKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtdm9pcCdcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgIH0sXG4gICAgICBsaWJvcHVzOiB7XG4gICAgICAgIG1lZGlhcGxleDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdtZWRpYXBsZXgnKSxcbiAgICAgICAgJ0BkaXNjb3JkanMvb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQGRpc2NvcmRqcy9vcHVzJyksXG4gICAgICAgICdAZXZhbi9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZXZhbi9vcHVzJyksXG4gICAgICAgIG9wdXNzY3JpcHQ6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignb3B1c3NjcmlwdCcpLFxuICAgICAgICAnbm9kZS1vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdub2RlLW9wdXMnKVxuICAgICAgfSxcbiAgICAgIGxpYnNvZGl1bToge1xuICAgICAgICAnc29kaXVtLW5hdGl2ZSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLW5hdGl2ZScpLFxuICAgICAgICBzb2RpdW06IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtJyksXG4gICAgICAgICdsaWJzb2RpdW0td3JhcHBlcnMnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2xpYnNvZGl1bS13cmFwcGVycycpLFxuICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSdcbiAgICAgICAgKSxcbiAgICAgICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzpcbiAgICAgICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tamF2YXNjcmlwdCcpLFxuICAgICAgICAnQG5vYmVsL2NpcGhlcnMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0Bub2JlbC9jaXBoZXJzJylcbiAgICAgIH0sXG4gICAgICBmZm1wZWc6IGZmbXBlZ1JlcG9ydFxuICAgIH07XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcGVuZGVuY2llcyByZXBvcnQuXG4gICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGdlbmVyYXRlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVwb3J0ID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcblxuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAgIG91dHB1dC5wdXNoKCdEZXBlbmRlbmNpZXMgUmVwb3J0Jyk7XG4gICAgb3V0cHV0LnB1c2gobGluZSk7XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVwb3J0KSBhcyAoa2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0KVtdO1xuXG4gICAgZm9yIChjb25zdCBfa2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IF9rZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0O1xuXG4gICAgICBvdXRwdXQucHVzaChrZXkpO1xuXG4gICAgICBjb25zdCBzdWJLZXlzID0gT2JqZWN0LmtleXMocmVwb3J0W2tleV0pO1xuXG4gICAgICBmb3IgKGNvbnN0IF9zdWJLZXkgb2Ygc3ViS2V5cykge1xuICAgICAgICBjb25zdCBzdWJLZXkgPSBfc3ViS2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydFt0eXBlb2Yga2V5XTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXBvcnRba2V5XVtzdWJLZXldID8/ICdOL0EnO1xuXG4gICAgICAgIG91dHB1dC5wdXNoKFxuICAgICAgICAgIGAtICR7c3ViS2V5fTogJHtcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpIDogdmFsdWV9YFxuXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cbn07IiwgIlxuXG5cblxuXG5cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gLyogQF9fTUFDUk9fXyBnZXRWZXJzaW9uICovXCI3LjIuMC1kZXYuMVwiOyIsICJpbXBvcnQgeyBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcblxudHlwZSBBd2FpdGFibGU8VD4gPSBUIHwgUHJvbWlzZUxpa2U8VD47XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbiA9IDxUID0gYW55PihcbnF1ZXVlOiBHdWlsZFF1ZXVlPFQ+LFxudHJhY2s6IFRyYWNrLFxuZm9ybWF0OiBTdHJlYW1UeXBlLFxuc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbj0+IEF3YWl0YWJsZTxib29sZWFuPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgYmUgaW50ZXJjZXB0ZWQuXG4gICAqL1xuICBzaG91bGRJbnRlcmNlcHQ/OiBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllclN0cmVhbUludGVyY2VwdG9yIHtcbiAgI29uU3RyZWFtID0gbmV3IFNldDxPbkludGVyY2VwdGVkU3RyZWFtSGFuZGxlcj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBpbnRlcmNlcHRvciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpXG4gIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGludGVyY2VwdGVkIHN0cmVhbS5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBndWlsZCBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGludGVyY2VwdGVkIHN0cmVhbVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzdHJlYW0gd2FzIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlPFQgPSB1bmtub3duPihcbiAgcXVldWU6IEd1aWxkUXVldWU8VD4sXG4gIHRyYWNrOiBUcmFjayxcbiAgdHlwZTogU3RyZWFtVHlwZSxcbiAgc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuc2hvdWxkSW50ZXJjZXB0O1xuXG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlsdGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKTtcbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTGlzdGVuZXJzID0gdGhpcy4jb25TdHJlYW0uc2l6ZTtcblxuICAgIGlmICghaGFzTGlzdGVuZXJzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50aGlzLiNvblN0cmVhbV0ubWFwKChoYW5kbGVyKSA9PiBoYW5kbGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBpbnRlcmNlcHRlZCBzdHJlYW0gbGlzdGVuZXIuXG4gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIG9uU3RyZWFtKGhhbmRsZXI6IE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy4jb25TdHJlYW0uYWRkKGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuI29uU3RyZWFtLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNHQSxpQkFBbUQ7OztBQ0g1QyxJQUFNLDRCQUE0QixPQUFPLHFCQUFxQjtBQVM5RCxTQUFTLG1CQUFtQixRQUFhLFVBQXdDO0FBQ3RGLFVBQVEsSUFBSSxRQUFRLDJCQUEyQixRQUFRO0FBQ3ZELFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQU5nQjtBQVFULFNBQVMsY0FBYyxRQUFzQjtBQUNsRCxTQUFPLFFBQVEsSUFBSSxRQUFRLHlCQUF5QixLQUFLO0FBQzNEO0FB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O0FBQUEsTUFBSztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLElBQUk7QUFBQSxFQUNyRDtBQUFBLEVBQ0EsV0FBVztBQUFBLElBQVU7QUFBQSxNQUNyQjtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFjO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFDdEQ7QUFBQSxJQUFZO0FBQUEsRUFDWjtBQUFBLEVBQ0EsTUFBTSxVQUFVLENBQUMsTUFBTSxhQUFjLEdBQUssS0FBSyxLQUFLLEtBQUssR0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDNUUsT0FBTztBQUFBLElBQVU7QUFBQSxNQUNqQjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFDcEQ7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQUs7QUFBQSxJQUFHO0FBQUEsRUFDcEM7QUFBQSxFQUNBLEtBQUs7QUFBQSxJQUFVO0FBQUEsTUFDZjtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLElBQUk7QUFBQSxFQUM5RDtBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQVU7QUFBQSxNQUNsQjtBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLE1BQ25FO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxJQUFZO0FBQUEsRUFDeEM7QUFBQSxFQUNBLE1BQU0sVUFBVSxDQUFDLEdBQUssS0FBSyxNQUFNLElBQU0sTUFBTSxHQUFLLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFLEtBQUs7QUFBQSxJQUFVO0FBQUEsTUFDZjtBQUFBLE1BQU07QUFBQSxNQUFNO0FB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bmFtZXMiOiBbIkd1aWxkUXVldWUiLCAiU2VyaWFsaXplZFR5cGUiLCAicXVlcnkiLCAidmVyc2lvbiIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgIm1vZHVsZSIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgImltcG9ydF92MTAiLCAiRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCIsICJkZWNsYXJlUHJvcGVydHkiLCAiZ2V0UHJvcGVydHkiLCAibW9kdWxlIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJyZXN1bHQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicmVzb2x2ZSIsICJyZXNvbHZlIiwgIndhaXRGb3IiLCAiaW1wb3J0X2VxdWFsaXplciIsICJUcmFja1NraXBSZWFzb24iLCAicmVzb2x2ZSIsICJHdWlsZFF1ZXVlIiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X3Byb21pc2VzIiwgInZlcnNpb24iLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2ZmbXBlZyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9mZm1wZWciLCAiZGpzVmVyc2lvbiIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIl0KfQo=