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

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,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __typeError = (msg) => {
7
9
  throw TypeError(msg);
@@ -21,6 +23,14 @@ var __copyProps = (to, from, except, desc) => {
21
23
  return to;
22
24
  };
23
25
  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
+ ));
24
34
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
35
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
26
36
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
@@ -89,12 +99,14 @@ __export(src_exports, {
89
99
  createContext: () => createContext,
90
100
  createErisCompat: () => createErisCompat,
91
101
  createFFmpegStream: () => createFFmpegStream,
102
+ createOceanicCompat: () => createOceanicCompat,
92
103
  decode: () => decode,
93
104
  deserialize: () => deserialize,
94
105
  encode: () => encode,
95
106
  getVoiceConnection: () => import_discord_voip6.getVoiceConnection,
96
107
  getVoiceConnections: () => import_discord_voip6.getVoiceConnections,
97
108
  isErisProxy: () => isErisProxy,
109
+ isOceanicProxy: () => isOceanicProxy,
98
110
  joinVoiceChannel: () => import_discord_voip6.joinVoiceChannel,
99
111
  onAfterCreateStream: () => onAfterCreateStream,
100
112
  onBeforeCreateStream: () => onBeforeCreateStream,
@@ -115,6 +127,33 @@ module.exports = __toCommonJS(src_exports);
115
127
  // src/compat/createErisCompat.ts
116
128
  var import_v10 = require("discord-api-types/v10");
117
129
 
130
+ // src/compat/common.ts
131
+ var DiscordPlayerClientSymbol = Symbol("DiscordPlayerClient");
132
+ function createCompatClient(client, provider) {
133
+ Reflect.set(client, DiscordPlayerClientSymbol, provider);
134
+ return {
135
+ provider,
136
+ client
137
+ };
138
+ }
139
+ __name(createCompatClient, "createCompatClient");
140
+ function isClientProxy(client) {
141
+ return Reflect.get(client, DiscordPlayerClientSymbol) != null;
142
+ }
143
+ __name(isClientProxy, "isClientProxy");
144
+ function getCompatName(client) {
145
+ return Reflect.get(client, DiscordPlayerClientSymbol) ?? null;
146
+ }
147
+ __name(getCompatName, "getCompatName");
148
+ function isErisProxy(client) {
149
+ return getCompatName(client) === "Eris";
150
+ }
151
+ __name(isErisProxy, "isErisProxy");
152
+ function isOceanicProxy(client) {
153
+ return getCompatName(client) === "Oceanic";
154
+ }
155
+ __name(isOceanicProxy, "isOceanicProxy");
156
+
118
157
  // src/utils/Util.ts
119
158
  var import_promises = require("timers/promises");
120
159
 
@@ -406,7 +445,7 @@ function tryIntoThumbnailString(data) {
406
445
  __name(tryIntoThumbnailString, "tryIntoThumbnailString");
407
446
 
408
447
  // src/fabric/Track.ts
409
- var _resource;
448
+ var _onSeek, _resource;
410
449
  var _Track = class _Track {
411
450
  /**
412
451
  * Track constructor
@@ -435,6 +474,7 @@ var _Track = class _Track {
435
474
  __publicField(this, "live", false);
436
475
  __publicField(this, "bridgedExtractor", null);
437
476
  __publicField(this, "bridgedTrack", null);
477
+ __privateAdd(this, _onSeek, null);
438
478
  __privateAdd(this, _resource, null);
439
479
  this.title = (0, import_discord.escapeMarkdown)(data.title ?? "");
440
480
  this.author = data.author ?? "";
@@ -456,6 +496,26 @@ var _Track = class _Track {
456
496
  this.cleanTitle = data.cleanTitle ?? Util.cleanTitle(this.title, this.source);
457
497
  this.live = data.live ?? false;
458
498
  }
499
+ /**
500
+ * Whether this track can be seeked
501
+ */
502
+ get seekable() {
503
+ return __privateGet(this, _onSeek) !== null;
504
+ }
505
+ /**
506
+ * Set the onSeek event
507
+ * @param fn The onSeek event
508
+ */
509
+ handleSeek(fn) {
510
+ __privateSet(this, _onSeek, fn);
511
+ }
512
+ /**
513
+ * Request seek
514
+ * @param event The seek event
515
+ */
516
+ async seek(event) {
517
+ if (__privateGet(this, _onSeek)) return __privateGet(this, _onSeek).call(this, event);
518
+ }
459
519
  /**
460
520
  * Sets audio resource for this track. This is not useful outside of the library.
461
521
  * @param resource Audio resource
@@ -629,6 +689,7 @@ var _Track = class _Track {
629
689
  return await fn(channel, this, options);
630
690
  }
631
691
  };
692
+ _onSeek = new WeakMap();
632
693
  _resource = new WeakMap();
633
694
  __name(_Track, "Track");
634
695
  var Track = _Track;
@@ -1363,19 +1424,7 @@ var VALIDATE_QUEUE_CAP = /* @__PURE__ */ __name((queue, items) => {
1363
1424
  }, "VALIDATE_QUEUE_CAP");
1364
1425
 
1365
1426
  // src/compat/createErisCompat.ts
1366
- var DiscordPlayerClientSymbol = Symbol("DiscordPlayerClient");
1367
- function isClientProxy(client) {
1368
- return Reflect.get(client, DiscordPlayerClientSymbol) != null;
1369
- }
1370
- __name(isClientProxy, "isClientProxy");
1371
- function getCompatName(client) {
1372
- return Reflect.get(client, DiscordPlayerClientSymbol) ?? null;
1373
- }
1374
- __name(getCompatName, "getCompatName");
1375
- function isErisProxy(client) {
1376
- return Reflect.get(client, DiscordPlayerClientSymbol) === "Eris";
1377
- }
1378
- __name(isErisProxy, "isErisProxy");
1427
+ var DiscordPlayerClientSymbol2 = Symbol("DiscordPlayerClient");
1379
1428
  function declareProperty(target, key, value) {
1380
1429
  Reflect.set(target, key, value);
1381
1430
  }
@@ -1414,8 +1463,8 @@ function createErisCompat(client) {
1414
1463
  }
1415
1464
  }
1416
1465
  });
1417
- Reflect.set(erisProxy, DiscordPlayerClientSymbol, "Eris");
1418
- return erisProxy;
1466
+ Reflect.set(erisProxy, DiscordPlayerClientSymbol2, "Eris");
1467
+ return createCompatClient(erisProxy, "Eris").client;
1419
1468
  }
1420
1469
  __name(createErisCompat, "createErisCompat");
1421
1470
  function erisVoiceStateUpdateProxy(client, proxy, handler) {
@@ -1649,6 +1698,283 @@ function erisUsersProxy(client, eris) {
1649
1698
  }
1650
1699
  __name(erisUsersProxy, "erisUsersProxy");
1651
1700
 
1701
+ // src/compat/createOceanicCompat.ts
1702
+ var import_v102 = require("discord-api-types/v10");
1703
+ var Oceanic = __toESM(require("oceanic.js"));
1704
+ var DiscordPlayerClientSymbol3 = Symbol("DiscordPlayerClient");
1705
+ function declareProperty2(target, key, value) {
1706
+ Reflect.set(target, key, value);
1707
+ }
1708
+ __name(declareProperty2, "declareProperty");
1709
+ function getProperty2(target, key) {
1710
+ return Reflect.get(target, key);
1711
+ }
1712
+ __name(getProperty2, "getProperty");
1713
+ function createOceanicCompat(client) {
1714
+ const { module: module2, error } = Util.require("oceanic.js");
1715
+ if (error) throw error;
1716
+ const oceanic = module2;
1717
+ oceanicVoiceEventsHandler(client);
1718
+ const oceanicProxy = new Proxy(client, {
1719
+ get(target, p) {
1720
+ switch (p) {
1721
+ case "users":
1722
+ return oceanicUsersProxy(target, oceanic);
1723
+ case "guilds":
1724
+ return oceanicGuildsProxy(target, oceanic);
1725
+ case "channels":
1726
+ return oceanicChannelsProxy(target, oceanic);
1727
+ case "__dp_voiceStateUpdate_proxy":
1728
+ return (handler) => oceanicVoiceStateUpdateProxy(target, oceanicProxy, handler);
1729
+ case "incrementMaxListeners":
1730
+ return () => {
1731
+ client.setMaxListeners(client.getMaxListeners() + 1);
1732
+ };
1733
+ case "decrementMaxListeners":
1734
+ return () => {
1735
+ const listeners = client.getMaxListeners() - 1;
1736
+ client.setMaxListeners(listeners < 0 ? 1 : listeners);
1737
+ };
1738
+ default:
1739
+ return target[p];
1740
+ }
1741
+ }
1742
+ });
1743
+ Reflect.set(oceanicProxy, DiscordPlayerClientSymbol3, "Oceanic");
1744
+ return createCompatClient(oceanicProxy, "Oceanic").client;
1745
+ }
1746
+ __name(createOceanicCompat, "createOceanicCompat");
1747
+ function oceanicVoiceStateUpdateProxy(client, proxy, handler) {
1748
+ client.on("voiceStateUpdate", (member, oldState) => {
1749
+ try {
1750
+ const proxiedOldState = {
1751
+ channelId: oldState.channelID,
1752
+ serverMute: oldState.mute,
1753
+ suppress: oldState.suppress,
1754
+ guild: {
1755
+ id: oldState.guild.id
1756
+ },
1757
+ member: {
1758
+ id: oldState.user.id
1759
+ }
1760
+ };
1761
+ const me = member.guild.members.get(client.user.id);
1762
+ const resolvedChannel = member.guild.channels.get(
1763
+ member.voiceState.channelID
1764
+ );
1765
+ const proxiedNewState = {
1766
+ channelId: member.voiceState.channelID,
1767
+ serverMute: member.voiceState.mute,
1768
+ suppress: member.voiceState.suppress,
1769
+ channel: oceanicResolvedChannelProxy(resolvedChannel, client),
1770
+ member: {
1771
+ id: member.id
1772
+ },
1773
+ guild: {
1774
+ id: member.guild.id,
1775
+ members: {
1776
+ me: {
1777
+ id: me?.id,
1778
+ voice: {
1779
+ async setRequestToSpeak(value) {
1780
+ return me?.voiceState;
1781
+ }
1782
+ }
1783
+ }
1784
+ }
1785
+ }
1786
+ };
1787
+ return handler(proxiedNewState, proxiedOldState);
1788
+ } catch {
1789
+ }
1790
+ });
1791
+ }
1792
+ __name(oceanicVoiceStateUpdateProxy, "oceanicVoiceStateUpdateProxy");
1793
+ function oceanicVoiceEventsHandler(client) {
1794
+ let adapters = getProperty2(client, "adapters");
1795
+ if (!adapters) {
1796
+ const collection = /* @__PURE__ */ new Map();
1797
+ adapters = collection;
1798
+ declareProperty2(client, "adapters", collection);
1799
+ }
1800
+ client.on("shardDisconnect", (_, shardId) => {
1801
+ for (const [guildId, adapter] of adapters.entries()) {
1802
+ if (client.guilds.get(guildId)?.shard.id === shardId) {
1803
+ adapter.destroy();
1804
+ }
1805
+ }
1806
+ });
1807
+ client.on("packet", (packet) => {
1808
+ switch (packet.t) {
1809
+ case import_v102.GatewayDispatchEvents.VoiceServerUpdate: {
1810
+ const payload = packet.d;
1811
+ adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload);
1812
+ return;
1813
+ }
1814
+ case import_v102.GatewayDispatchEvents.VoiceStateUpdate: {
1815
+ const payload = packet.d;
1816
+ if (payload.guild_id && payload.session_id && payload.user_id === client.user.id) {
1817
+ adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload);
1818
+ }
1819
+ return;
1820
+ }
1821
+ default:
1822
+ break;
1823
+ }
1824
+ });
1825
+ }
1826
+ __name(oceanicVoiceEventsHandler, "oceanicVoiceEventsHandler");
1827
+ function oceanicChannelsProxy(client, oceanic) {
1828
+ const handler = {
1829
+ client,
1830
+ get cache() {
1831
+ return {
1832
+ get(id) {
1833
+ return client.getChannel(id);
1834
+ },
1835
+ has(id) {
1836
+ return id in client.channelGuildMap;
1837
+ }
1838
+ };
1839
+ },
1840
+ resolve(resolvable) {
1841
+ if (typeof resolvable === "string") {
1842
+ return oceanicResolvedChannelProxy(
1843
+ this.client.getChannel(resolvable),
1844
+ client
1845
+ );
1846
+ }
1847
+ if (resolvable instanceof Oceanic.GuildChannel) {
1848
+ return oceanicResolvedChannelProxy(resolvable, client);
1849
+ }
1850
+ },
1851
+ resolveId(resolvable) {
1852
+ const channel = this.resolve(resolvable);
1853
+ return channel?.id;
1854
+ }
1855
+ };
1856
+ return handler;
1857
+ }
1858
+ __name(oceanicChannelsProxy, "oceanicChannelsProxy");
1859
+ function oceanicResolvedChannelProxy(channel, client) {
1860
+ if (!channel) return;
1861
+ return new Proxy(channel, {
1862
+ get(target, p) {
1863
+ switch (p) {
1864
+ case "guild":
1865
+ return oceanicVoiceAdapterProxy(target.guild, client);
1866
+ case "members":
1867
+ return target.voiceMembers;
1868
+ case "isVoiceBased":
1869
+ return () => target.type === import_v102.ChannelType.GuildVoice || target.type === import_v102.ChannelType.GuildStageVoice;
1870
+ case "isVoice":
1871
+ return () => target.type === import_v102.ChannelType.GuildVoice;
1872
+ case "isStage":
1873
+ return () => target.type === import_v102.ChannelType.GuildStageVoice;
1874
+ default:
1875
+ return target[p];
1876
+ }
1877
+ }
1878
+ });
1879
+ }
1880
+ __name(oceanicResolvedChannelProxy, "oceanicResolvedChannelProxy");
1881
+ function oceanicVoiceAdapterProxy(guild, client) {
1882
+ if (!guild) return;
1883
+ return new Proxy(guild, {
1884
+ get(target, p) {
1885
+ if (p === "voiceAdapterCreator") {
1886
+ return oceanicVoiceAdapterCreator(target, client);
1887
+ }
1888
+ return target[p];
1889
+ }
1890
+ });
1891
+ }
1892
+ __name(oceanicVoiceAdapterProxy, "oceanicVoiceAdapterProxy");
1893
+ function oceanicVoiceAdapterCreator(guild, client) {
1894
+ return (methods) => {
1895
+ let adapters = getProperty2(client, "adapters");
1896
+ if (!adapters) {
1897
+ const collection = /* @__PURE__ */ new Map();
1898
+ adapters = collection;
1899
+ declareProperty2(client, "adapters", collection);
1900
+ }
1901
+ adapters.set(guild.id, methods);
1902
+ return {
1903
+ sendPayload(payload) {
1904
+ if (guild.shard.status !== "ready") return false;
1905
+ guild.shard.send(payload.op, payload.d);
1906
+ return true;
1907
+ },
1908
+ destroy() {
1909
+ adapters.delete(guild.id);
1910
+ }
1911
+ };
1912
+ };
1913
+ }
1914
+ __name(oceanicVoiceAdapterCreator, "oceanicVoiceAdapterCreator");
1915
+ function oceanicGuildsProxy(client, oceanic) {
1916
+ return new Proxy(client.guilds, {
1917
+ get(target, p) {
1918
+ if (p === "cache") {
1919
+ return target;
1920
+ }
1921
+ if (p === "resolve" || p === "resolveId") {
1922
+ const resolver = /* @__PURE__ */ __name(function(resolvable) {
1923
+ if (typeof resolvable === "string") {
1924
+ return target.get(resolvable);
1925
+ }
1926
+ if (resolvable instanceof oceanic.Guild) {
1927
+ return resolvable;
1928
+ }
1929
+ if (resolvable instanceof oceanic.Member || resolvable instanceof oceanic.Guild || resolvable instanceof oceanic.GuildChannel || resolvable instanceof oceanic.Role) {
1930
+ return resolvable.guild;
1931
+ }
1932
+ }, "resolver");
1933
+ if (p === "resolve") {
1934
+ return resolver;
1935
+ }
1936
+ return (resolvable) => {
1937
+ const guild = resolver(resolvable);
1938
+ return guild?.id;
1939
+ };
1940
+ }
1941
+ return target[p];
1942
+ }
1943
+ });
1944
+ }
1945
+ __name(oceanicGuildsProxy, "oceanicGuildsProxy");
1946
+ function oceanicUsersProxy(client, oceanic) {
1947
+ return new Proxy(client.users, {
1948
+ get(target, p) {
1949
+ if (p === "cache") {
1950
+ return target;
1951
+ }
1952
+ if (p === "resolve" || p === "resolveId") {
1953
+ const resolver = /* @__PURE__ */ __name(function(resolvable) {
1954
+ if (typeof resolvable === "string") {
1955
+ return target.get(resolvable);
1956
+ }
1957
+ if (resolvable instanceof oceanic.User) {
1958
+ return resolvable;
1959
+ }
1960
+ if (resolvable instanceof oceanic.Member) {
1961
+ return resolvable.user;
1962
+ }
1963
+ }, "resolver");
1964
+ if (p === "resolve") {
1965
+ return resolver;
1966
+ }
1967
+ return (resolvable) => {
1968
+ const user = resolver(resolvable);
1969
+ return user?.id;
1970
+ };
1971
+ }
1972
+ return target[p];
1973
+ }
1974
+ });
1975
+ }
1976
+ __name(oceanicUsersProxy, "oceanicUsersProxy");
1977
+
1652
1978
  // src/utils/PlayerEventsEmitter.ts
1653
1979
  var import_utils = require("@discord-player/utils");
1654
1980
  var _hasDebugger;
@@ -2411,14 +2737,30 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2411
2737
  this.audioPlayer.on("error", (error) => void this.emit("error", error));
2412
2738
  this.dsp.onUpdate = () => {
2413
2739
  if (!this.dsp) return;
2414
- if (this.dsp.filters?.filters)
2740
+ if (this.dsp.filters?.filters) {
2415
2741
  this.emit("dsp", this.dsp.filters?.filters);
2416
- if (this.dsp.biquad?.filters)
2742
+ }
2743
+ if (this.dsp.biquad?.filters) {
2417
2744
  this.emit("biquad", this.dsp.biquad?.filters);
2418
- if (this.dsp.equalizer) this.emit("eqBands", this.dsp.equalizer.getEQ());
2419
- if (this.dsp.volume) this.emit("volume", this.dsp.volume.volume);
2420
- if (this.dsp.resampler)
2421
- this.emit("sampleRate", this.dsp.resampler.sampleRate);
2745
+ }
2746
+ if (this.dsp.equalizer) {
2747
+ this.emit("eqBands", this.dsp.equalizer.getEQ());
2748
+ }
2749
+ if (this.dsp.volume) {
2750
+ this.emit("volume", this.dsp.volume.volume);
2751
+ }
2752
+ if (this.dsp.resampler) {
2753
+ this.emit("sampleRate", this.dsp.resampler.getParameters());
2754
+ }
2755
+ if (this.dsp.compressor) {
2756
+ this.emit("compressor", this.dsp.compressor.getParameters());
2757
+ }
2758
+ if (this.dsp.reverb) {
2759
+ this.emit("reverb", this.dsp.reverb.getParameters());
2760
+ }
2761
+ if (this.dsp.seeker) {
2762
+ this.emit("seeker", this.dsp.seeker.getParameters());
2763
+ }
2422
2764
  };
2423
2765
  this.dsp.onError = (e) => this.emit("error", e);
2424
2766
  this.voiceConnection.on(import_discord_voip.VoiceConnectionStatus.Disconnected, async (oldState, newState) => {
@@ -2568,8 +2910,37 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2568
2910
  volume: {
2569
2911
  volume: ops?.volume,
2570
2912
  disabled: ops?.disableVolume
2571
- }
2913
+ },
2914
+ compressor: ops?.compressor ? {
2915
+ threshold: ops?.compressor.threshold,
2916
+ ratio: ops?.compressor.ratio,
2917
+ attack: ops?.compressor.attack,
2918
+ release: ops?.compressor.release,
2919
+ makeupGain: ops?.compressor.makeupGain,
2920
+ disabled: ops?.disableCompressor,
2921
+ kneeWidth: ops?.compressor.kneeWidth
2922
+ } : void 0,
2923
+ reverb: ops?.reverb ? {
2924
+ roomSize: ops?.reverb.roomSize,
2925
+ damping: ops?.reverb.damping,
2926
+ wetLevel: ops?.reverb.wetLevel,
2927
+ dryLevel: ops?.reverb.dryLevel,
2928
+ disabled: ops?.disableReverb
2929
+ } : void 0,
2930
+ seeker: ops?.seeker ? {
2931
+ disabled: ops?.disableSeeker,
2932
+ seekTarget: ops?.seeker.seekTarget,
2933
+ sampleRate: 48e3,
2934
+ channels: 2,
2935
+ totalDuration: ops?.seeker.totalDuration
2936
+ } : void 0
2572
2937
  }) : src;
2938
+ if (this.dsp.seeker) {
2939
+ this.dsp.seeker.on("seek", (data) => {
2940
+ this.queue.node.requestSeek(data).catch(() => {
2941
+ });
2942
+ });
2943
+ }
2573
2944
  if (this.queue.hasDebugger) {
2574
2945
  this.queue.debug("Executing onAfterCreateStream hook...");
2575
2946
  }
@@ -2615,6 +2986,15 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2615
2986
  get equalizer() {
2616
2987
  return this.dsp?.equalizer || null;
2617
2988
  }
2989
+ get compressor() {
2990
+ return this.dsp?.compressor || null;
2991
+ }
2992
+ get reverb() {
2993
+ return this.dsp?.reverb || null;
2994
+ }
2995
+ get seeker() {
2996
+ return this.dsp?.seeker || null;
2997
+ }
2618
2998
  /**
2619
2999
  * The player status
2620
3000
  * @type {AudioPlayerStatus}
@@ -3040,6 +3420,10 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3040
3420
  * Current playback duration with history included
3041
3421
  */
3042
3422
  get playbackTime() {
3423
+ if (this.queue.filters.seeker) {
3424
+ const pos = this.queue.filters.seeker.getPosition();
3425
+ if (pos > 0) return pos;
3426
+ }
3043
3427
  const dur = __privateGet(this, _progress) + this.streamTime;
3044
3428
  return dur;
3045
3429
  }
@@ -3059,11 +3443,6 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3059
3443
  get estimatedPlaybackTime() {
3060
3444
  const dur = this.playbackTime;
3061
3445
  const val = this.getDurationMultiplier() * dur;
3062
- if (this.queue.filters.resampler) {
3063
- const ratio = this.queue.filters.resampler.getRatio();
3064
- if (ratio <= 0) return val;
3065
- return val * ratio;
3066
- }
3067
3446
  return val;
3068
3447
  }
3069
3448
  /**
@@ -3181,7 +3560,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3181
3560
  });
3182
3561
  }
3183
3562
  if (duration < 0) duration = 0;
3184
- return this.queue.filters.triggerReplay(duration);
3563
+ const seeker = this.queue.filters.seeker;
3564
+ if (seeker) {
3565
+ seeker.seek(duration);
3566
+ return true;
3567
+ }
3568
+ return this.queue.filters.triggerReplay(duration).then((v) => {
3569
+ if (v) {
3570
+ this.queue.emit(GuildQueueEvent.PlayerSeek, this.queue, {
3571
+ currentPosition: this.estimatedPlaybackTime,
3572
+ seekTarget: duration,
3573
+ totalDuration: this.estimatedDuration
3574
+ });
3575
+ }
3576
+ return v;
3577
+ });
3185
3578
  }
3186
3579
  /**
3187
3580
  * Current volume
@@ -3390,6 +3783,18 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3390
3783
  }
3391
3784
  return true;
3392
3785
  }
3786
+ /**
3787
+ * Request the source to seek
3788
+ * @param data The seek parameters
3789
+ */
3790
+ async requestSeek(data) {
3791
+ const track = this.queue.currentTrack;
3792
+ if (!track) return false;
3793
+ if (track.seekable) {
3794
+ return track.seek(data);
3795
+ }
3796
+ return this.queue.filters.triggerReplay(data.position);
3797
+ }
3393
3798
  /**
3394
3799
  * Play the given track
3395
3800
  * @param res The track to play
@@ -3503,6 +3908,15 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3503
3908
  disableVolume: this.queue.options.disableVolume,
3504
3909
  disableFilters: this.queue.options.disableFilterer,
3505
3910
  disableResampler: this.queue.options.disableResampler,
3911
+ disableCompressor: this.queue.options.disableCompressor,
3912
+ disableReverb: this.queue.options.disableReverb,
3913
+ disableSeeker: this.queue.options.disableSeeker,
3914
+ compressor: this.queue.filters._lastFiltersCache.compressor ?? void 0,
3915
+ reverb: this.queue.filters._lastFiltersCache.reverb ?? void 0,
3916
+ seeker: {
3917
+ seekTarget: options.transitionMode && options.seek != null ? options.seek : null,
3918
+ totalDuration: track.durationMS ?? 0
3919
+ },
3506
3920
  sampleRate: this.queue.filters._lastFiltersCache.sampleRate ?? (typeof this.queue.options.resampler === "number" && this.queue.options.resampler > 0 ? this.queue.options.resampler : void 0),
3507
3921
  biquadFilter: this.queue.filters._lastFiltersCache.biquad || void 0,
3508
3922
  eq: this.queue.filters._lastFiltersCache.equalizer,
@@ -3532,14 +3946,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3532
3946
  trackStreamConfig.dispatcherConfig.disableEqualizer,
3533
3947
  trackStreamConfig.dispatcherConfig.disableFilters,
3534
3948
  trackStreamConfig.dispatcherConfig.disableResampler,
3535
- trackStreamConfig.dispatcherConfig.disableVolume
3949
+ trackStreamConfig.dispatcherConfig.disableVolume,
3950
+ trackStreamConfig.dispatcherConfig.disableCompressor,
3951
+ trackStreamConfig.dispatcherConfig.disableReverb,
3952
+ trackStreamConfig.dispatcherConfig.disableSeeker
3536
3953
  ].every((e) => !!e === true);
3537
3954
  const needsFilters = !!trackStreamConfig.playerConfig.seek || !!this.queue.filters.ffmpeg.args.length;
3538
3955
  const shouldSkipFFmpeg = !!trackStreamConfig.dispatcherConfig.skipFFmpeg && !needsFilters;
3539
3956
  let finalStream;
3540
- const demuxable = /* @__PURE__ */ __name((fmt) => [import_discord_voip2.StreamType.Opus, import_discord_voip2.StreamType.WebmOpus, import_discord_voip2.StreamType.OggOpus].includes(
3541
- fmt
3542
- ), "demuxable");
3957
+ const demuxable = /* @__PURE__ */ __name((fmt) => [
3958
+ import_discord_voip2.StreamType.Opus,
3959
+ import_discord_voip2.StreamType.WebmOpus,
3960
+ import_discord_voip2.StreamType.OggOpus,
3961
+ import_discord_voip2.StreamType.Raw,
3962
+ "pcm"
3963
+ ].includes(fmt), "demuxable");
3543
3964
  if (shouldSkipFFmpeg && !(streamSrc.stream instanceof import_stream.Readable) && typeof streamSrc.stream !== "string" && demuxable(streamSrc.stream.$fmt)) {
3544
3965
  const { $fmt, stream } = streamSrc.stream;
3545
3966
  const shouldPCM = !daspDisabled;
@@ -3547,7 +3968,8 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3547
3968
  this.queue.debug(
3548
3969
  `skipFFmpeg is set to true and stream is demuxable, creating stream with type ${shouldPCM ? "pcm" : "opus"}`
3549
3970
  );
3550
- const opusStream = $fmt === import_discord_voip2.StreamType.Opus ? stream : $fmt === import_discord_voip2.StreamType.OggOpus ? (
3971
+ const isRaw = $fmt === "pcm" || $fmt === import_discord_voip2.StreamType.Raw;
3972
+ const opusStream = isRaw || $fmt === import_discord_voip2.StreamType.Opus ? stream : $fmt === import_discord_voip2.StreamType.OggOpus ? (
3551
3973
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3552
3974
  stream.pipe(new import_opus.OggDemuxer())
3553
3975
  ) : (
@@ -3555,14 +3977,18 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3555
3977
  stream.pipe(new import_opus.WebmDemuxer())
3556
3978
  );
3557
3979
  if (shouldPCM) {
3558
- finalStream = opusStream.pipe(
3559
- new import_opus.OpusDecoder({
3560
- channels: 2,
3561
- frameSize: 960,
3562
- rate: 48e3
3563
- })
3564
- );
3565
- trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Raw;
3980
+ if (isRaw) {
3981
+ finalStream = opusStream;
3982
+ } else {
3983
+ finalStream = opusStream.pipe(
3984
+ new import_opus.OpusDecoder({
3985
+ channels: 2,
3986
+ frameSize: 960,
3987
+ rate: 48e3
3988
+ })
3989
+ );
3990
+ trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Raw;
3991
+ }
3566
3992
  } else {
3567
3993
  finalStream = opusStream;
3568
3994
  trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Opus;
@@ -4236,7 +4662,10 @@ var _GuildQueueAudioFilters = class _GuildQueueAudioFilters {
4236
4662
  equalizer: [],
4237
4663
  filters: [],
4238
4664
  volume: 100,
4239
- sampleRate: -1
4665
+ sampleRate: -1,
4666
+ compressor: null,
4667
+ reverb: null,
4668
+ sampleRateFilter: null
4240
4669
  });
4241
4670
  if (typeof this.queue.options.volume === "number") {
4242
4671
  this._lastFiltersCache.volume = this.queue.options.volume;
@@ -4283,6 +4712,24 @@ var _GuildQueueAudioFilters = class _GuildQueueAudioFilters {
4283
4712
  get resampler() {
4284
4713
  return this.queue.dispatcher?.resampler || null;
4285
4714
  }
4715
+ /**
4716
+ * Compressor transformer
4717
+ */
4718
+ get compressor() {
4719
+ return this.queue.dispatcher?.compressor || null;
4720
+ }
4721
+ /**
4722
+ * Reverb transformer
4723
+ */
4724
+ get reverb() {
4725
+ return this.queue.dispatcher?.reverb || null;
4726
+ }
4727
+ /**
4728
+ * PCM Seeker transformer
4729
+ */
4730
+ get seeker() {
4731
+ return this.queue.dispatcher?.seeker || null;
4732
+ }
4286
4733
  /**
4287
4734
  * Replay current track in transition mode
4288
4735
  * @param seek The duration to seek to
@@ -4635,7 +5082,23 @@ var GuildQueueEvent = {
4635
5082
  /**
4636
5083
  * Emitted when sample rate is updated
4637
5084
  */
4638
- SampleRateUpdate: "sampleRateUpdate"
5085
+ SampleRateUpdate: "sampleRateUpdate",
5086
+ /**
5087
+ * Emitted when a named sample rate filter is updated
5088
+ */
5089
+ SampleRateFilterUpdate: "sampleRateFilterUpdate",
5090
+ /**
5091
+ * Emitted when reverb filter is updated
5092
+ */
5093
+ ReverbUpdate: "reverbUpdate",
5094
+ /**
5095
+ * Emitted when compressor filter is updated
5096
+ */
5097
+ CompressorUpdate: "compressorUpdate",
5098
+ /**
5099
+ * Emitted when seek is performed
5100
+ */
5101
+ PlayerSeek: "playerSeek"
4639
5102
  };
4640
5103
  var TrackSkipReason = /* @__PURE__ */ ((TrackSkipReason2) => {
4641
5104
  TrackSkipReason2["NoStream"] = "ERR_NO_STREAM";
@@ -5301,15 +5764,64 @@ attachListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
5301
5764
  );
5302
5765
  this.filters._lastFiltersCache.volume = f;
5303
5766
  });
5767
+ const areObjectsDifferent = /* @__PURE__ */ __name((a, b) => {
5768
+ if (!a && !b) return false;
5769
+ if (!a || !b) return true;
5770
+ if (Object.keys(a).length !== Object.keys(b).length) return true;
5771
+ return Object.keys(a).some((k) => a[k] !== b[k]);
5772
+ }, "areObjectsDifferent");
5304
5773
  dispatcher.on("sampleRate", (f) => {
5305
- if (this.filters._lastFiltersCache.sampleRate !== f)
5774
+ if (this.filters._lastFiltersCache.sampleRate !== f.sampleRate) {
5306
5775
  this.emit(
5307
5776
  GuildQueueEvent.SampleRateUpdate,
5308
5777
  this,
5309
5778
  this.filters._lastFiltersCache.sampleRate,
5779
+ f.sampleRate
5780
+ );
5781
+ this.filters._lastFiltersCache.sampleRate = f.sampleRate;
5782
+ this.filters.seeker?.setSampleRate(f.sampleRate);
5783
+ this.filters.seeker?.setTotalDuration(this.node.estimatedDuration);
5784
+ }
5785
+ if (f.currentFilter !== this.filters._lastFiltersCache.sampleRateFilter) {
5786
+ this.emit(
5787
+ GuildQueueEvent.SampleRateFilterUpdate,
5788
+ this,
5789
+ this.filters._lastFiltersCache.sampleRateFilter ?? null,
5790
+ f.currentFilter
5791
+ );
5792
+ this.filters._lastFiltersCache.sampleRateFilter = f.currentFilter;
5793
+ }
5794
+ });
5795
+ dispatcher.on("reverb", (f) => {
5796
+ if (areObjectsDifferent(f, this.filters._lastFiltersCache.reverb)) {
5797
+ this.emit(
5798
+ GuildQueueEvent.ReverbUpdate,
5799
+ this,
5800
+ this.filters._lastFiltersCache.reverb ?? null,
5801
+ f
5802
+ );
5803
+ this.filters._lastFiltersCache.reverb = f;
5804
+ }
5805
+ });
5806
+ dispatcher.on("seeker", (f) => {
5807
+ if (this.hasDebugger) {
5808
+ this.debug(
5809
+ `Seeker >> Seeked to ${f.seekTarget}ms for Track ${this.currentTrack?.title}`
5810
+ );
5811
+ }
5812
+ if (f.seekTarget != null) this.node.setProgress(f.seekTarget);
5813
+ this.emit(GuildQueueEvent.PlayerSeek, this, f);
5814
+ });
5815
+ dispatcher.on("compressor", (f) => {
5816
+ if (areObjectsDifferent(f, this.filters._lastFiltersCache.compressor)) {
5817
+ this.emit(
5818
+ GuildQueueEvent.CompressorUpdate,
5819
+ this,
5820
+ this.filters._lastFiltersCache.compressor ?? null,
5310
5821
  f
5311
5822
  );
5312
- this.filters._lastFiltersCache.sampleRate = f;
5823
+ this.filters._lastFiltersCache.compressor = f;
5824
+ }
5313
5825
  });
5314
5826
  }, "#attachListeners");
5315
5827
  removeListeners_fn = /* @__PURE__ */ __name(function(target) {
@@ -5521,6 +6033,9 @@ var _GuildNodeManager = class _GuildNodeManager {
5521
6033
  options.disableFilterer ?? (options.disableFilterer = false);
5522
6034
  options.disableVolume ?? (options.disableVolume = false);
5523
6035
  options.disableResampler ?? (options.disableResampler = false);
6036
+ options.disableCompressor ?? (options.disableCompressor = true);
6037
+ options.disableSeeker ?? (options.disableSeeker = true);
6038
+ options.disableReverb ?? (options.disableReverb = true);
5524
6039
  options.disableFallbackStream ?? (options.disableFallbackStream = false);
5525
6040
  options.enableStreamInterceptor ?? (options.enableStreamInterceptor = false);
5526
6041
  options.verifyFallbackStream ?? (options.verifyFallbackStream = false);
@@ -5569,7 +6084,10 @@ var _GuildNodeManager = class _GuildNodeManager {
5569
6084
  disableVolume: options.disableVolume,
5570
6085
  disableFallbackStream: options.disableFallbackStream,
5571
6086
  enableStreamInterceptor: options.enableStreamInterceptor,
5572
- verifyFallbackStream: options.verifyFallbackStream
6087
+ verifyFallbackStream: options.verifyFallbackStream,
6088
+ disableCompressor: options.disableCompressor,
6089
+ disableSeeker: options.disableSeeker,
6090
+ disableReverb: options.disableReverb
5573
6091
  });
5574
6092
  this.cache.set(server.id, queue);
5575
6093
  return queue;
@@ -6096,7 +6614,7 @@ var import_ffmpeg2 = require("@discord-player/ffmpeg");
6096
6614
  // src/version.ts
6097
6615
  var version = (
6098
6616
  /* @__MACRO__ getVersion */
6099
- "7.1.1-dev.0"
6617
+ "7.2.0-dev.0"
6100
6618
  );
6101
6619
 
6102
6620
  // src/utils/DependencyReportGenerator.ts
@@ -6993,12 +7511,14 @@ var import_discord_voip6 = require("discord-voip");
6993
7511
  createContext,
6994
7512
  createErisCompat,
6995
7513
  createFFmpegStream,
7514
+ createOceanicCompat,
6996
7515
  decode,
6997
7516
  deserialize,
6998
7517
  encode,
6999
7518
  getVoiceConnection,
7000
7519
  getVoiceConnections,
7001
7520
  isErisProxy,
7521
+ isOceanicProxy,
7002
7522
  joinVoiceChannel,
7003
7523
  onAfterCreateStream,
7004
7524
  onBeforeCreateStream,
@@ -7015,4 +7535,4 @@ var import_discord_voip6 = require("discord-voip");
7015
7535
  version,
7016
7536
  ...require("@discord-player/ffmpeg")
7017
7537
  });
7018
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXIudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9ob29rcy9jb250ZXh0L2FzeW5jLWNvbnRleHQudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0udHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvdXRpbHMvRkZtcGVnU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvcXVldWUvU3luY2VkTHlyaWNzUHJvdmlkZXIudHMiLCAiLi4vc3JjL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQudHMiLCAiLi4vc3JjL2xyY2xpYi9McmNMaWIudHMiLCAiLi4vc3JjL3N0cmVhbS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci50cyIsICIuLi9zcmMvdmVyc2lvbi50cyIsICIuLi9zcmMvUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGNyZWF0ZUVyaXNDb21wYXQsIGlzRXJpc1Byb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5leHBvcnQge1xuICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgdHlwZSBQQ01GaWx0ZXJzLFxuICBRX0JVVFRFUldPUlRILFxuICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgQkFTU19FUV9CQU5EUyxcbiAgQUZfTklHSFRDT1JFX1JBVEUsXG4gIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICBGaWx0ZXJzQ2hhaW4gfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQge1xuICBjcmVhdGVBdWRpb1BsYXllcixcbiAgQXVkaW9QbGF5ZXIsXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9ucyxcbiAgam9pblZvaWNlQ2hhbm5lbCxcbiAgU3RyZWFtVHlwZSxcbiAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgdHlwZSBKb2luQ29uZmlnLFxuICB0eXBlIEpvaW5Wb2ljZUNoYW5uZWxPcHRpb25zLFxuICB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJzsiLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gQHRzLW5vY2hlY2tcblxuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEdhdGV3YXlEaXNwYXRjaEV2ZW50cyB9IGZyb20gJ2Rpc2NvcmQtYXBpLXR5cGVzL3YxMCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSBFcmlzIGZyb20gJ2VyaXMnO1xuXG50eXBlIEVyaXNVc2VyUmVzb2x2YWJsZSA9IEVyaXMuVXNlciB8IHN0cmluZyB8IEVyaXMuTWVtYmVyO1xudHlwZSBFcmlzR3VpbGRSZXNvbHZhYmxlID1cbkVyaXMuR3VpbGQgfFxuc3RyaW5nIHxcbkVyaXMuTWVtYmVyIHxcbkVyaXMuR3VpbGRDaGFubmVsIHxcbkVyaXMuUm9sZTtcbnR5cGUgRXJpc0NoYW5uZWxSZXNvbHZhYmxlID0gRXJpcy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBlcmlzUHJveHkgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IEVyaXMuQ2xpZW50LFxucHJveHk6IEVyaXMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncmF3V1MnLCAocGFja2V0KSA9PiB7XG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTZXJ2ZXJVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHBheWxvYWQuZ3VpbGRfaWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnNlc3Npb25faWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVN0YXRlVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc0NoYW5uZWxzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgY2xpZW50LFxuICAgIGdldCBjYWNoZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdldChpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRDaGFubmVsKGlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gaWQgaW4gY2xpZW50LmNoYW5uZWxHdWlsZE1hcDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJlc29sdmUocmVzb2x2YWJsZTogc3RyaW5nIHwgRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG4gICAgICAgICAgdGhpcy5jbGllbnQuZ2V0Q2hhbm5lbChyZXNvbHZhYmxlKSBhcyBFcmlzLkd1aWxkQ2hhbm5lbCxcbiAgICAgICAgICBjbGllbnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmFibGUsIGNsaWVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNvbHZlSWQocmVzb2x2YWJsZTogRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5yZXNvbHZlKHJlc29sdmFibGUpO1xuICAgICAgcmV0dXJuIGNoYW5uZWw/LmlkO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuY2hhbm5lbDogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoY2hhbm5lbCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICdndWlsZCc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNWb2ljZUFkYXB0ZXJQcm94eSh0YXJnZXQuZ3VpbGQsIGNsaWVudCk7XG4gICAgICAgIGNhc2UgJ21lbWJlcnMnOlxuICAgICAgICAgIHJldHVybiAodGFyZ2V0IGFzIEVyaXMuVm9pY2VDaGFubmVsKS52b2ljZU1lbWJlcnM7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2VCYXNlZCc6XG4gICAgICAgICAgcmV0dXJuICgpID0+XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2UgfHxcbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShcbmd1aWxkOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBFcmlzLkNsaWVudClcbjogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCB7XG4gIGlmICghZ3VpbGQpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGd1aWxkLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICd2b2ljZUFkYXB0ZXJDcmVhdG9yJykge1xuICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IodGFyZ2V0LCBjbGllbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKFxuZ3VpbGQ6IEVyaXMuR3VpbGQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIHtcbiAgcmV0dXJuIChtZXRob2RzKSA9PiB7XG4gICAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gICAgaWYgKCFhZGFwdGVycykge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4oKTtcbiAgICAgIGFkYXB0ZXJzID0gY29sbGVjdGlvbjtcbiAgICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIGFkYXB0ZXJzLnNldChndWlsZC5pZCwgbWV0aG9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VuZFBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICBpZiAoZ3VpbGQuc2hhcmQuc3RhdHVzICE9PSAncmVhZHknKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGd1aWxkLnNoYXJkLnNlbmRXUyhwYXlsb2FkLm9wLCBwYXlsb2FkLmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBhZGFwdGVycy5kZWxldGUoZ3VpbGQuaWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVyaXNHdWlsZHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQuZ3VpbGRzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuTWVtYmVyIHx8XG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5Sb2xlKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLmd1aWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3VpbGQgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gZ3VpbGQ/LmlkO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNVc2Vyc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC51c2Vycywge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBmdW5jdGlvbiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLnVzZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNVc2VyUmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gdXNlcj8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn0iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBUcmFja1NvdXJjZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBPdXRPZlNwYWNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmlsdGVyLFxuICBjcmVhdGVTcG90aWZ5RmlsdGVyLFxuICBmaXhUcmFja1N1ZmZpeCxcbiAgcmVtb3ZlTGl2ZSxcbiAgcmVtb3ZlUmVtYXN0ZXJlZCxcbiAgeW91dHViZSxcbiAgcmVtb3ZlWmVyb1dpZHRoLFxuICByZXBsYWNlTmJzcCxcbiAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICByZW1vdmVDbGVhbkV4cGxpY2l0IH0gZnJvbVxuJ0B3ZWItc2Nyb2JibGVyL21ldGFkYXRhLWZpbHRlcic7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUeXBlID0gJ25vZGUnIHwgJ2Rlbm8nIHwgJ2J1bicgfCAndW5rbm93bic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAvKipcbiAgICogVGltZSBpbiBkYXlzXG4gICAqL1xuICBkYXlzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIGhvdXJzXG4gICAqL1xuICBob3VyczogbnVtYmVyO1xuICAvKipcbiAgICogVGltZSBpbiBtaW51dGVzXG4gICAqL1xuICBtaW51dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICovXG4gIHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lIHtcbiAgbmFtZTogUnVudGltZVR5cGU7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuY2xhc3MgVXRpbCB7XG4gIC8qKlxuICAgKiBVdGlsc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJ1bnRpbWUgaW5mb3JtYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRSdW50aW1lKCk6IFJ1bnRpbWUge1xuICAgIGNvbnN0IHZlcnNpb24gPVxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdkZW5vJywgdmVyc2lvbjogRGVuby52ZXJzaW9uLmRlbm8gfTtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBCdW4gIT09ICd1bmRlZmluZWQnICYmIEJ1bi52ZXJzaW9uKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4geyBuYW1lOiAnYnVuJywgdmVyc2lvbjogQnVuLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbilcbiAgICByZXR1cm4geyBuYW1lOiAnbm9kZScsIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbiB9O1xuXG4gICAgcmV0dXJuIHsgbmFtZTogJ3Vua25vd24nLCB2ZXJzaW9uOiB2ZXJzaW9uID8/ICd1bmtub3duJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZHVyYXRpb24gc3RyaW5nXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkdXJPYmogVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGR1cmF0aW9uU3RyaW5nKGR1ck9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGR1ck9iaikuXG4gICAgbWFwKChtKSA9PiBpc05hTihtKSA/IDAgOiBtKS5cbiAgICBqb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG1pbGxpc2Vjb25kcyB0byBjb25zdW1hYmxlIHRpbWUgb2JqZWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgVGhlIHRpbWUgaW4gbXNcbiAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlTVMobWlsbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICBpZiAoaXNOYU4obWlsbGlzZWNvbmRzKSkgbWlsbGlzZWNvbmRzID0gMDtcbiAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRheXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDg2NDAwMDAwKSxcbiAgICAgIGhvdXJzOiByb3VuZChtaWxsaXNlY29uZHMgLyAzNjAwMDAwKSAlIDI0LFxuICAgICAgbWludXRlczogcm91bmQobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICBzZWNvbmRzOiByb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKSAlIDYwXG4gICAgfSBhcyBUaW1lRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGltZSBjb2RlXG4gICAqIEBwYXJhbSB7VGltZURhdGF9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBidWlsZFRpbWVDb2RlKGR1cmF0aW9uOiBUaW1lRGF0YSkge1xuICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXMoZHVyYXRpb24pO1xuICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgY29uc3QgcGFyc2VkID0gaXRlbXMuXG4gICAgZmlsdGVyKCh4KSA9PiByZXF1aXJlZC5pbmNsdWRlcyh4KSkuXG4gICAgbWFwKChtKSA9PiBkdXJhdGlvblttIGFzIGtleW9mIFRpbWVEYXRhXSk7XG4gICAgY29uc3QgZmluYWwgPSBwYXJzZWQuXG4gICAgc2xpY2UocGFyc2VkLmZpbmRJbmRleCgoeCkgPT4geCAhPT0gMCkpLlxuICAgIG1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpLlxuICAgIGpvaW4oJzonKTtcblxuICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHN0YXRpYyBmb3JtYXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRUaW1lQ29kZSh0aGlzLnBhcnNlTVMoZHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAqIEBwYXJhbSB7YW55W119IGFyciBUaGUgYXJyYXlcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHN0YXRpYyBsYXN0PFQgPSBhbnk+KGFycjogVFtdKTogVCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG4gICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZvaWNlRW1wdHkoY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB0aGUgdHJhY2sgdGl0bGVcbiAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZVxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2VcbiAgICogQHJldHVybnMgQ2xlYW5lZCB0aXRsZVxuICAgKi9cbiAgc3RhdGljIGNsZWFuVGl0bGUodGl0bGU6IHN0cmluZywgc291cmNlOiBUcmFja1NvdXJjZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWx0ZXJPcHRzID0ge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdHJhY2s6IFtcbiAgICAgICAgcmVtb3ZlUmVtYXN0ZXJlZCxcbiAgICAgICAgcmVtb3ZlTGl2ZSxcbiAgICAgICAgZml4VHJhY2tTdWZmaXgsXG4gICAgICAgIHJlbW92ZVplcm9XaWR0aCxcbiAgICAgICAgcmVwbGFjZU5ic3AsXG4gICAgICAgIHJlcGxhY2VTbWFydFF1b3RlcyxcbiAgICAgICAgcmVtb3ZlQ2xlYW5FeHBsaWNpdF1cblxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNwb3RpZnlGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG4gICAgICBzcG90aWZ5RmlsdGVyLmV4dGVuZChjcmVhdGVTcG90aWZ5RmlsdGVyKCkpO1xuICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcblxuICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSAneW91dHViZSc6XG4gICAgICAgICAgcmV0dXJuIHlvdXR1YmUodGl0bGUpO1xuICAgICAgICBjYXNlICdzcG90aWZ5JzpcbiAgICAgICAgICByZXR1cm4gc3BvdGlmeUZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlciByZXF1aXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBOb2RlIHJlcXVpcmUgaWRcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHN0YXRpYyByZXF1aXJlKGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiByZXF1aXJlKGlkKSwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBpbXBvcnQoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgaW4gbXMgdG8gd2FpdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIHN0YXRpYyB3YWl0KHRpbWU6IG51bWJlcikge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KHRpbWUsIHVuZGVmaW5lZCwgeyByZWY6IGZhbHNlIH0pO1xuICB9XG5cbiAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBhc3luYyBnZXRGZXRjaCgpIHtcbiAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBbJ25vZGUtZmV0Y2gnLCAndW5kaWNpJ10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKFxuICAgICAgICAgIChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICBpZiAocmVzKSByZXR1cm4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdDtcbiAgICAgICAgfSBjYXRjaCB7XG5cbiAgICAgICAgICAvLyBubz9cbiAgICAgICAgfX1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIGNvZGUgPSAnRGVwcmVjYXRpb25XYXJuaW5nJywgZGV0YWlsPzogc3RyaW5nKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICBjb2RlLFxuICAgICAgZGV0YWlsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmFuZG9tQ2hvaWNlPFQ+KHNyYzogVFtdKTogVCB7XG4gICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICB9XG5cbiAgc3RhdGljIGFycmF5Q2xvbmVTaHVmZmxlPFQ+KHNyYzogVFtdKTogVFtdIHtcbiAgICBjb25zdCBhcnIgPSBzcmMuc2xpY2UoKTtcblxuICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChtKSB7XG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbS0tKTtcbiAgICAgIFthcnJbbV0sIGFycltpXV0gPSBbYXJyW2ldLCBhcnJbbV1dO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1FVRVVFX0NBUCA9IChcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuaXRlbXM6IFBsYXlsaXN0IHwgVHJhY2sgfCBUcmFja1tdIHwgbnVtYmVyKSA9Plxue1xuICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICBjb25zdCB0cmFja3MgPVxuICB0eXBlb2YgaXRlbXMgPT09ICdudW1iZXInID9cbiAgaXRlbXMgOlxuICAoaXRlbXMgaW5zdGFuY2VvZiBQbGF5bGlzdCA/XG4gIGl0ZW1zLnRyYWNrcyA6XG4gIEFycmF5LmlzQXJyYXkoaXRlbXMpID9cbiAgaXRlbXMgOlxuICBbaXRlbXNdKS5cbiAgbGVuZ3RoO1xuXG4gIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgaWYgKG1heENhcCA8IHRyYWNrcykge1xuICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXJyb3IoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9OyIsICJpbXBvcnQge1xuICBVc2VyLFxuICBlc2NhcGVNYXJrZG93bixcbiAgU25vd2ZsYWtlVXRpbCxcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBBUElVc2VyIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHtcbiAgUGxheWVyLFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsXG4gIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tXG4nLi4vUGxheWVyJztcbmltcG9ydCB7IFBsYXlsaXN0LCBQbGF5bGlzdEpTT04gfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZS9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IEF1ZGlvUmVzb3VyY2UgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgbWV0YWRhdGE6IE07XG4gIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYWNrID0gUmV0dXJuVHlwZTxUcmFja1snc2VyaWFsaXplJ10+O1xuXG4vKipcbiAqIFRoZSB0cmFjayBzb3VyY2U6XG4gKiAtIHNvdW5kY2xvdWRcbiAqIC0geW91dHViZVxuICogLSBzcG90aWZ5XG4gKiAtIGFwcGxlX211c2ljXG4gKiAtIGFyYml0cmFyeVxuICovXG5leHBvcnQgdHlwZSBUcmFja1NvdXJjZSA9XG4nc291bmRjbG91ZCcgfFxuJ3lvdXR1YmUnIHxcbidzcG90aWZ5JyB8XG4nYXBwbGVfbXVzaWMnIHxcbidhcmJpdHJhcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhd1RyYWNrRGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3RcbiAgICovXG4gIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlXG4gICAqL1xuICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBlbmdpbmVcbiAgICovXG4gIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIC8qKlxuICAgKiBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAgICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJhdyBkYXRhXG4gICAqL1xuICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogVGhlIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbiAgLyoqXG4gICAqIFRoZSBzZXJpYWxpemVkIHRpdGxlXG4gICAqL1xuICBjbGVhblRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB2aWV3c1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgcmF3OiBhbnk7XG4gIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG4gIHB1YmxpYyBjbGVhblRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBicmlkZ2VkRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBicmlkZ2VkVHJhY2s6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pXG4gIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sXG4gICAgICBkYXRhLnJhdyA/PyBkYXRhXG4gICAgKTtcbiAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPVxuICAgIGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPVxuICAgIGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGF1ZGlvIHJlc291cmNlIGZvciB0aGlzIHRyYWNrLiBUaGlzIGlzIG5vdCB1c2VmdWwgb3V0c2lkZSBvZiB0aGUgbGlicmFyeS5cbiAgICogQHBhcmFtIHJlc291cmNlIEF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgc2V0UmVzb3VyY2UocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbCkge1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2UgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICB0aGlzLnNldE1ldGFkYXRhKHJlcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maW5kKChxKSA9PlxuICAgIHEudHJhY2tzLnNvbWUoKGFiKSA9PiBhYi5pZCA9PT0gdGhpcy5pZClcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWVzID0gKG46IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgdG4gPSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0OyBpKyspIHRuICo9IG47XG4gICAgICByZXR1cm4gdCA8PSAwID8gMTAwMCA6IHRuICogMTAwMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZHVyYXRpb24uXG4gICAgc3BsaXQoJzonKS5cbiAgICByZXZlcnNlKCkuXG4gICAgbWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSkuXG4gICAgcmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29yZCBoeXBlcmxpbmsgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnRpdGxlfV0oJHt0aGlzLnVybH0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNvdXJjZSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXcgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgfSBhcyBUcmFja0pTT047XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplZCB0cmFjayBkYXRhIHRoYXQgY2FuIGJlIHJlY29uc3RydWN0ZWRcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID9cbiAgICAgIHRoaXMudGh1bWJuYWlsIDpcbiAgICAgIHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICB2aWV3czogdGhpcy52aWV3cyA/PyAwLFxuICAgICAgcmVxdWVzdGVkX2J5OiB0aGlzLnJlcXVlc3RlZEJ5Py50b0pTT04oKSA/PyBudWxsLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgcXVlcnlfdHlwZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyID8/IG51bGwsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICR0eXBlOiBTZXJpYWxpemVkVHlwZS5UcmFjayxcbiAgICAgICRlbmNvZGVyX3ZlcnNpb246IHRoaXMucGxheWVyLnZlcnNpb25cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChcbiAgcGxheWVyOiBQbGF5ZXIsXG4gIGRhdGE6IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPilcbiAge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5UcmFjaylcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkVHJhY2snLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2socGxheWVyLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkX2J5ID9cbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGRhdGEucmVxdWVzdGVkX2J5IGFzIEFQSVVzZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwbGF5ZXIuY2xpZW50LnVzZXJzLnJlc29sdmUocmVzLmlkKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICBpZiAocGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5oYXMocmVzLmlkKSlcbiAgICAgICAgICByZXR1cm4gcGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5nZXQocmVzLmlkKSE7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcihwbGF5ZXIuY2xpZW50LCByZXMpO1xuICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSkoKSA6XG4gICAgICBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBkYXRhLnF1ZXJ5X3R5cGUgPz8gdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cmFjay5zZXRNZXRhZGF0YShkYXRhLm1ldGFkYXRhKTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYmVsb25naW5nIHF1ZXVlcyBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmlsdGVyKChub2RlKSA9PlxuICAgIG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpXG4gICAgKTtcblxuICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGVzO1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiB0aGlzLnRpbWVzdGFtcFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE91dE9mU3BhY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfU1BBQ0UsXG4gICAgICBgTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmdUeXBlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgICAgIGBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1JFU1VMVCwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9JTVBMRU1FTlRFRCwgYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEV4aXN0aW5nRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElORywgYCR7dGFyZ2V0fSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlJhbmdlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWluaW11bTogc3RyaW5nLCBtYXhpbXVtOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX09VVF9PRl9SQU5HRSxcbiAgICAgIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWluaW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTixcbiAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICdObyB2b2ljZSBjb25uZWN0aW9uIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCxcbiAgICAgICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vVm9pY2VDaGFubmVsRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19WT0lDRV9DSEFOTkVMLCAnQ291bGQgbm90IGdldCB0aGUgdm9pY2UgY2hhbm5lbCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVm9pY2VDaGFubmVsRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwsICdFeHBlY3RlZCBhIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZWNlaXZlckVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fUkVDRUlWRVIsXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgcmVjZWl2ZXIgaXMgYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRkZtcGVnRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9GRk1QRUdfTE9DQVRPUiwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vQXVkaW9SZXNvdXJjZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fQVVESU9fUkVTT1VSQ0UsXG4gICAgICBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZSdcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0d1aWxkUXVldWVFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19HVUlMRF9RVUVVRSwgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0d1aWxkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTEQsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5mb1JlcXVpcmVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgYWN0dWFsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lORk9fUkVRVUlSRUQsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9LCBmb3VuZCBcIiR7YWN0dWFsfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfU0VSSUFMSVpBVElPTl9GQUlMRUQsXG4gICAgICBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlc2VyaWFsaXphdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBkZXNlcmlhbGl6ZSB0aGlzIGRhdGFcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OLFxuICAgICAgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZGVzY3JpcHRpb24gPSAnJykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9UX0VYSVNUSU5HX01PRFVMRSxcbiAgICAgIGAke3RhcmdldH0gbW9kdWxlIGRvZXMgbm90IGV4aXN0LiBJbnN0YWxsIGl0IHdpdGggXFxgbnBtIGluc3RhbGwgJHt0YXJnZXR9XFxgLiR7XG4gICAgICBkZXNjcmlwdGlvbiA/ICcgJyArIGRlc2NyaXB0aW9uIDogJyd9YFxuXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnJpZGdlRmFpbGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nIHwgbnVsbCwgZXJyb3I6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfQlJJREdFX0ZBSUxFRCxcbiAgICAgIGAke1xuICAgICAgaWQgPyBgKEV4dHJhY3RvciBFeGVjdXRpb24gQ29udGV4dCBJRCBpcyAke2lkfSlgIDogJyd9RmFpbGVkIHRvIGJyaWRnZSB0aGlzIHF1ZXJ5OlxcbiR7XG4gICAgICBlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0ge1xuICBFUlJfT1VUX09GX1NQQUNFOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBFUlJfTk9fUkVTVUxUOiAnRVJSX05PX1JFU1VMVCcsXG4gIEVSUl9OT1RfSU1QTEVNRU5URUQ6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgRVJSX05PVF9FWElTVElORzogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICBFUlJfT1VUX09GX1JBTkdFOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiAnRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04nLFxuICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDogJ0VSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwnLFxuICBFUlJfTk9fUkVDRUlWRVI6ICdFUlJfTk9fUkVDRUlWRVInLFxuICBFUlJfRkZNUEVHX0xPQ0FUT1I6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6ICdFUlJfTk9fQVVESU9fUkVTT1VSQ0UnLFxuICBFUlJfTk9fR1VJTERfUVVFVUU6ICdFUlJfTk9fR1VJTERfUVVFVUUnLFxuICBFUlJfTk9fR1VJTEQ6ICdFUlJfTk9fR1VJTEQnLFxuICBFUlJfSU5GT19SRVFVSVJFRDogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgRVJSX1NFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gIEVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFOiAnRVJSX05PVF9FWElTVElOR19NT0RVTEUnLFxuICBFUlJfQlJJREdFX0ZBSUxFRDogJ0VSUl9CUklER0VfRkFJTEVEJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlcyA9ICh0eXBlb2YgRXJyb3JDb2Rlcylba2V5b2YgdHlwZW9mIEVycm9yQ29kZXNdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgZXJyb3IgaW5zdGFuY2VvZiBEaXNjb3JkUGxheWVyRXJyb3I7XG59XG5cbi8qKlxuICogSGFuZGxlIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAgZXJyb3IuXG4gKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGhhbmRsZVxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZXJyb3IgaXMgYSBgRGlzY29yZFBsYXllckVycm9yYC5cbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgaGFuZGxlclxuICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgLy8gLi4uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcihlcnJvciwgKGVycm9yKSA9PiB7XG4gKiAgICBjb25zb2xlLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBmcm9tIGRpc2NvcmQtcGxheWVyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gKiAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcjxcbiAgVCBleHRlbmRzIGFueVtdLFxuICBGIGV4dGVuZHMgKGVycm9yOiBEaXNjb3JkUGxheWVyRXJyb3IsIC4uLmFyZ3M6IFQpID0+IGFueSxcbiAgUiBleHRlbmRzIFJldHVyblR5cGU8Rj4+KFxuZXJyb3I6IGFueSwgaGFuZGxlcjogRiwgYXJnczogVCk6IFIge1xuICBpZiAoaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIoZXJyb3IsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkIGFzIFI7XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyIsICJpbXBvcnQgeyBEaXNjb3JkUGxheWVyRXJyb3IsIGlzRGlzY29yZFBsYXllckVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gVHlwZVV0aWw7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdCA9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRGlzY29yZFBsYXllckVycm9yKHQ6IHVua25vd24pOiB0IGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gICAgcmV0dXJuIGlzRGlzY29yZFBsYXllckVycm9yKHQpO1xuICB9XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRGVzZXJpYWxpemF0aW9uRXJyb3IsIFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBQbGF5bGlzdCxcbiAgdHlwZSBTZXJpYWxpemVkVHJhY2ssXG4gIFRyYWNrLFxuICBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tXG4nLi4vZmFicmljJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuZXhwb3J0IGVudW0gU2VyaWFsaXplZFR5cGUge1xuICBUcmFjayA9ICd0cmFjaycsXG4gIFBsYXlsaXN0ID0gJ3BsYXlsaXN0Jyxcbn1cblxuZXhwb3J0IHR5cGUgRW5jb2RhYmxlID0gU2VyaWFsaXplZFRyYWNrIHwgU2VyaWFsaXplZFBsYXlsaXN0O1xuXG5jb25zdCBpc1RyYWNrID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFRyYWNrID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5UcmFjaztcbmNvbnN0IGlzUGxheWxpc3QgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkUGxheWxpc3QgPT5cbmRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBUcmFjaykgcmV0dXJuIGRhdGEuc2VyaWFsaXplKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gIGlmIChpc1BsYXlsaXN0KGRhdGEpKSByZXR1cm4gUGxheWxpc3QuZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcblxuICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXJyb3IoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiBFbmNvZGFibGUpIHtcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICBjb25zdCBzdHIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHtcbiAgUGxheWVyLFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsXG4gIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tXG4nLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBsYXlsaXN0ID0gUmV0dXJuVHlwZTxQbGF5bGlzdFsnc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAvKipcbiAgICogVGhlIHRyYWNrcyBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICB0cmFja3M6IFRyYWNrW107XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3Qgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICAgKi9cbiAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAqL1xuICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICovXG4gIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICAgKi9cbiAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgcHVibGljIGF1dGhvcjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAvKipcbiAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyXG4gICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAqL1xuICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgKiAtIGBhbGJ1bWBcbiAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICogLSBgeW91dHViZWBcbiAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAqL1xuICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW11cbiAgICB9O1xuXG4gICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICByZXR1cm4gcGF5bG9hZCBhcyBQbGF5bGlzdEpTT047XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgcGxheWxpc3QgaW50byByZWNvbnN0cnVjdGFibGUgZGF0YVxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID9cbiAgICAgIHRoaXMudGh1bWJuYWlsIDpcbiAgICAgIHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuUGxheWxpc3QsXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2RhdGEnLFxuICAgICAgJ1NlcmlhbGl6ZWRQbGF5bGlzdCcsXG4gICAgICAnbWFsZm9ybWVkIGRhdGEnXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHRyYWNrczogZGF0YS50cmFja3MubWFwKChtKSA9PiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIG0pKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHBsYXlsaXN0IHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW5mb1JlcXVpcmVkRXJyb3IsIEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzp0cmFja1xcL3xcXD91cmk9c3BvdGlmeTp0cmFjazopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5UGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9XG4vXihodHRwfGh0dHBzKT86XFwvXFwvKHd3d1xcLnxwbGF5ZXJcXC4pP3ZpbWVvXFwuY29tXFwvKD86Y2hhbm5lbHNcXC8oPzpcXHcrXFwvKT98Z3JvdXBzXFwvKFteL10qKVxcL3ZpZGVvc1xcL3x2aWRlb1xcL3wpKFxcZCspKD86fFxcL1xcPykkLztcbmNvbnN0IHJldmVyYm5hdGlvblJlZ2V4ID1cbi9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvcGxheWxpc3RcXC8uK1xcL3BsXFwuKHUtfHBtLSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvc2V0c1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHlvdXR1YmVQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPVxuL14oKD86aHR0cHM/Oik/XFwvXFwvKT8oKD86d3d3fG0pXFwuKT8oKD86eW91dHViZVxcLmNvbXx5b3V0dS5iZSkpKFxcLyg/OltcXHctXStcXD92PXxlbWJlZFxcL3x2XFwvKT8pKFtcXHctXSspKFxcUyspPyQvO1xuY29uc3QgeW91dHViZVZpZGVvSWRSZWdleCA9IC9eW2EtekEtWjAtOS1fXXsxMX0kLztcbi8vIGRpc2NvcmQtcGxheWVyOi8vYmxvYi91dWlkLXY0XG5jb25zdCBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4ID0gL15kaXNjb3JkLXBsYXllcjpcXC9cXC9ibG9iXFwvXFxkKyQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gIERpc2NvcmRQbGF5ZXI6IFsnZGlzY29yZC1wbGF5ZXInXSxcbiAgWW91VHViZTogW1xuICAneW91dHViZS5jb20nLFxuICAneW91dHUuYmUnLFxuICAnbXVzaWMueW91dHViZS5jb20nLFxuICAnZ2FtaW5nLnlvdXR1YmUuY29tJyxcbiAgJ3d3dy55b3V0dWJlLmNvbScsXG4gICdtLnlvdXR1YmUuY29tJ10sXG5cbiAgU3BvdGlmeTogWydvcGVuLnNwb3RpZnkuY29tJywgJ2VtYmVkLnNwb3RpZnkuY29tJ10sXG4gIFZpbWVvOiBbJ3ZpbWVvLmNvbScsICdwbGF5ZXIudmltZW8uY29tJ10sXG4gIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gIFNvdW5kQ2xvdWQ6IFsnc291bmRjbG91ZC5jb20nXSxcbiAgQXBwbGVNdXNpYzogWydtdXNpYy5hcHBsZS5jb20nXVxufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCByZWRpcmVjdERvbWFpbnMgPSBuZXcgU2V0KFtcbi9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkubGlua1xcL1tBLVphLXowLTldKyQvLFxuL15odHRwczpcXC9cXC9vblxcLnNvdW5kY2xvdWRcXC5jb21cXC9bYS16QS1aMS05XXswLDE3fSQvXVxuKTtcblxuLyoqXG4gKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAqIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gQVVUT1xuICogLSBZT1VUVUJFXG4gKiAtIFlPVVRVQkVfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRF9UUkFDS1xuICogLSBTT1VORENMT1VEX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURcbiAqIC0gU1BPVElGWV9TT05HXG4gKiAtIFNQT1RJRllfQUxCVU1cbiAqIC0gU1BPVElGWV9QTEFZTElTVFxuICogLSBTUE9USUZZX1NFQVJDSFxuICogLSBGQUNFQk9PS1xuICogLSBWSU1FT1xuICogLSBBUkJJVFJBUllcbiAqIC0gUkVWRVJCTkFUSU9OXG4gKiAtIFlPVVRVQkVfU0VBUkNIXG4gKiAtIFlPVVRVQkVfVklERU9cbiAqIC0gU09VTkRDTE9VRF9TRUFSQ0hcbiAqIC0gQVBQTEVfTVVTSUNfU09OR1xuICogLSBBUFBMRV9NVVNJQ19BTEJVTVxuICogLSBBUFBMRV9NVVNJQ19QTEFZTElTVFxuICogLSBBUFBMRV9NVVNJQ19TRUFSQ0hcbiAqIC0gRklMRVxuICogLSBBVVRPX1NFQVJDSFxuICogLSBESVNDT1JEX1BMQVlFUl9CTE9CXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgQVVUTzogJ2F1dG8nLFxuICBZT1VUVUJFOiAneW91dHViZScsXG4gIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICBTT1VORENMT1VEX1RSQUNLOiAnc291bmRjbG91ZFRyYWNrJyxcbiAgU09VTkRDTE9VRF9QTEFZTElTVDogJ3NvdW5kY2xvdWRQbGF5bGlzdCcsXG4gIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgU1BPVElGWV9TT05HOiAnc3BvdGlmeVNvbmcnLFxuICBTUE9USUZZX0FMQlVNOiAnc3BvdGlmeUFsYnVtJyxcbiAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gIFNQT1RJRllfU0VBUkNIOiAnc3BvdGlmeVNlYXJjaCcsXG4gIEZBQ0VCT09LOiAnZmFjZWJvb2snLFxuICBWSU1FTzogJ3ZpbWVvJyxcbiAgQVJCSVRSQVJZOiAnYXJiaXRyYXJ5JyxcbiAgUkVWRVJCTkFUSU9OOiAncmV2ZXJibmF0aW9uJyxcbiAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgWU9VVFVCRV9WSURFTzogJ3lvdXR1YmVWaWRlbycsXG4gIFNPVU5EQ0xPVURfU0VBUkNIOiAnc291bmRjbG91ZFNlYXJjaCcsXG4gIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gIEFQUExFX01VU0lDX0FMQlVNOiAnYXBwbGVNdXNpY0FsYnVtJyxcbiAgQVBQTEVfTVVTSUNfUExBWUxJU1Q6ICdhcHBsZU11c2ljUGxheWxpc3QnLFxuICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgRklMRTogJ2ZpbGUnLFxuICBBVVRPX1NFQVJDSDogJ2F1dG9TZWFyY2gnLFxuICBESVNDT1JEX1BMQVlFUl9CTE9COiAnZGlzY29yZFBsYXllckJsb2InXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWVyeVR5cGUgPSAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG5cbmV4cG9ydCB0eXBlIFNlYXJjaFF1ZXJ5VHlwZSA9IGtleW9mIHR5cGVvZiBRdWVyeVR5cGUgfCBRdWVyeVR5cGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRRdWVyeSB7XG4gIHR5cGU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbiAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBRdWVyeSByZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3BvdGlmeUFsYnVtUmVnZXgsXG4gICAgICBzcG90aWZ5UGxheWxpc3RSZWdleCxcbiAgICAgIHNwb3RpZnlTb25nUmVnZXgsXG4gICAgICB2aW1lb1JlZ2V4LFxuICAgICAgcmV2ZXJibmF0aW9uUmVnZXgsXG4gICAgICBhdHRhY2htZW50UmVnZXgsXG4gICAgICBhcHBsZU11c2ljQWxidW1SZWdleCxcbiAgICAgIGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY1NvbmdSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRUcmFja1JlZ2V4LFxuICAgICAgc291bmRjbG91ZFBsYXlsaXN0UmVnZXgsXG4gICAgICB5b3V0dWJlUGxheWxpc3RSZWdleCxcbiAgICAgIGRpc2NvcmRQbGF5ZXJCbG9iUmVnZXhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1yZXNvbHZlIHJlZGlyZWN0IHVybHNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdydcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgIC8vIHNwb3RpZnkgZG9lcyBub3QgXCJyZWRpcmVjdFwiLCBpdCByZXR1cm5zIGEgcGFnZSB3aXRoIGpzIHRoYXQgcmVkaXJlY3RzXG4gICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LlxuICAgICAgICAgICAgc3BsaXQoJ2h0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8nKVsxXS5cbiAgICAgICAgICAgIHNwbGl0KCc/c2k9JylbMF07XG5cbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSBicmVhaztcblxuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJHt0YXJnZXR9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1heERlcHRoIDwgMSA/XG4gICAgICAgICAgcmVzLnVybCA6XG4gICAgICAgICAgdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgKi9cbiAgc3RhdGljIHJlc29sdmUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpXG4gIDogUmVzb2x2ZWRRdWVyeSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgIGlmICghcXVlcnkubGVuZ3RoKSB0aHJvdyBuZXcgSW5mb1JlcXVpcmVkRXJyb3IoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG5cbiAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgcXVlcnlcbiAgICB9KTtcblxuICAgIGlmIChkaXNjb3JkUGxheWVyQmxvYlJlZ2V4LnRlc3QocXVlcnkpKVxuICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQiwgcXVlcnkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocXVlcnkpO1xuXG4gICAgICBpZiAoRG9tYWluc01hcC5Zb3VUdWJlLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGxheWxpc3RJZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndicpO1xuICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgIGlmICh2aWRlb0lkICYmIHBsYXlsaXN0SWQuc3RhcnRzV2l0aCgnUkQnKSlcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoXG4gICAgICAgICAgICBRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCxcbiAgICAgICAgICAgIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PSR7dmlkZW9JZH0mbGlzdD0ke3BsYXlsaXN0SWR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVJZChxdWVyeSkgfHwgUXVlcnlSZXNvbHZlci52YWxpZGF0ZVVSTChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9WSURFTywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL2ludGwtKFthLXpBLVpdKylcXC8vLCAnJyk7XG4gICAgICAgIGlmIChzcG90aWZ5UGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfU09ORywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5WaW1lby5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuUmV2ZXJiTmF0aW9uLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAocmV2ZXJibmF0aW9uUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuUkVWRVJCTkFUSU9OLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkVHJhY2tSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1RSQUNLLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChhcHBsZU11c2ljQWxidW1SZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVJCSVRSQVJZLCBxdWVyeSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXRWaW1lb0lEKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gP1xuICAgIHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDpcbiAgICBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVVSTChxOiBzdHJpbmcpIHtcbiAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgfVxufVxuXG5leHBvcnQgeyBRdWVyeVJlc29sdmVyIH07IiwgImltcG9ydCB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFF1ZXJ5VHlwZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0RGF0YSB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgZXh0cmFjdG9yPzogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M/OiBUcmFja1tdO1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRoaXMgcGxheSB3YXMgdHJpZ2dlcmVkIGZvciBmaWx0ZXJzIHVwZGF0ZVxuICAgKi9cbiAgZmlsdGVyc1VwZGF0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgKi9cbiAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRpbWUgdG8gc2VlayB0byBiZWZvcmUgcGxheWluZ1xuICAgKi9cbiAgc2Vlaz86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICAgKi9cbiAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXJSZXNvbHZhYmxlO1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHNlYXJjaCBlbmdpbmUsIGNhbiBiZSBleHRyYWN0b3IgbmFtZSB0byB0YXJnZXQgc3BlY2lmaWMgb25lIChjdXN0b20pXG4gICAqL1xuICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdGhlIGV4dHJhY3RvcnMgdG8gYmxvY2tcbiAgICovXG4gIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICovXG4gIGlnbm9yZUNhY2hlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXF1ZXN0T3B0aW9ucz86IGFueTtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAqL1xuICBmYWxsYmFja1NlYXJjaEVuZ2luZT86ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwcml2YXRlIF9kYXRhOiBTZWFyY2hSZXN1bHREYXRhKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRRdWVyeVR5cGUodHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2gpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UmVxdWVzdGVkQnkodXNlcjogVXNlcikge1xuICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldEV4dHJhY3RvcihleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpIHtcbiAgICB0aGlzLl9kYXRhLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3MgPSB0cmFja3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGEucXVlcnkgPSBxdWVyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICB0aGlzLl9kYXRhLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4dHJhY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5bGlzdCByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucGxheWxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIHJlc3VsdFxuICAgKi9cbiAgcHVibGljIGdldCB0cmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RlZCBieVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1ZXN0ZWRCeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWV4ZWN1dGUgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5zZWFyY2godGhpcy5xdWVyeSwge1xuICAgICAgc2VhcmNoRW5naW5lOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5IVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLnRyYWNrcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGhhc1BsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBoYXNUcmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlcnk6IHRoaXMucXVlcnksXG4gICAgICBxdWVyeVR5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgcGxheWxpc3Q6IHRoaXMucGxheWxpc3Q/LnRvSlNPTihmYWxzZSkgfHwgbnVsbCxcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSksXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8IG51bGwsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgfHwgbnVsbFxuICAgIH07XG4gIH1cbn0iLCAiZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbi8qKlxuICogUmVwcmVzZW50cyBGRm1wZWcgZmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlRmlsdGVycyB7XG4gIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICBiYXNzYm9vc3Q/OiBib29sZWFuO1xuICBiYXNzYm9vc3RfaGlnaD86IGJvb2xlYW47XG4gICc4RCc/OiBib29sZWFuO1xuICB2YXBvcndhdmU/OiBib29sZWFuO1xuICBuaWdodGNvcmU/OiBib29sZWFuO1xuICBwaGFzZXI/OiBib29sZWFuO1xuICB0cmVtb2xvPzogYm9vbGVhbjtcbiAgdmlicmF0bz86IGJvb2xlYW47XG4gIHJldmVyc2U/OiBib29sZWFuO1xuICB0cmVibGU/OiBib29sZWFuO1xuICBub3JtYWxpemVyPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICBzdXJyb3VuZGluZz86IGJvb2xlYW47XG4gIHB1bHNhdG9yPzogYm9vbGVhbjtcbiAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICBrYXJhb2tlPzogYm9vbGVhbjtcbiAgZmxhbmdlcj86IGJvb2xlYW47XG4gIGdhdGU/OiBib29sZWFuO1xuICBoYWFzPzogYm9vbGVhbjtcbiAgbWNvbXBhbmQ/OiBib29sZWFuO1xuICBtb25vPzogYm9vbGVhbjtcbiAgbXN0bHI/OiBib29sZWFuO1xuICBtc3Rycj86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICBleHBhbmRlcj86IGJvb2xlYW47XG4gIHNvZnRsaW1pdGVyPzogYm9vbGVhbjtcbiAgY2hvcnVzPzogYm9vbGVhbjtcbiAgY2hvcnVzMmQ/OiBib29sZWFuO1xuICBjaG9ydXMzZD86IGJvb2xlYW47XG4gIGZhZGVpbj86IGJvb2xlYW47XG4gIGRpbT86IGJvb2xlYW47XG4gIGVhcnJhcGU/OiBib29sZWFuO1xuICBsb2ZpPzogYm9vbGVhbjtcbiAgc2lsZW5jZXJlbW92ZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZpbHRlcnM6IFJlY29yZDxGaWx0ZXJzTmFtZSwgc3RyaW5nPiA9IHtcbiAgICBiYXNzYm9vc3RfbG93OiBiYXNzKDE1KSxcbiAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgIGJhc3Nib29zdF9oaWdoOiBiYXNzKDMwKSxcbiAgICAnOEQnOiAnYXB1bHNhdG9yPWh6PTAuMDknLFxuICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgIG5pZ2h0Y29yZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCoxLjI1JyxcbiAgICBsb2ZpOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOSxleHRyYXN0ZXJlbz1tPTIuNTpjPWRpc2FibGVkJyxcbiAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICB0cmVtb2xvOiAndHJlbW9sbycsXG4gICAgdmlicmF0bzogJ3ZpYnJhdG89Zj02LjUnLFxuICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgdHJlYmxlOiAndHJlYmxlPWc9NScsXG4gICAgbm9ybWFsaXplcjI6ICdkeW5hdWRub3JtPWc9MTAxJyxcbiAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgIHN1cnJvdW5kaW5nOiAnc3Vycm91bmQnLFxuICAgIHB1bHNhdG9yOiAnYXB1bHNhdG9yPWh6PTEnLFxuICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICBrYXJhb2tlOiAnc3RlcmVvdG9vbHM9bWxldj0wLjAzJyxcbiAgICBmbGFuZ2VyOiAnZmxhbmdlcicsXG4gICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICBoYWFzOiAnaGFhcycsXG4gICAgbWNvbXBhbmQ6ICdtY29tcGFuZCcsXG4gICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICBtc3RscjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+bHInLFxuICAgIG1zdHJyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5ycicsXG4gICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgZXhwYW5kZXI6XG4gICAgJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTE2OXwtNTQvLTgwfC00OS41Ly02NC42fC00MS4xLy00MS4xfC0yNS44Ly0xNXwtMTAuOC8tNC41fDAvMHwyMC84LjMnLFxuICAgIHNvZnRsaW1pdGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCcsXG4gICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJ1xuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8e1xuICAgIG5hbWU6IEZpbHRlcnNOYW1lO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG5hbWVzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogKEsgfCBzdHJpbmcpW10pIHtcbiAgICBpZiAoIWZpbHRlcnMgfHwgIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGZpbHRlcnMuXG4gICAgZmlsdGVyKChwcmVkaWNhdGUpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKS5cbiAgICBtYXAoKG0pID0+IHRoaXMuZ2V0KG0gYXMgSykpLlxuICAgIGpvaW4oJywnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsdGVyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmaW5lKGZpbHRlck5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgKiBAcGFyYW0gZmlsdGVyc0FycmF5IEFycmF5IG9mIGZpbHRlcnMgY29udGFpbmluZyB0aGUgZmlsdGVyIG5hbWUgYW5kIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7bmFtZTogc3RyaW5nO3ZhbHVlOiBzdHJpbmc7fVtdKSB7XG4gICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICB9XG59IiwgImltcG9ydCB7IERlZmF1bHRMaXN0ZW5lciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBMaXN0ZW5lclNpZ25hdHVyZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFxuICBMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHNcbkV2ZW50RW1pdHRlcjxMPiB7XG4gICNoYXNEZWJ1Z2dlciA9IGZhbHNlO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLm9mZihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgIGlmIChcbiAgICB0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgIXRoaXMuZXZlbnROYW1lcygpLmluY2x1ZGVzKG5hbWUpKVxuICAgIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICBgTm8gZXZlbnQgbGlzdGVuZXIgZm91bmQgZm9yIGV2ZW50IFwiJHtTdHJpbmcoXG4gICAgICAgICAgbmFtZVxuICAgICAgICApfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLlxuICAgICAgICBtYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYCkuXG4gICAgICAgIGpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5lbWl0KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICByZXR1cm4gdGhpcy4jaGFzRGVidWdnZXI7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFBsYXllckV2ZW50cyB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuUmVhZGFibGUgfFxuc3RyaW5nIHxcbntcbiAgJGZtdDogc3RyaW5nO1xuICBzdHJlYW06IFJlYWRhYmxlO1xufTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWRlbnRpZmllciA9ICdjb20uZGlzY29yZC1wbGF5ZXIuZXh0cmFjdG9yJztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgKi9cbiAgcHVibGljIHByaW9yaXR5ID0gMTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHF1ZXJ5IHByb3RvY29scyB0aGF0IHRoaXMgZXh0cmFjdG9yIHN1cHBvcnRzLlxuICAgKi9cbiAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogSGFuZGxlIGJyaWRnZSBxdWVyeSBjcmVhdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUJyaWRnZVF1ZXJ5ID0gKHRyYWNrOiBUcmFjaykgPT5cbiAgYCR7dHJhY2sudGl0bGV9IGJ5ICR7dHJhY2suYXV0aG9yfSBvZmZpY2lhbCBhdWRpb2A7XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBwdWJsaWMgb3B0aW9uczogVCA9IDxUPiB7fSlcbiAge31cblxuICAvKipcbiAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG5ldyBvcHRpb25zIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgYXdhaXQgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKFxuICBxdWVyeTogc3RyaW5nLFxuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbClcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2b2lkIHR5cGU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIGluZm8gVGhlIHRyYWNrIHRvIHN0cmVhbVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZT4ge1xuICAgIHZvaWQgaW5mbztcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnN0cmVhbSgpYCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIGhhbmRsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dClcbiAgOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIGNvbnRleHQ7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyhcbiAgdHJhY2s6IFRyYWNrLFxuICBoaXN0b3J5OiBHdWlsZFF1ZXVlSGlzdG9yeSlcbiAgOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIHRyYWNrO1xuICAgIHZvaWQgaGlzdG9yeTtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgKiBAcGFyYW0gbmV4dCBUaGUgbmV4dCBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGRhdGEgdG8gZGlzcGF0Y2hcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KVxuICB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UoXG4gIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLFxuICB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKVxuICA6IEV4dHJhY3RvckluZm8ge1xuICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZGVidWcobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgKi9cbiAgcHVibGljIGdldCBzdXBwb3J0c0RlbXV4KCkge1xuICAgIHJldHVybiAhIXRoaXMuY29udGV4dC5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdHJlYW0gZXh0cmFjdGlvbiBmb3IgYW5vdGhlciBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBicmlkZ2VcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJyaWRnZShcbiAgdHJhY2s6IFRyYWNrLFxuICBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsKVxuICA6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGw+IHtcbiAgICB2b2lkIHNvdXJjZUV4dHJhY3RvcjtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2VhcmNoQ29udGV4dCB7XG4gIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICByZXF1ZXN0T3B0aW9ucz86IFJlcXVlc3RPcHRpb25zO1xuICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59IiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IsIEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vaG9va3MnO1xuaW1wb3J0IHsgQnJpZGdlRmFpbGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlc3Npb24ge1xuICBpZDogc3RyaW5nO1xuICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBTZXQ8c3RyaW5nPjtcbiAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzIHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVnaXN0ZXJlZDogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgdW5yZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgdW5yZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICovXG4gIHVucmVnaXN0ZXJlZDogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICovXG4gIGFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIGRlYWN0aXZhdGU6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGZhaWxzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBlcnJvcjogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsXG4gIGVycm9yOiBFcnJvcilcbiAgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICovXG4gIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoWydlcnJvciddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgIGNvbnN0IHNhbXBsZSA9IGBcXHRpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xcblxcdGF3YWl0IHBsYXllci5leHRyYWN0b3JzLmxvYWRNdWx0aShEZWZhdWx0RXh0cmFjdG9ycyk7YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0KCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGV4dHJhY3RvcnMubG9hZE11bHRpIGluc3RlYWQuIEV4YW1wbGU6XFxuJHtzYW1wbGV9XFxuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGJ1bmRsZSBvZiBleHRyYWN0b3JzLlxuICAgKiBAZXhhbXBsZSBpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuICAgKlxuICAgKiBhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNdWx0aTxcbiAgICBPIGV4dGVuZHMgb2JqZWN0LFxuICAgIFQgZXh0ZW5kcyAodHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4pW10sXG4gICAgUiBleHRlbmRzIFJlY29yZDxcbiAgICAgIFRbbnVtYmVyXVsnaWRlbnRpZmllciddLFxuICAgICAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFRbbnVtYmVyXT5bMV0+PihcblxuICBidW5kbGU6IFQsIG9wdGlvbnM6IFIgPSB7fSBhcyBSKSB7XG4gICAgYnVuZGxlLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZWdpc3RlcihleHQsIG9wdGlvbnM/LltleHQuaWRlbnRpZmllcl0gfHwge30pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBpZiB0aGUgZ2l2ZW4gZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgdG8gZ2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzdXBwbGllZCB0byB0aGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXI8TyBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+PihcbiAgX2V4dHJhY3RvcjogVCxcbiAgb3B0aW9uczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFQ+WycxJ10pXG4gIDogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiBfZXh0cmFjdG9yLmlkZW50aWZpZXIgIT09ICdzdHJpbmcnIHx8XG4gICAgdGhpcy5zdG9yZS5oYXMoX2V4dHJhY3Rvci5pZGVudGlmaWVyKSlcblxuICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBfZXh0cmFjdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0KF9leHRyYWN0b3IuaWRlbnRpZmllciwgZXh0cmFjdG9yKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShfZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgIGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXI8SyBleHRlbmRzIHN0cmluZyB8IEJhc2VFeHRyYWN0b3I+KF9leHRyYWN0b3I6IEspIHtcbiAgICBjb25zdCBleHRyYWN0b3IgPVxuICAgIHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/XG4gICAgdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOlxuICAgIHRoaXMuc3RvcmUuZmluZCgocikgPT4gciA9PT0gX2V4dHJhY3Rvcik7XG4gICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRpc2FibGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWBcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oXG4gIGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPixcbiAgZmlsdGVyQmxvY2tlZCA9IHRydWUpXG4gIHtcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICBpZiAoIXRoaXMuc3RvcmUuc2l6ZSkge1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICAnU2tpcHBpbmcgZXh0cmFjdG9ycyBleGVjdXRpb24gc2luY2UgemVybyBleHRyYWN0b3JzIHdlcmUgcmVnaXN0ZXJlZCcsXG4gICAgICAgICdOb0V4dHJhY3RvcnMnXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNvcnQgYnkgcHJpb3JpdHkgc28gdGhhdCBleHRyYWN0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5IGFyZSBleGVjdXRlZCBmaXJzdFxuICAgIGNvbnN0IGV4dHJhY3RvcnMgPSB0aGlzLnN0b3JlLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcblxuICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRyYWN0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgICAgICBgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgcmVzdWx0XG4gICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQ+O1xuICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICBlcnJvcjogZXJyLFxuICAgICAgcmVzdWx0OiBmYWxzZVxuICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGJyaWRnZSBmb3IgYSB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IHRyYWNrLmV4dHJhY3RvcilcbiAge1xuICAgIGNvbnN0IHByZXZpb3VzbHlBdHRlbXB0ZWQgPVxuICAgIHRoaXMuZ2V0Q29udGV4dCgpPy5icmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW48RXh0cmFjdG9yU3RyZWFtYWJsZT4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgaWYgKHNvdXJjZUV4dHJhY3RvciAmJiBleHQuaWRlbnRpZmllciA9PT0gc291cmNlRXh0cmFjdG9yLmlkZW50aWZpZXIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocHJldmlvdXNseUF0dGVtcHRlZC5oYXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHByZXZpb3VzbHlBdHRlbXB0ZWQuYWRkKGV4dC5pZGVudGlmaWVyKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcblxuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpXG4gICAgdGhyb3cgbmV3IEJyaWRnZUZhaWxlZEVycm9yKFxuICAgICAgdGhpcy5nZXRFeGVjdXRpb25JZCgpLFxuICAgICAgcmVzdWx0Py5lcnJvcj8uc3RhY2sgfHxcbiAgICAgIHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHxcbiAgICAgICdObyBleHRyYWN0b3JzIGF2YWlsYWJsZSB0byBicmlkZ2UnXG4gICAgKTtcblxuICAgIHRyYWNrLmJyaWRnZWRFeHRyYWN0b3IgPSByZXN1bHQuZXh0cmFjdG9yO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGJyaWRnZSBmcm9tIHRoZSBzcGVjaWZpZWQgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3Igb2YgdGhlIHRyYWNrXG4gICAqIEBwYXJhbSB0YXJnZXRFeHRyYWN0b3IgVGhlIHRhcmdldCBleHRyYWN0b3IgdG8gYnJpZGdlIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdEJyaWRnZUZyb20oXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCxcbiAgdGFyZ2V0RXh0cmFjdG9yOiBFeHRyYWN0b3JSZXNvbHZhYmxlKVxuICB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlKHRhcmdldEV4dHJhY3Rvcik7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0YXJnZXQuYnJpZGdlKHRyYWNrLCBzb3VyY2VFeHRyYWN0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRGlzYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhpZGVudGlmaWVyKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZW5hYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gcmVzb2x2YWJsZSA6IHJlc29sdmFibGUuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIHJlc29sdmUocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyB0aGlzLmdldChyZXNvbHZhYmxlKSA6IHJlc29sdmFibGU7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICByZXN1bHQ6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQgPSB1bmtub3duPiA9IChcbmV4dHJhY3RvcjogQmFzZUV4dHJhY3Rvcilcbj0+IFByb21pc2U8VCB8IGJvb2xlYW4+O1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JSZXNvbHZhYmxlID0gc3RyaW5nIHwgQmFzZUV4dHJhY3RvcjsiLCAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgdW5zYWZlID0gYW55O1xuXG4vKipcbiAqIFRoZSByZWNlaXZlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRleHQgaXMgcHJvdmlkZWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dFJlY2VpdmVyPFI+ID0gKCkgPT4gUjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHQ8VD4ge1xuICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZhdWx0VmFsdWU/OiBUKSB7fVxuXG4gIC8qKlxuICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBleGl0KHNjb3BlOiBDb250ZXh0UmVjZWl2ZXI8dm9pZD4pIHtcbiAgICB0aGlzLnN0b3JhZ2UuZXhpdChzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29udGV4dCBpcyBsb3N0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFN0b3JlKCkgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICAgKi9cbiAgcHVibGljIGNvbnN1bWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgcHJvdmlkZTxSID0gdW5zYWZlPih2YWx1ZTogVCwgcmVjZWl2ZXI6IENvbnRleHRSZWNlaXZlcjxSPik6IFIge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgcmVjZWl2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjb250ZXh0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHRcbiAqIEBleGFtcGxlIGNvbnN0IHVzZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICpcbiAqICAvLyB0aGUgdmFsdWUgdG8gcHJvdmlkZVxuICogIGNvbnN0IHVzZXIgPSB7XG4gKiAgIGlkOiAxLFxuICogICBuYW1lOiAnSm9obiBEb2UnXG4gKiAgfTtcbiAqXG4gKiAgLy8gcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSB0byB0aGUgcmVjZWl2ZXJcbiAqICBjb250ZXh0LnByb3ZpZGUodXNlciwgaGFuZGxlcik7XG4gKlxuICogIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gKiAgICAvLyBnZXQgdGhlIGNvbnRleHQgdmFsdWVcbiAqICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKlxuICogICAgY29uc29sZS5sb2coaWQsIG5hbWUpOyAvLyAxLCBKb2huIERvZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCA9IHVuc2FmZT4oZGVmYXVsdFZhbHVlPzogVCk6IENvbnRleHQ8VD4ge1xuICByZXR1cm4gbmV3IENvbnRleHQoZGVmYXVsdFZhbHVlKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tXG4gKiBAZXhhbXBsZSBjb25zdCB2YWx1ZSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb250ZXh0PFQgPSB1bnNhZmU+KGNvbnRleHQ6IENvbnRleHQ8VD4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufSIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpOyIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufSIsICJpbXBvcnQgeyBHdWlsZCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICBndWlsZDogR3VpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBTVVBFUl9DT05URVhUID0gY3JlYXRlQ29udGV4dDxQbGF5ZXI+KCk7XG5cbmNvbnN0IGdldEZhbGxiYWNrQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICBsZXQgaXNGYWxsYmFjayA9IGZhbHNlO1xuXG4gIGxldCBwbGF5ZXI6IFBsYXllciB8IHVuZGVmaW5lZDtcblxuICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICBwbGF5ZXIgPSBnZXRGYWxsYmFja0NvbnRleHQoKTtcbiAgICBpc0ZhbGxiYWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghcGxheWVyKVxuICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgJ2Rpc2NvcmQtcGxheWVyJyxcbiAgICBgUGxheWVyIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSwgJHtcbiAgICBpc0ZhbGxiYWNrID9cbiAgICAnZGlkIHlvdSBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGxheWVyIHdpdGggYG5ldyBQbGF5ZXIoY2xpZW50KWA/JyA6XG4gICAgJ2lzIGl0IGJlaW5nIGNhbGxlZCBpbnNpZGUgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKCk/J31gXG5cbiAgKTtcblxuICBpZiAobWFpbk9ubHkpIHJldHVybiB7IHBsYXllciwgY29udGV4dDoge30gYXMgSG9va3NDdHgsIGlzRmFsbGJhY2sgfTtcblxuICBsZXQgY29udGV4dDogSG9va3NDdHggfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFpc0ZhbGxiYWNrKSB7XG4gICAgY29udGV4dCA9IHVzZUNvbnRleHQocGxheWVyLmNvbnRleHQpO1xuICAgIGlmICghY29udGV4dClcbiAgICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgICBob29rTmFtZSxcbiAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIGdldCBndWlsZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgICAgIGhvb2tOYW1lLFxuICAgICAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGd1aWxkIGFyZ3VtZW50IHdoZW4gbm90IGluc2lkZSBhIHBsYXllciBjb250ZXh0YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gYXMgdW5rbm93biBhcyBIb29rc0N0eDtcbiAgfVxuXG4gIHJldHVybiB7IGNvbnRleHQsIHBsYXllciwgaXNGYWxsYmFjayB9O1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VIaXN0b3J5Jyk7XG5cbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIHBsYXllciBub2RlXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oXG5ub2RlPzogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVBsYXllcicpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZS5ub2RlO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZS5cbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZS4gRGVmYXVsdHMgdG8gaW5mZXJyZWQgZ3VpbGQgZnJvbSBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlPzogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLnJlc29sdmU8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlO1xufSIsICJpbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gIGNvbnN0IHsgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1haW5QbGF5ZXInLCB0cnVlKTtcblxuICByZXR1cm4gcGxheWVyO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbXG4gICgpID0+IFQsXG4gIChtZXRhZGF0YTogVCB8IFNldHRlckZOPFQsIFQ+KSA9PiB2b2lkXTtcblxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+IHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlTWV0YWRhdGEnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxUPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgIGlmIChxdWV1ZSkge1xuICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24obWV0YWRhdGEpKVxuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSwgUGxheWVyVGltZXN0YW1wIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlOiBOb2RlUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlVGltZWxpbmUge1xuICByZWFkb25seSB0aW1lc3RhbXA6IFBsYXllclRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhY2s6IFRyYWNrPHVua25vd24+IHwgbnVsbDtcbiAgcGF1c2UoKTogYm9vbGVhbjtcbiAgcmVzdW1lKCk6IGJvb2xlYW47XG4gIHNldFZvbHVtZSh2b2w6IG51bWJlcik6IGJvb2xlYW47XG4gIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKFxub3B0aW9uczogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KVxuOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldChvcHRpb25zPy5ub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0aW1lbGluZSA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7XG4gICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgfSxcbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUudm9sdW1lO1xuICAgIH0sXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgfSxcbiAgICBnZXQgdHJhY2soKSB7XG4gICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgIH0sXG4gICAgcGF1c2UoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5wYXVzZSgpO1xuICAgIH0sXG4gICAgcmVzdW1lKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgfSxcbiAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgIH0sXG4gICAgYXN5bmMgc2V0UG9zaXRpb24odGltZTogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZWVrKHRpbWUpO1xuICAgIH1cbiAgfSBzYXRpc2ZpZXMgR3VpbGRRdWV1ZVRpbWVsaW5lKTtcblxuICByZXR1cm4gdGltZWxpbmU7XG59IiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTiA9IChwcmV2aW91czogbnVtYmVyKSA9PiBudW1iZXI7XG50eXBlIFZvbHVtZURpc3BhdGNoID0gcmVhZG9ubHkgW1xuICAoKSA9PiBudW1iZXIsXG4gICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiBib29sZWFuIHwgdW5kZWZpbmVkXTtcblxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUoKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVm9sdW1lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQobm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpXG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sdW1lKHF1ZXVlLm5vZGUudm9sdW1lKSk7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sdW1lKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubm9kZS52b2x1bWUgYXMgbnVtYmVyO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQge1xuICBFcXVhbGl6ZXJCYW5kLFxuICBQQ01GaWx0ZXJzLFxuICBCaXF1YWRGaWx0ZXJzIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQge1xuICBHdWlsZFF1ZXVlLFxuICBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyLFxuICBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tXG4nLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IE5vR3VpbGRFcnJvciwgTm9HdWlsZFF1ZXVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi9mYWJyaWMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSBhbnk+IHtcbiAgc3RyYXRlZ3k/OiBRdWV1ZVN0cmF0ZWd5O1xuICB2b2x1bWU/OiBudW1iZXI7XG4gIGVxdWFsaXplcj86IEVxdWFsaXplckJhbmRbXTtcbiAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW107XG4gIGJpcXVhZD86IEJpcXVhZEZpbHRlcnM7XG4gIHJlc2FtcGxlcj86IG51bWJlcjtcbiAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHk/OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgbGVhdmVPbkVuZD86IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bj86IG51bWJlcjtcbiAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICBsZWF2ZU9uU3RvcENvb2xkb3duPzogbnVtYmVyO1xuICBtZXRhZGF0YT86IFQgfCBudWxsO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIGNvbm5lY3Rpb25UaW1lb3V0PzogbnVtYmVyO1xuICBkZWZhdWx0RkZtcGVnRmlsdGVycz86IEZpbHRlcnNOYW1lW107XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gIG5vRW1pdEluc2VydD86IGJvb2xlYW47XG4gIG1heFNpemU/OiBudW1iZXI7XG4gIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gIGRpc2FibGVGaWx0ZXJlcj86IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbiAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I/OiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5vZGVSZXNvbHZhYmxlID0gR3VpbGRRdWV1ZSB8IEd1aWxkUmVzb2x2YWJsZTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNhY2hlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPigpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZ3VpbGQgcXVldWUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIG9wdGlvbnMgUXVldWUgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oXG4gIGd1aWxkOiBHdWlsZFJlc29sdmFibGUsXG4gIG9wdGlvbnM6IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD4gPSB7fSlcbiAgOiBHdWlsZFF1ZXVlPFQ+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmUoZ3VpbGQpO1xuICAgIGlmICghc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgTm9HdWlsZEVycm9yKCdJbnZhbGlkIG9yIHVua25vd24gZ3VpbGQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICB9XG5cbiAgICBvcHRpb25zLnN0cmF0ZWd5ID8/PSAnRklGTyc7XG4gICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICBvcHRpb25zLmVxdWFsaXplciA/Pz0gW107XG4gICAgb3B0aW9ucy5hX2ZpbHRlciA/Pz0gW107XG4gICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHkgPz89IHRydWU7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24gPz89IDA7XG4gICAgb3B0aW9ucy5sZWF2ZU9uU3RvcCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgb3B0aW9ucy5yZXNhbXBsZXIgPz89IDQ4MDAwO1xuICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQgPz89IDEwMDA7XG4gICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IGZhbHNlO1xuXG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMudmVyaWZ5RmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IsXG4gICAgICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogb3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbVxuICAgIH0pO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQocXVldWUuaWQpIGFzIEd1aWxkUXVldWU8VD4gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWQgPVxuICAgIG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlID9cbiAgICBub2RlLmlkIDpcbiAgICB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkUXVldWVFcnJvcignQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICByZXR1cm4gbm9kZSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChcbiAgICAgIHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpIVxuICAgICkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICB9XG59IiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucywgVHJhY2tMaWtlIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7XG4gIENoYW5uZWxUeXBlLFxuICBHdWlsZCxcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBWb2ljZUJhc2VkQ2hhbm5lbCxcbiAgVm9pY2VTdGF0ZSB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7XG4gIEJpcXVhZEZpbHRlcnMsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQge1xuICB0eXBlIEF1ZGlvUGxheWVyLFxuICBBdWRpb1Jlc291cmNlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyB9IGZyb20gJy4vR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWVTdGF0aXN0aWNzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vVm9pY2VDaGFubmVsRXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvcixcbiAgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IgfSBmcm9tXG4nLi4vZXJyb3JzJztcbmltcG9ydCB7IFN5bmNlZEx5cmljc1Byb3ZpZGVyIH0gZnJvbSAnLi9TeW5jZWRMeXJpY3NQcm92aWRlcic7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IGFueT4ge1xuICBndWlsZDogR3VpbGQ7XG4gIHF1ZXVlU3RyYXRlZ3k6IFF1ZXVlU3RyYXRlZ3k7XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdIHwgYm9vbGVhbjtcbiAgdm9sdW1lOiBudW1iZXIgfCBib29sZWFuO1xuICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuICByZXNhbXBsZXI6IG51bWJlciB8IGJvb2xlYW47XG4gIGZpbHRlcmVyOiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICBmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdO1xuICBkaXNhYmxlSGlzdG9yeTogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZTogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgZGlzYWJsZUZpbHRlcmVyOiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkOiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yOiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyPFQgPSB1bmtub3duPiA9IChcbnN0cmVhbTogUmVhZGFibGUsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbnRyYWNrOiBUcmFjazxUPilcbj0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqL1xuICBTYW1wbGVSYXRlVXBkYXRlOiAnc2FtcGxlUmF0ZVVwZGF0ZSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEd1aWxkUXVldWVFdmVudCA9XG4odHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrcyBhcnJheVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2tbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3RdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGVidWddOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBtZXNzYWdlOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXJyb3JdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgZXJyb3I6IEVycm9yLFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRmluaXNoXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBza2lwcGVkXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb24sXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXJdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2ssXG4gIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkVm9sdW1lOiBudW1iZXIsXG4gIG5ld1ZvbHVtZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXF1YWxpemVyVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLFxuICBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLFxuICBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EU1BVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sXG4gIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLFxuICBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKVxuICA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gIGRvbmU6ICgpID0+IHZvaWQpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2tzOiBUcmFja1tdLFxuICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkUmF0ZSBUaGUgb2xkIHNhbXBsZSByYXRlXG4gICAqIEBwYXJhbSBuZXdSYXRlIFRoZSBuZXcgc2FtcGxlIHJhdGVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZFJhdGU6IG51bWJlcixcbiAgbmV3UmF0ZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIFRoZSBxdWV1ZSByZXBlYXQgbW9kZS4gVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBPRkZcbiAqIC0gVFJBQ0tcbiAqIC0gUVVFVUVcbiAqIC0gQVVUT1BMQVlcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXVlUmVwZWF0TW9kZSA9IHtcbiAgLyoqXG4gICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAqL1xuICBPRkY6IDAsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAqL1xuICBUUkFDSzogMSxcbiAgLyoqXG4gICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgKi9cbiAgUVVFVUU6IDIsXG4gIC8qKlxuICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgKi9cbiAgQVVUT1BMQVk6IDNcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFF1ZXVlUmVwZWF0TW9kZSA9XG4odHlwZW9mIFF1ZXVlUmVwZWF0TW9kZSlba2V5b2YgdHlwZW9mIFF1ZXVlUmVwZWF0TW9kZV07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZTxNZXRhID0gYW55PiB7XG4gICN0cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICNkZWxldGVkID0gZmFsc2U7XG4gICNzaHVmZmxlID0gZmFsc2U7XG4gIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgIHN0cmVhbSxcbiAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICB9KTtcbiAgcHVibGljIHJlcGVhdE1vZGU6IFF1ZXVlUmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgc3luY2VkTHlyaWNzUHJvdmlkZXIgPSBuZXcgU3luY2VkTHlyaWNzUHJvdmlkZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KVxuICB7XG4gICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSlcbiAgICB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSlcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICBpZiAoXG4gICAgIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJlxuICAgICFUeXBlVXRpbC5pc0Jvb2xlYW4odGhpcy5vcHRpb25zLmJpcXVhZCkpXG4gICAge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IHRoaXMub3B0aW9ucy5iaXF1YWQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmVxdWFsaXplcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSB0aGlzLm9wdGlvbnMuZXF1YWxpemVyO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgIH1cblxuICAgIGlmIChUeXBlVXRpbC5pc051bWJlcih0aGlzLm9wdGlvbnMucmVzYW1wbGVyKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSB0aGlzLm9wdGlvbnMucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIGlmIChUeXBlVXRpbC5pc0FycmF5KHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLmZmbXBlZy5zZXREZWZhdWx0cyh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycyk7XG4gICAgfVxuXG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heFNpemVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heEhpc3RvcnlTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgXG4gICAgKTtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcXVldWUgY2FuIGludGVyY2VwdCBzdHJlYW1zXG4gICAqL1xuICBwdWJsaWMgY2FuSW50ZXJjZXB0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzeW5jIGx5cmljcyBwcm92aWRlciBmb3IgdGhpcyBxdWV1ZS5cbiAgICogQGV4YW1wbGUgY29uc3QgbHlyaWNzID0gYXdhaXQgcGxheWVyLmx5cmljcy5zZWFyY2goeyBxOiAnQWxhbiBXYWxrZXIgRmFkZWQnIH0pO1xuICAgKiBjb25zdCBzeW5jZWRMeXJpY3MgPSBxdWV1ZS5zeW5jZWRMeXJpY3MobHlyaWNzWzBdKTtcbiAgICogY29uc29sZS5sb2coc3luY2VkTHlyaWNzLmF0KDEwXzAwMCkpO1xuICAgKiAvLyBzdWJzY3JpYmUgdG8gbHlyaWNzIGNoYW5nZVxuICAgKiBjb25zdCB1bnN1YnNjcmliZSA9IHN5bmNlZEx5cmljcy5vbkNoYW5nZSgobHlyaWNzLCB0aW1lc3RhbXApID0+IHtcbiAgICogICAgY29uc29sZS5sb2cobHlyaWNzLCB0aW1lc3RhbXApO1xuICAgKiB9KTtcbiAgICogLy8gdW5zdWJzY3JpYmUgZnJvbSBseXJpY3MgY2hhbmdlXG4gICAqIHVuc3Vic2NyaWJlKCk7IC8vIG9yXG4gICAqIHN5bmNlZEx5cmljcy51bnN1YnNjcmliZSgpO1xuICAgKi9cbiAgcHVibGljIHN5bmNlZEx5cmljcyhseXJpY3M6IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdCkge1xuICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubG9hZChseXJpY3M/LnN5bmNlZEx5cmljcyA/PyAnJyk7XG4gICAgcmV0dXJuIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICovXG4gIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbWV0YWRhdGEobTogTWV0YSkge1xuICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIE1ldGFkYXRhIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY2hhbm5lbCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIHNldCBjaGFubmVsKGM6IFZvaWNlQmFzZWRDaGFubmVsIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsID0gYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGd1aWxkKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRyYW5zaXRpb24gbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFRyYW5zaXRpb25pbmcoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAqL1xuICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiN0cmFuc2l0aW9uaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCByZXBlYXQgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICovXG4gIHB1YmxpYyBzZXRSZXBlYXRNb2RlKG1vZGU6IFF1ZXVlUmVwZWF0TW9kZSkge1xuICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4U2l6ZSA/PyBJbmZpbml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRNYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaXMgZnVsbFxuICAgKi9cbiAgcHVibGljIGlzRnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gY2FwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgY3VycmVudGx5IGhvbGRzIGFjdGl2ZSBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiZcbiAgICAgICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgIGlmIChpc011bHRpKSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kcyBhIHRyYWNrIG9yIHRyYWNrIHJlc29sdmFibGUgdG8gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgcmVzb2x2YWJsZSB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKS4gSWYgPiAwLCB0aGUgaW5zZXJ0ZWQgdHJhY2sgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIHRoZSB0cmFjayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgcHJlcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW9uSW5kZXggPSBpbmRleCA9PT0gMCA/IDAgOiBpbmRleCAtIDE7XG5cbiAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5zZXJ0aW9uSW5kZXgpO1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0cmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzID0gdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/IHRyYWNrLnN0b3JlIDogdHJhY2s7XG5cbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIC4uLnRyYWNrcyk7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSB0cmFjayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgYXBwZW5kKHRyYWNrOiBUcmFjayB8IFF1ZXVlPFRyYWNrPiB8IEFycmF5PFRyYWNrPiwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXJyb3IoXG4gICAgICAgICdpbmRleCcsXG4gICAgICAgIGAke2luZGV4fWAsXG4gICAgICAgICcwJyxcbiAgICAgICAgYCR7dGhpcy50cmFja3Muc2l6ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gQXJyYXkuaXNBcnJheSh0cmFjaykgP1xuICAgIHRyYWNrLmxlbmd0aCA6XG4gICAgdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/XG4gICAgdHJhY2suc2l6ZSA6XG4gICAgMTtcblxuICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCBjb3VudCk7XG5cbiAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0cmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzID0gdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/IHRyYWNrLnN0b3JlIDogdHJhY2s7XG5cbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIC4uLnRyYWNrcyk7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byB1c2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIG9wdGlvbnM6IFBpY2s8Vm9pY2VDb25uZWN0Q29uZmlnLCAnYXVkaW9QbGF5ZXInIHwgJ3RpbWVvdXQnPiA9IHt9KVxuICB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChcbiAgICAgIGNvbm5lY3Rpb24uam9pbkNvbmZpZy5jaGFubmVsSWQhXG4gICAgKTtcbiAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ2hhbm5lbEVycm9yKCk7XG4gICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsXG4gICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihcbiAgICAgIGNvbm5lY3Rpb24sXG4gICAgICBjaGFubmVsLFxuICAgICAgdGhpcyxcbiAgICAgIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBvcHRpb25zLmF1ZGlvUGxheWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbFxuICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcGFyYW0gb3B0aW9ucyBKb2luIGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KVxuICB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBDb25uZWN0aW5nIHRvICR7XG4gICAgICBjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7XG4gICAgICBjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIgJiYgY2hhbm5lbC5pZCAhPT0gdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwuaWQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdEZXN0cm95aW5nIG9sZCBjb25uZWN0aW9uJyk7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgcXVldWU6IHRoaXMsXG4gICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICBncm91cDogb3B0aW9ucy5ncm91cCA/PyB0aGlzLnBsYXllci5jbGllbnQudXNlcj8uaWRcbiAgICB9KTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbiwgdGhpcyk7XG5cbiAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayhcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogRHluYW1pYyBzaHVmZmxpbmcgd2lsbCBzaHVmZmxlIHRoZSBxdWV1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYWNrIGVuZHMsIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHF1ZXVlLlxuICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgYmUgc2h1ZmZsZWQgaW1tZWRpYXRlbHkgaW4tcGxhY2UsIHdoaWNoIGNhbm5vdCBiZSB1bmRvbmUuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgIGlmICghZHluYW1pYykge1xuICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy4jc2h1ZmZsZSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgZGlzYWJsZVNodWZmbGUoKSB7XG4gICAgdGhpcy4jc2h1ZmZsZSA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQHJldHVybnMgV2hldGhlciBzaHVmZmxlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgIGlmIChkeW5hbWljKSB7XG4gICAgICB0aGlzLiNzaHVmZmxlID0gIXRoaXMuI3NodWZmbGU7XG4gICAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2h1ZmZsZSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU2h1ZmZsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24/LnBpbmcudWRwID8/IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZpdmVzIHRoaXMgcXVldWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyByZXZpdmUoKSB7XG4gICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGYgZGVhZlxuICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIG11dGVcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgbm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheShcbiAgdHJhY2s6IFRyYWNrTGlrZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8TWV0YT4pXG4gIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPilcbiAgOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMsIGUpKTtcbiAgICBkaXNwYXRjaGVyLm9uKFxuICAgICAgJ2RlYnVnJyxcbiAgICAgIChtKSA9PiB0aGlzLmhhc0RlYnVnZ2VyICYmIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGVidWcsIHRoaXMsIG0pXG4gICAgKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZXN0cm95ZWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnMoZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5EU1BVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKVxuICAgICAgdGhpcy5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlLFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICBmXG4gICAgICApO1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignc2FtcGxlUmF0ZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgIT09IGYpXG4gICAgICB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlLFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSxcbiAgICAgICAgZlxuICAgICAgKTtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gZjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbiB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IE5vQXVkaW9SZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgdHlwZT86IFN0cmVhbVR5cGU7XG4gIGRhdGE6IFRyYWNrO1xuICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG59XG5cbmNsYXNzIFN0cmVhbURpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8Vm9pY2VFdmVudHM+IHtcbiAgcHVibGljIHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICBwdWJsaWMgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsO1xuICBwdWJsaWMgYXVkaW9SZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbDtcbiAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAjaW50ZXJjZXB0b3I6IEludGVyY2VwdGVkU3RyZWFtIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLFxuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKVxuICB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAqL1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICovXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oXG4gICAgICAnZXJyb3InLFxuICAgICAgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKVxuICAgICk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycylcbiAgICAgIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKVxuICAgICAgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcnMpO1xuICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpXG4gICAgICB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIuc2FtcGxlUmF0ZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICBuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiZcbiAgICAgIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNClcbiAgICAgIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLFxuICAgICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG5cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgPCA1KSB7XG4gICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICB0aGlzLmVuZCgpO1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ3N0YXRlQ2hhbmdlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgfHxcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmcpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmXG4gICAgICBvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUpXG4gICAgICB7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgKi9cbiAgZ2V0IHBhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgfVxuXG4gIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wYXVzZWQgfHxcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgKi9cbiAgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cbiAgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAqL1xuICBpc0lkbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGlzY29ubmVjdGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgKi9cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgKi9cbiAgaXNTaWduYWxsaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICovXG4gIGlzQ29ubmVjdGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAqL1xuICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzOiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnMgP1xuICAgIHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgIGRzcDoge1xuICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgfSxcbiAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXIgP1xuICAgICAge1xuICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcmVzYW1wbGVyOiBvcHM/LnNhbXBsZVJhdGUgP1xuICAgICAge1xuICAgICAgICBpbnB1dFNhbXBsZVJhdGU6IDQ4MDAwLFxuICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICB9LFxuICAgICAgdm9sdW1lOiB7XG4gICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgIH1cbiAgICB9KSA6XG4gICAgc3JjO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ0V4ZWN1dGluZyBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhvb2suLi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0U3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5cbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPy4oc3RyZWFtLCB0aGlzLnF1ZXVlLCBvcHM/LmRhdGEpLlxuICAgIGNhdGNoKFxuICAgICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgIH0pIGFzIFBvc3RQcm9jZXNzZWRSZXN1bHRcbiAgICApO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG5cbiAgICBjb25zdCBmb3JtYXQgPSBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeTtcblxuICAgIGxldCBfc3RyZWFtOiBSZWFkYWJsZTtcblxuICAgIGlmICh0aGlzLnF1ZXVlLmNhbkludGVyY2VwdCgpKSB7XG4gICAgICB0aGlzLiNpbnRlcmNlcHRvciA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSkucGlwZSh0aGlzLiNpbnRlcmNlcHRvcik7XG5cbiAgICAgIF9zdHJlYW0gPSB0aGlzLiNpbnRlcmNlcHRvcjtcblxuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuaGFuZGxlSW50ZXJjZXB0aW5nU3RyZWFtKFxuICAgICAgICB0aGlzLnF1ZXVlLFxuICAgICAgICBvcHM/LmRhdGEsXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgdGhpcy4jaW50ZXJjZXB0b3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zdHJlYW0gPSBwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtO1xuICAgIH1cblxuICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UoX3N0cmVhbSwge1xuICAgICAgaW5wdXRUeXBlOiBmb3JtYXQsXG4gICAgICBtZXRhZGF0YTogb3BzPy5kYXRhIGFzIFRyYWNrLFxuICAgICAgLy8gdm9sdW1lIGNvbnRyb2xzIGhhcHBlbiBmcm9tIEF1ZGlvRmlsdGVyIERTUCB1dGlsaXR5XG4gICAgICBpbmxpbmVWb2x1bWU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5maWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5iaXF1YWQgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgZnJvbSB2b2ljZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsYXllclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuZCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHN0cmVhbVxuICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb0F1ZGlvUmVzb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UuZW5kZWQpIHtcbiAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZmluaXNoJywgcmVzb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksXG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2b2x1bWUgYW1vdW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2V0Vm9sdW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB2b2x1bWUoKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiAxMDA7XG4gICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzdHJlYW1UaW1lKCkge1xuICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlLnBsYXliYWNrRHVyYXRpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9OyIsICJpbXBvcnQgeyBUcmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtQ2FsbGJhY2ssIHR5cGUgV3JpdGFibGUgfSBmcm9tICdub2RlOnN0cmVhbSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbSB0aGF0IGNhbiBiZSBpbnRlcmNlcHRlZCBhbmQgY29uc3VtZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsIGNvbnN1bWVyLlxuICogQGV4YW1wbGUgY29uc3Qgc3RyZWFtID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG4gKlxuICogLy8gcmVhbCBjb25zdW1lclxuICogc3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oJ2ZpbGUudHh0JykpO1xuICpcbiAqIC8vIG1hbiBpbiB0aGUgbWlkZGxlIGNvbnN1bWVyXG4gKiBjb25zdCBtYW5JblRoZU1pZGRsZSA9IG5ldyBXcml0YWJsZSh7XG4gKiAgd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICogICBjb25zb2xlLmxvZyhjaHVuay50b1N0cmluZygpKTtcbiAqICAgY2FsbGJhY2soKTtcbiAqICB9XG4gKiB9KTtcbiAqXG4gKiAvLyBzdHJlYW0uaW50ZXJjZXB0b3JzIGlzIGEgU2V0IG9mIFdyaXRhYmxlIHN0cmVhbXNcbiAqIHN0cmVhbS5pbnRlcmNlcHRvcnMuYWRkKG1hbkluVGhlTWlkZGxlKTtcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyY2VwdGVkU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgcHVibGljIHJlYWRvbmx5IGludGVyY2VwdG9ycyA9IG5ldyBTZXQ8V3JpdGFibGU+KCk7XG4gICNpbnRlcmNlcHRpbmcgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTdGFydCBpbnRlcmNlcHRpbmcgdGhlIHN0cmVhbS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGF0ZSBvZiBJbnRlcmNlcHRlZFN0cmVhbS5cbiAgICovXG4gIHB1YmxpYyBzdGFydEludGVyY2VwdGluZygpOiB2b2lkIHtcbiAgICB0aGlzLiNpbnRlcmNlcHRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzdHJlYW0gZnJvbSBiZWluZyBjb25zdW1lZCBieSB0aGUgaW50ZXJjZXB0b3JzLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byB0ZW1wb3JhcmlseSBzdG9wIHRoZSBpbnRlcmNlcHRpb24uIFRoZSBzdG9wcGVkIHN0YXRlIGNhbiBiZSByZXN1bWVkIGJ5IGNhbGxpbmcgc3RhcnRJbnRlcmNlcHRpbmcgYWdhaW4uXG4gICAqL1xuICBwdWJsaWMgc3RvcEludGVyY2VwdGluZygpOiB2b2lkIHtcbiAgICB0aGlzLiNpbnRlcmNlcHRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgYmVpbmcgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBpc0ludGVyY2VwdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jaW50ZXJjZXB0aW5nO1xuICB9XG5cbiAgcHVibGljIF90cmFuc2Zvcm0oXG4gIGNodW5rOiBCdWZmZXIsXG4gIGVuY29kaW5nOiBCdWZmZXJFbmNvZGluZyxcbiAgY2FsbGJhY2s6IFRyYW5zZm9ybUNhbGxiYWNrKVxuICA6IHZvaWQge1xuICAgIHRoaXMucHVzaChjaHVuaywgZW5jb2RpbmcpO1xuXG4gICAgaWYgKHRoaXMuI2ludGVyY2VwdGluZyAmJiB0aGlzLmludGVyY2VwdG9ycy5zaXplID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgICBjb25zdW1lci53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfZmluYWwoY2FsbGJhY2s6IFRyYW5zZm9ybUNhbGxiYWNrKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgY29uc3VtZXIuZW5kKCk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBfZGVzdHJveShlcnJvcjogRXJyb3IsIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbnN0IGlnbm9yZUVycm9yID0gU3RyaW5nKGVycm9yKS5pbmNsdWRlcygnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKTtcbiAgICBjb25zdCBlcnIgPSBpZ25vcmVFcnJvciA/IHVuZGVmaW5lZCA6IGVycm9yO1xuXG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgY29uc3VtZXIuZGVzdHJveShlcnIpO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJjZXB0b3JzLmNsZWFyKCk7XG5cbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG59IiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyB0cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KCdMSUZPJyk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBuZXh0VHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgaGlzdG9yeSBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlLm5vZGUuc2tpcCh7XG4gICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5IaXN0b3J5TmV4dCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcHBlZCBieSBHdWlsZFF1ZXVlSGlzdG9yeS5uZXh0KCknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIGlmIChjdXJyZW50ICYmIHByZXNlcnZlQ3VycmVudCkgdGhpcy5xdWV1ZS5ub2RlLmluc2VydChjdXJyZW50LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBbR3VpbGRRdWV1ZUhpc3RvcnldLnByZXZpb3VzKClcbiAgICovXG4gIHB1YmxpYyBiYWNrKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAqL1xuICBwdWJsaWMgcmVzaXplKCkge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9SZXN1bHRFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yIH0gZnJvbVxuJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgT2dnRGVtdXhlciwgT3B1c0RlY29kZXIsIFdlYm1EZW11eGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL29wdXMnO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgKi9cbiAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXIgbGVuZ3RoXG4gICAqL1xuICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICovXG4gIHJpZ2h0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aW1lc3RhbXAgYW5kIGxpbmVcbiAgICovXG4gIGluZGljYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRpY2F0b3JcbiAgICovXG4gIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gYW55PiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QoXG4gICAgICB0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgKi9cbiAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICBjb25zdCBkdXIgPSB0aGlzLiNwcm9ncmVzcyArIHRoaXMuc3RyZWFtVGltZTtcblxuICAgIHJldHVybiBkdXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICovXG4gIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgY29uc3Qgc3JhdGVGaWx0ZXJzID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICB0b0FycmF5KCkuXG4gICAgZmlsdGVyKChmZikgPT4gRkZNUEVHX1NSQVRFX1JFR0VYLnRlc3QoZmYpKTtcbiAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVycy5cbiAgICBtYXAoKG0pID0+IHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICB9KS5cbiAgICBmaWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/XG4gICAgMSA6XG4gICAgbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWRQbGF5YmFja1RpbWUoKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cjtcblxuICAgIC8vIHdlIGFsc28gbmVlZCB0byBjaGVjayBpZiB3ZSBoYXZlIGEgbmF0aXZlIHJlc2FtcGxlciBmaWx0ZXIgYXMgaXQgbWF5IGFsc28gYWZmZWN0IHRoZSBkdXJhdGlvblxuICAgIGlmICh0aGlzLnF1ZXVlLmZpbHRlcnMucmVzYW1wbGVyKSB7XG4gICAgICAvLyBnZXQgdGhlIHJlc2FtcGxlciByYXRpbyBpZiB3ZSBoYXZlIG9uZVxuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLnF1ZXVlLmZpbHRlcnMucmVzYW1wbGVyLmdldFJhdGlvKCk7XG4gICAgICBpZiAocmF0aW8gPD0gMCkgcmV0dXJuIHZhbDtcblxuICAgICAgcmV0dXJuIHZhbCAqIHJhdGlvO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy50b3RhbER1cmF0aW9uO1xuXG4gICAgLy8gZHVyYXRpb24gbXVsdGlwbGllciBjaGVja3MgZmZtcGVnIGZpbHRlcnMgdGhhdCBtYXkgYWZmZWN0IHRoZSBkdXJhdGlvblxuICAgIGNvbnN0IHZhbCA9IE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG5cbiAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIG5hdGl2ZSByZXNhbXBsZXIgZmlsdGVyIGFzIGl0IG1heSBhbHNvIGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnJlc2FtcGxlcikge1xuICAgICAgLy8gZ2V0IHRoZSByZXNhbXBsZXIgcmF0aW8gaWYgd2UgaGF2ZSBvbmVcbiAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnJlc2FtcGxlci5nZXRSYXRpbygpO1xuICAgICAgaWYgKHJhdGlvIDw9IDApIHJldHVybiB2YWw7XG5cbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbCAvIHJhdGlvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID1cbiAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJlxuICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrPy5kdXJhdGlvbk1TID8/XG4gICAgICAgIChcbiAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICB9O1xuICAgICAgICB9PikuXG4gICAgICAgIG1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/XG4gICAgdGhpcy5wbGF5YmFja1RpbWUgOlxuICAgIHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICB9LFxuICAgICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICB9LFxuICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoY3VycmVudCAvIHRvdGFsICogMTAwKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsXG4gICAgICBsZWZ0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIGxlbmd0aCA9IDE1LFxuICAgICAgdGltZWNvZGVzID0gdHJ1ZSxcbiAgICAgIHNlcGFyYXRvciA9ICdcXHUyNTAzJ1xuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJyxcbiAgICAgICAgU3RyaW5nKGxlbmd0aCksXG4gICAgICAgICcwJyxcbiAgICAgICAgJ0Zpbml0ZSBOdW1iZXInXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoXG4gICAgICB0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSAqIGxlbmd0aFxuICAgICk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKFxuICAgICAgICAgICcnXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgdGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7XG4gICAgICAgIHNlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KFxuICAgICAgICAgIGxlbmd0aCAtIDFcbiAgICAgICAgKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAgICdbZHVyYXRpb25dJyxcbiAgICAgICAgICBTdHJpbmcoZHVyYXRpb24pLFxuICAgICAgICAgICcwJyxcbiAgICAgICAgICBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKVxuICAgICAgICApLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24gPCAwKSBkdXJhdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdm9sdW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2b2x1bWVcbiAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYml0IHJhdGVcbiAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKFxuICAgICAgcmF0ZSA9PT0gJ2F1dG8nID8gdGhpcy5xdWV1ZS5jaGFubmVsPy5iaXRyYXRlID8/IDY0MDAwIDogcmF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhdXNlZCBzdGF0ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgc2V0UGF1c2VkKHN0YXRlOiBib29sZWFuKSB7XG4gICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHJlc3VtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgY3VycmVudCB0cmFja1xuICAgKi9cbiAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgfTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIHJlYXNvbixcbiAgICAgIGRlc2NyaXB0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICogQHBhcmFtIGVtaXRFdmVudCBXaGV0aGVyIG9yIG5vdCB0byBlbWl0IHRoZSBldmVudCBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICBpZiAoZW1pdEV2ZW50KVxuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgKi9cbiAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ3RyYWNrIHZhbHVlJyxcbiAgICAgICdpbnN0YW5jZSBvZiBUcmFjaycsXG4gICAgICBTdHJpbmcodHJhY2spXG4gICAgKTtcbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkge1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmUoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgdHJhY2sgdG8gbW92ZScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChyZW1vdmVkLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5xdWV1ZS50cmFja3MuYXQodGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZyb20pKTtcbiAgICBpZiAoIXNyYykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChzcmMsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgKi9cbiAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oZmlyc3QpO1xuICAgIGlmIChzcmMgPCAwKSB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3QgZGVzdCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihzZWNvbmQpO1xuICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICBjb25zdCBzcmNUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXTtcbiAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdID0gc3JjVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBwbGF5YmFja1xuICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHN0b3AoZm9yY2UgPSBmYWxzZSkge1xuICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kZXN0cm95KCk7XG4gICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5aW5nIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWBcbiAgICApO1xuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMFxuICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgb3B0aW9uc1xuICAgICkhO1xuXG4gICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHF1ZXVlIHRoZSB0cmFjaywgYWRkaW5nIHRoZSBnaXZlbiB0cmFjayB0byBxdWV1ZSBpbnN0ZWFkLi4uJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICAnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJ1xuICAgICAgKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLidcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzc2lnbmVkUmVzb3VyY2UgPSB0cmFjay5yZXNvdXJjZTtcblxuICAgICAgaWYgKGFzc2lnbmVkUmVzb3VyY2UpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ1RyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZSBhc3NpZ25lZCwgcGxheWVyIHdpbGwgbm93IHBsYXkgdGhlIHJlc291cmNlIGRpcmVjdGx5Li4uJ1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiNwZXJmb3JtUGxheShhc3NpZ25lZFJlc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPVxuICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IChcbiAgICAgIHNyYyA9PT0gJ3Nwb3RpZnknID9cbiAgICAgICdzcG90aWZ5U29uZycgOlxuICAgICAgc3JjID09PSAnYXBwbGVfbXVzaWMnID9cbiAgICAgICdhcHBsZU11c2ljU29uZycgOlxuICAgICAgc3JjKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0cmVhbVNyYyA9IHtcbiAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICBzdHJlYW06IG51bGwgYXMgRXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMucXVldWUuXG4gICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkuXG4gICAgICB0aGVuKFxuICAgICAgICAocykgPT4ge1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gc3RyZWFtU3JjLmVycm9yID0gZVxuICAgICAgKTtcblxuICAgICAgLy8gdGhyb3cgaWYgJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBwYW5pY3NcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSAmJiBzdHJlYW1TcmMuZXJyb3IpXG4gICAgICByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSwgYXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSB1c2luZyBleHRyYWN0b3JzLi4uJ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmNvbnRleHQucHJvdmlkZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgICAgICAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogbmV3IFNldDxzdHJpbmc+KClcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPiByLnJlc3VsdDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAocj8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW1TcmMuZXJyb3IgPSByLmVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlOiBFcnJvcikgPT4gc3RyZWFtU3JjLmVycm9yID0gZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWVrID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnNlZWsgPj0gMCkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgZGlzcGF0Y2hlckNvbmZpZzoge1xuICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgIGRpc2FibGVWb2x1bWU6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgIGRpc2FibGVGaWx0ZXJzOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgIHNhbXBsZVJhdGU6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPz8gKFxuICAgICAgICAgIHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPiAwID9cbiAgICAgICAgICB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDpcbiAgICAgICAgICB1bmRlZmluZWQpLFxuICAgICAgICAgIGJpcXVhZEZpbHRlcjpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgdm9sdW1lOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3LFxuICAgICAgICAgIHNraXBGRm1wZWc6IHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZ1xuICAgICAgICB9LFxuICAgICAgICBwbGF5ZXJDb25maWc6IG9wdGlvbnNcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXNvbHZlcjogKCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHJlc29sdmVyID0gcmVzb2x2ZSk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrLFxuICAgICAgICB0aGlzLnF1ZXVlLFxuICAgICAgICB0cmFjayxcbiAgICAgICAgdHJhY2tTdHJlYW1Db25maWcsXG4gICAgICAgIHJlc29sdmVyIVxuICAgICAgKTtcblxuICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVdLlxuICAgICAgZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLnBsYXllckNvbmZpZy5zZWVrIHx8XG4gICAgICAhIXRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncy5sZW5ndGg7XG4gICAgICBjb25zdCBzaG91bGRTa2lwRkZtcGVnID1cbiAgICAgICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT5cbiAgICAgIFtTdHJlYW1UeXBlLk9wdXMsIFN0cmVhbVR5cGUuV2VibU9wdXMsIFN0cmVhbVR5cGUuT2dnT3B1c10uaW5jbHVkZXMoXG4gICAgICAgIGZtdCBhcyBTdHJlYW1UeXBlXG4gICAgICApO1xuXG4gICAgICAvLyBza2lwIGZmbXBlZyB3aGVuIHBvc3NpYmxlXG4gICAgICBpZiAoXG4gICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAhKHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSkgJiZcbiAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtICE9PSAnc3RyaW5nJyAmJlxuICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7XG4gICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cyd9YFxuXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICBzdHJlYW0gOlxuICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fFxuICAgICAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA6XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbS5zdHJlYW0sXG4gICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDBcbiAgICAgICAgICAvLyBvcHVzXG4gICAgICAgICk7XG4gICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAvLyBGSVhNRTogT2dnT3B1cyByZXN1bHRzIGluIHN0YXRpYyBub2lzZVxuICAgICAgICAvLyB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBvcHVzID8gU3RyZWFtVHlwZS5PZ2dPcHVzIDogU3RyZWFtVHlwZS5SYXc7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI7XG5cbiAgICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmaW5hbFN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IGRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKFxuICAgICAgICAgIGZpbmFsU3RyZWFtLFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWdcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPVxuICAgIG5ldyBOb1Jlc3VsdEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApO1xuXG5cbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdC5tZXNzYWdlXG4gICAgKTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0LFxuICAgICAgdHJhY2tcbiAgICApO1xuICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKG5leHRUcmFjaykgcmV0dXJuIHZvaWQgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzaG91bGQgYmUgcmVzb2x2ZWRcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVtaXQoJ2ZpbmlzaCcsIG51bGwpO1xuICB9XG5cbiAgYXN5bmMgI3BlcmZvcm1QbGF5KHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF0dGVtcHRlZEV4dHJhY3RvcnMgPVxuICAgIHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuZ2V0Q29udGV4dCgpPy5hdHRlbXB0ZWRFeHRyYWN0b3JzIHx8XG4gICAgbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBzdHJlYW1JbmZvID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzLmFkZChleHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICB0cmFjay51cmwsXG4gICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgfSxcbiAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEdlbmVyaWMgc3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIGFuZCBmYWxsYmFjayBzdHJlYW0gZXh0cmFjdGlvbiBpcyBlbmFibGVkYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7XG4gICAgICB0cmFjay50aXRsZX0sIHVybDogJHtcbiAgICAgIHRyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgc3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcmlmeUZhbGxiYWNrU3RyZWFtID0gdGhpcy5xdWV1ZS5vcHRpb25zLnZlcmlmeUZhbGxiYWNrU3RyZWFtO1xuXG4gICAgY29uc3QgZmFsbGJhY2tTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgaWYgKGV4dHJhY3Rvci5pZGVudGlmaWVyID09PSB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKFxuICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZShcbiAgICAgICAgICAoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyXG4gICAgICAgICkpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGAke3RyYWNrLnRpdGxlfSAke3RyYWNrLmF1dGhvcn1gO1xuXG4gICAgICAgIGlmICh2ZXJpZnlGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFsbGJhY2sgc3RyZWFtIHZlcmlmaWNhdGlvbiBpcyBlbmFibGVkLCB2YWxpZGF0aW5nIHF1ZXJ5IGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfS4uLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkUHJvY2VlZCA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IHRyYWNrLnNvdXJjZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXNob3VsZFByb2NlZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB2YWxpZGF0ZSBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBRdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gd2FzIHZhbGlkYXRlZCB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfS4gUHJvY2VlZGluZyB3aXRoIGV4dHJhY3Rpb24uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2tzID0gYXdhaXQgZXh0cmFjdG9yLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrID0gZmFsbGJhY2tUcmFja3MudHJhY2tzWzBdO1xuXG4gICAgICAgIGlmICghZmFsbGJhY2tUcmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0oZmFsbGJhY2tUcmFjayk7XG5cbiAgICAgICAgaWYgKCFzdHJlYW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cmFjay5icmlkZ2VkVHJhY2sgPSBmYWxsYmFja1RyYWNrO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICBpZiAoIWZhbGxiYWNrU3RyZWFtIHx8ICFmYWxsYmFja1N0cmVhbS5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgZmFsbGJhY2sgc3RyZWFtaW5nIG1ldGhvZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsbGJhY2tTdHJlYW0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gZmFsbGJhY2tTdHJlYW0uZXh0cmFjdG9yO1xuXG4gICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtO1xuICB9XG5cbiAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZyxcbiAgdHJhY2s6IFRyYWNrLFxuICBzZWVrID0gMCxcbiAgb3B1cz86IGJvb2xlYW4pXG4gIHtcbiAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLlxuICAgIGNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgIGZtdDogb3B1cyA/ICdvcHVzJyA6ICdzMTZsZSdcbiAgICB9KS5cbiAgICBvbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICBgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke1xuICAgICAgICBlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWBcblxuICAgICAgKTtcblxuICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICB9XG59IiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAvKipcbiAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICBpZiAoY29uc3VtZSkge1xuICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICpcbiAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLFxuICBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpXG4gIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEFib3J0U2lnbmFsKHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICB0aGlzLm9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnF1ZXVlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICB9XG5cbiAgcHVibGljIGNvbnN1bWUoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZSgpIHtcbiAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICB0aGlzLm9uQWJvcnQgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgfVxufSIsICJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBBdWRpb0ZpbHRlcnMsIEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7XG4gIEJpcXVhZEZpbHRlcnMsXG4gIEVxdWFsaXplcixcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEZGbXBlZ1N0cmVhbU9wdGlvbnMsIGNyZWF0ZUZGbXBlZ1N0cmVhbSB9IGZyb20gJy4uL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgfSxcbiAgICAoXywgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICB9KVxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XVxuICApLFxuICBDbHViOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIERhbmNlOiBtYWtlQmFuZHMoW1xuICA5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoW1xuICAtOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdXG4gICksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoW1xuICA3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF1cbiAgKSxcbiAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFtcbiAgLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XVxuICApLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoW1xuICA0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF1cbiAgKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoW1xuICAxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gIFBhcnR5OiBtYWtlQmFuZHMoW1xuICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdXG4gICksXG4gIFBvcDogbWFrZUJhbmRzKFtcbiAgLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdXG4gICksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoW1xuICAtMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XVxuICApLFxuICBTb2Z0OiBtYWtlQmFuZHMoW1xuICA0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdXG4gICksXG4gIFNvZnRSb2NrOiBtYWtlQmFuZHMoW1xuICA0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdXG4gICksXG4gIFRlY2hubzogbWFrZUJhbmRzKFtcbiAgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdXG4gIClcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSBhbnk+IHtcbiAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZmbXBlZyBtYXkgYmUgc2tpcHBlZFxuICAgKi9cbiAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgI3NldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKFxuICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICBxdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcHJldixcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgKi9cbiAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbnB1dCBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBhcmdzKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKVxuICAgIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbXG4gICAgLi4udGhpcy4jaW5wdXRBcmdzLFxuICAgIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG5cblxuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKFxuICBmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pXG4gIHtcbiAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID9cbiAgICAgIFtdIDpcbiAgICAgIE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLlxuICAgICAgZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSkuXG4gICAgICBtYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoXG4gICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgIGJpcXVhZDogbnVsbCxcbiAgICBlcXVhbGl6ZXI6IFtdLFxuICAgIGZpbHRlcnM6IFtdLFxuICAgIHZvbHVtZTogMTAwLFxuICAgIHNhbXBsZVJhdGU6IC0xXG4gIH07XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogZW5hYmxlIHRoaXMgaW4gdGhlIGZ1dHVyZVxuICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAvLyAgICAgICAgIGlmICh0aGlzLiNmZm1wZWcpIHRoaXMuI2ZmbXBlZyA9IG51bGw7XG4gIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy4jZmZtcGVnKSB7XG4gIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICByZXR1cm4gdGhpcy4jZmZtcGVnO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFZvbHVtZSB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgKi9cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRFNQIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICogQHBhcmFtIHNlZWsgVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUuYWNxdWlyZSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgIHNlZWssXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgcHVibGljIGdldCBmZm1wZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogbVxuICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPFxuICAgICAgICBCaXF1YWRGaWx0ZXJzLFxuICAgICAgICBudW1iZXI+IHxcbiAgICAgIG51bGwgfHwgbnVsbCk7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICB9XG5cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgIHJldHVybiB7XG4gICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICB2b2x1bWU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufSIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRkZtcGVnLCBjcmVhdGVGRm1wZWdBcmdzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gIGZtdD86IHN0cmluZztcbiAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgc2Vlaz86IG51bWJlcjtcbiAgc2tpcD86IGJvb2xlYW47XG4gIGNvb2tpZXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19TVFJJTkcoXG5zdHJlYW06IHN0cmluZyxcbmZtdD86IHN0cmluZyxcbmNvb2tpZXM/OiBzdHJpbmcpXG57XG4gIGNvbnN0IGFyZ3MgPSBjcmVhdGVGRm1wZWdBcmdzKHtcbiAgICByZWNvbm5lY3Q6IDEsXG4gICAgcmVjb25uZWN0X3N0cmVhbWVkOiAxLFxuICAgIHJlY29ubmVjdF9kZWxheV9tYXg6IDUsXG4gICAgaTogc3RyZWFtLFxuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgY29va2llczpcbiAgICB0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycgP1xuICAgICFjb29raWVzLmluY2x1ZGVzKCcgJykgP1xuICAgIGNvb2tpZXMgOlxuICAgIGBcIiR7Y29va2llc31cImAgOlxuICAgIG51bGxcbiAgfSk7XG5cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19QSVBFRChmbXQ/OiBzdHJpbmcpIHtcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGxcbiAgfSk7XG5cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBGRm1wZWcgc3RyZWFtXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBzb3VyY2Ugc3RyZWFtXG4gKiBAcGFyYW0gb3B0aW9ucyBGRm1wZWcgc3RyZWFtIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZGbXBlZ1N0cmVhbShcbnN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsXG5vcHRpb25zPzogRkZtcGVnU3RyZWFtT3B0aW9ucylcbjogUmVhZGFibGUge1xuICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIGNvbnN0IGFyZ3MgPVxuICB0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gIEZGTVBFR19BUkdTX1NUUklORyhzdHJlYW0sIG9wdGlvbnMuZm10LCBvcHRpb25zLmNvb2tpZXMpIDpcbiAgRkZNUEVHX0FSR1NfUElQRUQob3B0aW9ucy5mbXQpO1xuXG4gIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZtcGVnKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gIHRyYW5zY29kZXIub24oJ2Nsb3NlJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuXG4gIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmVhbS5vbignZXJyb3InLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyIGFzIGFueSk7XG4gIH1cblxuICByZXR1cm4gdHJhbnNjb2Rlcjtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gIGxhdGVuY3k6IHtcbiAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICB2b2ljZUNvbm5lY3Rpb246IG51bWJlcjtcbiAgfTtcbiAgc3RhdHVzOiB7XG4gICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgcGF1c2VkOiBib29sZWFuO1xuICAgIGlkbGU6IGJvb2xlYW47XG4gIH07XG4gIHRyYWNrc0NvdW50OiBudW1iZXI7XG4gIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gIGV4dHJhY3RvcnM6IG51bWJlcjtcbiAgbGlzdGVuZXJzOiBudW1iZXI7XG4gIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gIHZlcnNpb25zOiB7XG4gICAgbm9kZTogc3RyaW5nO1xuICAgIHBsYXllcjogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAvKipcbiAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGVuY3k6IHtcbiAgICAgICAgZXZlbnRMb29wOiB0aGlzLnF1ZXVlLnBsYXllci5ldmVudExvb3BMYWcsXG4gICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGJ1ZmZlcmluZzogdGhpcy5xdWV1ZS5ub2RlLmlzQnVmZmVyaW5nKCksXG4gICAgICAgIHBsYXlpbmc6IHRoaXMucXVldWUubm9kZS5pc1BsYXlpbmcoKSxcbiAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgaWRsZTogdGhpcy5xdWV1ZS5ub2RlLmlzSWRsZSgpXG4gICAgICB9LFxuICAgICAgdHJhY2tzQ291bnQ6IHRoaXMucXVldWUudHJhY2tzLnNpemUsXG4gICAgICBoaXN0b3J5U2l6ZTogdGhpcy5xdWV1ZS5oaXN0b3J5LnRyYWNrcy5zaXplLFxuICAgICAgZXh0cmFjdG9yczogdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5zaXplLFxuICAgICAgbGlzdGVuZXJzOlxuICAgICAgdGhpcy5xdWV1ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5jaGFubmVsPy5tZW1iZXJzLmZpbHRlcihcbiAgICAgICAgKG0pID0+ICFtLnVzZXIuYm90XG4gICAgICApLnNpemUgfHwgMCxcbiAgICAgIG1lbW9yeVVzYWdlOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCksXG4gICAgICB2ZXJzaW9uczoge1xuICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgIHBsYXllcjogdGhpcy5xdWV1ZS5wbGF5ZXIudmVyc2lvblxuICAgICAgfVxuICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgfVxufSIsICJpbXBvcnQgeyBOb3RFeGlzdGluZ0Vycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgdHlwZSBMeXJpY3NEYXRhID0gTWFwPG51bWJlciwgc3RyaW5nPjtcbmV4cG9ydCB0eXBlIFVuc3Vic2NyaWJlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEx5cmljc0NhbGxiYWNrID0gKGx5cmljczogc3RyaW5nLCB0aW1lc3RhbXA6IG51bWJlcikgPT4gdW5rbm93bjtcbmV4cG9ydCB0eXBlIEx5cmljc0F0ID0ge3RpbWVzdGFtcDogbnVtYmVyO2xpbmU6IHN0cmluZzt9O1xuXG5jb25zdCB0aW1lc3RhbXBQYXR0ZXJuID0gL1xcWyhcXGR7Mn0pOihcXGR7Mn0pXFwuKFxcZHsyfSlcXF0vO1xuXG5leHBvcnQgY2xhc3MgU3luY2VkTHlyaWNzUHJvdmlkZXIge1xuICAjbG9vcDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgI2NhbGxiYWNrOiBMeXJpY3NDYWxsYmFjayB8IG51bGwgPSBudWxsO1xuICAjb25VbnN1YnNjcmliZTogVW5zdWJzY3JpYmUgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaW50ZXJ2YWwgPSAxMDA7XG4gIHB1YmxpYyByZWFkb25seSBseXJpY3M6IEx5cmljc0RhdGEgPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcmVhZG9ubHkgcXVldWU6IEd1aWxkUXVldWUsXG4gIHB1YmxpYyByZWFkb25seSByYXc/OiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpXG4gIHtcbiAgICBpZiAocmF3Py5zeW5jZWRMeXJpY3MpIHRoaXMubG9hZChyYXc/LnN5bmNlZEx5cmljcyk7XG4gIH1cblxuICBwdWJsaWMgaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWxsYmFjayAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGx5cmljczogc3RyaW5nKSB7XG4gICAgaWYgKCFseXJpY3MpIHRocm93IG5ldyBOb3RFeGlzdGluZ0Vycm9yKCdzeW5jZWRMeXJpY3MnKTtcblxuICAgIHRoaXMubHlyaWNzLmNsZWFyKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgbGluZXMgPSBseXJpY3Muc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2godGltZXN0YW1wUGF0dGVybik7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCBbLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9XG4gICAgICAgIHBhcnNlSW50KG1pbnV0ZXMpICogNjAgKiAxMDAwICtcbiAgICAgICAgcGFyc2VJbnQoc2Vjb25kcykgKiAxMDAwICtcbiAgICAgICAgcGFyc2VJbnQobWlsbGlzZWNvbmRzKTtcblxuICAgICAgICB0aGlzLmx5cmljcy5zZXQodGltZXN0YW1wLCBsaW5lLnJlcGxhY2UodGltZXN0YW1wUGF0dGVybiwgJycpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGx5cmljcyBhdCBhIHNwZWNpZmljIHRpbWUgb3IgYXQgdGhlIGNsb3Nlc3QgdGltZSAoXHUwMEIxMiBzZWNvbmRzKVxuICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBhdCh0aW1lOiBudW1iZXIpOiBMeXJpY3NBdCB8IG51bGwge1xuICAgIGNvbnN0IGxvd2VzdFRpbWUgPSB0aGlzLmx5cmljcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChsb3dlc3RUaW1lID09IG51bGwgfHwgdGltZSA8IGxvd2VzdFRpbWUpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmx5cmljcy5oYXModGltZSkpXG4gICAgcmV0dXJuIHsgbGluZTogdGhpcy5seXJpY3MuZ2V0KHRpbWUpIGFzIHN0cmluZywgdGltZXN0YW1wOiB0aW1lIH07XG5cbiAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbSh0aGlzLmx5cmljcy5rZXlzKCkpO1xuXG4gICAgY29uc3QgY2xvc2VzdCA9IGtleXMucmVkdWNlKChhLCBiKSA9PlxuICAgIE1hdGguYWJzKGIgLSB0aW1lKSA8IE1hdGguYWJzKGEgLSB0aW1lKSA/IGIgOiBhXG4gICAgKTtcblxuICAgIGlmIChjbG9zZXN0ID4gdGltZSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHRpbWUpID4gMjAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBsaW5lID0gdGhpcy5seXJpY3MuZ2V0KGNsb3Nlc3QpO1xuXG4gICAgaWYgKCFsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7IHRpbWVzdGFtcDogY2xvc2VzdCwgbGluZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZvciB0aGUgbHlyaWNzIGNoYW5nZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIG9uQ2hhbmdlKGNhbGxiYWNrOiBMeXJpY3NDYWxsYmFjaykge1xuICAgIHRoaXMuI2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gZGV0ZWN0IHdoZW4gdGhlIHByb3ZpZGVyIGlzIHVuc3Vic2NyaWJlZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIG9uVW5zdWJzY3JpYmUoY2FsbGJhY2s6IFVuc3Vic2NyaWJlKSB7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHRoZSBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyB1bnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcbiAgICBpZiAodGhpcy4jb25VbnN1YnNjcmliZSkgdGhpcy4jb25VbnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuI29uVW5zdWJzY3JpYmUgPSBudWxsO1xuICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIHF1ZXVlIHRvIG1vbml0b3IgdGhlIGN1cnJlbnQgdGltZS5cbiAgICogQHJldHVybnMgVGhlIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgc3Vic2NyaWJlKCk6IFVuc3Vic2NyaWJlIHtcbiAgICBpZiAodGhpcy4jbG9vcCkgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBseXJpY3MgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoaGFzTG9vcCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wISk7XG4gICAgICB0aGlzLiNsb29wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzTG9vcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWVzIHRoZSBseXJpY3MgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcmVzdW1lKCkge1xuICAgIGNvbnN0IGhhc0xvb3AgPSB0aGlzLiNsb29wICE9PSBudWxsO1xuXG4gICAgaWYgKCFoYXNMb29wKSB0aGlzLiNjcmVhdGVMb29wKCk7XG5cbiAgICByZXR1cm4gIWhhc0xvb3A7XG4gIH1cblxuICAjY3JlYXRlTG9vcCgpIHtcbiAgICBpZiAoIXRoaXMuI2NhbGxiYWNrKSByZXR1cm47XG4gICAgaWYgKHRoaXMuI2xvb3ApIGNsZWFySW50ZXJ2YWwodGhpcy4jbG9vcCk7XG5cbiAgICBsZXQgbGFzdFZhbHVlOiBMeXJpY3NBdCB8IG51bGwgPSBudWxsO1xuXG4gICAgdGhpcy4jbG9vcCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmRlbGV0ZWQpIHJldHVybiB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgIGlmICghdGhpcy4jY2FsbGJhY2sgfHwgIXRoaXMucXVldWUuaXNQbGF5aW5nKCkpIHJldHVybjtcblxuICAgICAgY29uc3QgdGltZSA9IHRoaXMucXVldWUubm9kZS5nZXRUaW1lc3RhbXAoKTtcbiAgICAgIGlmICghdGltZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBseXJpY3MgPSB0aGlzLmF0KHRpbWUuY3VycmVudC52YWx1ZSk7XG5cbiAgICAgIGlmICghbHlyaWNzKSByZXR1cm47XG5cbiAgICAgIGlmIChcbiAgICAgIGxhc3RWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgbHlyaWNzLmxpbmUgPT09IGxhc3RWYWx1ZS5saW5lICYmXG4gICAgICBseXJpY3MudGltZXN0YW1wID09PSBsYXN0VmFsdWUudGltZXN0YW1wKVxuXG4gICAgICByZXR1cm47XG5cbiAgICAgIGxhc3RWYWx1ZSA9IGx5cmljcztcblxuICAgICAgdGhpcy4jY2FsbGJhY2sobHlyaWNzLmxpbmUsIGx5cmljcy50aW1lc3RhbXApO1xuICAgIH0sIHRoaXMuaW50ZXJ2YWwpLnVucmVmKCk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi9Bc3luY1F1ZXVlJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEVudGl0eSA9ICgpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG5leHBvcnQgY2xhc3MgU2VxdWVudGlhbEJ1Y2tldCB7XG4gIHB1YmxpYyBsaW1pdCA9IDE7XG4gIHB1YmxpYyByZW1haW5pbmcgPSAxO1xuICBwdWJsaWMgcmVzZXRBZnRlciA9IDA7XG4gIHB1YmxpYyBxdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gIHB1YmxpYyBNQVhfUkVUUklFUyA9IDU7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgYnVja2V0IGlzIHJhdGUgbGltaXRlZC5cbiAgICovXG4gIHB1YmxpYyBpc1JhdGVMaW1pdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnJlbWFpbmluZyA8PSAwICYmIERhdGUubm93KCkgPCB0aGlzLnJlc2V0QWZ0ZXI7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IGZ1bmN0aW9uIHRvIGVucXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnF1ZXVlKHJlcTogUmVxdWVzdEVudGl0eSkge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5hY3F1aXJlKCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVudHJ5LnJlbGVhc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZXF1ZXN0KHJlcTogUmVxdWVzdEVudGl0eSwgcmV0cmllcyA9IDApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgd2hpbGUgKHRoaXMuaXNSYXRlTGltaXRlZCgpKSB7XG4gICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICBhd2FpdCBzZXRUaW1lb3V0KHJlc2V0KTtcbiAgICB9XG5cbiAgICBsZXQgcGFzcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcSgpO1xuXG4gICAgICB0aGlzLl9wYXRjaEhlYWRlcnMocmVzKTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBsZXQgZXJyOiBFcnJvcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHk6IHtcbiAgICAgICAgICAgIGNvZGU6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICB9ID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGJvZHkubWVzc2FnZSkgYXMgRXJyb3IgJiB7Y29kZTogbnVtYmVyO307XG5cbiAgICAgICAgICBlcnJvci5uYW1lID0gYm9keS5uYW1lO1xuICAgICAgICAgIGVycm9yLmNvZGUgPSBib2R5LmNvZGU7XG5cbiAgICAgICAgICBlcnIgPSBlcnJvcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgZXJyID0gbmV3IEVycm9yKGBIVFRQIEVycm9yOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXNzID0gdHJ1ZTtcblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHBhc3MpIHRocm93IGU7XG5cbiAgICAgIGNvbnN0IGJhZFJlcSA9IGUgaW5zdGFuY2VvZiBFcnJvciAmJiAvRXJyb3I6IDRbMC05XXsyfS8udGVzdChlLm1lc3NhZ2UpO1xuXG4gICAgICBpZiAoIWJhZFJlcSAmJiByZXRyaWVzIDwgdGhpcy5NQVhfUkVUUklFUykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEsICsrcmV0cmllcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGF0Y2hIZWFkZXJzKHJlczogUmVzcG9uc2UpIHtcbiAgICBjb25zdCBsaW1pdCA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LUxpbWl0JykpO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlbWFpbmluZycpKTtcbiAgICBjb25zdCByZXNldEFmdGVyID1cbiAgICBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpKSAqIDEwMDAgKyBEYXRlLm5vdygpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obGltaXQpKSB0aGlzLmxpbWl0ID0gbGltaXQ7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocmVtYWluaW5nKSkgdGhpcy5yZW1haW5pbmcgPSByZW1haW5pbmc7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocmVzZXRBZnRlcikpIHRoaXMucmVzZXRBZnRlciA9IHJlc2V0QWZ0ZXI7XG4gIH1cbn0iLCAiaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBTZXF1ZW50aWFsQnVja2V0IH0gZnJvbSAnLi4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjU2VhcmNoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciB0cmFja05hbWUgaXMgcmVxdWlyZWQuXG4gICAqL1xuICBxPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIG5hbWUgdG8gc2VhcmNoIGZvci4gRWl0aGVyIHRoaXMgb3IgcXVlcnkgaXMgcmVxdWlyZWQuXG4gICAqL1xuICB0cmFja05hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICovXG4gIGFydGlzdE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExyY0dldFBhcmFtcyBleHRlbmRzIFJlcXVpcmVkPE9taXQ8THJjU2VhcmNoUGFyYW1zLCAncXVlcnknPj4ge1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcbn1cblxuY29uc3QgdG9TbmFrZUNhc2UgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IHNuYWtlT2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBuZXdLZXkgPSBrZXkucmVwbGFjZShcbiAgICAgIC9bQS1aXS9nLFxuICAgICAgKGxldHRlcikgPT4gYF8ke2xldHRlci50b0xvd2VyQ2FzZSgpfWBcbiAgICApO1xuICAgIHNuYWtlT2JqW25ld0tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBzbmFrZU9iajtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBjcmVhdGVRdWVyeSA9IChwYXJhbXM6IGFueSkgPT5cbm5ldyBVUkxTZWFyY2hQYXJhbXModG9TbmFrZUNhc2UocGFyYW1zKSkudG9TdHJpbmcoKTtcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRyYWNrIG5hbWVcbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgdHJhY2tOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFsYnVtTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBpbnN0cnVtZW50YWw6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgcGxhaW5MeXJpY3M6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBzeW5jZWRMeXJpY3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExyY0dldFJlc3VsdCA9IE9taXQ8THJjU2VhcmNoUmVzdWx0LCAnbmFtZSc+O1xuXG5leHBvcnQgY2xhc3MgTHJjTGliIHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgVVJMXG4gICAqL1xuICBwdWJsaWMgYXBpID0gJ2h0dHBzOi8vbHJjbGliLm5ldC9hcGknO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgdGltZW91dC4gRGVmYXVsdCBpcyAxNSBzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIHRpbWVvdXQgPSAxNV8wMDA7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBidWNrZXQgPSBuZXcgU2VxdWVudGlhbEJ1Y2tldCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExyY0xpYiBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlcXVlc3QgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0VGltZW91dCh0aW1lb3V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJldHJ5IGxpbWl0LiBEZWZhdWx0IGlzIDUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgcmV0cnkgbGltaXRcbiAgICovXG4gIHB1YmxpYyBzZXRSZXRyeUxpbWl0KGxpbWl0OiBudW1iZXIpIHtcbiAgICB0aGlzLmJ1Y2tldC5NQVhfUkVUUklFUyA9IGxpbWl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBnZXQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICBjb25zdCBwYXRoID0gYGdldD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGx5cmljcyBieSBJRFxuICAgKiBAcGFyYW0gaWQgVGhlIGx5cmljcyBJRFxuICAgKi9cbiAgcHVibGljIGdldEJ5SWQoaWQ6IGAke251bWJlcn1gIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KGBnZXQvJHtpZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNhY2hlZCBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldENhY2hlZChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0LWNhY2hlZD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIHNlYXJjaCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBzZWFyY2gocGFyYW1zOiBMcmNTZWFyY2hQYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcy5xICYmICFwYXJhbXMudHJhY2tOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ29uZSBvZiBxIG9yIHRyYWNrTmFtZScsXG4gICAgICAgICdzdHJpbmcnLFxuICAgICAgICBbU3RyaW5nKHBhcmFtcy5xKSwgU3RyaW5nKHBhcmFtcy50cmFja05hbWUpXS5qb2luKCcsICcpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBgc2VhcmNoPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHRbXT4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgdGhlIEFQSVxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aFxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IFV0aWwuZ2V0UnVudGltZSgpO1xuXG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9XG4gICAgICBuYW1lID09PSAndW5rbm93bicgPyB2ZXJzaW9uIDogYCR7bmFtZX0vJHt2ZXJzaW9ufWA7XG5cbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCh0aGlzLnRpbWVvdXQpLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiBgRGlzY29yZC1QbGF5ZXIvJHt0aGlzLnBsYXllci52ZXJzaW9ufSAke1xuICAgICAgICAgIHJ1bnRpbWVWZXJzaW9uID8/ICcnfWAuXG4gICAgICAgICAgdHJpbUVuZCgpLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgW0xyY0xpYl0gUmVxdWVzdGluZyAke3BhdGh9YCk7XG5cbiAgICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgYCR7dGhpcy5hcGl9JHtwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiAnLycgKyBwYXRofWAsXG4gICAgICAgIGluaXRcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgfVxufSIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICBqb2luVm9pY2VDaGFubmVsLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBBdWRpb1BsYXllciB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBOb0d1aWxkUXVldWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAvKipcbiAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFxuICAgIFNub3dmbGFrZSxcbiAgICBTdHJlYW1EaXNwYXRjaGVyPihcbiAgKTtcblxuICAvKipcbiAgICogVGhlIHZvaWNlIHV0aWxzIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gIH0pXG4gIDogUHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPiB7XG4gICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCk7XG4gICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihcbiAgICAgIGNvbm4sXG4gICAgICBjaGFubmVsLFxuICAgICAgb3B0aW9ucy5xdWV1ZSxcbiAgICAgIG9wdGlvbnMubWF4VGltZSxcbiAgICAgIG9wdGlvbnMuYXVkaW9QbGF5ZXJcbiAgICApO1xuICAgIHJldHVybiBzdWI7XG4gIH1cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luKFxuICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgbWF4VGltZT86IG51bWJlcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29ubmVjdGlvbiA9IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICBvcHRpb25zPy5ncm91cFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgZXhpc3RpbmdDb25uZWN0aW9uPy5qb2luQ29uZmlnLmNoYW5uZWxJZCA9PT0gY2hhbm5lbD8uaWQgJiZcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0Nvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLlxuICAgICAgdm9pY2VBZGFwdGVyQ3JlYXRvciBhcyB1bmtub3duIGFzIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gICAgICBzZWxmRGVhZjogQm9vbGVhbihvcHRpb25zPy5kZWFmKSxcbiAgICAgIGRlYnVnOiB0aGlzLnBsYXllci5ldmVudHMubGlzdGVuZXJDb3VudCgnZGVidWcnKSA+IDAsXG4gICAgICBncm91cDogb3B0aW9ucz8uZ3JvdXBcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25uO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBTdHJlYW1EaXNwYXRjaGVyKVxuICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLnZvaWNlQ29ubmVjdGlvbjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAgICByZXR1cm4gY29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7U25vd2ZsYWtlfSBndWlsZCBUaGUgZ3VpbGQgaWRcbiAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29ubmVjdGlvbihndWlsZDogU25vd2ZsYWtlLCBncm91cD86IHN0cmluZykge1xuICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgfVxufVxuXG5leHBvcnQgeyBWb2ljZVV0aWxzIH07IiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9mYWJyaWMvU2VhcmNoUmVzdWx0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4vUXVlcnlSZXNvbHZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICBjaGVja0ludGVydmFsPzogbnVtYmVyO1xufVxuXG4vLyA1aFxuY29uc3QgREVGQVVMVF9FWFBJUllfVElNRU9VVCA9IDE4XzAwMF8wMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVByb3ZpZGVyPFQ+IHtcbiAgZ2V0RGF0YSgpOiBQcm9taXNlPERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQ+W10+O1xuICBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCk6IFByb21pc2U8dm9pZD47XG4gIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCk6IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q2FjaGUgaW1wbGVtZW50cyBRdWVyeUNhY2hlUHJvdmlkZXI8VHJhY2s+IHtcbiAgI2RlZmF1bHRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUcmFjaz4+KCk7XG4gIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBwbGF5ZXI6IFBsYXllcixcbiAgcHVibGljIG9wdGlvbnM6IFF1ZXJ5Q2FjaGVPcHRpb25zID0ge1xuICAgIGNoZWNrSW50ZXJ2YWw6IERFRkFVTFRfRVhQSVJZX1RJTUVPVVRcbiAgfSlcbiAge1xuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbChcbiAgICAgIHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5jaGVja0ludGVydmFsXG4gICAgKS51bnJlZigpO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2hlY2tJbnRlcnZhbCA/PyBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyKCkge1xuICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLiNkZWZhdWx0Q2FjaGUudmFsdWVzKCldO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgaWYgKCFyZXN1bHQpXG4gICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgZXhwaXJlQWZ0ZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBkYXRhOiBULFxuICBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVClcbiAge1xuICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgIGlmIChcbiAgICB0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHxcbiAgICBpc05hTih0aGlzLmV4cGlyZUFmdGVyKSB8fFxuICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0IHtcbiAgcXVlcnk6IHN0cmluZztcbiAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBgZXh0OiR7c3RyaW5nfWA7XG59IiwgImltcG9ydCB7IEZGbXBlZyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBTbm93Zmxha2VVdGlsLFxuICBWb2ljZVN0YXRlLFxuICBJbnRlbnRzQml0RmllbGQsXG4gIFVzZXIsXG4gIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgdmVyc2lvbiBhcyBkanNWZXJzaW9uLFxuICBFdmVudHMgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBQbGF5bGlzdCxcbiAgVHJhY2ssXG4gIFNlYXJjaFJlc3VsdCxcbiAgU2VhcmNoT3B0aW9ucyxcbiAgUGxheWxpc3RJbml0RGF0YSB9IGZyb21cbicuL2ZhYnJpYyc7XG5pbXBvcnQge1xuICBHdWlsZFF1ZXVlRXZlbnRzLFxuICBWb2ljZUNvbm5lY3RDb25maWcsXG4gIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsXG4gIEd1aWxkTm9kZU1hbmFnZXIsXG4gIEd1aWxkUXVldWUsXG4gIFJlc291cmNlUGxheU9wdGlvbnMsXG4gIEd1aWxkUXVldWVFdmVudCB9IGZyb21cbicuL3F1ZXVlJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7XG4gIFF1ZXJ5UmVzb2x2ZXIsXG4gIFF1ZXJ5VHlwZSxcbiAgUmVzb2x2ZWRRdWVyeSxcbiAgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbVxuJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEF1ZGlvUmVzb3VyY2UsXG4gIHZlcnNpb24gYXMgZFZvaWNlVmVyc2lvbixcbiAgU3RyZWFtVHlwZSB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBRdWVyeUNhY2hlLCBRdWVyeUNhY2hlUHJvdmlkZXIgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yLCBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyIH0gZnJvbSAnLi9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXInO1xuaW1wb3J0IHsgQ29udGV4dCwgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHsgSG9va3NDdHgsIFNVUEVSX0NPTlRFWFQgfSBmcm9tICcuL2hvb2tzL2NvbW1vbic7XG5pbXBvcnQgeyBMcmNMaWIgfSBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHsgZ2V0Q29tcGF0TmFtZSwgaXNDbGllbnRQcm94eSB9IGZyb20gJy4vY29tcGF0L2NyZWF0ZUVyaXNDb21wYXQnO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciB9IGZyb20gJy4vdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IHZlcnNpb24gYXMgZHBWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCB7XG4gIFBsYXllclN0cmVhbUludGVyY2VwdG9yLFxuICB0eXBlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB9IGZyb21cbicuL1BsYXllclN0cmVhbUludGVyY2VwdG9yJztcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0ZWRTdHJlYW0gfSBmcm9tICcuL3N0cmVhbS9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyRXZlbnRzIHtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBQbGF5ZXJFdmVudCA9IHtcbiAgZGVidWc6ICdkZWJ1ZycsXG4gIERlYnVnOiAnZGVidWcnLFxuICBlcnJvcjogJ2Vycm9yJyxcbiAgRXJyb3I6ICdlcnJvcicsXG4gIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGxheWVyRXZlbnQgPSAodHlwZW9mIFBsYXllckV2ZW50KVtrZXlvZiB0eXBlb2YgUGxheWVyRXZlbnRdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gYW55PiB7XG4gIHRyYWNrOiBUcmFjaztcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQ7XG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID1cbnN0cmluZyB8XG5UcmFjayB8XG5TZWFyY2hSZXN1bHQgfFxuVHJhY2tbXSB8XG5QbGF5bGlzdCB8XG5BdWRpb1Jlc291cmNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKVxuPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgKi9cbiAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICovXG4gIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAqL1xuICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICNsYWdNb25pdG9yVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0O1xuICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgI2hvb2tzQ3R4OiBDb250ZXh0PEhvb2tzQ3R4PiB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gZHBWZXJzaW9uO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgLyoqXG4gICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbm9kZXMgKHF1ZXVlKSBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBhcGkgdXRpbGl0aWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgZXZlbnRzIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbXG4gIEd1aWxkUXVldWVFdmVudC5FcnJvcixcbiAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXVxuICApO1xuICAvKipcbiAgICogVGhlIHBsYXllciB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9IFBsYXllci52ZXJzaW9uO1xuICAvKipcbiAgICogVGhlIGx5cmljcyBhcGlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBseXJpY3MgPSBuZXcgTHJjTGliKHRoaXMpO1xuXG4gICNzdHJlYW1JbnRlcmNlcHRvcjogUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihbUGxheWVyRXZlbnQuRXJyb3JdKTtcblxuICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgZm9yIG9wdGlvbnMuZmZtcGVnUGF0aC4gR290ICR7dHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aH0gaW5zdGVhZGBcbiAgICAgICk7XG5cbiAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXNjb3JkIGNsaWVudFxuICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoY2xpZW50IGluc3RhbmNlb2YgQ2xpZW50KSkge1xuICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWJmID1cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID9cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDpcbiAgICAgICAgbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAnY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JyxcbiAgICAgICAgICAgICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH19XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgIHF1ZXJ5Q2FjaGU6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgP1xuICAgICAgbnVsbCA6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSBzYXRpc2ZpZXMgUGxheWVySW5pdE9wdGlvbnM7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuaW5jcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmNsaWVudC5vbihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICB0aGlzLmNsaWVudC5fX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHkodGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gYXR0YWNoIHZvaWNlIHN0YXRlIHVwZGF0ZSBwcm94eSwgdm9pY2Ugc3RhdGUgaGFuZGxlciB3aWxsIG5vdCB3b3JrIHByb3Blcmx5JyxcbiAgICAgICAgICAnQ29tcGF0TW9kZUVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICB0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmXG4gICAgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKVxuICAgIHtcbiAgICAgIHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgdGhpcy4jbGFnTW9uaXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2BcbiAgICAgICAgICApO1xuICAgICAgICB9LCAwKS51bnJlZigpO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVycmlkZUZhbGxiYWNrQ29udGV4dCkge1xuICAgICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0BbcGxheWVyXScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaG9va3MgY29udGV4dCBmb3IgdGhpcyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgaWYgKCF0aGlzLiNob29rc0N0eCkge1xuICAgICAgdGhpcy4jaG9va3NDdHggPSBjcmVhdGVDb250ZXh0KCk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsUHJvdmlkZXIgPSB0aGlzLiNob29rc0N0eC5wcm92aWRlLmJpbmQodGhpcy4jaG9va3NDdHgpO1xuXG4gICAgICB0aGlzLiNob29rc0N0eC5wcm92aWRlID0gKHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgICAgICByZXR1cm4gU1VQRVJfQ09OVEVYVC5wcm92aWRlKHRoaXMsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm92aWRlcih2YWx1ZSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jaG9va3NDdHg7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIG9uVm9pY2VTdGF0ZVVwZGF0ZShoYW5kbGVyOiBWb2ljZVN0YXRlSGFuZGxlcikge1xuICAgIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBkaXNjb3JkLXBsYXllciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlDYWNoZSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIHRvIGBQbGF5ZXIubm9kZXNgLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRzID0gcGxheWVyLmdlbmVyYXRlU3RhdGlzdGljcygpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAqXG4gICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICogLy8ge1xuICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAqIC8vICAgcXVldWVzOiBbXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgLi4uXG4gICAqIC8vICAgXVxuICAgKiAvLyB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGxheWVyIGlzIGluIGNvbXBhdGliaWxpdHkgbW9kZS4gQ29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQgd2hlbiBub24tZGlzY29yZC5qcyBjbGllbnQgaXMgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBpc0NvbXBhdE1vZGUoKSB7XG4gICAgcmV0dXJuIGlzQ2xpZW50UHJveHkodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuXG4gICAgaWYgKCF0aGlzLmlzQ29tcGF0TW9kZSgpKSB7XG4gICAgICB0aGlzLmNsaWVudC5vZmYoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICB0aGlzLmNsaWVudC5kZWNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9yVGltZW91dCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9yVGltZW91dCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICBxdWV1ZSxcbiAgICAgIG9sZFN0YXRlLFxuICAgICAgbmV3U3RhdGVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgIHJldHVybiB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUodGhpcywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgKiAgIHBsYXllci5oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIsIGV2ZW4gaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhdWRpbyBwbGF5ZXJcbiAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5ZXJcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgKiBjb25zdCBxdWVyeSA9ICd0aGlzIGlzIG15IHN1cGVyIGNvb2wgc2VhcmNoIHF1ZXJ5IHRoYXQgSSB3YW50IHRvIHBsYXknO1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgICBjb25zdCB7IHRyYWNrIH0gPSBhd2FpdCBwbGF5ZXIucGxheSh2b2ljZUNoYW5uZWwsIHF1ZXJ5KTtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICogfSBjYXRjaChlKSB7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzRFx1REUyRCBGYWlsZWQgdG8gcGxheSBlcnJvciBvaCBubzpcXG5cXG4ke2V9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgcXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgJ1ZvaWNlQmFzZWRDaGFubmVsJyxcbiAgICAgICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YFxuICAgICk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9XG4gICAgcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPVxuICAgIChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoXG4gICAgICAgIGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtcbiAgICAgICAgcmVzdWx0LmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYFxuXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gV2FpdGluZyBmb3IgdGhlIHF1ZXVlIHRvIHJlc29sdmUuLi5gKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKVxuICAgICAgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHF1ZXVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdHJhY2tzXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtTZWFyY2hPcHRpb25zfSBvcHRpb25zIFRoZSBzZWFyY2ggb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJ3Bhc3MgdXJsIG9yIHRleHQgb3IgZGlzY29yZC1wbGF5ZXIgdHJhY2sgY29uc3RydWN0YWJsZSBvYmplY3RzLCB3ZSBnb3QgeW91IGNvdmVyZWQgXHVEODNEXHVERTBFJztcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAqXG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIExvZ3MgYFNlYXJjaFJlc3VsdGAgb2JqZWN0XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChcbiAgc2VhcmNoUXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KVxuICA6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gc2VhcmNoUXVlcnk7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICBzZWFyY2hRdWVyeSA9IHRoaXMuY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShzZWFyY2hRdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbClcbiAgICBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG5cbiAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgdHJhY2tzOiBbc2VhcmNoUXVlcnldLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IHNlYXJjaFF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgbGV0IGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsLFxuICAgICAgcHJvdG9jb2w6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gXG4gICAgKTtcblxuICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGRldGVjdGVkIGluIHF1ZXJ5YCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlLmZpbmQoXG4gICAgICAgIChlKSA9PlxuICAgICAgICAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJlxuICAgICAgICBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdFeHRyYWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYFxuICAgICAgICApO1xuICAgICAgICBleHRyYWN0b3IgPSBtYXRjaGluZ0V4dHJhY3RvcjtcbiAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGFuIGV4dHJhY3RvciB0aGF0IHN1cHBvcnRzICR7cHJvdG9jb2xOYW1lfSBwcm90b2NvbC4gRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuLi5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3RlZCA9IGF3YWl0IFF1ZXJ5UmVzb2x2ZXIucHJlUmVzb2x2ZShzZWFyY2hRdWVyeSk7XG4gICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUTyA/XG4gICAgUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDpcbiAgICB7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogcmVkaXJlY3RlZCB9IGFzIFJlc29sdmVkUXVlcnk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke1xuICAgICAgZXh0cmFjdG9yICYmIHByb3RvY29sID9cbiAgICAgICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDpcbiAgICAgICcnfWBcblxuICAgICk7XG5cbiAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgIGlmIChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdGFydHNXaXRoKCdleHQ6JykpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgRm9yY2luZyAke29wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KX0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGFsbCBleHRyYWN0b3JzXG4gICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICBpZiAocmVzPy5oYXNUcmFja3MoKSkge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBoaXQgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvcnMuLi5gKTtcblxuICAgICAgLy8gY2FjaGUgbWlzc1xuICAgICAgZXh0cmFjdG9yID1cbiAgICAgIChcbiAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgIH0pKT8uXG4gICAgICBleHRyYWN0b3IgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gXG4gICAgKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3IuXG4gICAgaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgcHJvdG9jb2xcbiAgICB9KS5cbiAgICBjYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICAnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICFvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpICYmIChcbiAgICAgIGF3YWl0IGV4dC52YWxpZGF0ZShxdWVyeSkpICYmXG4gICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICBwcm90b2NvbFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke1xuICAgICAgICByZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYFxuXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgfSk7XG5cbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgIGNvbnN0IHJ1bnRpbWUgPVxuICAgICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICBsaW5lLFxuICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufSR7XG4gICAgdGhpcy5pc0NvbXBhdE1vZGUoKSA/XG4gICAgYCAoJHtnZXRDb21wYXROYW1lKHRoaXMuY2xpZW50KX0gY29tcGF0aWJpbGl0eSBtb2RlKWAgOlxuICAgICcnfWAsXG5cbiAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgIGAtIE5vZGUgdmVyc2lvbjogJHtwcm9jZXNzLnZlcnNpb259IChEZXRlY3RlZCBSdW50aW1lOiAke3J1bnRpbWV9LCBQbGF0Zm9ybTogJHtwcm9jZXNzLnBsYXRmb3JtfSBbJHtwcm9jZXNzLmFyY2h9XSlgLFxuICAgICgoKSA9PiB7XG4gICAgICBjb25zdCBpbmZvID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG4gICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgYC0gZmZtcGVnOiAke2luZm8udmVyc2lvbn1gLFxuICAgICAgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCxcbiAgICAgIGAtIHN0YXRpYzogJHtpbmZvLm1vZHVsZX1gLFxuICAgICAgYC0gbGlib3B1czogJHtpbmZvLnJlc3VsdCEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5cbiAgICAgIGpvaW4oJ1xcbicpO1xuICAgIH0pKCksXG4gICAgJ1xcbicsXG4gICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgbGluZSxcbiAgICB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgIH0pLlxuICAgIGpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVTdHJpbmcoKV07XG5cblxuICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSBhIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYWNrIGZyb20gYW4gYXVkaW8gcmVzb3VyY2UuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVUcmFja0Zyb21BdWRpb1Jlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSAocmVzb3VyY2UubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJlZiA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1heWJlVGl0bGUgPVxuICAgICd0aXRsZScgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aXRsZX1gIDogYFRyYWNrICR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVBdXRob3IgPVxuICAgICdhdXRob3InIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuYXV0aG9yfWAgOiAnVW5rbm93biBhdXRob3InO1xuICAgIGNvbnN0IG1heWJlRHVyYXRpb24gPVxuICAgICdkdXJhdGlvbicgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS5kdXJhdGlvbn1gIDogJzAwOjAwJztcbiAgICBjb25zdCBtYXliZVRodW1ibmFpbCA9XG4gICAgJ3RodW1ibmFpbCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aHVtYm5haWx9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXliZVVSTCA9XG4gICAgJ3VybCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS51cmx9YCA6IGBkaXNjb3JkLXBsYXllcjovL2Jsb2IvJHtyZWZ9YDtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID1cbiAgICAnZGVzY3JpcHRpb24nIGluIG1ldGFkYXRhID9cbiAgICBgJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1gIDpcbiAgICAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLic7XG4gICAgY29uc3QgbWF5YmVWaWV3cyA9ICd2aWV3cycgaW4gbWV0YWRhdGEgPyBOdW1iZXIobWV0YWRhdGEudmlld3MpIHx8IDAgOiAwO1xuXG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywge1xuICAgICAgdGl0bGU6IG1heWJlVGl0bGUsXG4gICAgICBhdXRob3I6IG1heWJlQXV0aG9yLFxuICAgICAgZHVyYXRpb246IG1heWJlRHVyYXRpb24sXG4gICAgICB0aHVtYm5haWw6IG1heWJlVGh1bWJuYWlsLFxuICAgICAgdXJsOiBtYXliZVVSTCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtYXliZURlc2NyaXB0aW9uLFxuICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQixcbiAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgdmlld3M6IG1heWJlVmlld3NcbiAgICB9KTtcblxuICAgIHJlc291cmNlLm1ldGFkYXRhID0gdHJhY2s7XG5cbiAgICB0cmFjay5zZXRSZXNvdXJjZShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbnRlcmNlcHRpbmcgc3RyZWFtc1xuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gaW50ZXJjZXB0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlSW50ZXJjZXB0aW5nU3RyZWFtKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgdHJhY2s6IFRyYWNrLFxuICBmb3JtYXQ6IFN0cmVhbVR5cGUsXG4gIHN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG4gIHtcbiAgICBpZiAoIXRoaXMuI3N0cmVhbUludGVyY2VwdG9yKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IuaGFuZGxlKHF1ZXVlLCB0cmFjaywgZm9ybWF0LCBzdHJlYW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnbG9iYWwgc3RyZWFtIGludGVyY2VwdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gaW50ZXJjZXB0b3Igb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVN0cmVhbUludGVyY2VwdG9yKG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICAgIH1cblxuICAgIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yID0gbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICB9XG59IiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5mdW5jdGlvbiBoYW5kbGVFbXB0eUNoYW5uZWwoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgfHwgIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKVxuICAgIHJldHVybjtcbiAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke2d1aWxkSWR9YCwgdGltZW91dCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5ndWlsZElkOiBzdHJpbmcpXG57XG4gIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtndWlsZElkfWApO1xuICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZTogR3VpbGRRdWV1ZSkge1xuICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICBjb25zdCB3YXNQYXVzZWRPbkVtcHR5ID0gUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKTtcblxuICBpZiAoaXNFbXB0eSAmJiAhd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICBxdWV1ZS5kZWJ1ZyhcbiAgICAgICAgJ1ZvaWNlIGNoYW5uZWwgaXMgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHBhdXNpbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghaXNFbXB0eSAmJiB3YXNQYXVzZWRPbkVtcHR5KSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVCb3RWb2ljZVN0YXRlVXBkYXRlKFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoXG4gIG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpXG4gIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFN0YXRlOiBWb2ljZVN0YXRlLFxubmV3U3RhdGU6IFZvaWNlU3RhdGUpXG57XG4gIGlmICghcXVldWU/LmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBjb25zdCBpc0JvdFN0YXRlID0gbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQ7XG4gIGNvbnN0IGd1aWxkSWQgPSBvbGRTdGF0ZS5ndWlsZC5pZDtcblxuICAvLyBCb3QgZGlzY29ubmVjdGVkXG4gIGlmIChpc0JvdFN0YXRlICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgaGFuZGxlUGF1c2VPbkVtcHR5KHF1ZXVlKTtcbiAgfVxuXG4gIC8vIEJvdCBqb2luZWQgY2hhbm5lbCBvciBjaGFuZ2VkIHN0YXRlXG4gIGlmIChcbiAgaXNCb3RTdGF0ZSAmJlxuICBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgKFxuICAhb2xkU3RhdGUuY2hhbm5lbElkIHx8IG9sZFN0YXRlLmNoYW5uZWxJZCAhPT0gbmV3U3RhdGUuY2hhbm5lbElkKSlcbiAge1xuICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uKSBxdWV1ZS5jaGFubmVsID0gbmV3U3RhdGUuY2hhbm5lbCE7XG4gICAgaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjaGFubmVsIGVtcHR5L3BvcHVsYXRlIGV2ZW50c1xuICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIGlmIChcbiAgICBuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQgJiZcbiAgICAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpXG5cbiAgICByZXR1cm47XG4gICAgaWYgKCFxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7Z3VpbGRJZH1gKSkge1xuICAgICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICAgIH1cbiAgfVxufSIsICJpbXBvcnQgeyByZXNvbHZlLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEZGbXBlZywgRkZtcGVnTGliIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUpTT04ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWF5YmVOdWxsPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgY29yZToge1xuICAgICdkaXNjb3JkLXBsYXllcic6IHN0cmluZztcbiAgICAnZGlzY29yZC12b2lwJzogc3RyaW5nO1xuICB9O1xuICBsaWJvcHVzOiB7XG4gICAgbWVkaWFwbGV4OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQGRpc2NvcmRqcy9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BldmFuL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICBvcHVzc2NyaXB0OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbm9kZS1vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGxpYnNvZGl1bToge1xuICAgICdzb2RpdW0tbmF0aXZlJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgc29kaXVtOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQG5vYmVsL2NpcGhlcnMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgfTtcbiAgZmZtcGVnOiBGRm1wZWdSZXBvcnQ7XG59XG5cbmV4cG9ydCB0eXBlIEZGbXBlZ1JlcG9ydCA9IFJlY29yZDxcbiAgRkZtcGVnTGliLFxuICBNYXliZU51bGw8e1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBoYXNMaWJvcHVzOiBib29sZWFuO1xuICB9Pj47XG5cblxuLyoqXG4gKiBBIHV0aWxpdHkgdG8gZ2VuZXJhdGUgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yID0ge1xuICAvKipcbiAgICogRmluZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIG9mIGEgcGFja2FnZS5cbiAgICogQHBhcmFtIGRpciAtIFRoZSBkaXJlY3RvcnkgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cbiAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gZmluZFxuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2hcbiAgICogQHJldHVybnMgVGhlIHBhY2thZ2UuanNvbiBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZmluZFBhY2thZ2VKU09OKFxuICBkaXI6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZGVwdGg6IG51bWJlcilcbiAgOiBQYWNrYWdlSlNPTiB8IG51bGwge1xuICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgY29uc3QgbmV4dCA9ICgpID0+XG4gICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04oXG4gICAgICByZXNvbHZlKGRpciwgJy4uJyksXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGRlcHRoIC0gMVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IHBrZ0pTT046IFBhY2thZ2VKU09OID0gcmVxdWlyZSh0YXJnZXQpO1xuXG4gICAgICBpZiAocGtnSlNPTi5uYW1lICE9PSBwYWNrYWdlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGtnSlNPTjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogVHJpZXMgdG8gZmluZCB0aGUgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHBhY2thZ2UgdG8gZmluZCB0aGUgdmVyc2lvbiBvZlxuICAgKiBAcGFyYW0gbWF4TG9va3VwRGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2ggZm9yIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgKiBAcmV0dXJucyBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIHZlcnNpb24obmFtZTogc3RyaW5nLCBtYXhMb29rdXBEZXB0aCA9IDMpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkaXNjb3JkLXBsYXllcicpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBrZyA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShuYW1lKSksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1heExvb2t1cERlcHRoXG4gICAgICApO1xuICAgICAgcmV0dXJuIHBrZz8udmVyc2lvbiA/PyBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVwb3J0IG9iamVjdFxuICAgKi9cbiAgZ2VuZXJhdGUoKTogRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgICBjb25zdCBmZm1wZWdSZXBvcnQgPSB7fSBhcyBGRm1wZWdSZXBvcnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBGRm1wZWcuc291cmNlcykge1xuICAgICAgZmZtcGVnUmVwb3J0W2xpYi5uYW1lXSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmZtcGVnID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG5cbiAgICBpZiAoZmZtcGVnKSB7XG4gICAgICBmZm1wZWdSZXBvcnRbZmZtcGVnLm5hbWVdID0ge1xuICAgICAgICBoYXNMaWJvcHVzOiBmZm1wZWcuY29tbWFuZC5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpLFxuICAgICAgICB2ZXJzaW9uOiBmZm1wZWcudmVyc2lvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29yZToge1xuICAgICAgICAnZGlzY29yZC1wbGF5ZXInOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJ1xuICAgICAgICApIGFzIHN0cmluZyxcbiAgICAgICAgJ2Rpc2NvcmQtdm9pcCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnZGlzY29yZC12b2lwJ1xuICAgICAgICApIGFzIHN0cmluZ1xuICAgICAgfSxcbiAgICAgIGxpYm9wdXM6IHtcbiAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgJ0BldmFuL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BldmFuL29wdXMnKSxcbiAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpXG4gICAgICB9LFxuICAgICAgbGlic29kaXVtOiB7XG4gICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6XG4gICAgICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbGlic29kaXVtLXdyYXBwZXJzJyksXG4gICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1J1xuICAgICAgICApLFxuICAgICAgICAnc29kaXVtLWphdmFzY3JpcHQnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bS1qYXZhc2NyaXB0JyksXG4gICAgICAgICdAbm9iZWwvY2lwaGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQG5vYmVsL2NpcGhlcnMnKVxuICAgICAgfSxcbiAgICAgIGZmbXBlZzogZmZtcGVnUmVwb3J0XG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydC5cbiAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgZ2VuZXJhdGVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgb3V0cHV0LnB1c2goJ0RlcGVuZGVuY2llcyBSZXBvcnQnKTtcbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXBvcnQpIGFzIChrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQpW107XG5cbiAgICBmb3IgKGNvbnN0IF9rZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qga2V5ID0gX2tleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQ7XG5cbiAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cbiAgICAgIGNvbnN0IHN1YktleXMgPSBPYmplY3Qua2V5cyhyZXBvcnRba2V5XSk7XG5cbiAgICAgIGZvciAoY29uc3QgX3N1YktleSBvZiBzdWJLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YktleSA9IF9zdWJLZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0W3R5cGVvZiBrZXldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcG9ydFtrZXldW3N1YktleV0gPz8gJ04vQSc7XG5cbiAgICAgICAgb3V0cHV0LnB1c2goXG4gICAgICAgICAgYC0gJHtzdWJLZXl9OiAke1xuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiB2YWx1ZX1gXG5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cblxuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxufTsiLCAiXG5cblxuXG5cblxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAvKiBAX19NQUNST19fIGdldFZlcnNpb24gKi9cIjcuMS4xLWRldi4wXCI7IiwgImltcG9ydCB7IFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHR5cGUgeyBUcmFjayB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG50eXBlIEF3YWl0YWJsZTxUPiA9IFQgfCBQcm9taXNlTGlrZTxUPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFNob3VsZEludGVyY2VwdEZ1bmN0aW9uID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPGJvb2xlYW4+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIgPSA8VCA9IGFueT4oXG5xdWV1ZTogR3VpbGRRdWV1ZTxUPixcbnRyYWNrOiBUcmFjayxcbmZvcm1hdDogU3RyZWFtVHlwZSxcbnN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG49PiBBd2FpdGFibGU8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3RyZWFtIHNob3VsZCBiZSBpbnRlcmNlcHRlZC5cbiAgICovXG4gIHNob3VsZEludGVyY2VwdD86IFNob3VsZEludGVyY2VwdEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3Ige1xuICAjb25TdHJlYW0gPSBuZXcgU2V0PE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLFxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucylcbiAge31cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgaW50ZXJjZXB0ZWQgc3RyZWFtLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIGd1aWxkIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW50ZXJjZXB0ZWQgc3RyZWFtXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHN0cmVhbSB3YXMgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGU8VCA9IHVua25vd24+KFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPixcbiAgdHJhY2s6IFRyYWNrLFxuICB0eXBlOiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICA6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy5zaG91bGRJbnRlcmNlcHQ7XG5cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaWx0ZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLiNvblN0cmVhbS5zaXplO1xuXG4gICAgaWYgKCFoYXNMaXN0ZW5lcnMpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRoaXMuI29uU3RyZWFtXS5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pKVxuICAgICk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGludGVyY2VwdGVkIHN0cmVhbSBsaXN0ZW5lci5cbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXJcbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxpc3RlbmVyXG4gICAqL1xuICBwdWJsaWMgb25TdHJlYW0oaGFuZGxlcjogT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLiNvblN0cmVhbS5hZGQoaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy4jb25TdHJlYW0uZGVsZXRlKGhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDR0EsaUJBQW1EOzs7QUNGbkQsc0JBQTJCOzs7QUNEM0IscUJBTUE7OztBQ05PLElBQU0sc0JBQU4sTUFBTSw0QkFBMkIsTUFBTTtBQUFBLEVBSXJDLFlBQVksTUFBa0IsU0FBaUI7QUFDcEQsVUFBTSxPQUFPO0FBSmYsd0JBQWdCO0FBQ2hCLHdCQUFn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M0IsYUFBTyxtQkFBSztBQUFBLElBQ2Q7QUFFQSx1QkFBSyxvQkFBcUIsSUFBSSx3QkFBd0IsTUFBTSxPQUFPO0FBRW5FLFdBQU8sbUJBQUs7QUFBQSxFQUNkO0FBQ0Y7QUFseUJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTZDQTtBQW5ENEQ7QUFBQTtBQUFBO0FBQUE7QUFVNUQsY0FWVyxTQVVZLFdBQWtCO0FBVnBDLElBQU0sU0FBTjs7O0ExQ3BJUCxJQUFBSyxvQkFXQTtBQUNBLElBQUFDLHVCQVdBOyIsCiAgIm5hbWVzIjogWyJHdWlsZFF1ZXVlIiwgIlNlcmlhbGl6ZWRUeXBlIiwgInF1ZXJ5IiwgInZlcnNpb24iLCAibW9kdWxlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAicmVzdWx0IiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9kaXNjb3JkIiwgInJlc29sdmUiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiVHJhY2tTa2lwUmVhc29uIiwgInJlc29sdmUiLCAiR3VpbGRRdWV1ZSIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF9wcm9taXNlcyIsICJ2ZXJzaW9uIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9mZm1wZWciLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZmZtcGVnIiwgImRqc1ZlcnNpb24iLCAicXVlcnkiLCAicmVzIiwgInJlc3VsdCIsICJkVm9pY2VWZXJzaW9uIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCJdCn0K
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+IHtcbiAgICAgIHRoaXMuI29uU3RyZWFtLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDR0EsaUJBQW1EOzs7QUNINUMsSUFBTSw0QkFBNEIsT0FBTyxxQkFBcUI7QUFTOUQsU0FBUyxtQkFBbUIsUUFBYSxVQUF3QztBQUN0RixVQUFRLElBQUksUUFBUSwyQkFBMkIsUUFBUTtBQUN2RCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFOZ0I7QUFRVCxTQUFTLGNBQWMsUUFBc0I7QUFDbEQsU0FBTyxRQUFRLElBQUksUUFBUSx5QkFBeUIsS0FB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QUFBQyx1QkFXQTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJTZXJpYWxpemVkVHlwZSIsICJxdWVyeSIsICJ2ZXJzaW9uIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAibW9kdWxlIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAiaW1wb3J0X3YxMCIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgImRlY2xhcmVQcm9wZXJ0eSIsICJnZXRQcm9wZXJ0eSIsICJtb2R1bGUiLCAiRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgInJlc3VsdCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJyZXNvbHZlIiwgInJlc29sdmUiLCAid2FpdEZvciIsICJpbXBvcnRfZXF1YWxpemVyIiwgIlRyYWNrU2tpcFJlYXNvbiIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2ZmbXBlZyIsICJkanNWZXJzaW9uIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiXQp9Cg==