@r5n/hydra 0.3.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/cli.js ADDED
@@ -0,0 +1,2443 @@
1
+ #!/usr/bin/env bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
18
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
19
+
20
+ // ../../node_modules/sisteransi/src/index.js
21
+ var require_src = __commonJS((exports, module) => {
22
+ var ESC = "\x1B";
23
+ var CSI = `${ESC}[`;
24
+ var beep = "\x07";
25
+ var cursor = {
26
+ to(x, y) {
27
+ if (!y)
28
+ return `${CSI}${x + 1}G`;
29
+ return `${CSI}${y + 1};${x + 1}H`;
30
+ },
31
+ move(x, y) {
32
+ let ret = "";
33
+ if (x < 0)
34
+ ret += `${CSI}${-x}D`;
35
+ else if (x > 0)
36
+ ret += `${CSI}${x}C`;
37
+ if (y < 0)
38
+ ret += `${CSI}${-y}A`;
39
+ else if (y > 0)
40
+ ret += `${CSI}${y}B`;
41
+ return ret;
42
+ },
43
+ up: (count = 1) => `${CSI}${count}A`,
44
+ down: (count = 1) => `${CSI}${count}B`,
45
+ forward: (count = 1) => `${CSI}${count}C`,
46
+ backward: (count = 1) => `${CSI}${count}D`,
47
+ nextLine: (count = 1) => `${CSI}E`.repeat(count),
48
+ prevLine: (count = 1) => `${CSI}F`.repeat(count),
49
+ left: `${CSI}G`,
50
+ hide: `${CSI}?25l`,
51
+ show: `${CSI}?25h`,
52
+ save: `${ESC}7`,
53
+ restore: `${ESC}8`
54
+ };
55
+ var scroll = {
56
+ up: (count = 1) => `${CSI}S`.repeat(count),
57
+ down: (count = 1) => `${CSI}T`.repeat(count)
58
+ };
59
+ var erase = {
60
+ screen: `${CSI}2J`,
61
+ up: (count = 1) => `${CSI}1J`.repeat(count),
62
+ down: (count = 1) => `${CSI}J`.repeat(count),
63
+ line: `${CSI}2K`,
64
+ lineEnd: `${CSI}K`,
65
+ lineStart: `${CSI}1K`,
66
+ lines(count) {
67
+ let clear = "";
68
+ for (let i = 0;i < count; i++)
69
+ clear += this.line + (i < count - 1 ? cursor.up() : "");
70
+ if (count)
71
+ clear += cursor.left;
72
+ return clear;
73
+ }
74
+ };
75
+ module.exports = { cursor, scroll, erase, beep };
76
+ });
77
+
78
+ // ../../node_modules/picocolors/picocolors.js
79
+ var require_picocolors = __commonJS((exports, module) => {
80
+ var p = process || {};
81
+ var argv = p.argv || [];
82
+ var env = p.env || {};
83
+ var isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
84
+ var formatter = (open, close, replace = open) => (input) => {
85
+ let string = "" + input, index = string.indexOf(close, open.length);
86
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
87
+ };
88
+ var replaceClose = (string, close, replace, index) => {
89
+ let result = "", cursor = 0;
90
+ do {
91
+ result += string.substring(cursor, index) + replace;
92
+ cursor = index + close.length;
93
+ index = string.indexOf(close, cursor);
94
+ } while (~index);
95
+ return result + string.substring(cursor);
96
+ };
97
+ var createColors = (enabled = isColorSupported) => {
98
+ let f = enabled ? formatter : () => String;
99
+ return {
100
+ isColorSupported: enabled,
101
+ reset: f("\x1B[0m", "\x1B[0m"),
102
+ bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
103
+ dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
104
+ italic: f("\x1B[3m", "\x1B[23m"),
105
+ underline: f("\x1B[4m", "\x1B[24m"),
106
+ inverse: f("\x1B[7m", "\x1B[27m"),
107
+ hidden: f("\x1B[8m", "\x1B[28m"),
108
+ strikethrough: f("\x1B[9m", "\x1B[29m"),
109
+ black: f("\x1B[30m", "\x1B[39m"),
110
+ red: f("\x1B[31m", "\x1B[39m"),
111
+ green: f("\x1B[32m", "\x1B[39m"),
112
+ yellow: f("\x1B[33m", "\x1B[39m"),
113
+ blue: f("\x1B[34m", "\x1B[39m"),
114
+ magenta: f("\x1B[35m", "\x1B[39m"),
115
+ cyan: f("\x1B[36m", "\x1B[39m"),
116
+ white: f("\x1B[37m", "\x1B[39m"),
117
+ gray: f("\x1B[90m", "\x1B[39m"),
118
+ bgBlack: f("\x1B[40m", "\x1B[49m"),
119
+ bgRed: f("\x1B[41m", "\x1B[49m"),
120
+ bgGreen: f("\x1B[42m", "\x1B[49m"),
121
+ bgYellow: f("\x1B[43m", "\x1B[49m"),
122
+ bgBlue: f("\x1B[44m", "\x1B[49m"),
123
+ bgMagenta: f("\x1B[45m", "\x1B[49m"),
124
+ bgCyan: f("\x1B[46m", "\x1B[49m"),
125
+ bgWhite: f("\x1B[47m", "\x1B[49m"),
126
+ blackBright: f("\x1B[90m", "\x1B[39m"),
127
+ redBright: f("\x1B[91m", "\x1B[39m"),
128
+ greenBright: f("\x1B[92m", "\x1B[39m"),
129
+ yellowBright: f("\x1B[93m", "\x1B[39m"),
130
+ blueBright: f("\x1B[94m", "\x1B[39m"),
131
+ magentaBright: f("\x1B[95m", "\x1B[39m"),
132
+ cyanBright: f("\x1B[96m", "\x1B[39m"),
133
+ whiteBright: f("\x1B[97m", "\x1B[39m"),
134
+ bgBlackBright: f("\x1B[100m", "\x1B[49m"),
135
+ bgRedBright: f("\x1B[101m", "\x1B[49m"),
136
+ bgGreenBright: f("\x1B[102m", "\x1B[49m"),
137
+ bgYellowBright: f("\x1B[103m", "\x1B[49m"),
138
+ bgBlueBright: f("\x1B[104m", "\x1B[49m"),
139
+ bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
140
+ bgCyanBright: f("\x1B[106m", "\x1B[49m"),
141
+ bgWhiteBright: f("\x1B[107m", "\x1B[49m")
142
+ };
143
+ };
144
+ module.exports = createColors();
145
+ module.exports.createColors = createColors;
146
+ });
147
+
148
+ // ../../node_modules/@clack/core/dist/index.mjs
149
+ var import_sisteransi = __toESM(require_src(), 1);
150
+ var import_picocolors = __toESM(require_picocolors(), 1);
151
+ import { stdin as j, stdout as M } from "process";
152
+ import * as g from "readline";
153
+ import O from "readline";
154
+ import { Writable as X } from "stream";
155
+ function DD({ onlyFirst: e = false } = {}) {
156
+ const t = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");
157
+ return new RegExp(t, e ? undefined : "g");
158
+ }
159
+ var uD = DD();
160
+ function P(e) {
161
+ if (typeof e != "string")
162
+ throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);
163
+ return e.replace(uD, "");
164
+ }
165
+ function L(e) {
166
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
167
+ }
168
+ var W = { exports: {} };
169
+ (function(e) {
170
+ var u = {};
171
+ e.exports = u, u.eastAsianWidth = function(F) {
172
+ var s = F.charCodeAt(0), i = F.length == 2 ? F.charCodeAt(1) : 0, D = s;
173
+ return 55296 <= s && s <= 56319 && 56320 <= i && i <= 57343 && (s &= 1023, i &= 1023, D = s << 10 | i, D += 65536), D == 12288 || 65281 <= D && D <= 65376 || 65504 <= D && D <= 65510 ? "F" : D == 8361 || 65377 <= D && D <= 65470 || 65474 <= D && D <= 65479 || 65482 <= D && D <= 65487 || 65490 <= D && D <= 65495 || 65498 <= D && D <= 65500 || 65512 <= D && D <= 65518 ? "H" : 4352 <= D && D <= 4447 || 4515 <= D && D <= 4519 || 4602 <= D && D <= 4607 || 9001 <= D && D <= 9002 || 11904 <= D && D <= 11929 || 11931 <= D && D <= 12019 || 12032 <= D && D <= 12245 || 12272 <= D && D <= 12283 || 12289 <= D && D <= 12350 || 12353 <= D && D <= 12438 || 12441 <= D && D <= 12543 || 12549 <= D && D <= 12589 || 12593 <= D && D <= 12686 || 12688 <= D && D <= 12730 || 12736 <= D && D <= 12771 || 12784 <= D && D <= 12830 || 12832 <= D && D <= 12871 || 12880 <= D && D <= 13054 || 13056 <= D && D <= 19903 || 19968 <= D && D <= 42124 || 42128 <= D && D <= 42182 || 43360 <= D && D <= 43388 || 44032 <= D && D <= 55203 || 55216 <= D && D <= 55238 || 55243 <= D && D <= 55291 || 63744 <= D && D <= 64255 || 65040 <= D && D <= 65049 || 65072 <= D && D <= 65106 || 65108 <= D && D <= 65126 || 65128 <= D && D <= 65131 || 110592 <= D && D <= 110593 || 127488 <= D && D <= 127490 || 127504 <= D && D <= 127546 || 127552 <= D && D <= 127560 || 127568 <= D && D <= 127569 || 131072 <= D && D <= 194367 || 177984 <= D && D <= 196605 || 196608 <= D && D <= 262141 ? "W" : 32 <= D && D <= 126 || 162 <= D && D <= 163 || 165 <= D && D <= 166 || D == 172 || D == 175 || 10214 <= D && D <= 10221 || 10629 <= D && D <= 10630 ? "Na" : D == 161 || D == 164 || 167 <= D && D <= 168 || D == 170 || 173 <= D && D <= 174 || 176 <= D && D <= 180 || 182 <= D && D <= 186 || 188 <= D && D <= 191 || D == 198 || D == 208 || 215 <= D && D <= 216 || 222 <= D && D <= 225 || D == 230 || 232 <= D && D <= 234 || 236 <= D && D <= 237 || D == 240 || 242 <= D && D <= 243 || 247 <= D && D <= 250 || D == 252 || D == 254 || D == 257 || D == 273 || D == 275 || D == 283 || 294 <= D && D <= 295 || D == 299 || 305 <= D && D <= 307 || D == 312 || 319 <= D && D <= 322 || D == 324 || 328 <= D && D <= 331 || D == 333 || 338 <= D && D <= 339 || 358 <= D && D <= 359 || D == 363 || D == 462 || D == 464 || D == 466 || D == 468 || D == 470 || D == 472 || D == 474 || D == 476 || D == 593 || D == 609 || D == 708 || D == 711 || 713 <= D && D <= 715 || D == 717 || D == 720 || 728 <= D && D <= 731 || D == 733 || D == 735 || 768 <= D && D <= 879 || 913 <= D && D <= 929 || 931 <= D && D <= 937 || 945 <= D && D <= 961 || 963 <= D && D <= 969 || D == 1025 || 1040 <= D && D <= 1103 || D == 1105 || D == 8208 || 8211 <= D && D <= 8214 || 8216 <= D && D <= 8217 || 8220 <= D && D <= 8221 || 8224 <= D && D <= 8226 || 8228 <= D && D <= 8231 || D == 8240 || 8242 <= D && D <= 8243 || D == 8245 || D == 8251 || D == 8254 || D == 8308 || D == 8319 || 8321 <= D && D <= 8324 || D == 8364 || D == 8451 || D == 8453 || D == 8457 || D == 8467 || D == 8470 || 8481 <= D && D <= 8482 || D == 8486 || D == 8491 || 8531 <= D && D <= 8532 || 8539 <= D && D <= 8542 || 8544 <= D && D <= 8555 || 8560 <= D && D <= 8569 || D == 8585 || 8592 <= D && D <= 8601 || 8632 <= D && D <= 8633 || D == 8658 || D == 8660 || D == 8679 || D == 8704 || 8706 <= D && D <= 8707 || 8711 <= D && D <= 8712 || D == 8715 || D == 8719 || D == 8721 || D == 8725 || D == 8730 || 8733 <= D && D <= 8736 || D == 8739 || D == 8741 || 8743 <= D && D <= 8748 || D == 8750 || 8756 <= D && D <= 8759 || 8764 <= D && D <= 8765 || D == 8776 || D == 8780 || D == 8786 || 8800 <= D && D <= 8801 || 8804 <= D && D <= 8807 || 8810 <= D && D <= 8811 || 8814 <= D && D <= 8815 || 8834 <= D && D <= 8835 || 8838 <= D && D <= 8839 || D == 8853 || D == 8857 || D == 8869 || D == 8895 || D == 8978 || 9312 <= D && D <= 9449 || 9451 <= D && D <= 9547 || 9552 <= D && D <= 9587 || 9600 <= D && D <= 9615 || 9618 <= D && D <= 9621 || 9632 <= D && D <= 9633 || 9635 <= D && D <= 9641 || 9650 <= D && D <= 9651 || 9654 <= D && D <= 9655 || 9660 <= D && D <= 9661 || 9664 <= D && D <= 9665 || 9670 <= D && D <= 9672 || D == 9675 || 9678 <= D && D <= 9681 || 9698 <= D && D <= 9701 || D == 9711 || 9733 <= D && D <= 9734 || D == 9737 || 9742 <= D && D <= 9743 || 9748 <= D && D <= 9749 || D == 9756 || D == 9758 || D == 9792 || D == 9794 || 9824 <= D && D <= 9825 || 9827 <= D && D <= 9829 || 9831 <= D && D <= 9834 || 9836 <= D && D <= 9837 || D == 9839 || 9886 <= D && D <= 9887 || 9918 <= D && D <= 9919 || 9924 <= D && D <= 9933 || 9935 <= D && D <= 9953 || D == 9955 || 9960 <= D && D <= 9983 || D == 10045 || D == 10071 || 10102 <= D && D <= 10111 || 11093 <= D && D <= 11097 || 12872 <= D && D <= 12879 || 57344 <= D && D <= 63743 || 65024 <= D && D <= 65039 || D == 65533 || 127232 <= D && D <= 127242 || 127248 <= D && D <= 127277 || 127280 <= D && D <= 127337 || 127344 <= D && D <= 127386 || 917760 <= D && D <= 917999 || 983040 <= D && D <= 1048573 || 1048576 <= D && D <= 1114109 ? "A" : "N";
174
+ }, u.characterLength = function(F) {
175
+ var s = this.eastAsianWidth(F);
176
+ return s == "F" || s == "W" || s == "A" ? 2 : 1;
177
+ };
178
+ function t(F) {
179
+ return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
180
+ }
181
+ u.length = function(F) {
182
+ for (var s = t(F), i = 0, D = 0;D < s.length; D++)
183
+ i = i + this.characterLength(s[D]);
184
+ return i;
185
+ }, u.slice = function(F, s, i) {
186
+ textLen = u.length(F), s = s || 0, i = i || 1, s < 0 && (s = textLen + s), i < 0 && (i = textLen + i);
187
+ for (var D = "", C = 0, n = t(F), E = 0;E < n.length; E++) {
188
+ var a = n[E], o = u.length(a);
189
+ if (C >= s - (o == 2 ? 1 : 0))
190
+ if (C + o <= i)
191
+ D += a;
192
+ else
193
+ break;
194
+ C += o;
195
+ }
196
+ return D;
197
+ };
198
+ })(W);
199
+ var tD = W.exports;
200
+ var eD = L(tD);
201
+ var FD = function() {
202
+ return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
203
+ };
204
+ var sD = L(FD);
205
+ function p(e, u = {}) {
206
+ if (typeof e != "string" || e.length === 0 || (u = { ambiguousIsNarrow: true, ...u }, e = P(e), e.length === 0))
207
+ return 0;
208
+ e = e.replace(sD(), " ");
209
+ const t = u.ambiguousIsNarrow ? 1 : 2;
210
+ let F = 0;
211
+ for (const s of e) {
212
+ const i = s.codePointAt(0);
213
+ if (i <= 31 || i >= 127 && i <= 159 || i >= 768 && i <= 879)
214
+ continue;
215
+ switch (eD.eastAsianWidth(s)) {
216
+ case "F":
217
+ case "W":
218
+ F += 2;
219
+ break;
220
+ case "A":
221
+ F += t;
222
+ break;
223
+ default:
224
+ F += 1;
225
+ }
226
+ }
227
+ return F;
228
+ }
229
+ var w = 10;
230
+ var N = (e = 0) => (u) => `\x1B[${u + e}m`;
231
+ var I = (e = 0) => (u) => `\x1B[${38 + e};5;${u}m`;
232
+ var R = (e = 0) => (u, t, F) => `\x1B[${38 + e};2;${u};${t};${F}m`;
233
+ var r = { modifier: { reset: [0, 0], bold: [1, 22], dim: [2, 22], italic: [3, 23], underline: [4, 24], overline: [53, 55], inverse: [7, 27], hidden: [8, 28], strikethrough: [9, 29] }, color: { black: [30, 39], red: [31, 39], green: [32, 39], yellow: [33, 39], blue: [34, 39], magenta: [35, 39], cyan: [36, 39], white: [37, 39], blackBright: [90, 39], gray: [90, 39], grey: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], blueBright: [94, 39], magentaBright: [95, 39], cyanBright: [96, 39], whiteBright: [97, 39] }, bgColor: { bgBlack: [40, 49], bgRed: [41, 49], bgGreen: [42, 49], bgYellow: [43, 49], bgBlue: [44, 49], bgMagenta: [45, 49], bgCyan: [46, 49], bgWhite: [47, 49], bgBlackBright: [100, 49], bgGray: [100, 49], bgGrey: [100, 49], bgRedBright: [101, 49], bgGreenBright: [102, 49], bgYellowBright: [103, 49], bgBlueBright: [104, 49], bgMagentaBright: [105, 49], bgCyanBright: [106, 49], bgWhiteBright: [107, 49] } };
234
+ Object.keys(r.modifier);
235
+ var iD = Object.keys(r.color);
236
+ var CD = Object.keys(r.bgColor);
237
+ [...iD];
238
+ function rD() {
239
+ const e = new Map;
240
+ for (const [u, t] of Object.entries(r)) {
241
+ for (const [F, s] of Object.entries(t))
242
+ r[F] = { open: `\x1B[${s[0]}m`, close: `\x1B[${s[1]}m` }, t[F] = r[F], e.set(s[0], s[1]);
243
+ Object.defineProperty(r, u, { value: t, enumerable: false });
244
+ }
245
+ return Object.defineProperty(r, "codes", { value: e, enumerable: false }), r.color.close = "\x1B[39m", r.bgColor.close = "\x1B[49m", r.color.ansi = N(), r.color.ansi256 = I(), r.color.ansi16m = R(), r.bgColor.ansi = N(w), r.bgColor.ansi256 = I(w), r.bgColor.ansi16m = R(w), Object.defineProperties(r, { rgbToAnsi256: { value: (u, t, F) => u === t && t === F ? u < 8 ? 16 : u > 248 ? 231 : Math.round((u - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(u / 255 * 5) + 6 * Math.round(t / 255 * 5) + Math.round(F / 255 * 5), enumerable: false }, hexToRgb: { value: (u) => {
246
+ const t = /[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));
247
+ if (!t)
248
+ return [0, 0, 0];
249
+ let [F] = t;
250
+ F.length === 3 && (F = [...F].map((i) => i + i).join(""));
251
+ const s = Number.parseInt(F, 16);
252
+ return [s >> 16 & 255, s >> 8 & 255, s & 255];
253
+ }, enumerable: false }, hexToAnsi256: { value: (u) => r.rgbToAnsi256(...r.hexToRgb(u)), enumerable: false }, ansi256ToAnsi: { value: (u) => {
254
+ if (u < 8)
255
+ return 30 + u;
256
+ if (u < 16)
257
+ return 90 + (u - 8);
258
+ let t, F, s;
259
+ if (u >= 232)
260
+ t = ((u - 232) * 10 + 8) / 255, F = t, s = t;
261
+ else {
262
+ u -= 16;
263
+ const C = u % 36;
264
+ t = Math.floor(u / 36) / 5, F = Math.floor(C / 6) / 5, s = C % 6 / 5;
265
+ }
266
+ const i = Math.max(t, F, s) * 2;
267
+ if (i === 0)
268
+ return 30;
269
+ let D = 30 + (Math.round(s) << 2 | Math.round(F) << 1 | Math.round(t));
270
+ return i === 2 && (D += 60), D;
271
+ }, enumerable: false }, rgbToAnsi: { value: (u, t, F) => r.ansi256ToAnsi(r.rgbToAnsi256(u, t, F)), enumerable: false }, hexToAnsi: { value: (u) => r.ansi256ToAnsi(r.hexToAnsi256(u)), enumerable: false } }), r;
272
+ }
273
+ var ED = rD();
274
+ var d = new Set(["\x1B", "\x9B"]);
275
+ var oD = 39;
276
+ var y = "\x07";
277
+ var V = "[";
278
+ var nD = "]";
279
+ var G = "m";
280
+ var _ = `${nD}8;;`;
281
+ var z = (e) => `${d.values().next().value}${V}${e}${G}`;
282
+ var K = (e) => `${d.values().next().value}${_}${e}${y}`;
283
+ var aD = (e) => e.split(" ").map((u) => p(u));
284
+ var k = (e, u, t) => {
285
+ const F = [...u];
286
+ let s = false, i = false, D = p(P(e[e.length - 1]));
287
+ for (const [C, n] of F.entries()) {
288
+ const E = p(n);
289
+ if (D + E <= t ? e[e.length - 1] += n : (e.push(n), D = 0), d.has(n) && (s = true, i = F.slice(C + 1).join("").startsWith(_)), s) {
290
+ i ? n === y && (s = false, i = false) : n === G && (s = false);
291
+ continue;
292
+ }
293
+ D += E, D === t && C < F.length - 1 && (e.push(""), D = 0);
294
+ }
295
+ !D && e[e.length - 1].length > 0 && e.length > 1 && (e[e.length - 2] += e.pop());
296
+ };
297
+ var hD = (e) => {
298
+ const u = e.split(" ");
299
+ let t = u.length;
300
+ for (;t > 0 && !(p(u[t - 1]) > 0); )
301
+ t--;
302
+ return t === u.length ? e : u.slice(0, t).join(" ") + u.slice(t).join("");
303
+ };
304
+ var lD = (e, u, t = {}) => {
305
+ if (t.trim !== false && e.trim() === "")
306
+ return "";
307
+ let F = "", s, i;
308
+ const D = aD(e);
309
+ let C = [""];
310
+ for (const [E, a] of e.split(" ").entries()) {
311
+ t.trim !== false && (C[C.length - 1] = C[C.length - 1].trimStart());
312
+ let o = p(C[C.length - 1]);
313
+ if (E !== 0 && (o >= u && (t.wordWrap === false || t.trim === false) && (C.push(""), o = 0), (o > 0 || t.trim === false) && (C[C.length - 1] += " ", o++)), t.hard && D[E] > u) {
314
+ const c = u - o, f = 1 + Math.floor((D[E] - c - 1) / u);
315
+ Math.floor((D[E] - 1) / u) < f && C.push(""), k(C, a, u);
316
+ continue;
317
+ }
318
+ if (o + D[E] > u && o > 0 && D[E] > 0) {
319
+ if (t.wordWrap === false && o < u) {
320
+ k(C, a, u);
321
+ continue;
322
+ }
323
+ C.push("");
324
+ }
325
+ if (o + D[E] > u && t.wordWrap === false) {
326
+ k(C, a, u);
327
+ continue;
328
+ }
329
+ C[C.length - 1] += a;
330
+ }
331
+ t.trim !== false && (C = C.map((E) => hD(E)));
332
+ const n = [...C.join(`
333
+ `)];
334
+ for (const [E, a] of n.entries()) {
335
+ if (F += a, d.has(a)) {
336
+ const { groups: c } = new RegExp(`(?:\\${V}(?<code>\\d+)m|\\${_}(?<uri>.*)${y})`).exec(n.slice(E).join("")) || { groups: {} };
337
+ if (c.code !== undefined) {
338
+ const f = Number.parseFloat(c.code);
339
+ s = f === oD ? undefined : f;
340
+ } else
341
+ c.uri !== undefined && (i = c.uri.length === 0 ? undefined : c.uri);
342
+ }
343
+ const o = ED.codes.get(Number(s));
344
+ n[E + 1] === `
345
+ ` ? (i && (F += K("")), s && o && (F += z(o))) : a === `
346
+ ` && (s && o && (F += z(s)), i && (F += K(i)));
347
+ }
348
+ return F;
349
+ };
350
+ function Y(e, u, t) {
351
+ return String(e).normalize().replace(/\r\n/g, `
352
+ `).split(`
353
+ `).map((F) => lD(F, u, t)).join(`
354
+ `);
355
+ }
356
+ var xD = ["up", "down", "left", "right", "space", "enter", "cancel"];
357
+ var B = { actions: new Set(xD), aliases: new Map([["k", "up"], ["j", "down"], ["h", "left"], ["l", "right"], ["\x03", "cancel"], ["escape", "cancel"]]) };
358
+ function $(e, u) {
359
+ if (typeof e == "string")
360
+ return B.aliases.get(e) === u;
361
+ for (const t of e)
362
+ if (t !== undefined && $(t, u))
363
+ return true;
364
+ return false;
365
+ }
366
+ function BD(e, u) {
367
+ if (e === u)
368
+ return;
369
+ const t = e.split(`
370
+ `), F = u.split(`
371
+ `), s = [];
372
+ for (let i = 0;i < Math.max(t.length, F.length); i++)
373
+ t[i] !== F[i] && s.push(i);
374
+ return s;
375
+ }
376
+ var AD = globalThis.process.platform.startsWith("win");
377
+ var S = Symbol("clack:cancel");
378
+ function pD(e) {
379
+ return e === S;
380
+ }
381
+ function m(e, u) {
382
+ const t = e;
383
+ t.isTTY && t.setRawMode(u);
384
+ }
385
+ function fD({ input: e = j, output: u = M, overwrite: t = true, hideCursor: F = true } = {}) {
386
+ const s = g.createInterface({ input: e, output: u, prompt: "", tabSize: 1 });
387
+ g.emitKeypressEvents(e, s), e.isTTY && e.setRawMode(true);
388
+ const i = (D, { name: C, sequence: n }) => {
389
+ const E = String(D);
390
+ if ($([E, C, n], "cancel")) {
391
+ F && u.write(import_sisteransi.cursor.show), process.exit(0);
392
+ return;
393
+ }
394
+ if (!t)
395
+ return;
396
+ const a = C === "return" ? 0 : -1, o = C === "return" ? -1 : 0;
397
+ g.moveCursor(u, a, o, () => {
398
+ g.clearLine(u, 1, () => {
399
+ e.once("keypress", i);
400
+ });
401
+ });
402
+ };
403
+ return F && u.write(import_sisteransi.cursor.hide), e.once("keypress", i), () => {
404
+ e.off("keypress", i), F && u.write(import_sisteransi.cursor.show), e.isTTY && !AD && e.setRawMode(false), s.terminal = false, s.close();
405
+ };
406
+ }
407
+ var gD = Object.defineProperty;
408
+ var vD = (e, u, t) => (u in e) ? gD(e, u, { enumerable: true, configurable: true, writable: true, value: t }) : e[u] = t;
409
+ var h = (e, u, t) => (vD(e, typeof u != "symbol" ? u + "" : u, t), t);
410
+
411
+ class x {
412
+ constructor(u, t = true) {
413
+ h(this, "input"), h(this, "output"), h(this, "_abortSignal"), h(this, "rl"), h(this, "opts"), h(this, "_render"), h(this, "_track", false), h(this, "_prevFrame", ""), h(this, "_subscribers", new Map), h(this, "_cursor", 0), h(this, "state", "initial"), h(this, "error", ""), h(this, "value");
414
+ const { input: F = j, output: s = M, render: i, signal: D, ...C } = u;
415
+ this.opts = C, this.onKeypress = this.onKeypress.bind(this), this.close = this.close.bind(this), this.render = this.render.bind(this), this._render = i.bind(this), this._track = t, this._abortSignal = D, this.input = F, this.output = s;
416
+ }
417
+ unsubscribe() {
418
+ this._subscribers.clear();
419
+ }
420
+ setSubscriber(u, t) {
421
+ const F = this._subscribers.get(u) ?? [];
422
+ F.push(t), this._subscribers.set(u, F);
423
+ }
424
+ on(u, t) {
425
+ this.setSubscriber(u, { cb: t });
426
+ }
427
+ once(u, t) {
428
+ this.setSubscriber(u, { cb: t, once: true });
429
+ }
430
+ emit(u, ...t) {
431
+ const F = this._subscribers.get(u) ?? [], s = [];
432
+ for (const i of F)
433
+ i.cb(...t), i.once && s.push(() => F.splice(F.indexOf(i), 1));
434
+ for (const i of s)
435
+ i();
436
+ }
437
+ prompt() {
438
+ return new Promise((u, t) => {
439
+ if (this._abortSignal) {
440
+ if (this._abortSignal.aborted)
441
+ return this.state = "cancel", this.close(), u(S);
442
+ this._abortSignal.addEventListener("abort", () => {
443
+ this.state = "cancel", this.close();
444
+ }, { once: true });
445
+ }
446
+ const F = new X;
447
+ F._write = (s, i, D) => {
448
+ this._track && (this.value = this.rl?.line.replace(/\t/g, ""), this._cursor = this.rl?.cursor ?? 0, this.emit("value", this.value)), D();
449
+ }, this.input.pipe(F), this.rl = O.createInterface({ input: this.input, output: F, tabSize: 2, prompt: "", escapeCodeTimeout: 50, terminal: true }), O.emitKeypressEvents(this.input, this.rl), this.rl.prompt(), this.opts.initialValue !== undefined && this._track && this.rl.write(this.opts.initialValue), this.input.on("keypress", this.onKeypress), m(this.input, true), this.output.on("resize", this.render), this.render(), this.once("submit", () => {
450
+ this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(this.value);
451
+ }), this.once("cancel", () => {
452
+ this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(S);
453
+ });
454
+ });
455
+ }
456
+ onKeypress(u, t) {
457
+ if (this.state === "error" && (this.state = "active"), t?.name && (!this._track && B.aliases.has(t.name) && this.emit("cursor", B.aliases.get(t.name)), B.actions.has(t.name) && this.emit("cursor", t.name)), u && (u.toLowerCase() === "y" || u.toLowerCase() === "n") && this.emit("confirm", u.toLowerCase() === "y"), u === "\t" && this.opts.placeholder && (this.value || (this.rl?.write(this.opts.placeholder), this.emit("value", this.opts.placeholder))), u && this.emit("key", u.toLowerCase()), t?.name === "return") {
458
+ if (this.opts.validate) {
459
+ const F = this.opts.validate(this.value);
460
+ F && (this.error = F instanceof Error ? F.message : F, this.state = "error", this.rl?.write(this.value));
461
+ }
462
+ this.state !== "error" && (this.state = "submit");
463
+ }
464
+ $([u, t?.name, t?.sequence], "cancel") && (this.state = "cancel"), (this.state === "submit" || this.state === "cancel") && this.emit("finalize"), this.render(), (this.state === "submit" || this.state === "cancel") && this.close();
465
+ }
466
+ close() {
467
+ this.input.unpipe(), this.input.removeListener("keypress", this.onKeypress), this.output.write(`
468
+ `), m(this.input, false), this.rl?.close(), this.rl = undefined, this.emit(`${this.state}`, this.value), this.unsubscribe();
469
+ }
470
+ restoreCursor() {
471
+ const u = Y(this._prevFrame, process.stdout.columns, { hard: true }).split(`
472
+ `).length - 1;
473
+ this.output.write(import_sisteransi.cursor.move(-999, u * -1));
474
+ }
475
+ render() {
476
+ const u = Y(this._render(this) ?? "", process.stdout.columns, { hard: true });
477
+ if (u !== this._prevFrame) {
478
+ if (this.state === "initial")
479
+ this.output.write(import_sisteransi.cursor.hide);
480
+ else {
481
+ const t = BD(this._prevFrame, u);
482
+ if (this.restoreCursor(), t && t?.length === 1) {
483
+ const F = t[0];
484
+ this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.lines(1));
485
+ const s = u.split(`
486
+ `);
487
+ this.output.write(s[F]), this._prevFrame = u, this.output.write(import_sisteransi.cursor.move(0, s.length - F - 1));
488
+ return;
489
+ }
490
+ if (t && t?.length > 1) {
491
+ const F = t[0];
492
+ this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.down());
493
+ const s = u.split(`
494
+ `).slice(F);
495
+ this.output.write(s.join(`
496
+ `)), this._prevFrame = u;
497
+ return;
498
+ }
499
+ this.output.write(import_sisteransi.erase.down());
500
+ }
501
+ this.output.write(u), this.state === "initial" && (this.state = "active"), this._prevFrame = u;
502
+ }
503
+ }
504
+ }
505
+
506
+ class dD extends x {
507
+ get cursor() {
508
+ return this.value ? 0 : 1;
509
+ }
510
+ get _value() {
511
+ return this.cursor === 0;
512
+ }
513
+ constructor(u) {
514
+ super(u, false), this.value = !!u.initialValue, this.on("value", () => {
515
+ this.value = this._value;
516
+ }), this.on("confirm", (t) => {
517
+ this.output.write(import_sisteransi.cursor.move(0, -1)), this.value = t, this.state = "submit", this.close();
518
+ }), this.on("cursor", () => {
519
+ this.value = !this.value;
520
+ });
521
+ }
522
+ }
523
+ var A;
524
+ A = new WeakMap;
525
+ class RD extends x {
526
+ get valueWithCursor() {
527
+ if (this.state === "submit")
528
+ return this.value;
529
+ if (this.cursor >= this.value.length)
530
+ return `${this.value}\u2588`;
531
+ const u = this.value.slice(0, this.cursor), [t, ...F] = this.value.slice(this.cursor);
532
+ return `${u}${import_picocolors.default.inverse(t)}${F.join("")}`;
533
+ }
534
+ get cursor() {
535
+ return this._cursor;
536
+ }
537
+ constructor(u) {
538
+ super(u), this.on("finalize", () => {
539
+ this.value || (this.value = u.defaultValue);
540
+ });
541
+ }
542
+ }
543
+
544
+ // ../../node_modules/@clack/prompts/dist/index.mjs
545
+ var import_picocolors2 = __toESM(require_picocolors(), 1);
546
+ var import_sisteransi2 = __toESM(require_src(), 1);
547
+ import y2 from "process";
548
+ function ce() {
549
+ return y2.platform !== "win32" ? y2.env.TERM !== "linux" : !!y2.env.CI || !!y2.env.WT_SESSION || !!y2.env.TERMINUS_SUBLIME || y2.env.ConEmuTask === "{cmd::Cmder}" || y2.env.TERM_PROGRAM === "Terminus-Sublime" || y2.env.TERM_PROGRAM === "vscode" || y2.env.TERM === "xterm-256color" || y2.env.TERM === "alacritty" || y2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
550
+ }
551
+ var V2 = ce();
552
+ var u = (t, n) => V2 ? t : n;
553
+ var le = u("\u25C6", "*");
554
+ var L2 = u("\u25A0", "x");
555
+ var W2 = u("\u25B2", "x");
556
+ var C = u("\u25C7", "o");
557
+ var ue = u("\u250C", "T");
558
+ var o = u("\u2502", "|");
559
+ var d2 = u("\u2514", "\u2014");
560
+ var k2 = u("\u25CF", ">");
561
+ var P2 = u("\u25CB", " ");
562
+ var A2 = u("\u25FB", "[\u2022]");
563
+ var T = u("\u25FC", "[+]");
564
+ var F = u("\u25FB", "[ ]");
565
+ var $e = u("\u25AA", "\u2022");
566
+ var _2 = u("\u2500", "-");
567
+ var me = u("\u256E", "+");
568
+ var de = u("\u251C", "+");
569
+ var pe = u("\u256F", "+");
570
+ var q = u("\u25CF", "\u2022");
571
+ var D = u("\u25C6", "*");
572
+ var U = u("\u25B2", "!");
573
+ var K2 = u("\u25A0", "x");
574
+ var b2 = (t) => {
575
+ switch (t) {
576
+ case "initial":
577
+ case "active":
578
+ return import_picocolors2.default.cyan(le);
579
+ case "cancel":
580
+ return import_picocolors2.default.red(L2);
581
+ case "error":
582
+ return import_picocolors2.default.yellow(W2);
583
+ case "submit":
584
+ return import_picocolors2.default.green(C);
585
+ }
586
+ };
587
+ var he = (t) => new RD({ validate: t.validate, placeholder: t.placeholder, defaultValue: t.defaultValue, initialValue: t.initialValue, render() {
588
+ const n = `${import_picocolors2.default.gray(o)}
589
+ ${b2(this.state)} ${t.message}
590
+ `, r2 = t.placeholder ? import_picocolors2.default.inverse(t.placeholder[0]) + import_picocolors2.default.dim(t.placeholder.slice(1)) : import_picocolors2.default.inverse(import_picocolors2.default.hidden("_")), i = this.value ? this.valueWithCursor : r2;
591
+ switch (this.state) {
592
+ case "error":
593
+ return `${n.trim()}
594
+ ${import_picocolors2.default.yellow(o)} ${i}
595
+ ${import_picocolors2.default.yellow(d2)} ${import_picocolors2.default.yellow(this.error)}
596
+ `;
597
+ case "submit":
598
+ return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(this.value || t.placeholder)}`;
599
+ case "cancel":
600
+ return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(this.value ?? ""))}${this.value?.trim() ? `
601
+ ${import_picocolors2.default.gray(o)}` : ""}`;
602
+ default:
603
+ return `${n}${import_picocolors2.default.cyan(o)} ${i}
604
+ ${import_picocolors2.default.cyan(d2)}
605
+ `;
606
+ }
607
+ } }).prompt();
608
+ var ye = (t) => {
609
+ const n = t.active ?? "Yes", r2 = t.inactive ?? "No";
610
+ return new dD({ active: n, inactive: r2, initialValue: t.initialValue ?? true, render() {
611
+ const i = `${import_picocolors2.default.gray(o)}
612
+ ${b2(this.state)} ${t.message}
613
+ `, s = this.value ? n : r2;
614
+ switch (this.state) {
615
+ case "submit":
616
+ return `${i}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(s)}`;
617
+ case "cancel":
618
+ return `${i}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(s))}
619
+ ${import_picocolors2.default.gray(o)}`;
620
+ default:
621
+ return `${i}${import_picocolors2.default.cyan(o)} ${this.value ? `${import_picocolors2.default.green(k2)} ${n}` : `${import_picocolors2.default.dim(P2)} ${import_picocolors2.default.dim(n)}`} ${import_picocolors2.default.dim("/")} ${this.value ? `${import_picocolors2.default.dim(P2)} ${import_picocolors2.default.dim(r2)}` : `${import_picocolors2.default.green(k2)} ${r2}`}
622
+ ${import_picocolors2.default.cyan(d2)}
623
+ `;
624
+ }
625
+ } }).prompt();
626
+ };
627
+ var xe = (t = "") => {
628
+ process.stdout.write(`${import_picocolors2.default.gray(d2)} ${import_picocolors2.default.red(t)}
629
+
630
+ `);
631
+ };
632
+ var Ie = (t = "") => {
633
+ process.stdout.write(`${import_picocolors2.default.gray(ue)} ${t}
634
+ `);
635
+ };
636
+ var Se = (t = "") => {
637
+ process.stdout.write(`${import_picocolors2.default.gray(o)}
638
+ ${import_picocolors2.default.gray(d2)} ${t}
639
+
640
+ `);
641
+ };
642
+ var M2 = { message: (t = "", { symbol: n = import_picocolors2.default.gray(o) } = {}) => {
643
+ const r2 = [`${import_picocolors2.default.gray(o)}`];
644
+ if (t) {
645
+ const [i, ...s] = t.split(`
646
+ `);
647
+ r2.push(`${n} ${i}`, ...s.map((c) => `${import_picocolors2.default.gray(o)} ${c}`));
648
+ }
649
+ process.stdout.write(`${r2.join(`
650
+ `)}
651
+ `);
652
+ }, info: (t) => {
653
+ M2.message(t, { symbol: import_picocolors2.default.blue(q) });
654
+ }, success: (t) => {
655
+ M2.message(t, { symbol: import_picocolors2.default.green(D) });
656
+ }, step: (t) => {
657
+ M2.message(t, { symbol: import_picocolors2.default.green(C) });
658
+ }, warn: (t) => {
659
+ M2.message(t, { symbol: import_picocolors2.default.yellow(U) });
660
+ }, warning: (t) => {
661
+ M2.warn(t);
662
+ }, error: (t) => {
663
+ M2.message(t, { symbol: import_picocolors2.default.red(K2) });
664
+ } };
665
+ var J = `${import_picocolors2.default.gray(o)} `;
666
+ var Y2 = ({ indicator: t = "dots" } = {}) => {
667
+ const n = V2 ? ["\u25D2", "\u25D0", "\u25D3", "\u25D1"] : ["\u2022", "o", "O", "0"], r2 = V2 ? 80 : 120, i = process.env.CI === "true";
668
+ let s, c, a = false, l2 = "", $2, g2 = performance.now();
669
+ const p2 = (m2) => {
670
+ const h2 = m2 > 1 ? "Something went wrong" : "Canceled";
671
+ a && N2(h2, m2);
672
+ }, v2 = () => p2(2), f = () => p2(1), j2 = () => {
673
+ process.on("uncaughtExceptionMonitor", v2), process.on("unhandledRejection", v2), process.on("SIGINT", f), process.on("SIGTERM", f), process.on("exit", p2);
674
+ }, E = () => {
675
+ process.removeListener("uncaughtExceptionMonitor", v2), process.removeListener("unhandledRejection", v2), process.removeListener("SIGINT", f), process.removeListener("SIGTERM", f), process.removeListener("exit", p2);
676
+ }, B2 = () => {
677
+ if ($2 === undefined)
678
+ return;
679
+ i && process.stdout.write(`
680
+ `);
681
+ const m2 = $2.split(`
682
+ `);
683
+ process.stdout.write(import_sisteransi2.cursor.move(-999, m2.length - 1)), process.stdout.write(import_sisteransi2.erase.down(m2.length));
684
+ }, R2 = (m2) => m2.replace(/\.+$/, ""), O2 = (m2) => {
685
+ const h2 = (performance.now() - m2) / 1000, w2 = Math.floor(h2 / 60), I2 = Math.floor(h2 % 60);
686
+ return w2 > 0 ? `[${w2}m ${I2}s]` : `[${I2}s]`;
687
+ }, H = (m2 = "") => {
688
+ a = true, s = fD(), l2 = R2(m2), g2 = performance.now(), process.stdout.write(`${import_picocolors2.default.gray(o)}
689
+ `);
690
+ let h2 = 0, w2 = 0;
691
+ j2(), c = setInterval(() => {
692
+ if (i && l2 === $2)
693
+ return;
694
+ B2(), $2 = l2;
695
+ const I2 = import_picocolors2.default.magenta(n[h2]);
696
+ if (i)
697
+ process.stdout.write(`${I2} ${l2}...`);
698
+ else if (t === "timer")
699
+ process.stdout.write(`${I2} ${l2} ${O2(g2)}`);
700
+ else {
701
+ const z2 = ".".repeat(Math.floor(w2)).slice(0, 3);
702
+ process.stdout.write(`${I2} ${l2}${z2}`);
703
+ }
704
+ h2 = h2 + 1 < n.length ? h2 + 1 : 0, w2 = w2 < n.length ? w2 + 0.125 : 0;
705
+ }, r2);
706
+ }, N2 = (m2 = "", h2 = 0) => {
707
+ a = false, clearInterval(c), B2();
708
+ const w2 = h2 === 0 ? import_picocolors2.default.green(C) : h2 === 1 ? import_picocolors2.default.red(L2) : import_picocolors2.default.red(W2);
709
+ l2 = R2(m2 ?? l2), t === "timer" ? process.stdout.write(`${w2} ${l2} ${O2(g2)}
710
+ `) : process.stdout.write(`${w2} ${l2}
711
+ `), E(), s();
712
+ };
713
+ return { start: H, stop: N2, message: (m2 = "") => {
714
+ l2 = R2(m2 ?? l2);
715
+ } };
716
+ };
717
+ var Ce = async (t, n) => {
718
+ const r2 = {}, i = Object.keys(t);
719
+ for (const s of i) {
720
+ const c = t[s], a = await c({ results: r2 })?.catch((l2) => {
721
+ throw l2;
722
+ });
723
+ if (typeof n?.onCancel == "function" && pD(a)) {
724
+ r2[s] = "canceled", n.onCancel({ results: r2 });
725
+ continue;
726
+ }
727
+ r2[s] = a;
728
+ }
729
+ return r2;
730
+ };
731
+ // ../../tools/utils/colors.ts
732
+ var isColorEnabled = !process.env.NO_COLOR && (process.env.FORCE_COLOR || process.stdout.isTTY);
733
+ var baseColors = ["blue", "cyan", "gray", "green", "magenta", "red", "white", "yellow"];
734
+ var baseDecorations = ["bold", "dim", "italic", "underline", "reset"];
735
+ var ansiCodes = {
736
+ bold: "\x1B[1m",
737
+ dim: "\x1B[2m",
738
+ italic: "\x1B[3m",
739
+ reset: "\x1B[0m",
740
+ underline: "\x1B[4m"
741
+ };
742
+ var brightColorMap = {
743
+ "\x1B[30m": "\x1B[90m",
744
+ "\x1B[31m": "\x1B[91m",
745
+ "\x1B[32m": "\x1B[92m",
746
+ "\x1B[33m": "\x1B[93m",
747
+ "\x1B[34m": "\x1B[94m",
748
+ "\x1B[35m": "\x1B[95m",
749
+ "\x1B[36m": "\x1B[96m",
750
+ "\x1B[37m": "\x1B[97m"
751
+ };
752
+ function colorize(colorCode) {
753
+ return (text) => isColorEnabled ? `${colorCode}${text}${ansiCodes.reset}` : text;
754
+ }
755
+ function getColorCode({ bright = false, color }) {
756
+ const baseColor = Bun.color(color, "ansi");
757
+ if (!baseColor)
758
+ return "";
759
+ return bright ? brightColorMap[baseColor] || baseColor : baseColor;
760
+ }
761
+ var colorDecorations = baseColors.reduce((acc, color) => {
762
+ acc[color] = colorize(getColorCode({ color }));
763
+ acc[`${color}Bright`] = colorize(getColorCode({ bright: true, color }));
764
+ return acc;
765
+ }, {});
766
+ var decorations = baseDecorations.reduce((acc, decoration) => {
767
+ acc[decoration] = colorize(ansiCodes[decoration]);
768
+ return acc;
769
+ }, {});
770
+ var colors = { ...colorDecorations, ...decorations };
771
+ // ../../node_modules/fastest-levenshtein/esm/mod.js
772
+ var peq = new Uint32Array(65536);
773
+ var myers_32 = (a, b3) => {
774
+ const n = a.length;
775
+ const m2 = b3.length;
776
+ const lst = 1 << n - 1;
777
+ let pv = -1;
778
+ let mv = 0;
779
+ let sc = n;
780
+ let i = n;
781
+ while (i--) {
782
+ peq[a.charCodeAt(i)] |= 1 << i;
783
+ }
784
+ for (i = 0;i < m2; i++) {
785
+ let eq = peq[b3.charCodeAt(i)];
786
+ const xv = eq | mv;
787
+ eq |= (eq & pv) + pv ^ pv;
788
+ mv |= ~(eq | pv);
789
+ pv &= eq;
790
+ if (mv & lst) {
791
+ sc++;
792
+ }
793
+ if (pv & lst) {
794
+ sc--;
795
+ }
796
+ mv = mv << 1 | 1;
797
+ pv = pv << 1 | ~(xv | mv);
798
+ mv &= xv;
799
+ }
800
+ i = n;
801
+ while (i--) {
802
+ peq[a.charCodeAt(i)] = 0;
803
+ }
804
+ return sc;
805
+ };
806
+ var myers_x = (b3, a) => {
807
+ const n = a.length;
808
+ const m2 = b3.length;
809
+ const mhc = [];
810
+ const phc = [];
811
+ const hsize = Math.ceil(n / 32);
812
+ const vsize = Math.ceil(m2 / 32);
813
+ for (let i = 0;i < hsize; i++) {
814
+ phc[i] = -1;
815
+ mhc[i] = 0;
816
+ }
817
+ let j2 = 0;
818
+ for (;j2 < vsize - 1; j2++) {
819
+ let mv2 = 0;
820
+ let pv2 = -1;
821
+ const start2 = j2 * 32;
822
+ const vlen2 = Math.min(32, m2) + start2;
823
+ for (let k3 = start2;k3 < vlen2; k3++) {
824
+ peq[b3.charCodeAt(k3)] |= 1 << k3;
825
+ }
826
+ for (let i = 0;i < n; i++) {
827
+ const eq = peq[a.charCodeAt(i)];
828
+ const pb = phc[i / 32 | 0] >>> i & 1;
829
+ const mb = mhc[i / 32 | 0] >>> i & 1;
830
+ const xv = eq | mv2;
831
+ const xh = ((eq | mb) & pv2) + pv2 ^ pv2 | eq | mb;
832
+ let ph = mv2 | ~(xh | pv2);
833
+ let mh = pv2 & xh;
834
+ if (ph >>> 31 ^ pb) {
835
+ phc[i / 32 | 0] ^= 1 << i;
836
+ }
837
+ if (mh >>> 31 ^ mb) {
838
+ mhc[i / 32 | 0] ^= 1 << i;
839
+ }
840
+ ph = ph << 1 | pb;
841
+ mh = mh << 1 | mb;
842
+ pv2 = mh | ~(xv | ph);
843
+ mv2 = ph & xv;
844
+ }
845
+ for (let k3 = start2;k3 < vlen2; k3++) {
846
+ peq[b3.charCodeAt(k3)] = 0;
847
+ }
848
+ }
849
+ let mv = 0;
850
+ let pv = -1;
851
+ const start = j2 * 32;
852
+ const vlen = Math.min(32, m2 - start) + start;
853
+ for (let k3 = start;k3 < vlen; k3++) {
854
+ peq[b3.charCodeAt(k3)] |= 1 << k3;
855
+ }
856
+ let score = m2;
857
+ for (let i = 0;i < n; i++) {
858
+ const eq = peq[a.charCodeAt(i)];
859
+ const pb = phc[i / 32 | 0] >>> i & 1;
860
+ const mb = mhc[i / 32 | 0] >>> i & 1;
861
+ const xv = eq | mv;
862
+ const xh = ((eq | mb) & pv) + pv ^ pv | eq | mb;
863
+ let ph = mv | ~(xh | pv);
864
+ let mh = pv & xh;
865
+ score += ph >>> m2 - 1 & 1;
866
+ score -= mh >>> m2 - 1 & 1;
867
+ if (ph >>> 31 ^ pb) {
868
+ phc[i / 32 | 0] ^= 1 << i;
869
+ }
870
+ if (mh >>> 31 ^ mb) {
871
+ mhc[i / 32 | 0] ^= 1 << i;
872
+ }
873
+ ph = ph << 1 | pb;
874
+ mh = mh << 1 | mb;
875
+ pv = mh | ~(xv | ph);
876
+ mv = ph & xv;
877
+ }
878
+ for (let k3 = start;k3 < vlen; k3++) {
879
+ peq[b3.charCodeAt(k3)] = 0;
880
+ }
881
+ return score;
882
+ };
883
+ var distance = (a, b3) => {
884
+ if (a.length < b3.length) {
885
+ const tmp = b3;
886
+ b3 = a;
887
+ a = tmp;
888
+ }
889
+ if (b3.length === 0) {
890
+ return a.length;
891
+ }
892
+ if (a.length <= 32) {
893
+ return myers_32(a, b3);
894
+ }
895
+ return myers_x(a, b3);
896
+ };
897
+
898
+ // ../core/src/fuzzy-match.ts
899
+ function getSuggestions(input, options, maxSuggestions = 3) {
900
+ const distances = options.map((option) => ({
901
+ distance: distance(input.toLowerCase(), option.toLowerCase()),
902
+ option
903
+ }));
904
+ const suggestions = distances.filter(({ distance: distance2 }) => distance2 <= Math.max(3, input.length / 2)).sort((a, b3) => a.distance - b3.distance).slice(0, maxSuggestions).map(({ option }) => option);
905
+ return suggestions;
906
+ }
907
+ function checkCommonMistakes(input, mistakesMap) {
908
+ return mistakesMap[input.toLowerCase()] || null;
909
+ }
910
+ // ../core/src/graceful.ts
911
+ async function gracefulTry(operation, options = {}) {
912
+ const { fallback, logLevel = "warn", message = "Operation failed gracefully" } = options;
913
+ try {
914
+ return await operation();
915
+ } catch (error) {
916
+ const errorMessage = error instanceof Error ? error.message : String(error);
917
+ console[logLevel](`${message}: ${errorMessage}`);
918
+ if (fallback) {
919
+ try {
920
+ await fallback();
921
+ } catch (fallbackError) {
922
+ console.error(`Fallback also failed: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
923
+ }
924
+ }
925
+ return;
926
+ }
927
+ }
928
+ // ../../tools/utils/logger.ts
929
+ var createLogger = ({
930
+ prefix = "",
931
+ level = process.env.DEBUG ? 0 /* DEBUG */ : 1 /* INFO */
932
+ } = {}) => {
933
+ function debug(...args) {
934
+ if (level <= 0 /* DEBUG */) {
935
+ const message = args.join(" ");
936
+ console.log(format({ level: colors.dim("DEBUG"), message, prefix }));
937
+ }
938
+ }
939
+ function info(...args) {
940
+ if (level <= 1 /* INFO */) {
941
+ const message = args.join(" ");
942
+ console.info(format({ level: colors.cyan("INFO "), message, prefix }));
943
+ }
944
+ }
945
+ function warn(...args) {
946
+ if (level <= 2 /* WARN */) {
947
+ const message = args.join(" ");
948
+ console.warn(format({ level: colors.yellow("WARN "), message, prefix }));
949
+ }
950
+ }
951
+ function error(...args) {
952
+ if (level <= 3 /* ERROR */) {
953
+ const message = args.join(" ");
954
+ console.error(format({ level: colors.red("ERROR"), message, prefix }));
955
+ }
956
+ }
957
+ function child(childPrefix) {
958
+ return createLogger({ level, prefix: `${prefix}:${childPrefix}` });
959
+ }
960
+ return { child, debug, error, info, warn };
961
+ };
962
+ var logger = createLogger();
963
+ function format({ prefix, level, message }) {
964
+ const timestamp = new Date().toISOString().split("T")[1]?.split(".")[0] || "";
965
+ const formatPrefix = prefix ? `[${prefix}] ` : "";
966
+ return `${colors.dim(timestamp || "")} ${level} ${formatPrefix}${message}`;
967
+ }
968
+
969
+ // ../core/src/retry.ts
970
+ var DEFAULT_OPTIONS = {
971
+ backoffMultiplier: 2,
972
+ initialDelay: 1000,
973
+ maxAttempts: 3,
974
+ maxDelay: 30000,
975
+ onRetry: (attempt, error) => {
976
+ logger.warn(`Retry attempt ${attempt}: ${error.message}`);
977
+ },
978
+ retryableErrors: [
979
+ "ECONNREFUSED",
980
+ "ECONNRESET",
981
+ "ETIMEDOUT",
982
+ "ENOTFOUND",
983
+ "rate limit",
984
+ "429",
985
+ "503",
986
+ "502",
987
+ "504",
988
+ "npm ERR!",
989
+ "EPUBLISHCONFLICT"
990
+ ]
991
+ };
992
+ async function withRetry(operation, options = {}) {
993
+ const opts = { ...DEFAULT_OPTIONS, ...options };
994
+ let lastError = new Error("Operation failed");
995
+ for (let attempt = 1;attempt <= opts.maxAttempts; attempt++) {
996
+ try {
997
+ return await operation();
998
+ } catch (error) {
999
+ lastError = error instanceof Error ? error : new Error(String(error));
1000
+ const isRetryable = opts.retryableErrors.some((retryableError) => lastError.message.toLowerCase().includes(retryableError.toLowerCase()));
1001
+ if (!isRetryable || attempt === opts.maxAttempts) {
1002
+ throw lastError;
1003
+ }
1004
+ opts.onRetry(attempt, lastError);
1005
+ const delay = Math.min(opts.initialDelay * opts.backoffMultiplier ** (attempt - 1), opts.maxDelay);
1006
+ await new Promise((resolve) => setTimeout(resolve, delay));
1007
+ }
1008
+ }
1009
+ throw lastError;
1010
+ }
1011
+ // ../../node_modules/banditypes/dist/index.js
1012
+ var banditype = (cast) => {
1013
+ cast.map = (extra) => banditype((raw) => extra(cast(raw)));
1014
+ cast.or = (extra) => banditype((raw) => {
1015
+ try {
1016
+ return cast(raw);
1017
+ } catch (err) {
1018
+ return extra(raw);
1019
+ }
1020
+ });
1021
+ return cast;
1022
+ };
1023
+ var fail = () => "bad banditype"();
1024
+ var enums = (items) => banditype((raw) => items.includes(raw) ? raw : fail());
1025
+ var like = (tag) => banditype((raw) => typeof raw === typeof tag ? raw : fail());
1026
+ var string = () => like("");
1027
+ var number = () => like(0);
1028
+ var boolean = () => like(true);
1029
+ var optional = () => like();
1030
+ var instance = (proto) => banditype((raw) => raw instanceof proto ? raw : fail());
1031
+ var record = (castValue) => instance(Object).map((raw) => {
1032
+ const res = {};
1033
+ for (const key in raw) {
1034
+ const f = castValue(raw[key]);
1035
+ f !== undefined && (res[key] = f);
1036
+ }
1037
+ return res;
1038
+ });
1039
+ var object = (schema) => instance(Object).map((raw) => {
1040
+ const res = {};
1041
+ for (const key in schema) {
1042
+ const f = schema[key](raw[key]);
1043
+ f !== undefined && (res[key] = f);
1044
+ }
1045
+ return res;
1046
+ });
1047
+
1048
+ // ../core/src/validator.ts
1049
+ function union(schemaA, schemaB) {
1050
+ return banditype((data) => {
1051
+ try {
1052
+ return schemaA(data);
1053
+ } catch {
1054
+ try {
1055
+ return schemaB(data);
1056
+ } catch {
1057
+ throw new Error("No matching schema in union");
1058
+ }
1059
+ }
1060
+ });
1061
+ }
1062
+ function defaultTo(schema, defaultValue) {
1063
+ return (data) => {
1064
+ if (data === undefined)
1065
+ return defaultValue;
1066
+ return schema(data);
1067
+ };
1068
+ }
1069
+ function positiveInt() {
1070
+ return banditype((data) => {
1071
+ const n = number()(data);
1072
+ if (!Number.isInteger(n) || n <= 0) {
1073
+ throw new Error("Must be a positive integer");
1074
+ }
1075
+ return n;
1076
+ });
1077
+ }
1078
+ function url() {
1079
+ return banditype((data) => {
1080
+ const s = string()(data);
1081
+ try {
1082
+ new URL(s);
1083
+ return s;
1084
+ } catch {
1085
+ throw new Error("Must be a valid URL");
1086
+ }
1087
+ });
1088
+ }
1089
+ function regex(pattern, message) {
1090
+ return banditype((data) => {
1091
+ const s = string()(data);
1092
+ if (!pattern.test(s)) {
1093
+ throw new Error(message || `Must match pattern ${pattern}`);
1094
+ }
1095
+ return s;
1096
+ });
1097
+ }
1098
+ function createSchema(validator) {
1099
+ return {
1100
+ parse(value) {
1101
+ try {
1102
+ return validator(value);
1103
+ } catch (error) {
1104
+ throw new Error(error instanceof Error ? error.message : "Validation failed");
1105
+ }
1106
+ },
1107
+ safeParse(value) {
1108
+ try {
1109
+ return { data: validator(value), success: true };
1110
+ } catch (error) {
1111
+ return {
1112
+ error: error instanceof Error ? error : new Error("Validation failed"),
1113
+ success: false
1114
+ };
1115
+ }
1116
+ },
1117
+ validator
1118
+ };
1119
+ }
1120
+ // src/methods/createMachines.ts
1121
+ import { parseArgs } from "util";
1122
+ var {$: $3 } = globalThis.Bun;
1123
+
1124
+ // src/config.ts
1125
+ import { join } from "path";
1126
+ var {$: $2 } = globalThis.Bun;
1127
+
1128
+ // src/constants.ts
1129
+ import { tmpdir } from "os";
1130
+ var PATHS = { MACHINES_DIR: "machines", TEMP_DIR: tmpdir() };
1131
+
1132
+ // src/types.ts
1133
+ var profileValidator = object({
1134
+ directory: defaultTo(string(), "./gh-runners"),
1135
+ labels: union(optional(), string()),
1136
+ name: defaultTo(string(), "runner"),
1137
+ numberOfMachines: defaultTo(positiveInt(), 1),
1138
+ os: defaultTo(enums(["osx", "linux", "windows"]), "linux"),
1139
+ overwrite: defaultTo(boolean(), false),
1140
+ run: defaultTo(boolean(), false),
1141
+ runnerGroup: union(optional(), string()),
1142
+ url: union(optional(), string())
1143
+ });
1144
+ var ProfileSchema = createSchema(profileValidator);
1145
+ var ConfigSchema = createSchema(object({
1146
+ defaultProfile: union(optional(), string()),
1147
+ profiles: record(ProfileSchema.validator)
1148
+ }));
1149
+
1150
+ // src/config.ts
1151
+ var CONFIG_FILE_NAMES = ["hydra.json", ".hydra.json", "hydra.toml", ".hydra.toml"];
1152
+ async function findConfigFile(startPath = process.cwd()) {
1153
+ for (const fileName of CONFIG_FILE_NAMES) {
1154
+ const configPath = join(startPath, fileName);
1155
+ const file = Bun.file(configPath);
1156
+ if (await file.exists()) {
1157
+ return configPath;
1158
+ }
1159
+ }
1160
+ return null;
1161
+ }
1162
+ async function loadConfig(options) {
1163
+ const configPath = options?.configPath || await findConfigFile();
1164
+ if (!configPath) {
1165
+ return null;
1166
+ }
1167
+ const file = Bun.file(configPath);
1168
+ if (!await file.exists()) {
1169
+ return null;
1170
+ }
1171
+ try {
1172
+ const content = await file.text();
1173
+ const data = configPath.endsWith(".toml") ? await parseToml(content) : JSON.parse(content);
1174
+ return ConfigSchema.parse(data);
1175
+ } catch (error2) {
1176
+ if (error2 instanceof Error) {
1177
+ throw new Error(`Invalid config file: ${error2.message}`);
1178
+ }
1179
+ throw error2;
1180
+ }
1181
+ }
1182
+ async function getProfile(config, profileName) {
1183
+ if (!config)
1184
+ return null;
1185
+ const name = profileName || config.defaultProfile;
1186
+ if (!name)
1187
+ return null;
1188
+ return config.profiles[name] || null;
1189
+ }
1190
+ async function parseToml(content) {
1191
+ const tempFile = join(PATHS.TEMP_DIR, `hydra-config-${Date.now()}.toml`);
1192
+ await Bun.write(tempFile, content);
1193
+ try {
1194
+ const module = await import(tempFile);
1195
+ await $2`rm -f ${tempFile}`.quiet();
1196
+ return module.default;
1197
+ } catch (error2) {
1198
+ await $2`rm -f ${tempFile}`.quiet();
1199
+ throw new Error(`Failed to parse TOML configuration: ${error2}`);
1200
+ }
1201
+ }
1202
+
1203
+ // src/helpers.ts
1204
+ function getPackagePath() {
1205
+ const currentFilePath = import.meta.path;
1206
+ const currentDir = currentFilePath.substring(0, currentFilePath.lastIndexOf("/"));
1207
+ const srcDir = currentDir.substring(0, currentDir.lastIndexOf("/"));
1208
+ return srcDir;
1209
+ }
1210
+ var cliArgsValidator = object({
1211
+ directory: defaultTo(string(), `${process.cwd()}/gh-runners`),
1212
+ labels: union(string(), optional()),
1213
+ name: defaultTo(string(), "runner"),
1214
+ numberOfMachines: defaultTo(regex(/^\d+$/, "Number of machines must be a positive integer"), "1"),
1215
+ os: defaultTo(enums(["osx", "linux", "windows"]), "osx"),
1216
+ overwrite: defaultTo(boolean(), false),
1217
+ run: defaultTo(boolean(), false),
1218
+ token: defaultTo(string(), process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? ""),
1219
+ url: url()
1220
+ });
1221
+ var CliArgsSchema = createSchema(cliArgsValidator);
1222
+
1223
+ // src/lib/worker-manager.ts
1224
+ var logger2 = createLogger({ prefix: "WorkerManager" });
1225
+
1226
+ class WorkerManager {
1227
+ workers = new Set;
1228
+ cleanupRegistered = false;
1229
+ constructor() {
1230
+ this.registerCleanup();
1231
+ }
1232
+ registerCleanup() {
1233
+ if (this.cleanupRegistered)
1234
+ return;
1235
+ this.cleanupRegistered = true;
1236
+ const cleanup = () => {
1237
+ if (this.workers.size > 0) {
1238
+ logger2.info("Cleaning up workers...");
1239
+ }
1240
+ this.terminateAll();
1241
+ };
1242
+ process.on("exit", cleanup);
1243
+ process.on("SIGINT", cleanup);
1244
+ process.on("SIGTERM", cleanup);
1245
+ process.on("uncaughtException", (error2) => {
1246
+ logger2.error("Uncaught exception:", error2);
1247
+ cleanup();
1248
+ process.exit(1);
1249
+ });
1250
+ }
1251
+ add(worker) {
1252
+ this.workers.add(worker);
1253
+ logger2.debug(`Worker added. Total workers: ${this.workers.size}`);
1254
+ worker.addEventListener("exit", () => {
1255
+ this.workers.delete(worker);
1256
+ logger2.debug(`Worker exited. Remaining workers: ${this.workers.size}`);
1257
+ });
1258
+ }
1259
+ remove(worker) {
1260
+ if (this.workers.has(worker)) {
1261
+ worker.terminate();
1262
+ this.workers.delete(worker);
1263
+ logger2.debug(`Worker removed. Remaining workers: ${this.workers.size}`);
1264
+ }
1265
+ }
1266
+ terminateAll() {
1267
+ if (this.workers.size > 0) {
1268
+ logger2.info(`Terminating ${this.workers.size} workers...`);
1269
+ for (const worker of this.workers) {
1270
+ try {
1271
+ worker.terminate();
1272
+ } catch (error2) {
1273
+ logger2.error(`Failed to terminate worker:`, error2);
1274
+ }
1275
+ }
1276
+ this.workers.clear();
1277
+ }
1278
+ }
1279
+ get size() {
1280
+ return this.workers.size;
1281
+ }
1282
+ }
1283
+ var workerManager = new WorkerManager;
1284
+
1285
+ // src/methods/createMachines.ts
1286
+ var logger3 = createLogger({ prefix: "createMachines" });
1287
+ async function createMachines() {
1288
+ const args = await getArgs();
1289
+ const { overwrite, directory, numberOfMachines, os, run, name, labels, runnerGroup } = args;
1290
+ let { token, url: url2 } = args;
1291
+ if (!url2) {
1292
+ throw new Error("URL (-u) parameter is required");
1293
+ }
1294
+ if (!token) {
1295
+ const settingsUrl = constructRunnerSettingsUrl(url2);
1296
+ const shouldOpen = await ye({
1297
+ message: `No token provided. Would you like to open GitHub to get a runner token?
1298
+ ${settingsUrl}`
1299
+ });
1300
+ if (pD(shouldOpen) || !shouldOpen) {
1301
+ throw new Error("Token is required to create runners");
1302
+ }
1303
+ logger3.info("Opening GitHub runner settings...");
1304
+ await $3`open ${settingsUrl}`.quiet();
1305
+ const tokenInput = await he({
1306
+ message: "Enter the runner registration token:",
1307
+ placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
1308
+ validate: (value) => {
1309
+ if (!value || value.trim().length === 0) {
1310
+ return "Token is required";
1311
+ }
1312
+ return;
1313
+ }
1314
+ });
1315
+ if (pD(tokenInput)) {
1316
+ throw new Error("Token is required to create runners");
1317
+ }
1318
+ token = tokenInput.trim();
1319
+ }
1320
+ logger3.info(`Creating ${numberOfMachines} runners in ${directory}`);
1321
+ logger3.debug(`OS: ${os}, Name: ${name}, Labels: ${labels || "none"}`);
1322
+ const directoryExists = await Bun.file(directory).exists();
1323
+ if (directoryExists) {
1324
+ if (overwrite) {
1325
+ logger3.warn(`Directory ${directory} exists, removing...`);
1326
+ await $3`rm -rf ${directory}`;
1327
+ } else {
1328
+ throw new Error(`Directory ${directory} already exists`);
1329
+ }
1330
+ }
1331
+ const runnerBase = await downloadLatestRunnerImage({ directory, os });
1332
+ await extractAndCopyRunnerBase({ directory, numberOfMachines, overwrite, runnerBase });
1333
+ if (!run) {
1334
+ logger3.info("Runners created but not started");
1335
+ return;
1336
+ }
1337
+ startRunners({ directory, labels, name, numberOfMachines, runnerGroup, token, url: url2 });
1338
+ }
1339
+ function constructRunnerSettingsUrl(url2) {
1340
+ try {
1341
+ const parsedUrl = new URL(url2);
1342
+ const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
1343
+ if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
1344
+ if (pathParts[0] === "orgs" && pathParts[1]) {
1345
+ return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners/new`;
1346
+ } else if (pathParts.length >= 2) {
1347
+ return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
1348
+ }
1349
+ } else {
1350
+ if (pathParts[0] === "orgs" && pathParts[1]) {
1351
+ return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners/new`;
1352
+ } else if (pathParts.length >= 2) {
1353
+ return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
1354
+ }
1355
+ }
1356
+ return url2;
1357
+ } catch {
1358
+ return url2;
1359
+ }
1360
+ }
1361
+ async function getArgs() {
1362
+ const { values } = parseArgs({
1363
+ allowPositionals: true,
1364
+ args: Bun.argv,
1365
+ options: {
1366
+ config: { short: "c", type: "string" },
1367
+ directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
1368
+ labels: { short: "l", type: "string" },
1369
+ name: { default: "runner", short: "n", type: "string" },
1370
+ numberOfMachines: { default: "1", short: "m", type: "string" },
1371
+ os: { default: "osx", short: "s", type: "string" },
1372
+ overwrite: { default: false, short: "f", type: "boolean" },
1373
+ profile: { short: "p", type: "string" },
1374
+ run: { default: false, short: "r", type: "boolean" },
1375
+ runnerGroup: { short: "g", type: "string" },
1376
+ token: { short: "t", type: "string" },
1377
+ url: { short: "u", type: "string" }
1378
+ },
1379
+ strict: true
1380
+ });
1381
+ const config = await loadConfig({ configPath: values.config });
1382
+ const profile = await getProfile(config, values.profile);
1383
+ const baseArgs = {
1384
+ directory: values.directory,
1385
+ labels: values.labels,
1386
+ name: values.name,
1387
+ numberOfMachines: values.numberOfMachines,
1388
+ os: values.os,
1389
+ overwrite: values.overwrite,
1390
+ run: values.run,
1391
+ runnerGroup: values.runnerGroup,
1392
+ token: values.token,
1393
+ url: values.url
1394
+ };
1395
+ if (profile) {
1396
+ return {
1397
+ directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
1398
+ labels: baseArgs.labels ?? profile.labels,
1399
+ name: baseArgs.name ?? profile.name ?? "runner",
1400
+ numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
1401
+ os: baseArgs.os ?? profile.os ?? "osx",
1402
+ overwrite: baseArgs.overwrite ?? profile.overwrite ?? false,
1403
+ run: baseArgs.run ?? profile.run ?? false,
1404
+ runnerGroup: baseArgs.runnerGroup ?? profile.runnerGroup,
1405
+ token: baseArgs.token,
1406
+ url: baseArgs.url ?? profile.url
1407
+ };
1408
+ }
1409
+ return {
1410
+ directory: baseArgs.directory,
1411
+ labels: baseArgs.labels,
1412
+ name: baseArgs.name,
1413
+ numberOfMachines: baseArgs.numberOfMachines,
1414
+ os: baseArgs.os,
1415
+ overwrite: baseArgs.overwrite,
1416
+ run: baseArgs.run,
1417
+ runnerGroup: baseArgs.runnerGroup,
1418
+ token: baseArgs.token,
1419
+ url: baseArgs.url
1420
+ };
1421
+ }
1422
+ async function downloadLatestRunnerImage({ directory, os }) {
1423
+ const log = logger3.child("download");
1424
+ log.info(`Fetching latest runner version for ${os}...`);
1425
+ const releaseInfo = await withRetry(async () => (await $3`curl -Ls -o /dev/null -w "%{url_effective}" https://github.com/actions/runner/releases/latest`).text(), {
1426
+ onRetry: (attempt, error2) => {
1427
+ log.warn(`Retrying GitHub API call (attempt ${attempt}): ${error2.message}`);
1428
+ }
1429
+ });
1430
+ const lastRelease = (await $3`basename ${releaseInfo}`).text();
1431
+ const version = lastRelease.trim().replace("v", "");
1432
+ const runnerBase = `actions-runner-${os}-x64-${version}.tar.gz`;
1433
+ const githubReleaseUrl = `https://github.com/actions/runner/releases/download/v${version}/${runnerBase}`;
1434
+ log.debug(`Runner version: ${version}`);
1435
+ log.debug(`Download URL: ${githubReleaseUrl}`);
1436
+ await $3`mkdir -p ${directory}`;
1437
+ await $3`mkdir -p ${directory}/machines`;
1438
+ const runnerFileExists = await Bun.file(`${directory}/${runnerBase}`).exists();
1439
+ if (!runnerFileExists) {
1440
+ log.info("Downloading runner image...");
1441
+ await withRetry(async () => await $3`curl -o ${directory}/${runnerBase} -L ${githubReleaseUrl}`, {
1442
+ maxAttempts: 5,
1443
+ onRetry: (attempt, error2) => {
1444
+ log.warn(`Retrying runner download (attempt ${attempt}): ${error2.message}`);
1445
+ }
1446
+ });
1447
+ log.info("Download complete");
1448
+ } else {
1449
+ log.info("Runner image already exists, skipping download");
1450
+ }
1451
+ return runnerBase;
1452
+ }
1453
+ async function extractAndCopyRunnerBase({
1454
+ overwrite,
1455
+ numberOfMachines,
1456
+ directory,
1457
+ runnerBase
1458
+ }) {
1459
+ const log = logger3.child("extract");
1460
+ const numMachines = Number(numberOfMachines);
1461
+ const cpuCount = (() => {
1462
+ try {
1463
+ const result = Bun.spawnSync(["nproc"]);
1464
+ return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
1465
+ } catch {
1466
+ try {
1467
+ const result = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"]);
1468
+ return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
1469
+ } catch {
1470
+ return 4;
1471
+ }
1472
+ }
1473
+ })();
1474
+ const concurrency = Math.min(Math.max(2, Math.floor(cpuCount / 2)), numMachines, 8);
1475
+ log.info(`Extracting ${numMachines} runners with concurrency of ${concurrency}`);
1476
+ const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
1477
+ execute: async () => {
1478
+ const machineDirectory = `${directory}/machines/${runnerIndex}`;
1479
+ const machineExists = await Bun.file(machineDirectory).exists();
1480
+ if (machineExists) {
1481
+ if (overwrite) {
1482
+ log.debug(`Machine ${runnerIndex} already exists, removing...`);
1483
+ await $3`rm -rf ${machineDirectory}`;
1484
+ } else {
1485
+ log.debug(`Machine ${runnerIndex} already exists, skipping...`);
1486
+ return;
1487
+ }
1488
+ }
1489
+ await $3`mkdir -p ${machineDirectory}`;
1490
+ await $3`tar xzf ${runnerBase} -C ${machineDirectory.replace(`${directory}/`, "")}`.cwd(directory);
1491
+ const runnerPath = `${getPackagePath()}/src/runner`;
1492
+ await $3`cp -R ${runnerPath}/hooks ${machineDirectory}`;
1493
+ await $3`cp -R ${runnerPath}/.runner-env ${machineDirectory}/.runner-env`;
1494
+ log.debug(`Machine ${runnerIndex} extracted successfully`);
1495
+ },
1496
+ runnerIndex
1497
+ }));
1498
+ const results = [];
1499
+ for (let i = 0;i < tasks.length; i += concurrency) {
1500
+ const batch = tasks.slice(i, i + concurrency);
1501
+ const batchResults = await Promise.allSettled(batch.map((task) => task.execute()));
1502
+ for (const [index, result] of batchResults.entries()) {
1503
+ if (result.status === "rejected") {
1504
+ log.error(`Failed to extract runner ${batch[index]?.runnerIndex}: ${result.reason}`);
1505
+ throw result.reason;
1506
+ }
1507
+ }
1508
+ results.push(...batchResults);
1509
+ }
1510
+ log.info(`Successfully extracted ${numMachines} runners`);
1511
+ }
1512
+ function startRunners({
1513
+ directory,
1514
+ numberOfMachines,
1515
+ token,
1516
+ url: url2,
1517
+ name,
1518
+ labels,
1519
+ runnerGroup
1520
+ }) {
1521
+ logger3.info(`Starting ${numberOfMachines} runners...`);
1522
+ for (let runnerIndex = 1;runnerIndex <= Number(numberOfMachines); runnerIndex++) {
1523
+ const workerPath = `${getPackagePath()}/src/runner-worker.ts`;
1524
+ const workerName = `${name}-${runnerIndex}`;
1525
+ const worker = new Worker(workerPath, { name: workerName, ref: true });
1526
+ worker.addEventListener("open", () => {
1527
+ logger3.info(`Worker ${workerName} started`);
1528
+ worker.postMessage({
1529
+ index: runnerIndex,
1530
+ labels,
1531
+ machineCwd: `${directory}/machines/${runnerIndex}`,
1532
+ name,
1533
+ runnerGroup,
1534
+ token,
1535
+ url: url2
1536
+ });
1537
+ });
1538
+ worker.addEventListener("message", ({ data }) => {
1539
+ const level = data.type === "error" ? "error" : "info";
1540
+ logger3[level](`${workerName}: ${data.message}`);
1541
+ });
1542
+ worker.addEventListener("error", (error2) => {
1543
+ logger3.error(`Worker ${workerName} error:`, error2);
1544
+ });
1545
+ worker.addEventListener("exit", (code) => {
1546
+ logger3.info(`Worker ${workerName} exited with code ${code}`);
1547
+ });
1548
+ workerManager.add(worker);
1549
+ }
1550
+ logger3.info("All workers started. Press Ctrl+C to stop all machines");
1551
+ }
1552
+
1553
+ // src/methods/help.ts
1554
+ var COMMAND_HELP = {
1555
+ create: `
1556
+ hydra create - Create and register new GitHub runner machines
1557
+
1558
+ USAGE
1559
+ hydra create [options]
1560
+
1561
+ OPTIONS
1562
+ -t, --token GitHub Personal Access Token [string] (required)
1563
+ -u, --url GitHub repository or org URL [string] (required)
1564
+ -m, --numberOfMachines Number of machines [number] (default: 1)
1565
+ -n, --name Runner name prefix [string]
1566
+ -l, --labels Comma-separated runner labels [string]
1567
+ -o, --os Runner OS [string] (default: linux)
1568
+ -d, --directory Runners directory [string]
1569
+ -O, --overwrite Overwrite existing runners [boolean]
1570
+ -p, --profile Configuration profile [string]
1571
+ -c, --config Configuration file path [string]
1572
+
1573
+ EXAMPLES
1574
+ # Create a single runner
1575
+ hydra create -t TOKEN -u https://github.com/org/repo
1576
+
1577
+ # Create 3 runners with labels
1578
+ hydra create -m 3 -t TOKEN -u URL -l docker,gpu
1579
+
1580
+ # Create using profile
1581
+ hydra create -p production -t TOKEN
1582
+ `,
1583
+ init: `
1584
+ hydra init - Initialize a new Hydra configuration file
1585
+
1586
+ USAGE
1587
+ hydra init [options]
1588
+
1589
+ OPTIONS
1590
+ -t, --toml Use TOML format instead of JSON [boolean]
1591
+
1592
+ EXAMPLES
1593
+ # Initialize with interactive prompts
1594
+ hydra init
1595
+
1596
+ # Initialize with TOML format
1597
+ hydra init --toml
1598
+ `,
1599
+ remove: `
1600
+ hydra remove - Remove GitHub runner machines
1601
+
1602
+ USAGE
1603
+ hydra remove [options]
1604
+
1605
+ OPTIONS
1606
+ -t, --token GitHub Personal Access Token [string] (required)
1607
+ -u, --url GitHub repository or org URL [string] (required)
1608
+ -m, --numberOfMachines Number of machines [number] (default: 1)
1609
+ -n, --name Runner name prefix [string]
1610
+ -d, --directory Runners directory [string]
1611
+ -f, --force Force removal [boolean]
1612
+ -p, --profile Configuration profile [string]
1613
+ -c, --config Configuration file path [string]
1614
+
1615
+ EXAMPLES
1616
+ # Remove and unregister
1617
+ hydra remove -t TOKEN -u https://github.com/org/repo
1618
+
1619
+ # Force remove
1620
+ hydra remove -m 2 --force
1621
+
1622
+ # Remove specific runners
1623
+ hydra remove -n custom -m 3 -t TOKEN -u URL
1624
+ `,
1625
+ run: `
1626
+ hydra run - Start existing GitHub runner machines
1627
+
1628
+ USAGE
1629
+ hydra run [options]
1630
+
1631
+ OPTIONS
1632
+ -t, --token GitHub Personal Access Token [string] (required)
1633
+ -u, --url GitHub repository or org URL [string] (required)
1634
+ -m, --numberOfMachines Number of machines [number] (default: 1)
1635
+ -n, --name Runner name prefix [string]
1636
+ -d, --directory Runners directory [string]
1637
+ -p, --profile Configuration profile [string]
1638
+ -c, --config Configuration file path [string]
1639
+
1640
+ EXAMPLES
1641
+ # Run existing runners
1642
+ hydra run -t TOKEN -u https://github.com/org/repo
1643
+
1644
+ # Run specific runners
1645
+ hydra run -m 2 -n custom -t TOKEN -u URL
1646
+ `,
1647
+ status: `
1648
+ hydra status - Check the status of GitHub runner machines
1649
+
1650
+ USAGE
1651
+ hydra status [options]
1652
+
1653
+ OPTIONS
1654
+ -t, --token GitHub Personal Access Token [string] (required)
1655
+ -u, --url GitHub repository or org URL [string] (required)
1656
+ -d, --directory Runners directory [string]
1657
+ -j, --json Output status in JSON format [boolean]
1658
+ -p, --profile Configuration profile [string]
1659
+ -c, --config Configuration file path [string]
1660
+
1661
+ EXAMPLES
1662
+ # Check runner status
1663
+ hydra status -t TOKEN -u https://github.com/org/repo
1664
+
1665
+ # Output as JSON
1666
+ hydra status -t TOKEN -u URL --json
1667
+
1668
+ # Status using profile
1669
+ hydra status -p production
1670
+ `
1671
+ };
1672
+ function help(commandName) {
1673
+ if (commandName && COMMAND_HELP[commandName]) {
1674
+ const helpText = COMMAND_HELP[commandName];
1675
+ const coloredHelp = helpText.split(`
1676
+ `).map((line) => {
1677
+ if (line.startsWith("hydra"))
1678
+ return colors.bold(line);
1679
+ if (line === "USAGE" || line === "OPTIONS" || line === "EXAMPLES")
1680
+ return colors.bold(line);
1681
+ if (line.startsWith(" -")) {
1682
+ const match = line.match(/^(\s+-\w,\s--\w+)\s+(.+)$/);
1683
+ if (match) {
1684
+ const [, flags = "", description = ""] = match;
1685
+ const coloredDesc = description.replace("(required)", colors.red("(required)")).replace(/\(default: ([^)]+)\)/g, (_3, value) => colors.dim(`(default: ${value})`)).replace(/\[boolean\]/g, colors.cyan("[boolean]")).replace(/\[string\]/g, colors.green("[string]")).replace(/\[number\]/g, colors.magenta("[number]"));
1686
+ return ` ${colors.yellow(flags.padEnd(26))} ${coloredDesc}`;
1687
+ }
1688
+ }
1689
+ if (line.startsWith(" # "))
1690
+ return colors.dim(line);
1691
+ if (line.startsWith(" hydra"))
1692
+ return ` ${colors.cyan(line.trim())}`;
1693
+ return line;
1694
+ }).join(`
1695
+ `);
1696
+ console.info(coloredHelp);
1697
+ return;
1698
+ }
1699
+ console.info(`
1700
+ ${colors.bold("Hydra - GitHub self-hosted runner manager")}
1701
+
1702
+ ${colors.bold("USAGE")}
1703
+ hydra <command> [options]
1704
+
1705
+ ${colors.bold("COMMANDS")}
1706
+ ${colors.green("init")} Initialize a new Hydra configuration file
1707
+ ${colors.green("create")} Create and register new GitHub runner machines
1708
+ ${colors.green("run")} Start existing GitHub runner machines
1709
+ ${colors.green("remove")} Remove GitHub runner machines
1710
+ ${colors.green("status")} Check the status of GitHub runner machines
1711
+ ${colors.green("help")} Show this help message
1712
+
1713
+ Use ${colors.cyan("hydra <command> --help")} for more information about a command.
1714
+ `);
1715
+ }
1716
+
1717
+ // src/methods/init.ts
1718
+ import { resolve } from "path";
1719
+ import { parseArgs as parseArgs2 } from "util";
1720
+ var {$: $4 } = globalThis.Bun;
1721
+ async function init() {
1722
+ const { toml } = getArgs2();
1723
+ const configFileName = toml ? "hydra.toml" : "hydra.json";
1724
+ const configPath = resolve(process.cwd(), configFileName);
1725
+ const file = Bun.file(configPath);
1726
+ if (await file.exists()) {
1727
+ const overwrite = await ye({
1728
+ initialValue: false,
1729
+ message: `Configuration file ${configFileName} already exists. Overwrite?`
1730
+ });
1731
+ if (pD(overwrite) || !overwrite) {
1732
+ xe("Configuration cancelled");
1733
+ process.exit(0);
1734
+ }
1735
+ }
1736
+ Ie(colors.cyan("\uD83D\uDE80 Hydra Configuration Setup"));
1737
+ console.info(colors.dim("This will create a configuration file with your runner settings."));
1738
+ console.info(colors.dim(`You can always edit the file later or create additional profiles.
1739
+ `));
1740
+ const answers = await Ce({
1741
+ profileName: () => he({ message: "Profile name?", placeholder: "default" }),
1742
+ directory: () => he({
1743
+ defaultValue: "./gh-runners",
1744
+ message: "Directory to store runners?",
1745
+ placeholder: "./gh-runners"
1746
+ }),
1747
+ name: () => he({ defaultValue: "runner", message: "Runner name prefix?", placeholder: "runner" }),
1748
+ labels: ({ results }) => {
1749
+ const placeholder = results.name || "runner";
1750
+ return he({
1751
+ defaultValue: placeholder,
1752
+ message: "Runner labels (comma-separated)?",
1753
+ placeholder
1754
+ });
1755
+ },
1756
+ numberOfMachines: () => he({
1757
+ defaultValue: "1",
1758
+ message: "Number of runner machines?",
1759
+ placeholder: "1",
1760
+ validate: (value) => {
1761
+ const num = Number.parseInt(value, 10);
1762
+ if (Number.isNaN(num) || num < 1)
1763
+ return "Please enter a valid number greater than 0";
1764
+ return;
1765
+ }
1766
+ }),
1767
+ url: () => he({
1768
+ message: "GitHub repository or organization URL? (optional)",
1769
+ placeholder: "https://github.com/org/repo"
1770
+ })
1771
+ }, {
1772
+ onCancel: () => {
1773
+ xe("Configuration cancelled");
1774
+ process.exit(0);
1775
+ }
1776
+ });
1777
+ const { profileName, labels, numberOfMachines, ...profile } = answers;
1778
+ const config = {
1779
+ defaultProfile: profileName,
1780
+ profiles: {
1781
+ [profileName]: {
1782
+ ...profile,
1783
+ labels,
1784
+ numberOfMachines: Number.parseInt(numberOfMachines, 10),
1785
+ os: "osx",
1786
+ overwrite: false,
1787
+ run: false
1788
+ }
1789
+ }
1790
+ };
1791
+ const content = JSON.stringify(config, null, 2);
1792
+ await Bun.write(configPath, content);
1793
+ await gracefulTry(async () => {
1794
+ await $4`chmod 600 ${configPath}`.quiet();
1795
+ }, { logLevel: "warn", message: "Could not set secure file permissions" });
1796
+ Se(colors.green(`\u2713 Configuration saved to ${configFileName}`));
1797
+ console.info(`
1798
+ Example usage:`);
1799
+ console.info(colors.cyan(` hydra create -p ${profileName} --token YOUR_TOKEN${answers.url ? "" : " --url REPO_URL"}`));
1800
+ console.info(`
1801
+ You can add more profiles by editing the configuration file.`);
1802
+ if (answers.url) {
1803
+ await openGitHubSettings(answers.url);
1804
+ }
1805
+ }
1806
+ async function openGitHubSettings(url2) {
1807
+ const githubRegex = /github\.com[:/]([^/]+)(?:\/([^/.]+))?/;
1808
+ const match = url2.match(githubRegex);
1809
+ if (!match)
1810
+ return;
1811
+ const [, orgOrOwner, repo] = match;
1812
+ const repoUrl = repo ? `${orgOrOwner}/${repo}` : `organizations/${orgOrOwner}`;
1813
+ const settingsUrl = `https://github.com/${repoUrl}/settings/actions/runners`;
1814
+ console.info(`
1815
+ Opening GitHub settings: ${colors.cyan(settingsUrl)}`);
1816
+ await gracefulTry(async () => {
1817
+ await $4`open ${settingsUrl}`.quiet();
1818
+ }, {
1819
+ fallback: async () => {
1820
+ await gracefulTry(async () => {
1821
+ await $4`xdg-open ${settingsUrl}`.quiet();
1822
+ }, {
1823
+ fallback: () => {
1824
+ console.info(`
1825
+ Please open the URL manually to add a new runner token.`);
1826
+ },
1827
+ logLevel: "info",
1828
+ message: "Alternative browser open method also failed"
1829
+ });
1830
+ },
1831
+ logLevel: "info",
1832
+ message: "Could not open browser automatically"
1833
+ });
1834
+ }
1835
+ function getArgs2() {
1836
+ const { values } = parseArgs2({
1837
+ allowPositionals: true,
1838
+ args: Bun.argv,
1839
+ options: { toml: { default: false, short: "t", type: "boolean" } },
1840
+ strict: true
1841
+ });
1842
+ return values;
1843
+ }
1844
+
1845
+ // src/methods/removeMachines.ts
1846
+ import { parseArgs as parseArgs3 } from "util";
1847
+ var {$: $5 } = globalThis.Bun;
1848
+ var logger4 = createLogger({ prefix: "removeMachines" });
1849
+ async function removeMachines() {
1850
+ const args = await getArgs3();
1851
+ const { directory, numberOfMachines, force } = args;
1852
+ let { token, url: url2 } = args;
1853
+ const machinesDir = `${directory}/machines`;
1854
+ const directoryExists = await Bun.file(machinesDir).exists();
1855
+ if (!directoryExists) {
1856
+ throw new Error(`Machines directory not found at ${machinesDir}. Nothing to remove.`);
1857
+ }
1858
+ if (!token && !force) {
1859
+ if (!url2) {
1860
+ console.warn(colors.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub."));
1861
+ console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
1862
+ throw new Error("Token (-t) and URL (-u) parameters are required or use --force");
1863
+ }
1864
+ const settingsUrl = constructRunnerSettingsUrl2(url2);
1865
+ const shouldOpen = await ye({
1866
+ message: `No token provided. Would you like to open GitHub to get a runner token for unregistration?
1867
+ ${settingsUrl}`
1868
+ });
1869
+ if (pD(shouldOpen) || !shouldOpen) {
1870
+ console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
1871
+ throw new Error("Token is required to unregister runners (or use --force)");
1872
+ }
1873
+ logger4.info("Opening GitHub runner settings...");
1874
+ await $5`open ${settingsUrl}`.quiet();
1875
+ const tokenInput = await he({
1876
+ message: "Enter the runner removal token:",
1877
+ placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
1878
+ validate: (value) => {
1879
+ if (!value || value.trim().length === 0) {
1880
+ return "Token is required";
1881
+ }
1882
+ return;
1883
+ }
1884
+ });
1885
+ if (pD(tokenInput)) {
1886
+ console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
1887
+ throw new Error("Token is required to unregister runners (or use --force)");
1888
+ }
1889
+ token = tokenInput.trim();
1890
+ }
1891
+ if (token && url2) {
1892
+ console.info(colors.cyan("Unregistering runners from GitHub..."));
1893
+ await unregisterRunners({ directory, numberOfMachines, token });
1894
+ } else if (!force) {
1895
+ console.warn(colors.yellow("\u26A0\uFE0F No token or URL provided. Runners will not be unregistered from GitHub."));
1896
+ console.warn(colors.yellow("Use --force to remove runners without unregistering them."));
1897
+ throw new Error("Token (-t) and URL (-u) parameters are required or use --force");
1898
+ }
1899
+ await removeRunnerDirectories({ directory, numberOfMachines });
1900
+ console.info(colors.green("\u2713 Runners successfully removed"));
1901
+ }
1902
+ async function getArgs3() {
1903
+ const { values } = parseArgs3({
1904
+ allowPositionals: true,
1905
+ args: Bun.argv,
1906
+ options: {
1907
+ config: { short: "c", type: "string" },
1908
+ directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
1909
+ force: { default: false, short: "f", type: "boolean" },
1910
+ numberOfMachines: { default: "1", short: "m", type: "string" },
1911
+ profile: { short: "p", type: "string" },
1912
+ token: { short: "t", type: "string" },
1913
+ url: { short: "u", type: "string" }
1914
+ },
1915
+ strict: true
1916
+ });
1917
+ const config = await loadConfig({ configPath: values.config });
1918
+ const profile = await getProfile(config, values.profile);
1919
+ const baseArgs = {
1920
+ directory: values.directory,
1921
+ force: values.force,
1922
+ numberOfMachines: values.numberOfMachines,
1923
+ token: values.token,
1924
+ url: values.url
1925
+ };
1926
+ if (profile) {
1927
+ return {
1928
+ directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
1929
+ force: baseArgs.force,
1930
+ numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
1931
+ token: baseArgs.token,
1932
+ url: baseArgs.url ?? profile.url
1933
+ };
1934
+ }
1935
+ return baseArgs;
1936
+ }
1937
+ async function unregisterRunners({
1938
+ directory,
1939
+ numberOfMachines,
1940
+ token
1941
+ }) {
1942
+ const log = logger4.child("unregister");
1943
+ const numMachines = Number(numberOfMachines);
1944
+ const cpuCount = (() => {
1945
+ try {
1946
+ const result = Bun.spawnSync(["nproc"]);
1947
+ return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
1948
+ } catch {
1949
+ try {
1950
+ const result = Bun.spawnSync(["sysctl", "-n", "hw.ncpu"]);
1951
+ return Number.parseInt(result.stdout.toString().trim(), 10) || 4;
1952
+ } catch {
1953
+ return 4;
1954
+ }
1955
+ }
1956
+ })();
1957
+ const concurrency = Math.min(Math.max(2, Math.floor(cpuCount / 2)), numMachines, 8);
1958
+ log.info(`Unregistering ${numMachines} runners with concurrency of ${concurrency}`);
1959
+ const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
1960
+ execute: async () => {
1961
+ const machineDirectory = `${directory}/machines/${runnerIndex}`;
1962
+ const machineExists = await Bun.file(machineDirectory).exists();
1963
+ if (!machineExists) {
1964
+ log.debug(`Machine ${runnerIndex} doesn't exist, skipping...`);
1965
+ return { runnerIndex, status: "skipped" };
1966
+ }
1967
+ try {
1968
+ log.debug(`Unregistering machine ${runnerIndex}...`);
1969
+ await $5`${machineDirectory}/config.sh remove --token ${token}`.quiet();
1970
+ log.info(`Successfully unregistered machine ${runnerIndex} from GitHub`);
1971
+ return { runnerIndex, status: "success" };
1972
+ } catch (error2) {
1973
+ log.warn(`Unable to unregister machine ${runnerIndex}: ${error2}`);
1974
+ return { error: error2, runnerIndex, status: "failed" };
1975
+ }
1976
+ },
1977
+ runnerIndex
1978
+ }));
1979
+ const results = [];
1980
+ for (let i = 0;i < tasks.length; i += concurrency) {
1981
+ const batch = tasks.slice(i, i + concurrency);
1982
+ const batchResults = await Promise.allSettled(batch.map((task) => task.execute()));
1983
+ results.push(...batchResults);
1984
+ }
1985
+ const successful = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "success").length;
1986
+ const failed = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "failed").length;
1987
+ const skipped = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "skipped").length;
1988
+ log.info(`Unregistration complete: ${successful} successful, ${failed} failed, ${skipped} skipped`);
1989
+ }
1990
+ async function removeRunnerDirectories({
1991
+ directory,
1992
+ numberOfMachines
1993
+ }) {
1994
+ const log = logger4.child("removeDirectories");
1995
+ const numMachines = Number(numberOfMachines);
1996
+ const tasks = Array.from({ length: numMachines }, (_3, i) => i + 1).map((runnerIndex) => ({
1997
+ execute: async () => {
1998
+ const machineDirectory = `${directory}/machines/${runnerIndex}`;
1999
+ const machineExists = await Bun.file(machineDirectory).exists();
2000
+ if (!machineExists) {
2001
+ return { runnerIndex, status: "skipped" };
2002
+ }
2003
+ try {
2004
+ await $5`rm -rf ${machineDirectory}`.quiet();
2005
+ log.debug(`Removed machine ${runnerIndex} directory`);
2006
+ return { runnerIndex, status: "success" };
2007
+ } catch (error2) {
2008
+ log.error(`Error removing machine ${runnerIndex} directory: ${error2}`);
2009
+ return { error: error2, runnerIndex, status: "failed" };
2010
+ }
2011
+ },
2012
+ runnerIndex
2013
+ }));
2014
+ const results = await Promise.allSettled(tasks.map((task) => task.execute()));
2015
+ const successful = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "success").length;
2016
+ const failed = results.filter((r2) => r2.status === "fulfilled" && r2.value?.status === "failed").length;
2017
+ log.info(`Directory removal complete: ${successful} removed, ${failed} failed`);
2018
+ if (failed > 0) {
2019
+ throw new Error(`Failed to remove ${failed} runner directories`);
2020
+ }
2021
+ try {
2022
+ const machinesDir = `${directory}/machines`;
2023
+ const files = (await $5`ls -A ${machinesDir}`.text()).trim();
2024
+ if (!files) {
2025
+ await $5`rm -rf ${machinesDir}`.quiet();
2026
+ const parentFiles = (await $5`ls -A ${directory}`.text()).trim();
2027
+ if (!parentFiles) {
2028
+ await $5`rm -rf ${directory}`.quiet();
2029
+ }
2030
+ console.info(colors.green(`\u2713 Removed empty directories`));
2031
+ }
2032
+ } catch (_error) {}
2033
+ }
2034
+ function constructRunnerSettingsUrl2(url2) {
2035
+ try {
2036
+ const parsedUrl = new URL(url2);
2037
+ const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
2038
+ if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
2039
+ if (pathParts[0] === "orgs" && pathParts[1]) {
2040
+ return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners`;
2041
+ } else if (pathParts.length >= 2) {
2042
+ return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners`;
2043
+ }
2044
+ } else {
2045
+ if (pathParts[0] === "orgs" && pathParts[1]) {
2046
+ return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners`;
2047
+ } else if (pathParts.length >= 2) {
2048
+ return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners`;
2049
+ }
2050
+ }
2051
+ return url2;
2052
+ } catch {
2053
+ return url2;
2054
+ }
2055
+ }
2056
+
2057
+ // src/methods/runMachines.ts
2058
+ import { parseArgs as parseArgs4 } from "util";
2059
+ var {$: $6 } = globalThis.Bun;
2060
+ var logger5 = createLogger({ prefix: "runMachines" });
2061
+ async function runMachines() {
2062
+ const args = await getArgs4();
2063
+ const { directory, numberOfMachines, name, labels, runnerGroup } = args;
2064
+ let { token, url: url2 } = args;
2065
+ if (!url2) {
2066
+ throw new Error("URL (-u) parameter is required");
2067
+ }
2068
+ if (!token) {
2069
+ const settingsUrl = constructRunnerSettingsUrl3(url2);
2070
+ const shouldOpen = await ye({
2071
+ message: `No token provided. Would you like to open GitHub to get a runner token?
2072
+ ${settingsUrl}`
2073
+ });
2074
+ if (pD(shouldOpen) || !shouldOpen) {
2075
+ throw new Error("Token is required to run machines");
2076
+ }
2077
+ logger5.info("Opening GitHub runner settings...");
2078
+ await $6`open ${settingsUrl}`.quiet();
2079
+ const tokenInput = await he({
2080
+ message: "Enter the runner registration token:",
2081
+ placeholder: "AXXXXXXXXXXXXXXXXXXXXXXXXX",
2082
+ validate: (value) => {
2083
+ if (!value || value.trim().length === 0) {
2084
+ return "Token is required";
2085
+ }
2086
+ return;
2087
+ }
2088
+ });
2089
+ if (pD(tokenInput)) {
2090
+ throw new Error("Token is required to run machines");
2091
+ }
2092
+ token = tokenInput.trim();
2093
+ }
2094
+ logger5.info(`Starting ${numberOfMachines} runners from ${directory}`);
2095
+ logger5.debug(`Name: ${name}, Labels: ${labels || "none"}`);
2096
+ const directoryExists = await Bun.file(`${directory}/machines`).exists();
2097
+ if (!directoryExists) {
2098
+ throw new Error(`Machines directory not found at ${directory}/machines. Run 'hydra create' first.`);
2099
+ }
2100
+ await startRunners2({ directory, labels, name, numberOfMachines, runnerGroup, token, url: url2 });
2101
+ }
2102
+ async function getArgs4() {
2103
+ const { values } = parseArgs4({
2104
+ allowPositionals: true,
2105
+ args: Bun.argv,
2106
+ options: {
2107
+ config: { short: "c", type: "string" },
2108
+ directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
2109
+ labels: { short: "l", type: "string" },
2110
+ name: { default: "runner", short: "n", type: "string" },
2111
+ numberOfMachines: { default: "1", short: "m", type: "string" },
2112
+ profile: { short: "p", type: "string" },
2113
+ runnerGroup: { short: "g", type: "string" },
2114
+ token: { short: "t", type: "string" },
2115
+ url: { short: "u", type: "string" }
2116
+ },
2117
+ strict: true
2118
+ });
2119
+ const config = await loadConfig({ configPath: values.config });
2120
+ const profile = await getProfile(config, values.profile);
2121
+ const baseArgs = {
2122
+ directory: values.directory,
2123
+ labels: values.labels,
2124
+ name: values.name,
2125
+ numberOfMachines: values.numberOfMachines,
2126
+ runnerGroup: values.runnerGroup,
2127
+ token: values.token,
2128
+ url: values.url
2129
+ };
2130
+ if (profile) {
2131
+ return {
2132
+ directory: baseArgs.directory ?? profile.directory ?? `${process.cwd()}/gh-runners`,
2133
+ labels: baseArgs.labels ?? profile.labels,
2134
+ name: baseArgs.name ?? profile.name ?? "runner",
2135
+ numberOfMachines: baseArgs.numberOfMachines ?? String(profile.numberOfMachines) ?? "1",
2136
+ runnerGroup: baseArgs.runnerGroup ?? profile.runnerGroup,
2137
+ token: baseArgs.token,
2138
+ url: baseArgs.url ?? profile.url
2139
+ };
2140
+ }
2141
+ return baseArgs;
2142
+ }
2143
+ async function startRunners2({
2144
+ directory,
2145
+ numberOfMachines,
2146
+ token,
2147
+ url: url2,
2148
+ name,
2149
+ labels,
2150
+ runnerGroup
2151
+ }) {
2152
+ logger5.info(`Starting ${numberOfMachines} workers...`);
2153
+ for (let runnerIndex = 1;runnerIndex <= Number(numberOfMachines); runnerIndex++) {
2154
+ const machineDirectory = `${directory}/machines/${runnerIndex}`;
2155
+ const machineExists = await Bun.file(machineDirectory).exists();
2156
+ if (!machineExists) {
2157
+ logger5.warn(`Machine ${runnerIndex} doesn't exist, skipping...`);
2158
+ continue;
2159
+ }
2160
+ const workerPath = `${getPackagePath()}/src/runner-worker.ts`;
2161
+ const workerName = `${name}-${runnerIndex}`;
2162
+ const worker = new Worker(workerPath, { name: workerName, ref: true });
2163
+ worker.addEventListener("message", ({ data }) => {
2164
+ const level = data.type === "error" ? "error" : "info";
2165
+ logger5[level](`${workerName}: ${data.message}`);
2166
+ });
2167
+ worker.addEventListener("error", (error2) => {
2168
+ logger5.error(`Worker ${workerName} error:`, error2);
2169
+ });
2170
+ worker.addEventListener("exit", (code) => {
2171
+ logger5.info(`Worker ${workerName} exited with code ${code}`);
2172
+ });
2173
+ worker.postMessage({
2174
+ index: runnerIndex,
2175
+ labels,
2176
+ machineCwd: machineDirectory,
2177
+ name,
2178
+ runnerGroup,
2179
+ token,
2180
+ url: url2
2181
+ });
2182
+ logger5.info(`Worker ${workerName} starting...`);
2183
+ workerManager.add(worker);
2184
+ }
2185
+ logger5.info("All workers started. Press Ctrl+C to stop all machines");
2186
+ }
2187
+ function constructRunnerSettingsUrl3(url2) {
2188
+ try {
2189
+ const parsedUrl = new URL(url2);
2190
+ const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
2191
+ if (parsedUrl.hostname === "github.com" || parsedUrl.hostname === "www.github.com") {
2192
+ if (pathParts[0] === "orgs" && pathParts[1]) {
2193
+ return `https://github.com/organizations/${pathParts[1]}/settings/actions/runners/new`;
2194
+ } else if (pathParts.length >= 2) {
2195
+ return `https://github.com/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
2196
+ }
2197
+ } else {
2198
+ if (pathParts[0] === "orgs" && pathParts[1]) {
2199
+ return `${parsedUrl.origin}/organizations/${pathParts[1]}/settings/actions/runners/new`;
2200
+ } else if (pathParts.length >= 2) {
2201
+ return `${parsedUrl.origin}/${pathParts[0]}/${pathParts[1]}/settings/actions/runners/new`;
2202
+ }
2203
+ }
2204
+ return url2;
2205
+ } catch {
2206
+ return url2;
2207
+ }
2208
+ }
2209
+
2210
+ // src/methods/status.ts
2211
+ import { parseArgs as parseArgs5 } from "util";
2212
+ var {$: $7 } = globalThis.Bun;
2213
+ async function status() {
2214
+ const args = await getArgs5();
2215
+ const { directory, token, url: url2, json } = args;
2216
+ if (!token || !url2) {
2217
+ throw new Error("Token (-t) and URL (-u) parameters are required");
2218
+ }
2219
+ const statusSpinner = Y2();
2220
+ statusSpinner.start("Fetching runner status...");
2221
+ try {
2222
+ const localRunners = await getLocalRunners(directory);
2223
+ const githubRunners = await fetchGitHubRunners(url2, token);
2224
+ const runnerStatuses = combineRunnerStatus(localRunners, githubRunners);
2225
+ statusSpinner.stop("Runner status fetched");
2226
+ if (json) {
2227
+ console.log(JSON.stringify(runnerStatuses, null, 2));
2228
+ } else {
2229
+ displayRunnerStatus(runnerStatuses);
2230
+ }
2231
+ } catch (error2) {
2232
+ statusSpinner.stop("Failed to fetch runner status");
2233
+ throw error2;
2234
+ }
2235
+ }
2236
+ async function getArgs5() {
2237
+ const { values } = parseArgs5({
2238
+ allowPositionals: true,
2239
+ args: Bun.argv,
2240
+ options: {
2241
+ config: { short: "c", type: "string" },
2242
+ directory: { default: `${process.cwd()}/gh-runners`, short: "d", type: "string" },
2243
+ json: { default: false, short: "j", type: "boolean" },
2244
+ profile: { short: "p", type: "string" },
2245
+ token: { short: "t", type: "string" },
2246
+ url: { short: "u", type: "string" }
2247
+ },
2248
+ strict: true
2249
+ });
2250
+ const config = await loadConfig({ configPath: values.config });
2251
+ const profile = await getProfile(config, values.profile);
2252
+ return {
2253
+ directory: values.directory || profile?.directory || `${process.cwd()}/gh-runners`,
2254
+ json: values.json,
2255
+ token: values.token,
2256
+ url: values.url || profile?.url
2257
+ };
2258
+ }
2259
+ async function getLocalRunners(directory) {
2260
+ const machinesDir = `${directory}/machines`;
2261
+ const result = await gracefulTry(async () => {
2262
+ const output = await $7`ls ${machinesDir} 2>/dev/null || true`.quiet();
2263
+ return output.stdout.toString().trim().split(`
2264
+ `).filter(Boolean);
2265
+ }, { fallback: () => {}, logLevel: "debug", message: "No local runners found" });
2266
+ return result || [];
2267
+ }
2268
+ async function fetchGitHubRunners(url2, token) {
2269
+ const match = url2.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);
2270
+ if (!match) {
2271
+ throw new Error("Invalid GitHub URL");
2272
+ }
2273
+ const [, orgOrOwner, repo] = match;
2274
+ const apiUrl = repo ? `https://api.github.com/repos/${orgOrOwner}/${repo}/actions/runners` : `https://api.github.com/orgs/${orgOrOwner}/actions/runners`;
2275
+ return withRetry(async () => {
2276
+ const headers = {
2277
+ Accept: "application/vnd.github.v3+json",
2278
+ Authorization: `Bearer ${token}`
2279
+ };
2280
+ const response = await fetch(apiUrl, { headers });
2281
+ if (!response.ok) {
2282
+ throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
2283
+ }
2284
+ const data = await response.json();
2285
+ return data;
2286
+ }, {
2287
+ onRetry: (attempt, error2) => {
2288
+ M2.warn(`Retrying GitHub API call (attempt ${attempt}): ${error2.message}`);
2289
+ }
2290
+ });
2291
+ }
2292
+ function combineRunnerStatus(localRunners, githubData) {
2293
+ const statuses = [];
2294
+ const githubRunnerMap = new Map(githubData.runners.map((runner) => [runner.name, runner]));
2295
+ for (const runnerDir of localRunners) {
2296
+ const runnerName = `runner-${runnerDir}`;
2297
+ const githubRunner = githubRunnerMap.get(runnerName);
2298
+ if (githubRunner) {
2299
+ statuses.push({
2300
+ busy: githubRunner.busy,
2301
+ labels: githubRunner.labels.map((l2) => l2.name),
2302
+ name: runnerName,
2303
+ os: githubRunner.os,
2304
+ status: githubRunner.busy ? "busy" : githubRunner.status === "online" ? "online" : "offline"
2305
+ });
2306
+ } else {
2307
+ statuses.push({
2308
+ busy: false,
2309
+ labels: [],
2310
+ name: runnerName,
2311
+ os: "unknown",
2312
+ status: "offline"
2313
+ });
2314
+ }
2315
+ }
2316
+ return statuses;
2317
+ }
2318
+ function displayRunnerStatus(statuses) {
2319
+ if (statuses.length === 0) {
2320
+ M2.info("No runners found");
2321
+ return;
2322
+ }
2323
+ console.log(`
2324
+ ${colors.bold("Runner Status:")}`);
2325
+ console.log("\u2500".repeat(80));
2326
+ const statusColors = { busy: colors.yellow, offline: colors.red, online: colors.green };
2327
+ for (const runner of statuses) {
2328
+ const statusColor = statusColors[runner.status];
2329
+ const statusText = runner.status.toUpperCase().padEnd(7);
2330
+ console.log(`${statusColor("\u25CF")} ${statusColor(statusText)} ${colors.cyan(runner.name.padEnd(20))} ` + `${colors.dim(`OS: ${runner.os.padEnd(10)}`)} ` + `${runner.labels.length > 0 ? colors.dim(`Labels: ${runner.labels.join(", ")}`) : ""}`);
2331
+ }
2332
+ console.log("\u2500".repeat(80));
2333
+ const summary = {
2334
+ busy: statuses.filter((r2) => r2.status === "busy").length,
2335
+ offline: statuses.filter((r2) => r2.status === "offline").length,
2336
+ online: statuses.filter((r2) => r2.status === "online").length,
2337
+ total: statuses.length
2338
+ };
2339
+ console.log(`
2340
+ ${colors.bold("Summary:")} ` + `Total: ${summary.total} | ` + `${colors.green(`Online: ${summary.online}`)} | ` + `${colors.yellow(`Busy: ${summary.busy}`)} | ` + `${colors.red(`Offline: ${summary.offline}`)}
2341
+ `);
2342
+ }
2343
+
2344
+ // src/cli.ts
2345
+ var COMMANDS = ["init", "create", "run", "remove", "status", "help"];
2346
+ var COMMON_MISTAKES = {
2347
+ c: "create",
2348
+ ceate: "create",
2349
+ craete: "create",
2350
+ cretae: "create",
2351
+ del: "remove",
2352
+ delete: "remove",
2353
+ h: "help",
2354
+ i: "init",
2355
+ info: "status",
2356
+ initialise: "init",
2357
+ inti: "init",
2358
+ intialize: "init",
2359
+ list: "status",
2360
+ ls: "status",
2361
+ new: "create",
2362
+ r: "run",
2363
+ remvoe: "remove",
2364
+ rm: "remove",
2365
+ rmove: "remove",
2366
+ rnu: "run",
2367
+ runn: "run",
2368
+ s: "status",
2369
+ start: "run",
2370
+ stat: "status",
2371
+ stop: "remove",
2372
+ sttaus: "status",
2373
+ t: "troubleshoot"
2374
+ };
2375
+ async function main() {
2376
+ try {
2377
+ const [, , commandName, ...args] = process.argv;
2378
+ if (!commandName || commandName === "--help" || commandName === "-h") {
2379
+ help();
2380
+ process.exit(0);
2381
+ }
2382
+ let actualCommand = commandName;
2383
+ if (!COMMANDS.includes(commandName)) {
2384
+ const corrected = checkCommonMistakes(commandName, COMMON_MISTAKES);
2385
+ if (corrected && COMMANDS.includes(corrected)) {
2386
+ actualCommand = corrected;
2387
+ console.log(colors.yellow(`Assuming you meant '${corrected}'
2388
+ `));
2389
+ }
2390
+ }
2391
+ if (!COMMANDS.includes(actualCommand)) {
2392
+ console.error(colors.red(`Unknown command: ${commandName}`));
2393
+ const suggestions = getSuggestions(commandName, COMMANDS);
2394
+ if (suggestions.length > 0) {
2395
+ console.error(`
2396
+ Did you mean one of these?`);
2397
+ for (const suggestion of suggestions) {
2398
+ console.error(` ${colors.cyan(suggestion)}`);
2399
+ }
2400
+ console.error();
2401
+ }
2402
+ help();
2403
+ process.exit(1);
2404
+ }
2405
+ if (args.includes("--help") || args.includes("-h")) {
2406
+ help(actualCommand);
2407
+ process.exit(0);
2408
+ }
2409
+ switch (actualCommand) {
2410
+ case "init":
2411
+ await init();
2412
+ break;
2413
+ case "create":
2414
+ await createMachines();
2415
+ break;
2416
+ case "run":
2417
+ await runMachines();
2418
+ break;
2419
+ case "remove":
2420
+ await removeMachines();
2421
+ break;
2422
+ case "status":
2423
+ await status();
2424
+ break;
2425
+ case "help": {
2426
+ const targetCommand = args[0];
2427
+ help(targetCommand);
2428
+ break;
2429
+ }
2430
+ default:
2431
+ throw new Error(`Unknown command: ${actualCommand}`);
2432
+ }
2433
+ process.exit(0);
2434
+ } catch (error2) {
2435
+ const errorObj = error2 instanceof Error ? error2 : new Error(String(error2));
2436
+ M2.error(errorObj.message);
2437
+ process.exit(1);
2438
+ }
2439
+ }
2440
+ await main();
2441
+
2442
+ //# debugId=172319766803FBE064756E2164756E21
2443
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Npc3RlcmFuc2kvc3JjL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvY29sb3JzL3BpY29jb2xvcnMuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BjbGFjay9jb3JlL2Rpc3QvaW5kZXgubWpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AY2xhY2svcHJvbXB0cy9kaXN0L2luZGV4Lm1qcyIsICIuLi8uLi8uLi90b29scy91dGlscy9jb2xvcnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3Rlc3QtbGV2ZW5zaHRlaW4vZXNtL21vZC5qcyIsICIuLi8uLi9jb3JlL3NyYy9mdXp6eS1tYXRjaC50cyIsICIuLi8uLi9jb3JlL3NyYy9ncmFjZWZ1bC50cyIsICIuLi8uLi8uLi90b29scy91dGlscy9sb2dnZXIudHMiLCAiLi4vLi4vY29yZS9zcmMvcmV0cnkudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhbmRpdHlwZXMvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9jb3JlL3NyYy92YWxpZGF0b3IudHMiLCAiLi4vc3JjL21ldGhvZHMvY3JlYXRlTWFjaGluZXMudHMiLCAiLi4vc3JjL2NvbmZpZy50cyIsICIuLi9zcmMvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy90eXBlcy50cyIsICIuLi9zcmMvaGVscGVycy50cyIsICIuLi9zcmMvbGliL3dvcmtlci1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9tZXRob2RzL2hlbHAudHMiLCAiLi4vc3JjL21ldGhvZHMvaW5pdC50cyIsICIuLi9zcmMvbWV0aG9kcy9yZW1vdmVNYWNoaW5lcy50cyIsICIuLi9zcmMvbWV0aG9kcy9ydW5NYWNoaW5lcy50cyIsICIuLi9zcmMvbWV0aG9kcy9zdGF0dXMudHMiLCAiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEVTQyA9ICdcXHgxQic7XG5jb25zdCBDU0kgPSBgJHtFU0N9W2A7XG5jb25zdCBiZWVwID0gJ1xcdTAwMDcnO1xuXG5jb25zdCBjdXJzb3IgPSB7XG4gIHRvKHgsIHkpIHtcbiAgICBpZiAoIXkpIHJldHVybiBgJHtDU0l9JHt4ICsgMX1HYDtcbiAgICByZXR1cm4gYCR7Q1NJfSR7eSArIDF9OyR7eCArIDF9SGA7XG4gIH0sXG4gIG1vdmUoeCwgeSkge1xuICAgIGxldCByZXQgPSAnJztcblxuICAgIGlmICh4IDwgMCkgcmV0ICs9IGAke0NTSX0key14fURgO1xuICAgIGVsc2UgaWYgKHggPiAwKSByZXQgKz0gYCR7Q1NJfSR7eH1DYDtcblxuICAgIGlmICh5IDwgMCkgcmV0ICs9IGAke0NTSX0key15fUFgO1xuICAgIGVsc2UgaWYgKHkgPiAwKSByZXQgKz0gYCR7Q1NJfSR7eX1CYDtcblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIHVwOiAoY291bnQgPSAxKSA9PiBgJHtDU0l9JHtjb3VudH1BYCxcbiAgZG93bjogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfSR7Y291bnR9QmAsXG4gIGZvcndhcmQ6IChjb3VudCA9IDEpID0+IGAke0NTSX0ke2NvdW50fUNgLFxuICBiYWNrd2FyZDogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfSR7Y291bnR9RGAsXG4gIG5leHRMaW5lOiAoY291bnQgPSAxKSA9PiBgJHtDU0l9RWAucmVwZWF0KGNvdW50KSxcbiAgcHJldkxpbmU6IChjb3VudCA9IDEpID0+IGAke0NTSX1GYC5yZXBlYXQoY291bnQpLFxuICBsZWZ0OiBgJHtDU0l9R2AsXG4gIGhpZGU6IGAke0NTSX0/MjVsYCxcbiAgc2hvdzogYCR7Q1NJfT8yNWhgLFxuICBzYXZlOiBgJHtFU0N9N2AsXG4gIHJlc3RvcmU6IGAke0VTQ304YFxufVxuXG5jb25zdCBzY3JvbGwgPSB7XG4gIHVwOiAoY291bnQgPSAxKSA9PiBgJHtDU0l9U2AucmVwZWF0KGNvdW50KSxcbiAgZG93bjogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfVRgLnJlcGVhdChjb3VudClcbn1cblxuY29uc3QgZXJhc2UgPSB7XG4gIHNjcmVlbjogYCR7Q1NJfTJKYCxcbiAgdXA6IChjb3VudCA9IDEpID0+IGAke0NTSX0xSmAucmVwZWF0KGNvdW50KSxcbiAgZG93bjogKGNvdW50ID0gMSkgPT4gYCR7Q1NJfUpgLnJlcGVhdChjb3VudCksXG4gIGxpbmU6IGAke0NTSX0yS2AsXG4gIGxpbmVFbmQ6IGAke0NTSX1LYCxcbiAgbGluZVN0YXJ0OiBgJHtDU0l9MUtgLFxuICBsaW5lcyhjb3VudCkge1xuICAgIGxldCBjbGVhciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKylcbiAgICAgIGNsZWFyICs9IHRoaXMubGluZSArIChpIDwgY291bnQgLSAxID8gY3Vyc29yLnVwKCkgOiAnJyk7XG4gICAgaWYgKGNvdW50KVxuICAgICAgY2xlYXIgKz0gY3Vyc29yLmxlZnQ7XG4gICAgcmV0dXJuIGNsZWFyO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBjdXJzb3IsIHNjcm9sbCwgZXJhc2UsIGJlZXAgfTtcbiIsCiAgICAibGV0IHAgPSBwcm9jZXNzIHx8IHt9LCBhcmd2ID0gcC5hcmd2IHx8IFtdLCBlbnYgPSBwLmVudiB8fCB7fVxubGV0IGlzQ29sb3JTdXBwb3J0ZWQgPVxuXHQhKCEhZW52Lk5PX0NPTE9SIHx8IGFyZ3YuaW5jbHVkZXMoXCItLW5vLWNvbG9yXCIpKSAmJlxuXHQoISFlbnYuRk9SQ0VfQ09MT1IgfHwgYXJndi5pbmNsdWRlcyhcIi0tY29sb3JcIikgfHwgcC5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiIHx8ICgocC5zdGRvdXQgfHwge30pLmlzVFRZICYmIGVudi5URVJNICE9PSBcImR1bWJcIikgfHwgISFlbnYuQ0kpXG5cbmxldCBmb3JtYXR0ZXIgPSAob3BlbiwgY2xvc2UsIHJlcGxhY2UgPSBvcGVuKSA9PlxuXHRpbnB1dCA9PiB7XG5cdFx0bGV0IHN0cmluZyA9IFwiXCIgKyBpbnB1dCwgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjbG9zZSwgb3Blbi5sZW5ndGgpXG5cdFx0cmV0dXJuIH5pbmRleCA/IG9wZW4gKyByZXBsYWNlQ2xvc2Uoc3RyaW5nLCBjbG9zZSwgcmVwbGFjZSwgaW5kZXgpICsgY2xvc2UgOiBvcGVuICsgc3RyaW5nICsgY2xvc2Vcblx0fVxuXG5sZXQgcmVwbGFjZUNsb3NlID0gKHN0cmluZywgY2xvc2UsIHJlcGxhY2UsIGluZGV4KSA9PiB7XG5cdGxldCByZXN1bHQgPSBcIlwiLCBjdXJzb3IgPSAwXG5cdGRvIHtcblx0XHRyZXN1bHQgKz0gc3RyaW5nLnN1YnN0cmluZyhjdXJzb3IsIGluZGV4KSArIHJlcGxhY2Vcblx0XHRjdXJzb3IgPSBpbmRleCArIGNsb3NlLmxlbmd0aFxuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoY2xvc2UsIGN1cnNvcilcblx0fSB3aGlsZSAofmluZGV4KVxuXHRyZXR1cm4gcmVzdWx0ICsgc3RyaW5nLnN1YnN0cmluZyhjdXJzb3IpXG59XG5cbmxldCBjcmVhdGVDb2xvcnMgPSAoZW5hYmxlZCA9IGlzQ29sb3JTdXBwb3J0ZWQpID0+IHtcblx0bGV0IGYgPSBlbmFibGVkID8gZm9ybWF0dGVyIDogKCkgPT4gU3RyaW5nXG5cdHJldHVybiB7XG5cdFx0aXNDb2xvclN1cHBvcnRlZDogZW5hYmxlZCxcblx0XHRyZXNldDogZihcIlxceDFiWzBtXCIsIFwiXFx4MWJbMG1cIiksXG5cdFx0Ym9sZDogZihcIlxceDFiWzFtXCIsIFwiXFx4MWJbMjJtXCIsIFwiXFx4MWJbMjJtXFx4MWJbMW1cIiksXG5cdFx0ZGltOiBmKFwiXFx4MWJbMm1cIiwgXCJcXHgxYlsyMm1cIiwgXCJcXHgxYlsyMm1cXHgxYlsybVwiKSxcblx0XHRpdGFsaWM6IGYoXCJcXHgxYlszbVwiLCBcIlxceDFiWzIzbVwiKSxcblx0XHR1bmRlcmxpbmU6IGYoXCJcXHgxYls0bVwiLCBcIlxceDFiWzI0bVwiKSxcblx0XHRpbnZlcnNlOiBmKFwiXFx4MWJbN21cIiwgXCJcXHgxYlsyN21cIiksXG5cdFx0aGlkZGVuOiBmKFwiXFx4MWJbOG1cIiwgXCJcXHgxYlsyOG1cIiksXG5cdFx0c3RyaWtldGhyb3VnaDogZihcIlxceDFiWzltXCIsIFwiXFx4MWJbMjltXCIpLFxuXG5cdFx0YmxhY2s6IGYoXCJcXHgxYlszMG1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0cmVkOiBmKFwiXFx4MWJbMzFtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdGdyZWVuOiBmKFwiXFx4MWJbMzJtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdHllbGxvdzogZihcIlxceDFiWzMzbVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRibHVlOiBmKFwiXFx4MWJbMzRtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdG1hZ2VudGE6IGYoXCJcXHgxYlszNW1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0Y3lhbjogZihcIlxceDFiWzM2bVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHR3aGl0ZTogZihcIlxceDFiWzM3bVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRncmF5OiBmKFwiXFx4MWJbOTBtXCIsIFwiXFx4MWJbMzltXCIpLFxuXG5cdFx0YmdCbGFjazogZihcIlxceDFiWzQwbVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ1JlZDogZihcIlxceDFiWzQxbVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ0dyZWVuOiBmKFwiXFx4MWJbNDJtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnWWVsbG93OiBmKFwiXFx4MWJbNDNtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnQmx1ZTogZihcIlxceDFiWzQ0bVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ01hZ2VudGE6IGYoXCJcXHgxYls0NW1cIiwgXCJcXHgxYls0OW1cIiksXG5cdFx0YmdDeWFuOiBmKFwiXFx4MWJbNDZtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnV2hpdGU6IGYoXCJcXHgxYls0N21cIiwgXCJcXHgxYls0OW1cIiksXG5cblx0XHRibGFja0JyaWdodDogZihcIlxceDFiWzkwbVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRyZWRCcmlnaHQ6IGYoXCJcXHgxYls5MW1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0Z3JlZW5CcmlnaHQ6IGYoXCJcXHgxYls5Mm1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0eWVsbG93QnJpZ2h0OiBmKFwiXFx4MWJbOTNtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdGJsdWVCcmlnaHQ6IGYoXCJcXHgxYls5NG1cIiwgXCJcXHgxYlszOW1cIiksXG5cdFx0bWFnZW50YUJyaWdodDogZihcIlxceDFiWzk1bVwiLCBcIlxceDFiWzM5bVwiKSxcblx0XHRjeWFuQnJpZ2h0OiBmKFwiXFx4MWJbOTZtXCIsIFwiXFx4MWJbMzltXCIpLFxuXHRcdHdoaXRlQnJpZ2h0OiBmKFwiXFx4MWJbOTdtXCIsIFwiXFx4MWJbMzltXCIpLFxuXG5cdFx0YmdCbGFja0JyaWdodDogZihcIlxceDFiWzEwMG1cIiwgXCJcXHgxYls0OW1cIiksXG5cdFx0YmdSZWRCcmlnaHQ6IGYoXCJcXHgxYlsxMDFtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnR3JlZW5CcmlnaHQ6IGYoXCJcXHgxYlsxMDJtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnWWVsbG93QnJpZ2h0OiBmKFwiXFx4MWJbMTAzbVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ0JsdWVCcmlnaHQ6IGYoXCJcXHgxYlsxMDRtXCIsIFwiXFx4MWJbNDltXCIpLFxuXHRcdGJnTWFnZW50YUJyaWdodDogZihcIlxceDFiWzEwNW1cIiwgXCJcXHgxYls0OW1cIiksXG5cdFx0YmdDeWFuQnJpZ2h0OiBmKFwiXFx4MWJbMTA2bVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0XHRiZ1doaXRlQnJpZ2h0OiBmKFwiXFx4MWJbMTA3bVwiLCBcIlxceDFiWzQ5bVwiKSxcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbG9ycygpXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVDb2xvcnMgPSBjcmVhdGVDb2xvcnNcbiIsCiAgICAiaW1wb3J0e2N1cnNvciBhcyBsLGVyYXNlIGFzIGJ9ZnJvbVwic2lzdGVyYW5zaVwiO2ltcG9ydHtzdGRpbiBhcyBqLHN0ZG91dCBhcyBNfWZyb21cIm5vZGU6cHJvY2Vzc1wiO2ltcG9ydCphcyBnIGZyb21cIm5vZGU6cmVhZGxpbmVcIjtpbXBvcnQgTyBmcm9tXCJub2RlOnJlYWRsaW5lXCI7aW1wb3J0e1dyaXRhYmxlIGFzIFh9ZnJvbVwibm9kZTpzdHJlYW1cIjtpbXBvcnQgdiBmcm9tXCJwaWNvY29sb3JzXCI7ZnVuY3Rpb24gREQoe29ubHlGaXJzdDplPSExfT17fSl7Y29uc3QgdD1bXCJbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT8oPzpcXFxcdTAwMDd8XFxcXHUwMDFCXFxcXHUwMDVDfFxcXFx1MDA5QykpXCIsXCIoPzooPzpcXFxcZHsxLDR9KD86O1xcXFxkezAsNH0pKik/W1xcXFxkQS1QUi1UWmNmLW5xLXV5PT48fl0pKVwiXS5qb2luKFwifFwiKTtyZXR1cm4gbmV3IFJlZ0V4cCh0LGU/dm9pZCAwOlwiZ1wiKX1jb25zdCB1RD1ERCgpO2Z1bmN0aW9uIFAoZSl7aWYodHlwZW9mIGUhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBcXGBzdHJpbmdcXGAsIGdvdCBcXGAke3R5cGVvZiBlfVxcYGApO3JldHVybiBlLnJlcGxhY2UodUQsXCJcIil9ZnVuY3Rpb24gTChlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxcImRlZmF1bHRcIik/ZS5kZWZhdWx0OmV9dmFyIFc9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlKXt2YXIgdT17fTtlLmV4cG9ydHM9dSx1LmVhc3RBc2lhbldpZHRoPWZ1bmN0aW9uKEYpe3ZhciBzPUYuY2hhckNvZGVBdCgwKSxpPUYubGVuZ3RoPT0yP0YuY2hhckNvZGVBdCgxKTowLEQ9cztyZXR1cm4gNTUyOTY8PXMmJnM8PTU2MzE5JiY1NjMyMDw9aSYmaTw9NTczNDMmJihzJj0xMDIzLGkmPTEwMjMsRD1zPDwxMHxpLEQrPTY1NTM2KSxEPT0xMjI4OHx8NjUyODE8PUQmJkQ8PTY1Mzc2fHw2NTUwNDw9RCYmRDw9NjU1MTA/XCJGXCI6RD09ODM2MXx8NjUzNzc8PUQmJkQ8PTY1NDcwfHw2NTQ3NDw9RCYmRDw9NjU0Nzl8fDY1NDgyPD1EJiZEPD02NTQ4N3x8NjU0OTA8PUQmJkQ8PTY1NDk1fHw2NTQ5ODw9RCYmRDw9NjU1MDB8fDY1NTEyPD1EJiZEPD02NTUxOD9cIkhcIjo0MzUyPD1EJiZEPD00NDQ3fHw0NTE1PD1EJiZEPD00NTE5fHw0NjAyPD1EJiZEPD00NjA3fHw5MDAxPD1EJiZEPD05MDAyfHwxMTkwNDw9RCYmRDw9MTE5Mjl8fDExOTMxPD1EJiZEPD0xMjAxOXx8MTIwMzI8PUQmJkQ8PTEyMjQ1fHwxMjI3Mjw9RCYmRDw9MTIyODN8fDEyMjg5PD1EJiZEPD0xMjM1MHx8MTIzNTM8PUQmJkQ8PTEyNDM4fHwxMjQ0MTw9RCYmRDw9MTI1NDN8fDEyNTQ5PD1EJiZEPD0xMjU4OXx8MTI1OTM8PUQmJkQ8PTEyNjg2fHwxMjY4ODw9RCYmRDw9MTI3MzB8fDEyNzM2PD1EJiZEPD0xMjc3MXx8MTI3ODQ8PUQmJkQ8PTEyODMwfHwxMjgzMjw9RCYmRDw9MTI4NzF8fDEyODgwPD1EJiZEPD0xMzA1NHx8MTMwNTY8PUQmJkQ8PTE5OTAzfHwxOTk2ODw9RCYmRDw9NDIxMjR8fDQyMTI4PD1EJiZEPD00MjE4Mnx8NDMzNjA8PUQmJkQ8PTQzMzg4fHw0NDAzMjw9RCYmRDw9NTUyMDN8fDU1MjE2PD1EJiZEPD01NTIzOHx8NTUyNDM8PUQmJkQ8PTU1MjkxfHw2Mzc0NDw9RCYmRDw9NjQyNTV8fDY1MDQwPD1EJiZEPD02NTA0OXx8NjUwNzI8PUQmJkQ8PTY1MTA2fHw2NTEwODw9RCYmRDw9NjUxMjZ8fDY1MTI4PD1EJiZEPD02NTEzMXx8MTEwNTkyPD1EJiZEPD0xMTA1OTN8fDEyNzQ4ODw9RCYmRDw9MTI3NDkwfHwxMjc1MDQ8PUQmJkQ8PTEyNzU0Nnx8MTI3NTUyPD1EJiZEPD0xMjc1NjB8fDEyNzU2ODw9RCYmRDw9MTI3NTY5fHwxMzEwNzI8PUQmJkQ8PTE5NDM2N3x8MTc3OTg0PD1EJiZEPD0xOTY2MDV8fDE5NjYwODw9RCYmRDw9MjYyMTQxP1wiV1wiOjMyPD1EJiZEPD0xMjZ8fDE2Mjw9RCYmRDw9MTYzfHwxNjU8PUQmJkQ8PTE2Nnx8RD09MTcyfHxEPT0xNzV8fDEwMjE0PD1EJiZEPD0xMDIyMXx8MTA2Mjk8PUQmJkQ8PTEwNjMwP1wiTmFcIjpEPT0xNjF8fEQ9PTE2NHx8MTY3PD1EJiZEPD0xNjh8fEQ9PTE3MHx8MTczPD1EJiZEPD0xNzR8fDE3Njw9RCYmRDw9MTgwfHwxODI8PUQmJkQ8PTE4Nnx8MTg4PD1EJiZEPD0xOTF8fEQ9PTE5OHx8RD09MjA4fHwyMTU8PUQmJkQ8PTIxNnx8MjIyPD1EJiZEPD0yMjV8fEQ9PTIzMHx8MjMyPD1EJiZEPD0yMzR8fDIzNjw9RCYmRDw9MjM3fHxEPT0yNDB8fDI0Mjw9RCYmRDw9MjQzfHwyNDc8PUQmJkQ8PTI1MHx8RD09MjUyfHxEPT0yNTR8fEQ9PTI1N3x8RD09MjczfHxEPT0yNzV8fEQ9PTI4M3x8Mjk0PD1EJiZEPD0yOTV8fEQ9PTI5OXx8MzA1PD1EJiZEPD0zMDd8fEQ9PTMxMnx8MzE5PD1EJiZEPD0zMjJ8fEQ9PTMyNHx8MzI4PD1EJiZEPD0zMzF8fEQ9PTMzM3x8MzM4PD1EJiZEPD0zMzl8fDM1ODw9RCYmRDw9MzU5fHxEPT0zNjN8fEQ9PTQ2Mnx8RD09NDY0fHxEPT00NjZ8fEQ9PTQ2OHx8RD09NDcwfHxEPT00NzJ8fEQ9PTQ3NHx8RD09NDc2fHxEPT01OTN8fEQ9PTYwOXx8RD09NzA4fHxEPT03MTF8fDcxMzw9RCYmRDw9NzE1fHxEPT03MTd8fEQ9PTcyMHx8NzI4PD1EJiZEPD03MzF8fEQ9PTczM3x8RD09NzM1fHw3Njg8PUQmJkQ8PTg3OXx8OTEzPD1EJiZEPD05Mjl8fDkzMTw9RCYmRDw9OTM3fHw5NDU8PUQmJkQ8PTk2MXx8OTYzPD1EJiZEPD05Njl8fEQ9PTEwMjV8fDEwNDA8PUQmJkQ8PTExMDN8fEQ9PTExMDV8fEQ9PTgyMDh8fDgyMTE8PUQmJkQ8PTgyMTR8fDgyMTY8PUQmJkQ8PTgyMTd8fDgyMjA8PUQmJkQ8PTgyMjF8fDgyMjQ8PUQmJkQ8PTgyMjZ8fDgyMjg8PUQmJkQ8PTgyMzF8fEQ9PTgyNDB8fDgyNDI8PUQmJkQ8PTgyNDN8fEQ9PTgyNDV8fEQ9PTgyNTF8fEQ9PTgyNTR8fEQ9PTgzMDh8fEQ9PTgzMTl8fDgzMjE8PUQmJkQ8PTgzMjR8fEQ9PTgzNjR8fEQ9PTg0NTF8fEQ9PTg0NTN8fEQ9PTg0NTd8fEQ9PTg0Njd8fEQ9PTg0NzB8fDg0ODE8PUQmJkQ8PTg0ODJ8fEQ9PTg0ODZ8fEQ9PTg0OTF8fDg1MzE8PUQmJkQ8PTg1MzJ8fDg1Mzk8PUQmJkQ8PTg1NDJ8fDg1NDQ8PUQmJkQ8PTg1NTV8fDg1NjA8PUQmJkQ8PTg1Njl8fEQ9PTg1ODV8fDg1OTI8PUQmJkQ8PTg2MDF8fDg2MzI8PUQmJkQ8PTg2MzN8fEQ9PTg2NTh8fEQ9PTg2NjB8fEQ9PTg2Nzl8fEQ9PTg3MDR8fDg3MDY8PUQmJkQ8PTg3MDd8fDg3MTE8PUQmJkQ8PTg3MTJ8fEQ9PTg3MTV8fEQ9PTg3MTl8fEQ9PTg3MjF8fEQ9PTg3MjV8fEQ9PTg3MzB8fDg3MzM8PUQmJkQ8PTg3MzZ8fEQ9PTg3Mzl8fEQ9PTg3NDF8fDg3NDM8PUQmJkQ8PTg3NDh8fEQ9PTg3NTB8fDg3NTY8PUQmJkQ8PTg3NTl8fDg3NjQ8PUQmJkQ8PTg3NjV8fEQ9PTg3NzZ8fEQ9PTg3ODB8fEQ9PTg3ODZ8fDg4MDA8PUQmJkQ8PTg4MDF8fDg4MDQ8PUQmJkQ8PTg4MDd8fDg4MTA8PUQmJkQ8PTg4MTF8fDg4MTQ8PUQmJkQ8PTg4MTV8fDg4MzQ8PUQmJkQ8PTg4MzV8fDg4Mzg8PUQmJkQ8PTg4Mzl8fEQ9PTg4NTN8fEQ9PTg4NTd8fEQ9PTg4Njl8fEQ9PTg4OTV8fEQ9PTg5Nzh8fDkzMTI8PUQmJkQ8PTk0NDl8fDk0NTE8PUQmJkQ8PTk1NDd8fDk1NTI8PUQmJkQ8PTk1ODd8fDk2MDA8PUQmJkQ8PTk2MTV8fDk2MTg8PUQmJkQ8PTk2MjF8fDk2MzI8PUQmJkQ8PTk2MzN8fDk2MzU8PUQmJkQ8PTk2NDF8fDk2NTA8PUQmJkQ8PTk2NTF8fDk2NTQ8PUQmJkQ8PTk2NTV8fDk2NjA8PUQmJkQ8PTk2NjF8fDk2NjQ8PUQmJkQ8PTk2NjV8fDk2NzA8PUQmJkQ8PTk2NzJ8fEQ9PTk2NzV8fDk2Nzg8PUQmJkQ8PTk2ODF8fDk2OTg8PUQmJkQ8PTk3MDF8fEQ9PTk3MTF8fDk3MzM8PUQmJkQ8PTk3MzR8fEQ9PTk3Mzd8fDk3NDI8PUQmJkQ8PTk3NDN8fDk3NDg8PUQmJkQ8PTk3NDl8fEQ9PTk3NTZ8fEQ9PTk3NTh8fEQ9PTk3OTJ8fEQ9PTk3OTR8fDk4MjQ8PUQmJkQ8PTk4MjV8fDk4Mjc8PUQmJkQ8PTk4Mjl8fDk4MzE8PUQmJkQ8PTk4MzR8fDk4MzY8PUQmJkQ8PTk4Mzd8fEQ9PTk4Mzl8fDk4ODY8PUQmJkQ8PTk4ODd8fDk5MTg8PUQmJkQ8PTk5MTl8fDk5MjQ8PUQmJkQ8PTk5MzN8fDk5MzU8PUQmJkQ8PTk5NTN8fEQ9PTk5NTV8fDk5NjA8PUQmJkQ8PTk5ODN8fEQ9PTEwMDQ1fHxEPT0xMDA3MXx8MTAxMDI8PUQmJkQ8PTEwMTExfHwxMTA5Mzw9RCYmRDw9MTEwOTd8fDEyODcyPD1EJiZEPD0xMjg3OXx8NTczNDQ8PUQmJkQ8PTYzNzQzfHw2NTAyNDw9RCYmRDw9NjUwMzl8fEQ9PTY1NTMzfHwxMjcyMzI8PUQmJkQ8PTEyNzI0Mnx8MTI3MjQ4PD1EJiZEPD0xMjcyNzd8fDEyNzI4MDw9RCYmRDw9MTI3MzM3fHwxMjczNDQ8PUQmJkQ8PTEyNzM4Nnx8OTE3NzYwPD1EJiZEPD05MTc5OTl8fDk4MzA0MDw9RCYmRDw9MTA0ODU3M3x8MTA0ODU3Njw9RCYmRDw9MTExNDEwOT9cIkFcIjpcIk5cIn0sdS5jaGFyYWN0ZXJMZW5ndGg9ZnVuY3Rpb24oRil7dmFyIHM9dGhpcy5lYXN0QXNpYW5XaWR0aChGKTtyZXR1cm4gcz09XCJGXCJ8fHM9PVwiV1wifHxzPT1cIkFcIj8yOjF9O2Z1bmN0aW9uIHQoRil7cmV0dXJuIEYubWF0Y2goL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W15cXHVEODAwLVxcdURGRkZdL2cpfHxbXX11Lmxlbmd0aD1mdW5jdGlvbihGKXtmb3IodmFyIHM9dChGKSxpPTAsRD0wO0Q8cy5sZW5ndGg7RCsrKWk9aSt0aGlzLmNoYXJhY3Rlckxlbmd0aChzW0RdKTtyZXR1cm4gaX0sdS5zbGljZT1mdW5jdGlvbihGLHMsaSl7dGV4dExlbj11Lmxlbmd0aChGKSxzPXN8fDAsaT1pfHwxLHM8MCYmKHM9dGV4dExlbitzKSxpPDAmJihpPXRleHRMZW4raSk7Zm9yKHZhciBEPVwiXCIsQz0wLG49dChGKSxFPTA7RTxuLmxlbmd0aDtFKyspe3ZhciBhPW5bRV0sbz11Lmxlbmd0aChhKTtpZihDPj1zLShvPT0yPzE6MCkpaWYoQytvPD1pKUQrPWE7ZWxzZSBicmVhaztDKz1vfXJldHVybiBEfX0pKFcpO3ZhciB0RD1XLmV4cG9ydHM7Y29uc3QgZUQ9TCh0RCk7dmFyIEZEPWZ1bmN0aW9uKCl7cmV0dXJuL1xcdUQ4M0NcXHVERkY0XFx1REI0MFxcdURDNjdcXHVEQjQwXFx1REM2Mig/OlxcdURCNDBcXHVEQzc3XFx1REI0MFxcdURDNkNcXHVEQjQwXFx1REM3M3xcXHVEQjQwXFx1REM3M1xcdURCNDBcXHVEQzYzXFx1REI0MFxcdURDNzR8XFx1REI0MFxcdURDNjVcXHVEQjQwXFx1REM2RVxcdURCNDBcXHVEQzY3KVxcdURCNDBcXHVEQzdGfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkZcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZGXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRV0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZFXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRFxcdURGRkZdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRFxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGQ1xcdURGRkVcXHVERkZGXSl8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGQ1xcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkNcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkQtXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZCXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1xcdURGRkIoPzpcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKSl8XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdXFx1RkUwRnxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKT98KD86XFx1RDgzQ1tcXHVERkZDLVxcdURGRkZdKVxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pKXxcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNEXFx1REM2OHwoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSlcXHUyMDBEKD86XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pKXxcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRlxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRVxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZEXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXFx1REZGRVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCXFx1REZGRC1cXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXwoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pXFx1RkUwRnxcXHUyMDBEKD86KD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXxcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1xcdURGRkZ8XFx1RDgzQ1xcdURGRkV8XFx1RDgzQ1xcdURGRkR8XFx1RDgzQ1xcdURGRkMpP3woPzpcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZCXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8KD86XFx1RDgzQ1tcXHVERkZDLVxcdURGRkZdKVxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKXxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSlcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDEpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfFxcdUQ4M0RcXHVEQzY5KD86XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRlxcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGQ1xcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSkpfFxcdUQ4M0VcXHVEREQxKD86XFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZEXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY4NFxcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfCg/OlxcdUQ4M0RcXHVEQzQxXFx1RkUwRlxcdTIwMERcXHVEODNEXFx1RERFOHxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZFXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZEXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZDXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZCXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSl8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pfFxcdUQ4M0RcXHVERTM2XFx1MjAwRFxcdUQ4M0NcXHVERjJCfFxcdUQ4M0NcXHVERkYzXFx1RkUwRlxcdTIwMERcXHUyNkE3fFxcdUQ4M0RcXHVEQzNCXFx1MjAwRFxcdTI3NDR8KD86KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzBcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNVxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ0XFx1RERENi1cXHVEREREXSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzZGfFxcdUQ4M0VbXFx1REQzQ1xcdUREREVcXHVERERGXSlcXHUyMDBEW1xcdTI2NDBcXHUyNjQyXXwoPzpcXHUyNkY5fFxcdUQ4M0NbXFx1REZDQlxcdURGQ0NdfFxcdUQ4M0RcXHVERDc1KSg/OlxcdUZFMEZ8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfFxcdUQ4M0NcXHVERkY0XFx1MjAwRFxcdTI2MjB8KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzBcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNVxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ0XFx1RERENi1cXHVEREREXSlcXHUyMDBEW1xcdTI2NDBcXHUyNjQyXXxbXFx4QTlcXHhBRVxcdTIwM0NcXHUyMDQ5XFx1MjEyMlxcdTIxMzlcXHUyMTk0LVxcdTIxOTlcXHUyMUE5XFx1MjFBQVxcdTIzMjhcXHUyM0NGXFx1MjNFRC1cXHUyM0VGXFx1MjNGMVxcdTIzRjJcXHUyM0Y4LVxcdTIzRkFcXHUyNEMyXFx1MjVBQVxcdTI1QUJcXHUyNUI2XFx1MjVDMFxcdTI1RkJcXHUyNUZDXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE4XFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjkyXFx1MjY5NC1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTdcXHUyNkIwXFx1MjZCMVxcdTI2QzhcXHUyNkNGXFx1MjZEMVxcdTI2RDNcXHUyNkU5XFx1MjZGMFxcdTI2RjFcXHUyNkY0XFx1MjZGN1xcdTI2RjhcXHUyNzAyXFx1MjcwOFxcdTI3MDlcXHUyNzBGXFx1MjcxMlxcdTI3MTRcXHUyNzE2XFx1MjcxRFxcdTI3MjFcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc2M1xcdTI3QTFcXHUyOTM0XFx1MjkzNVxcdTJCMDUtXFx1MkIwN1xcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REQ3MFxcdURENzFcXHVERDdFXFx1REQ3RlxcdURFMDJcXHVERTM3XFx1REYyMVxcdURGMjQtXFx1REYyQ1xcdURGMzZcXHVERjdEXFx1REY5NlxcdURGOTdcXHVERjk5LVxcdURGOUJcXHVERjlFXFx1REY5RlxcdURGQ0RcXHVERkNFXFx1REZENC1cXHVERkRGXFx1REZGNVxcdURGRjddfFxcdUQ4M0RbXFx1REMzRlxcdURDRkRcXHVERDQ5XFx1REQ0QVxcdURENkZcXHVERDcwXFx1REQ3M1xcdURENzYtXFx1REQ3OVxcdUREODdcXHVERDhBLVxcdUREOERcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQVxcdURFQ0JcXHVERUNELVxcdURFQ0ZcXHVERUUwLVxcdURFRTVcXHVERUU5XFx1REVGMFxcdURFRjNdKVxcdUZFMEZ8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdUQ4M0NcXHVERjA4fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY3fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVERTM1XFx1MjAwRFxcdUQ4M0RcXHVEQ0FCfFxcdUQ4M0RcXHVERTJFXFx1MjAwRFxcdUQ4M0RcXHVEQ0E4fFxcdUQ4M0RcXHVEQzE1XFx1MjAwRFxcdUQ4M0VcXHVEREJBfFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1xcdURGRkZ8XFx1RDgzQ1xcdURGRkV8XFx1RDgzQ1xcdURGRkR8XFx1RDgzQ1xcdURGRkN8XFx1RDgzQ1xcdURGRkIpP3xcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZGfFxcdUQ4M0NcXHVERkZFfFxcdUQ4M0NcXHVERkZEfFxcdUQ4M0NcXHVERkZDfFxcdUQ4M0NcXHVERkZCKT98XFx1RDgzQ1xcdURERkRcXHVEODNDXFx1RERGMHxcXHVEODNDXFx1RERGNlxcdUQ4M0NcXHVEREU2fFxcdUQ4M0NcXHVEREY0XFx1RDgzQ1xcdURERjJ8XFx1RDgzRFxcdURDMDhcXHUyMDBEXFx1MkIxQnxcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REQyNXxcXHVEODNFXFx1REU3OSl8XFx1RDgzRFxcdURDNDFcXHVGRTBGfFxcdUQ4M0NcXHVERkYzXFx1RkUwRnxcXHVEODNDXFx1RERGRig/OlxcdUQ4M0NbXFx1RERFNlxcdURERjJcXHVEREZDXSl8XFx1RDgzQ1xcdURERkUoPzpcXHVEODNDW1xcdURERUFcXHVEREY5XSl8XFx1RDgzQ1xcdURERkMoPzpcXHVEODNDW1xcdURERUJcXHVEREY4XSl8XFx1RDgzQ1xcdURERkIoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVFXFx1RERGM1xcdURERkFdKXxcXHVEODNDXFx1RERGQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERUNcXHVEREYyXFx1RERGM1xcdURERjhcXHVEREZFXFx1RERGRl0pfFxcdUQ4M0NcXHVEREY5KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERTlcXHVEREVCLVxcdURERURcXHVEREVGLVxcdURERjRcXHVEREY3XFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRl0pfFxcdUQ4M0NcXHVEREY4KD86XFx1RDgzQ1tcXHVEREU2LVxcdURERUFcXHVEREVDLVxcdURERjRcXHVEREY3LVxcdURERjlcXHVEREZCXFx1RERGRC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERjcoPzpcXHVEODNDW1xcdURERUFcXHVEREY0XFx1RERGOFxcdURERkFcXHVEREZDXSl8XFx1RDgzQ1xcdURERjUoPzpcXHVEODNDW1xcdURERTZcXHVEREVBLVxcdURERURcXHVEREYwLVxcdURERjNcXHVEREY3LVxcdURERjlcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREYzKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdKXxcXHVEODNDXFx1RERGMig/OlxcdUQ4M0NbXFx1RERFNlxcdURERTgtXFx1RERFRFxcdURERjAtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYxKD86XFx1RDgzQ1tcXHVEREU2LVxcdURERThcXHVEREVFXFx1RERGMFxcdURERjctXFx1RERGQlxcdURERkVdKXxcXHVEODNDXFx1RERGMCg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRig/OlxcdUQ4M0NbXFx1RERFQVxcdURERjJcXHVEREY0XFx1RERGNV0pfFxcdUQ4M0NcXHVEREVFKD86XFx1RDgzQ1tcXHVEREU4LVxcdURERUFcXHVEREYxLVxcdURERjRcXHVEREY2LVxcdURERjldKXxcXHVEODNDXFx1RERFRCg/OlxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXSl8XFx1RDgzQ1xcdURERUMoPzpcXHVEODNDW1xcdURERTZcXHVEREU3XFx1RERFOS1cXHVEREVFXFx1RERGMS1cXHVEREYzXFx1RERGNS1cXHVEREZBXFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERFQig/OlxcdUQ4M0NbXFx1RERFRS1cXHVEREYwXFx1RERGMlxcdURERjRcXHVEREY3XSl8XFx1RDgzQ1xcdURERUEoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVEXFx1RERGNy1cXHVEREZBXSl8XFx1RDgzQ1xcdURERTkoPzpcXHVEODNDW1xcdURERUFcXHVEREVDXFx1RERFRlxcdURERjBcXHVEREYyXFx1RERGNFxcdURERkZdKXxcXHVEODNDXFx1RERFOCg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVFXFx1RERGMC1cXHVEREY1XFx1RERGN1xcdURERkEtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREU3KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFNig/OlxcdUQ4M0NbXFx1RERFOC1cXHVEREVDXFx1RERFRVxcdURERjFcXHVEREYyXFx1RERGNFxcdURERjYtXFx1RERGQVxcdURERkNcXHVEREZEXFx1RERGRl0pfFsjXFwqMC05XVxcdUZFMEZcXHUyMEUzfFxcdTI3NjRcXHVGRTBGfCg/OlxcdUQ4M0NbXFx1REZDM1xcdURGQzRcXHVERkNBXXxcXHVEODNEW1xcdURDNkVcXHVEQzcwXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzVcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENFxcdURERDYtXFx1RERERF0pKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXwoPzpcXHUyNkY5fFxcdUQ4M0NbXFx1REZDQlxcdURGQ0NdfFxcdUQ4M0RcXHVERDc1KSg/OlxcdUZFMEZ8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNDXFx1REZGNHwoPzpbXFx1MjcwQVxcdTI3MEJdfFxcdUQ4M0NbXFx1REY4NVxcdURGQzJcXHVERkM3XXxcXHVEODNEW1xcdURDNDJcXHVEQzQzXFx1REM0Ni1cXHVEQzUwXFx1REM2NlxcdURDNjdcXHVEQzZCLVxcdURDNkRcXHVEQzcyXFx1REM3NC1cXHVEQzc2XFx1REM3OFxcdURDN0NcXHVEQzgzXFx1REM4NVxcdURDOEZcXHVEQzkxXFx1RENBQVxcdUREN0FcXHVERDk1XFx1REQ5NlxcdURFNENcXHVERTRGXFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwQ1xcdUREMEZcXHVERDE4LVxcdUREMUNcXHVERDFFXFx1REQxRlxcdUREMzAtXFx1REQzNFxcdUREMzZcXHVERDc3XFx1RERCNVxcdUREQjZcXHVEREJCXFx1REREMlxcdURERDNcXHVEREQ1XSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyNjFEXFx1MjcwQ1xcdTI3MERdfFxcdUQ4M0RbXFx1REQ3NFxcdUREOTBdKSg/OlxcdUZFMEZ8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxbXFx1MjcwQVxcdTI3MEJdfFxcdUQ4M0NbXFx1REY4NVxcdURGQzJcXHVERkM3XXxcXHVEODNEW1xcdURDMDhcXHVEQzE1XFx1REMzQlxcdURDNDJcXHVEQzQzXFx1REM0Ni1cXHVEQzUwXFx1REM2NlxcdURDNjdcXHVEQzZCLVxcdURDNkRcXHVEQzcyXFx1REM3NC1cXHVEQzc2XFx1REM3OFxcdURDN0NcXHVEQzgzXFx1REM4NVxcdURDOEZcXHVEQzkxXFx1RENBQVxcdUREN0FcXHVERDk1XFx1REQ5NlxcdURFMkVcXHVERTM1XFx1REUzNlxcdURFNENcXHVERTRGXFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwQ1xcdUREMEZcXHVERDE4LVxcdUREMUNcXHVERDFFXFx1REQxRlxcdUREMzAtXFx1REQzNFxcdUREMzZcXHVERDc3XFx1RERCNVxcdUREQjZcXHVEREJCXFx1REREMlxcdURERDNcXHVEREQ1XXxcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MFxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM1XFx1REQzNy1cXHVERDM5XFx1REQzRFxcdUREM0VcXHVEREI4XFx1RERCOVxcdUREQ0QtXFx1RERDRlxcdURERDRcXHVEREQ2LVxcdURERERdfFxcdUQ4M0RcXHVEQzZGfFxcdUQ4M0VbXFx1REQzQ1xcdUREREVcXHVERERGXXxbXFx1MjMxQVxcdTIzMUJcXHUyM0U5LVxcdTIzRUNcXHUyM0YwXFx1MjNGM1xcdTI1RkRcXHUyNUZFXFx1MjYxNFxcdTI2MTVcXHUyNjQ4LVxcdTI2NTNcXHUyNjdGXFx1MjY5M1xcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkNFXFx1MjZENFxcdTI2RUFcXHUyNkYyXFx1MjZGM1xcdTI2RjVcXHUyNkZBXFx1MjZGRFxcdTI3MDVcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjg0XFx1REY4Ni1cXHVERjkzXFx1REZBMC1cXHVERkMxXFx1REZDNVxcdURGQzZcXHVERkM4XFx1REZDOVxcdURGQ0YtXFx1REZEM1xcdURGRTAtXFx1REZGMFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDMDdcXHVEQzA5LVxcdURDMTRcXHVEQzE2LVxcdURDM0FcXHVEQzNDLVxcdURDM0VcXHVEQzQwXFx1REM0NFxcdURDNDVcXHVEQzUxLVxcdURDNjVcXHVEQzZBXFx1REM3OS1cXHVEQzdCXFx1REM3RC1cXHVEQzgwXFx1REM4NFxcdURDODgtXFx1REM4RVxcdURDOTBcXHVEQzkyLVxcdURDQTlcXHVEQ0FCLVxcdURDRkNcXHVEQ0ZGLVxcdUREM0RcXHVERDRCLVxcdURENEVcXHVERDUwLVxcdURENjdcXHVEREE0XFx1RERGQi1cXHVERTJEXFx1REUyRi1cXHVERTM0XFx1REUzNy1cXHVERTQ0XFx1REU0OC1cXHVERTRBXFx1REU4MC1cXHVERUEyXFx1REVBNC1cXHVERUIzXFx1REVCNy1cXHVERUJGXFx1REVDMS1cXHVERUM1XFx1REVEMC1cXHVERUQyXFx1REVENS1cXHVERUQ3XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkNcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRFxcdUREMEVcXHVERDEwLVxcdUREMTdcXHVERDFEXFx1REQyMC1cXHVERDI1XFx1REQyNy1cXHVERDJGXFx1REQzQVxcdUREM0YtXFx1REQ0NVxcdURENDctXFx1REQ3NlxcdURENzhcXHVERDdBLVxcdUREQjRcXHVEREI3XFx1RERCQVxcdUREQkMtXFx1RERDQlxcdURERDBcXHVEREUwLVxcdURERkZcXHVERTcwLVxcdURFNzRcXHVERTc4LVxcdURFN0FcXHVERTgwLVxcdURFODZcXHVERTkwLVxcdURFQThcXHVERUIwLVxcdURFQjZcXHVERUMwLVxcdURFQzJcXHVERUQwLVxcdURFRDZdfCg/OltcXHUyMzFBXFx1MjMxQlxcdTIzRTktXFx1MjNFQ1xcdTIzRjBcXHUyM0YzXFx1MjVGRFxcdTI1RkVcXHUyNjE0XFx1MjYxNVxcdTI2NDgtXFx1MjY1M1xcdTI2N0ZcXHUyNjkzXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2Q0VcXHUyNkQ0XFx1MjZFQVxcdTI2RjJcXHUyNkYzXFx1MjZGNVxcdTI2RkFcXHUyNkZEXFx1MjcwNVxcdTI3MEFcXHUyNzBCXFx1MjcyOFxcdTI3NENcXHUyNzRFXFx1Mjc1My1cXHUyNzU1XFx1Mjc1N1xcdTI3OTUtXFx1Mjc5N1xcdTI3QjBcXHUyN0JGXFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NV18XFx1RDgzQ1tcXHVEQzA0XFx1RENDRlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFMzZcXHVERTM4LVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMFxcdURGMkQtXFx1REYzNVxcdURGMzctXFx1REY3Q1xcdURGN0UtXFx1REY5M1xcdURGQTAtXFx1REZDQVxcdURGQ0YtXFx1REZEM1xcdURGRTAtXFx1REZGMFxcdURGRjRcXHVERkY4LVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVEQzNFXFx1REM0MFxcdURDNDItXFx1RENGQ1xcdURDRkYtXFx1REQzRFxcdURENEItXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdUREN0FcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREZCLVxcdURFNEZcXHVERTgwLVxcdURFQzVcXHVERUNDXFx1REVEMC1cXHVERUQyXFx1REVENS1cXHVERUQ3XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkNcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwQy1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDc4XFx1REQ3QS1cXHVERENCXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTc0XFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTg2XFx1REU5MC1cXHVERUE4XFx1REVCMC1cXHVERUI2XFx1REVDMC1cXHVERUMyXFx1REVEMC1cXHVERUQ2XSl8KD86WyNcXCowLTlcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMxQVxcdTIzMUJcXHUyMzI4XFx1MjNDRlxcdTIzRTktXFx1MjNGM1xcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQi1cXHUyNUZFXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE0XFx1MjYxNVxcdTI2MThcXHUyNjFEXFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY0OC1cXHUyNjUzXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjdGXFx1MjY5Mi1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTFcXHUyNkE3XFx1MjZBQVxcdTI2QUJcXHUyNkIwXFx1MjZCMVxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkM4XFx1MjZDRVxcdTI2Q0ZcXHUyNkQxXFx1MjZEM1xcdTI2RDRcXHUyNkU5XFx1MjZFQVxcdTI2RjAtXFx1MjZGNVxcdTI2RjctXFx1MjZGQVxcdTI2RkRcXHUyNzAyXFx1MjcwNVxcdTI3MDgtXFx1MjcwRFxcdTI3MEZcXHUyNzEyXFx1MjcxNFxcdTI3MTZcXHUyNzFEXFx1MjcyMVxcdTI3MjhcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc2M1xcdTI3NjRcXHUyNzk1LVxcdTI3OTdcXHUyN0ExXFx1MjdCMFxcdTI3QkZcXHUyOTM0XFx1MjkzNVxcdTJCMDUtXFx1MkIwN1xcdTJCMUJcXHUyQjFDXFx1MkI1MFxcdTJCNTVcXHUzMDMwXFx1MzAzRFxcdTMyOTdcXHUzMjk5XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ3MFxcdURENzFcXHVERDdFXFx1REQ3RlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUwMlxcdURFMUFcXHVERTJGXFx1REUzMi1cXHVERTNBXFx1REU1MFxcdURFNTFcXHVERjAwLVxcdURGMjFcXHVERjI0LVxcdURGOTNcXHVERjk2XFx1REY5N1xcdURGOTktXFx1REY5QlxcdURGOUUtXFx1REZGMFxcdURGRjMtXFx1REZGNVxcdURGRjctXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDRkRcXHVEQ0ZGLVxcdUREM0RcXHVERDQ5LVxcdURENEVcXHVERDUwLVxcdURENjdcXHVERDZGXFx1REQ3MFxcdURENzMtXFx1REQ3QVxcdUREODdcXHVERDhBLVxcdUREOERcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVEREE0XFx1RERBNVxcdUREQThcXHVEREIxXFx1RERCMlxcdUREQkNcXHVEREMyLVxcdUREQzRcXHVEREQxLVxcdURERDNcXHVERERDLVxcdUREREVcXHVEREUxXFx1RERFM1xcdURERThcXHVEREVGXFx1RERGM1xcdURERkEtXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0ItXFx1REVEMlxcdURFRDUtXFx1REVEN1xcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUVCXFx1REVFQ1xcdURFRjBcXHVERUYzLVxcdURFRkNcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwQy1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDc4XFx1REQ3QS1cXHVERENCXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTc0XFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTg2XFx1REU5MC1cXHVERUE4XFx1REVCMC1cXHVERUI2XFx1REVDMC1cXHVERUMyXFx1REVEMC1cXHVERUQ2XSlcXHVGRTBGfCg/OltcXHUyNjFEXFx1MjZGOVxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMi1cXHVERkM0XFx1REZDN1xcdURGQ0EtXFx1REZDQ118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjYtXFx1REM3OFxcdURDN0NcXHVEQzgxLVxcdURDODNcXHVEQzg1LVxcdURDODdcXHVEQzhGXFx1REM5MVxcdURDQUFcXHVERDc0XFx1REQ3NVxcdUREN0FcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVERTQ1LVxcdURFNDdcXHVERTRCLVxcdURFNEZcXHVERUEzXFx1REVCNC1cXHVERUI2XFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwQ1xcdUREMEZcXHVERDE4LVxcdUREMUZcXHVERDI2XFx1REQzMC1cXHVERDM5XFx1REQzQy1cXHVERDNFXFx1REQ3N1xcdUREQjVcXHVEREI2XFx1RERCOFxcdUREQjlcXHVEREJCXFx1RERDRC1cXHVERENGXFx1REREMS1cXHVEREREXSkvZ307Y29uc3Qgc0Q9TChGRCk7ZnVuY3Rpb24gcChlLHU9e30pe2lmKHR5cGVvZiBlIT1cInN0cmluZ1wifHxlLmxlbmd0aD09PTB8fCh1PXthbWJpZ3VvdXNJc05hcnJvdzohMCwuLi51fSxlPVAoZSksZS5sZW5ndGg9PT0wKSlyZXR1cm4gMDtlPWUucmVwbGFjZShzRCgpLFwiICBcIik7Y29uc3QgdD11LmFtYmlndW91c0lzTmFycm93PzE6MjtsZXQgRj0wO2Zvcihjb25zdCBzIG9mIGUpe2NvbnN0IGk9cy5jb2RlUG9pbnRBdCgwKTtpZihpPD0zMXx8aT49MTI3JiZpPD0xNTl8fGk+PTc2OCYmaTw9ODc5KWNvbnRpbnVlO3N3aXRjaChlRC5lYXN0QXNpYW5XaWR0aChzKSl7Y2FzZVwiRlwiOmNhc2VcIldcIjpGKz0yO2JyZWFrO2Nhc2VcIkFcIjpGKz10O2JyZWFrO2RlZmF1bHQ6Ris9MX19cmV0dXJuIEZ9Y29uc3Qgdz0xMCxOPShlPTApPT51PT5gXFx4MUJbJHt1K2V9bWAsST0oZT0wKT0+dT0+YFxceDFCWyR7MzgrZX07NTske3V9bWAsUj0oZT0wKT0+KHUsdCxGKT0+YFxceDFCWyR7MzgrZX07Mjske3V9OyR7dH07JHtGfW1gLHI9e21vZGlmaWVyOntyZXNldDpbMCwwXSxib2xkOlsxLDIyXSxkaW06WzIsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxvdmVybGluZTpbNTMsNTVdLGludmVyc2U6WzcsMjddLGhpZGRlbjpbOCwyOF0sc3RyaWtldGhyb3VnaDpbOSwyOV19LGNvbG9yOntibGFjazpbMzAsMzldLHJlZDpbMzEsMzldLGdyZWVuOlszMiwzOV0seWVsbG93OlszMywzOV0sYmx1ZTpbMzQsMzldLG1hZ2VudGE6WzM1LDM5XSxjeWFuOlszNiwzOV0sd2hpdGU6WzM3LDM5XSxibGFja0JyaWdodDpbOTAsMzldLGdyYXk6WzkwLDM5XSxncmV5Ols5MCwzOV0scmVkQnJpZ2h0Ols5MSwzOV0sZ3JlZW5CcmlnaHQ6WzkyLDM5XSx5ZWxsb3dCcmlnaHQ6WzkzLDM5XSxibHVlQnJpZ2h0Ols5NCwzOV0sbWFnZW50YUJyaWdodDpbOTUsMzldLGN5YW5CcmlnaHQ6Wzk2LDM5XSx3aGl0ZUJyaWdodDpbOTcsMzldfSxiZ0NvbG9yOntiZ0JsYWNrOls0MCw0OV0sYmdSZWQ6WzQxLDQ5XSxiZ0dyZWVuOls0Miw0OV0sYmdZZWxsb3c6WzQzLDQ5XSxiZ0JsdWU6WzQ0LDQ5XSxiZ01hZ2VudGE6WzQ1LDQ5XSxiZ0N5YW46WzQ2LDQ5XSxiZ1doaXRlOls0Nyw0OV0sYmdCbGFja0JyaWdodDpbMTAwLDQ5XSxiZ0dyYXk6WzEwMCw0OV0sYmdHcmV5OlsxMDAsNDldLGJnUmVkQnJpZ2h0OlsxMDEsNDldLGJnR3JlZW5CcmlnaHQ6WzEwMiw0OV0sYmdZZWxsb3dCcmlnaHQ6WzEwMyw0OV0sYmdCbHVlQnJpZ2h0OlsxMDQsNDldLGJnTWFnZW50YUJyaWdodDpbMTA1LDQ5XSxiZ0N5YW5CcmlnaHQ6WzEwNiw0OV0sYmdXaGl0ZUJyaWdodDpbMTA3LDQ5XX19O09iamVjdC5rZXlzKHIubW9kaWZpZXIpO2NvbnN0IGlEPU9iamVjdC5rZXlzKHIuY29sb3IpLENEPU9iamVjdC5rZXlzKHIuYmdDb2xvcik7Wy4uLmlELC4uLkNEXTtmdW5jdGlvbiByRCgpe2NvbnN0IGU9bmV3IE1hcDtmb3IoY29uc3RbdSx0XW9mIE9iamVjdC5lbnRyaWVzKHIpKXtmb3IoY29uc3RbRixzXW9mIE9iamVjdC5lbnRyaWVzKHQpKXJbRl09e29wZW46YFxceDFCWyR7c1swXX1tYCxjbG9zZTpgXFx4MUJbJHtzWzFdfW1gfSx0W0ZdPXJbRl0sZS5zZXQoc1swXSxzWzFdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocix1LHt2YWx1ZTp0LGVudW1lcmFibGU6ITF9KX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJjb2Rlc1wiLHt2YWx1ZTplLGVudW1lcmFibGU6ITF9KSxyLmNvbG9yLmNsb3NlPVwiXFx4MUJbMzltXCIsci5iZ0NvbG9yLmNsb3NlPVwiXFx4MUJbNDltXCIsci5jb2xvci5hbnNpPU4oKSxyLmNvbG9yLmFuc2kyNTY9SSgpLHIuY29sb3IuYW5zaTE2bT1SKCksci5iZ0NvbG9yLmFuc2k9Tih3KSxyLmJnQ29sb3IuYW5zaTI1Nj1JKHcpLHIuYmdDb2xvci5hbnNpMTZtPVIodyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocix7cmdiVG9BbnNpMjU2Ont2YWx1ZToodSx0LEYpPT51PT09dCYmdD09PUY/dTw4PzE2OnU+MjQ4PzIzMTpNYXRoLnJvdW5kKCh1LTgpLzI0NyoyNCkrMjMyOjE2KzM2Kk1hdGgucm91bmQodS8yNTUqNSkrNipNYXRoLnJvdW5kKHQvMjU1KjUpK01hdGgucm91bmQoRi8yNTUqNSksZW51bWVyYWJsZTohMX0saGV4VG9SZ2I6e3ZhbHVlOnU9Pntjb25zdCB0PS9bYS1mXFxkXXs2fXxbYS1mXFxkXXszfS9pLmV4ZWModS50b1N0cmluZygxNikpO2lmKCF0KXJldHVyblswLDAsMF07bGV0W0ZdPXQ7Ri5sZW5ndGg9PT0zJiYoRj1bLi4uRl0ubWFwKGk9PmkraSkuam9pbihcIlwiKSk7Y29uc3Qgcz1OdW1iZXIucGFyc2VJbnQoRiwxNik7cmV0dXJuW3M+PjE2JjI1NSxzPj44JjI1NSxzJjI1NV19LGVudW1lcmFibGU6ITF9LGhleFRvQW5zaTI1Njp7dmFsdWU6dT0+ci5yZ2JUb0Fuc2kyNTYoLi4uci5oZXhUb1JnYih1KSksZW51bWVyYWJsZTohMX0sYW5zaTI1NlRvQW5zaTp7dmFsdWU6dT0+e2lmKHU8OClyZXR1cm4gMzArdTtpZih1PDE2KXJldHVybiA5MCsodS04KTtsZXQgdCxGLHM7aWYodT49MjMyKXQ9KCh1LTIzMikqMTArOCkvMjU1LEY9dCxzPXQ7ZWxzZXt1LT0xNjtjb25zdCBDPXUlMzY7dD1NYXRoLmZsb29yKHUvMzYpLzUsRj1NYXRoLmZsb29yKEMvNikvNSxzPUMlNi81fWNvbnN0IGk9TWF0aC5tYXgodCxGLHMpKjI7aWYoaT09PTApcmV0dXJuIDMwO2xldCBEPTMwKyhNYXRoLnJvdW5kKHMpPDwyfE1hdGgucm91bmQoRik8PDF8TWF0aC5yb3VuZCh0KSk7cmV0dXJuIGk9PT0yJiYoRCs9NjApLER9LGVudW1lcmFibGU6ITF9LHJnYlRvQW5zaTp7dmFsdWU6KHUsdCxGKT0+ci5hbnNpMjU2VG9BbnNpKHIucmdiVG9BbnNpMjU2KHUsdCxGKSksZW51bWVyYWJsZTohMX0saGV4VG9BbnNpOnt2YWx1ZTp1PT5yLmFuc2kyNTZUb0Fuc2koci5oZXhUb0Fuc2kyNTYodSkpLGVudW1lcmFibGU6ITF9fSkscn1jb25zdCBFRD1yRCgpLGQ9bmV3IFNldChbXCJcXHgxQlwiLFwiXFx4OUJcIl0pLG9EPTM5LHk9XCJcXHgwN1wiLFY9XCJbXCIsbkQ9XCJdXCIsRz1cIm1cIixfPWAke25EfTg7O2Asej1lPT5gJHtkLnZhbHVlcygpLm5leHQoKS52YWx1ZX0ke1Z9JHtlfSR7R31gLEs9ZT0+YCR7ZC52YWx1ZXMoKS5uZXh0KCkudmFsdWV9JHtffSR7ZX0ke3l9YCxhRD1lPT5lLnNwbGl0KFwiIFwiKS5tYXAodT0+cCh1KSksaz0oZSx1LHQpPT57Y29uc3QgRj1bLi4udV07bGV0IHM9ITEsaT0hMSxEPXAoUChlW2UubGVuZ3RoLTFdKSk7Zm9yKGNvbnN0W0Msbl1vZiBGLmVudHJpZXMoKSl7Y29uc3QgRT1wKG4pO2lmKEQrRTw9dD9lW2UubGVuZ3RoLTFdKz1uOihlLnB1c2gobiksRD0wKSxkLmhhcyhuKSYmKHM9ITAsaT1GLnNsaWNlKEMrMSkuam9pbihcIlwiKS5zdGFydHNXaXRoKF8pKSxzKXtpP249PT15JiYocz0hMSxpPSExKTpuPT09RyYmKHM9ITEpO2NvbnRpbnVlfUQrPUUsRD09PXQmJkM8Ri5sZW5ndGgtMSYmKGUucHVzaChcIlwiKSxEPTApfSFEJiZlW2UubGVuZ3RoLTFdLmxlbmd0aD4wJiZlLmxlbmd0aD4xJiYoZVtlLmxlbmd0aC0yXSs9ZS5wb3AoKSl9LGhEPWU9Pntjb25zdCB1PWUuc3BsaXQoXCIgXCIpO2xldCB0PXUubGVuZ3RoO2Zvcig7dD4wJiYhKHAodVt0LTFdKT4wKTspdC0tO3JldHVybiB0PT09dS5sZW5ndGg/ZTp1LnNsaWNlKDAsdCkuam9pbihcIiBcIikrdS5zbGljZSh0KS5qb2luKFwiXCIpfSxsRD0oZSx1LHQ9e30pPT57aWYodC50cmltIT09ITEmJmUudHJpbSgpPT09XCJcIilyZXR1cm5cIlwiO2xldCBGPVwiXCIscyxpO2NvbnN0IEQ9YUQoZSk7bGV0IEM9W1wiXCJdO2Zvcihjb25zdFtFLGFdb2YgZS5zcGxpdChcIiBcIikuZW50cmllcygpKXt0LnRyaW0hPT0hMSYmKENbQy5sZW5ndGgtMV09Q1tDLmxlbmd0aC0xXS50cmltU3RhcnQoKSk7bGV0IG89cChDW0MubGVuZ3RoLTFdKTtpZihFIT09MCYmKG8+PXUmJih0LndvcmRXcmFwPT09ITF8fHQudHJpbT09PSExKSYmKEMucHVzaChcIlwiKSxvPTApLChvPjB8fHQudHJpbT09PSExKSYmKENbQy5sZW5ndGgtMV0rPVwiIFwiLG8rKykpLHQuaGFyZCYmRFtFXT51KXtjb25zdCBjPXUtbyxmPTErTWF0aC5mbG9vcigoRFtFXS1jLTEpL3UpO01hdGguZmxvb3IoKERbRV0tMSkvdSk8ZiYmQy5wdXNoKFwiXCIpLGsoQyxhLHUpO2NvbnRpbnVlfWlmKG8rRFtFXT51JiZvPjAmJkRbRV0+MCl7aWYodC53b3JkV3JhcD09PSExJiZvPHUpe2soQyxhLHUpO2NvbnRpbnVlfUMucHVzaChcIlwiKX1pZihvK0RbRV0+dSYmdC53b3JkV3JhcD09PSExKXtrKEMsYSx1KTtjb250aW51ZX1DW0MubGVuZ3RoLTFdKz1hfXQudHJpbSE9PSExJiYoQz1DLm1hcChFPT5oRChFKSkpO2NvbnN0IG49Wy4uLkMuam9pbihgXG5gKV07Zm9yKGNvbnN0W0UsYV1vZiBuLmVudHJpZXMoKSl7aWYoRis9YSxkLmhhcyhhKSl7Y29uc3R7Z3JvdXBzOmN9PW5ldyBSZWdFeHAoYCg/OlxcXFwke1Z9KD88Y29kZT5cXFxcZCspbXxcXFxcJHtffSg/PHVyaT4uKikke3l9KWApLmV4ZWMobi5zbGljZShFKS5qb2luKFwiXCIpKXx8e2dyb3Vwczp7fX07aWYoYy5jb2RlIT09dm9pZCAwKXtjb25zdCBmPU51bWJlci5wYXJzZUZsb2F0KGMuY29kZSk7cz1mPT09b0Q/dm9pZCAwOmZ9ZWxzZSBjLnVyaSE9PXZvaWQgMCYmKGk9Yy51cmkubGVuZ3RoPT09MD92b2lkIDA6Yy51cmkpfWNvbnN0IG89RUQuY29kZXMuZ2V0KE51bWJlcihzKSk7bltFKzFdPT09YFxuYD8oaSYmKEYrPUsoXCJcIikpLHMmJm8mJihGKz16KG8pKSk6YT09PWBcbmAmJihzJiZvJiYoRis9eihzKSksaSYmKEYrPUsoaSkpKX1yZXR1cm4gRn07ZnVuY3Rpb24gWShlLHUsdCl7cmV0dXJuIFN0cmluZyhlKS5ub3JtYWxpemUoKS5yZXBsYWNlKC9cXHJcXG4vZyxgXG5gKS5zcGxpdChgXG5gKS5tYXAoRj0+bEQoRix1LHQpKS5qb2luKGBcbmApfWNvbnN0IHhEPVtcInVwXCIsXCJkb3duXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwic3BhY2VcIixcImVudGVyXCIsXCJjYW5jZWxcIl0sQj17YWN0aW9uczpuZXcgU2V0KHhEKSxhbGlhc2VzOm5ldyBNYXAoW1tcImtcIixcInVwXCJdLFtcImpcIixcImRvd25cIl0sW1wiaFwiLFwibGVmdFwiXSxbXCJsXCIsXCJyaWdodFwiXSxbXCJcdTAwMDNcIixcImNhbmNlbFwiXSxbXCJlc2NhcGVcIixcImNhbmNlbFwiXV0pfTtmdW5jdGlvbiBjRChlKXtmb3IoY29uc3QgdSBpbiBlKXtjb25zdCB0PXU7aWYoIU9iamVjdC5oYXNPd24oZSx0KSljb250aW51ZTtjb25zdCBGPWVbdF07c3dpdGNoKHQpe2Nhc2VcImFsaWFzZXNcIjp7Zm9yKGNvbnN0IHMgaW4gRilPYmplY3QuaGFzT3duKEYscykmJihCLmFsaWFzZXMuaGFzKHMpfHxCLmFsaWFzZXMuc2V0KHMsRltzXSkpO2JyZWFrfX19fWZ1bmN0aW9uICQoZSx1KXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIilyZXR1cm4gQi5hbGlhc2VzLmdldChlKT09PXU7Zm9yKGNvbnN0IHQgb2YgZSlpZih0IT09dm9pZCAwJiYkKHQsdSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gQkQoZSx1KXtpZihlPT09dSlyZXR1cm47Y29uc3QgdD1lLnNwbGl0KGBcbmApLEY9dS5zcGxpdChgXG5gKSxzPVtdO2ZvcihsZXQgaT0wO2k8TWF0aC5tYXgodC5sZW5ndGgsRi5sZW5ndGgpO2krKyl0W2ldIT09RltpXSYmcy5wdXNoKGkpO3JldHVybiBzfWNvbnN0IEFEPWdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybS5zdGFydHNXaXRoKFwid2luXCIpLFM9U3ltYm9sKFwiY2xhY2s6Y2FuY2VsXCIpO2Z1bmN0aW9uIHBEKGUpe3JldHVybiBlPT09U31mdW5jdGlvbiBtKGUsdSl7Y29uc3QgdD1lO3QuaXNUVFkmJnQuc2V0UmF3TW9kZSh1KX1mdW5jdGlvbiBmRCh7aW5wdXQ6ZT1qLG91dHB1dDp1PU0sb3ZlcndyaXRlOnQ9ITAsaGlkZUN1cnNvcjpGPSEwfT17fSl7Y29uc3Qgcz1nLmNyZWF0ZUludGVyZmFjZSh7aW5wdXQ6ZSxvdXRwdXQ6dSxwcm9tcHQ6XCJcIix0YWJTaXplOjF9KTtnLmVtaXRLZXlwcmVzc0V2ZW50cyhlLHMpLGUuaXNUVFkmJmUuc2V0UmF3TW9kZSghMCk7Y29uc3QgaT0oRCx7bmFtZTpDLHNlcXVlbmNlOm59KT0+e2NvbnN0IEU9U3RyaW5nKEQpO2lmKCQoW0UsQyxuXSxcImNhbmNlbFwiKSl7RiYmdS53cml0ZShsLnNob3cpLHByb2Nlc3MuZXhpdCgwKTtyZXR1cm59aWYoIXQpcmV0dXJuO2NvbnN0IGE9Qz09PVwicmV0dXJuXCI/MDotMSxvPUM9PT1cInJldHVyblwiPy0xOjA7Zy5tb3ZlQ3Vyc29yKHUsYSxvLCgpPT57Zy5jbGVhckxpbmUodSwxLCgpPT57ZS5vbmNlKFwia2V5cHJlc3NcIixpKX0pfSl9O3JldHVybiBGJiZ1LndyaXRlKGwuaGlkZSksZS5vbmNlKFwia2V5cHJlc3NcIixpKSwoKT0+e2Uub2ZmKFwia2V5cHJlc3NcIixpKSxGJiZ1LndyaXRlKGwuc2hvdyksZS5pc1RUWSYmIUFEJiZlLnNldFJhd01vZGUoITEpLHMudGVybWluYWw9ITEscy5jbG9zZSgpfX12YXIgZ0Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LHZEPShlLHUsdCk9PnUgaW4gZT9nRChlLHUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTplW3VdPXQsaD0oZSx1LHQpPT4odkQoZSx0eXBlb2YgdSE9XCJzeW1ib2xcIj91K1wiXCI6dSx0KSx0KTtjbGFzcyB4e2NvbnN0cnVjdG9yKHUsdD0hMCl7aCh0aGlzLFwiaW5wdXRcIiksaCh0aGlzLFwib3V0cHV0XCIpLGgodGhpcyxcIl9hYm9ydFNpZ25hbFwiKSxoKHRoaXMsXCJybFwiKSxoKHRoaXMsXCJvcHRzXCIpLGgodGhpcyxcIl9yZW5kZXJcIiksaCh0aGlzLFwiX3RyYWNrXCIsITEpLGgodGhpcyxcIl9wcmV2RnJhbWVcIixcIlwiKSxoKHRoaXMsXCJfc3Vic2NyaWJlcnNcIixuZXcgTWFwKSxoKHRoaXMsXCJfY3Vyc29yXCIsMCksaCh0aGlzLFwic3RhdGVcIixcImluaXRpYWxcIiksaCh0aGlzLFwiZXJyb3JcIixcIlwiKSxoKHRoaXMsXCJ2YWx1ZVwiKTtjb25zdHtpbnB1dDpGPWosb3V0cHV0OnM9TSxyZW5kZXI6aSxzaWduYWw6RCwuLi5DfT11O3RoaXMub3B0cz1DLHRoaXMub25LZXlwcmVzcz10aGlzLm9uS2V5cHJlc3MuYmluZCh0aGlzKSx0aGlzLmNsb3NlPXRoaXMuY2xvc2UuYmluZCh0aGlzKSx0aGlzLnJlbmRlcj10aGlzLnJlbmRlci5iaW5kKHRoaXMpLHRoaXMuX3JlbmRlcj1pLmJpbmQodGhpcyksdGhpcy5fdHJhY2s9dCx0aGlzLl9hYm9ydFNpZ25hbD1ELHRoaXMuaW5wdXQ9Rix0aGlzLm91dHB1dD1zfXVuc3Vic2NyaWJlKCl7dGhpcy5fc3Vic2NyaWJlcnMuY2xlYXIoKX1zZXRTdWJzY3JpYmVyKHUsdCl7Y29uc3QgRj10aGlzLl9zdWJzY3JpYmVycy5nZXQodSk/P1tdO0YucHVzaCh0KSx0aGlzLl9zdWJzY3JpYmVycy5zZXQodSxGKX1vbih1LHQpe3RoaXMuc2V0U3Vic2NyaWJlcih1LHtjYjp0fSl9b25jZSh1LHQpe3RoaXMuc2V0U3Vic2NyaWJlcih1LHtjYjp0LG9uY2U6ITB9KX1lbWl0KHUsLi4udCl7Y29uc3QgRj10aGlzLl9zdWJzY3JpYmVycy5nZXQodSk/P1tdLHM9W107Zm9yKGNvbnN0IGkgb2YgRilpLmNiKC4uLnQpLGkub25jZSYmcy5wdXNoKCgpPT5GLnNwbGljZShGLmluZGV4T2YoaSksMSkpO2Zvcihjb25zdCBpIG9mIHMpaSgpfXByb21wdCgpe3JldHVybiBuZXcgUHJvbWlzZSgodSx0KT0+e2lmKHRoaXMuX2Fib3J0U2lnbmFsKXtpZih0aGlzLl9hYm9ydFNpZ25hbC5hYm9ydGVkKXJldHVybiB0aGlzLnN0YXRlPVwiY2FuY2VsXCIsdGhpcy5jbG9zZSgpLHUoUyk7dGhpcy5fYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsKCk9Pnt0aGlzLnN0YXRlPVwiY2FuY2VsXCIsdGhpcy5jbG9zZSgpfSx7b25jZTohMH0pfWNvbnN0IEY9bmV3IFg7Ri5fd3JpdGU9KHMsaSxEKT0+e3RoaXMuX3RyYWNrJiYodGhpcy52YWx1ZT10aGlzLnJsPy5saW5lLnJlcGxhY2UoL1xcdC9nLFwiXCIpLHRoaXMuX2N1cnNvcj10aGlzLnJsPy5jdXJzb3I/PzAsdGhpcy5lbWl0KFwidmFsdWVcIix0aGlzLnZhbHVlKSksRCgpfSx0aGlzLmlucHV0LnBpcGUoRiksdGhpcy5ybD1PLmNyZWF0ZUludGVyZmFjZSh7aW5wdXQ6dGhpcy5pbnB1dCxvdXRwdXQ6Rix0YWJTaXplOjIscHJvbXB0OlwiXCIsZXNjYXBlQ29kZVRpbWVvdXQ6NTAsdGVybWluYWw6ITB9KSxPLmVtaXRLZXlwcmVzc0V2ZW50cyh0aGlzLmlucHV0LHRoaXMucmwpLHRoaXMucmwucHJvbXB0KCksdGhpcy5vcHRzLmluaXRpYWxWYWx1ZSE9PXZvaWQgMCYmdGhpcy5fdHJhY2smJnRoaXMucmwud3JpdGUodGhpcy5vcHRzLmluaXRpYWxWYWx1ZSksdGhpcy5pbnB1dC5vbihcImtleXByZXNzXCIsdGhpcy5vbktleXByZXNzKSxtKHRoaXMuaW5wdXQsITApLHRoaXMub3V0cHV0Lm9uKFwicmVzaXplXCIsdGhpcy5yZW5kZXIpLHRoaXMucmVuZGVyKCksdGhpcy5vbmNlKFwic3VibWl0XCIsKCk9Pnt0aGlzLm91dHB1dC53cml0ZShsLnNob3cpLHRoaXMub3V0cHV0Lm9mZihcInJlc2l6ZVwiLHRoaXMucmVuZGVyKSxtKHRoaXMuaW5wdXQsITEpLHUodGhpcy52YWx1ZSl9KSx0aGlzLm9uY2UoXCJjYW5jZWxcIiwoKT0+e3RoaXMub3V0cHV0LndyaXRlKGwuc2hvdyksdGhpcy5vdXRwdXQub2ZmKFwicmVzaXplXCIsdGhpcy5yZW5kZXIpLG0odGhpcy5pbnB1dCwhMSksdShTKX0pfSl9b25LZXlwcmVzcyh1LHQpe2lmKHRoaXMuc3RhdGU9PT1cImVycm9yXCImJih0aGlzLnN0YXRlPVwiYWN0aXZlXCIpLHQ/Lm5hbWUmJighdGhpcy5fdHJhY2smJkIuYWxpYXNlcy5oYXModC5uYW1lKSYmdGhpcy5lbWl0KFwiY3Vyc29yXCIsQi5hbGlhc2VzLmdldCh0Lm5hbWUpKSxCLmFjdGlvbnMuaGFzKHQubmFtZSkmJnRoaXMuZW1pdChcImN1cnNvclwiLHQubmFtZSkpLHUmJih1LnRvTG93ZXJDYXNlKCk9PT1cInlcInx8dS50b0xvd2VyQ2FzZSgpPT09XCJuXCIpJiZ0aGlzLmVtaXQoXCJjb25maXJtXCIsdS50b0xvd2VyQ2FzZSgpPT09XCJ5XCIpLHU9PT1cIlx0XCImJnRoaXMub3B0cy5wbGFjZWhvbGRlciYmKHRoaXMudmFsdWV8fCh0aGlzLnJsPy53cml0ZSh0aGlzLm9wdHMucGxhY2Vob2xkZXIpLHRoaXMuZW1pdChcInZhbHVlXCIsdGhpcy5vcHRzLnBsYWNlaG9sZGVyKSkpLHUmJnRoaXMuZW1pdChcImtleVwiLHUudG9Mb3dlckNhc2UoKSksdD8ubmFtZT09PVwicmV0dXJuXCIpe2lmKHRoaXMub3B0cy52YWxpZGF0ZSl7Y29uc3QgRj10aGlzLm9wdHMudmFsaWRhdGUodGhpcy52YWx1ZSk7RiYmKHRoaXMuZXJyb3I9RiBpbnN0YW5jZW9mIEVycm9yP0YubWVzc2FnZTpGLHRoaXMuc3RhdGU9XCJlcnJvclwiLHRoaXMucmw/LndyaXRlKHRoaXMudmFsdWUpKX10aGlzLnN0YXRlIT09XCJlcnJvclwiJiYodGhpcy5zdGF0ZT1cInN1Ym1pdFwiKX0kKFt1LHQ/Lm5hbWUsdD8uc2VxdWVuY2VdLFwiY2FuY2VsXCIpJiYodGhpcy5zdGF0ZT1cImNhbmNlbFwiKSwodGhpcy5zdGF0ZT09PVwic3VibWl0XCJ8fHRoaXMuc3RhdGU9PT1cImNhbmNlbFwiKSYmdGhpcy5lbWl0KFwiZmluYWxpemVcIiksdGhpcy5yZW5kZXIoKSwodGhpcy5zdGF0ZT09PVwic3VibWl0XCJ8fHRoaXMuc3RhdGU9PT1cImNhbmNlbFwiKSYmdGhpcy5jbG9zZSgpfWNsb3NlKCl7dGhpcy5pbnB1dC51bnBpcGUoKSx0aGlzLmlucHV0LnJlbW92ZUxpc3RlbmVyKFwia2V5cHJlc3NcIix0aGlzLm9uS2V5cHJlc3MpLHRoaXMub3V0cHV0LndyaXRlKGBcbmApLG0odGhpcy5pbnB1dCwhMSksdGhpcy5ybD8uY2xvc2UoKSx0aGlzLnJsPXZvaWQgMCx0aGlzLmVtaXQoYCR7dGhpcy5zdGF0ZX1gLHRoaXMudmFsdWUpLHRoaXMudW5zdWJzY3JpYmUoKX1yZXN0b3JlQ3Vyc29yKCl7Y29uc3QgdT1ZKHRoaXMuX3ByZXZGcmFtZSxwcm9jZXNzLnN0ZG91dC5jb2x1bW5zLHtoYXJkOiEwfSkuc3BsaXQoYFxuYCkubGVuZ3RoLTE7dGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKC05OTksdSotMSkpfXJlbmRlcigpe2NvbnN0IHU9WSh0aGlzLl9yZW5kZXIodGhpcyk/P1wiXCIscHJvY2Vzcy5zdGRvdXQuY29sdW1ucyx7aGFyZDohMH0pO2lmKHUhPT10aGlzLl9wcmV2RnJhbWUpe2lmKHRoaXMuc3RhdGU9PT1cImluaXRpYWxcIil0aGlzLm91dHB1dC53cml0ZShsLmhpZGUpO2Vsc2V7Y29uc3QgdD1CRCh0aGlzLl9wcmV2RnJhbWUsdSk7aWYodGhpcy5yZXN0b3JlQ3Vyc29yKCksdCYmdD8ubGVuZ3RoPT09MSl7Y29uc3QgRj10WzBdO3RoaXMub3V0cHV0LndyaXRlKGwubW92ZSgwLEYpKSx0aGlzLm91dHB1dC53cml0ZShiLmxpbmVzKDEpKTtjb25zdCBzPXUuc3BsaXQoYFxuYCk7dGhpcy5vdXRwdXQud3JpdGUoc1tGXSksdGhpcy5fcHJldkZyYW1lPXUsdGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKDAscy5sZW5ndGgtRi0xKSk7cmV0dXJufWlmKHQmJnQ/Lmxlbmd0aD4xKXtjb25zdCBGPXRbMF07dGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKDAsRikpLHRoaXMub3V0cHV0LndyaXRlKGIuZG93bigpKTtjb25zdCBzPXUuc3BsaXQoYFxuYCkuc2xpY2UoRik7dGhpcy5vdXRwdXQud3JpdGUocy5qb2luKGBcbmApKSx0aGlzLl9wcmV2RnJhbWU9dTtyZXR1cm59dGhpcy5vdXRwdXQud3JpdGUoYi5kb3duKCkpfXRoaXMub3V0cHV0LndyaXRlKHUpLHRoaXMuc3RhdGU9PT1cImluaXRpYWxcIiYmKHRoaXMuc3RhdGU9XCJhY3RpdmVcIiksdGhpcy5fcHJldkZyYW1lPXV9fX1jbGFzcyBkRCBleHRlbmRzIHh7Z2V0IGN1cnNvcigpe3JldHVybiB0aGlzLnZhbHVlPzA6MX1nZXQgX3ZhbHVlKCl7cmV0dXJuIHRoaXMuY3Vyc29yPT09MH1jb25zdHJ1Y3Rvcih1KXtzdXBlcih1LCExKSx0aGlzLnZhbHVlPSEhdS5pbml0aWFsVmFsdWUsdGhpcy5vbihcInZhbHVlXCIsKCk9Pnt0aGlzLnZhbHVlPXRoaXMuX3ZhbHVlfSksdGhpcy5vbihcImNvbmZpcm1cIix0PT57dGhpcy5vdXRwdXQud3JpdGUobC5tb3ZlKDAsLTEpKSx0aGlzLnZhbHVlPXQsdGhpcy5zdGF0ZT1cInN1Ym1pdFwiLHRoaXMuY2xvc2UoKX0pLHRoaXMub24oXCJjdXJzb3JcIiwoKT0+e3RoaXMudmFsdWU9IXRoaXMudmFsdWV9KX19dmFyIG1EPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxiRD0oZSx1LHQpPT51IGluIGU/bUQoZSx1LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6ZVt1XT10LFo9KGUsdSx0KT0+KGJEKGUsdHlwZW9mIHUhPVwic3ltYm9sXCI/dStcIlwiOnUsdCksdCkscT0oZSx1LHQpPT57aWYoIXUuaGFzKGUpKXRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBcIit0KX0sVD0oZSx1LHQpPT4ocShlLHUsXCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZFwiKSx0P3QuY2FsbChlKTp1LmdldChlKSksd0Q9KGUsdSx0KT0+e2lmKHUuaGFzKGUpKXRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2VcIik7dSBpbnN0YW5jZW9mIFdlYWtTZXQ/dS5hZGQoZSk6dS5zZXQoZSx0KX0seUQ9KGUsdSx0LEYpPT4ocShlLHUsXCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkXCIpLEY/Ri5jYWxsKGUsdCk6dS5zZXQoZSx0KSx0KSxBO2xldCBfRD1jbGFzcyBleHRlbmRzIHh7Y29uc3RydWN0b3IodSl7c3VwZXIodSwhMSksWih0aGlzLFwib3B0aW9uc1wiKSxaKHRoaXMsXCJjdXJzb3JcIiwwKSx3RCh0aGlzLEEsdm9pZCAwKTtjb25zdHtvcHRpb25zOnR9PXU7eUQodGhpcyxBLHUuc2VsZWN0YWJsZUdyb3VwcyE9PSExKSx0aGlzLm9wdGlvbnM9T2JqZWN0LmVudHJpZXModCkuZmxhdE1hcCgoW0Ysc10pPT5be3ZhbHVlOkYsZ3JvdXA6ITAsbGFiZWw6Rn0sLi4ucy5tYXAoaT0+KHsuLi5pLGdyb3VwOkZ9KSldKSx0aGlzLnZhbHVlPVsuLi51LmluaXRpYWxWYWx1ZXM/P1tdXSx0aGlzLmN1cnNvcj1NYXRoLm1heCh0aGlzLm9wdGlvbnMuZmluZEluZGV4KCh7dmFsdWU6Rn0pPT5GPT09dS5jdXJzb3JBdCksVCh0aGlzLEEpPzA6MSksdGhpcy5vbihcImN1cnNvclwiLEY9Pntzd2l0Y2goRil7Y2FzZVwibGVmdFwiOmNhc2VcInVwXCI6e3RoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09MD90aGlzLm9wdGlvbnMubGVuZ3RoLTE6dGhpcy5jdXJzb3ItMTtjb25zdCBzPXRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl0/Lmdyb3VwPT09ITA7IVQodGhpcyxBKSYmcyYmKHRoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09MD90aGlzLm9wdGlvbnMubGVuZ3RoLTE6dGhpcy5jdXJzb3ItMSk7YnJlYWt9Y2FzZVwiZG93blwiOmNhc2VcInJpZ2h0XCI6e3RoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09dGhpcy5vcHRpb25zLmxlbmd0aC0xPzA6dGhpcy5jdXJzb3IrMTtjb25zdCBzPXRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl0/Lmdyb3VwPT09ITA7IVQodGhpcyxBKSYmcyYmKHRoaXMuY3Vyc29yPXRoaXMuY3Vyc29yPT09dGhpcy5vcHRpb25zLmxlbmd0aC0xPzA6dGhpcy5jdXJzb3IrMSk7YnJlYWt9Y2FzZVwic3BhY2VcIjp0aGlzLnRvZ2dsZVZhbHVlKCk7YnJlYWt9fSl9Z2V0R3JvdXBJdGVtcyh1KXtyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcih0PT50Lmdyb3VwPT09dSl9aXNHcm91cFNlbGVjdGVkKHUpe3JldHVybiB0aGlzLmdldEdyb3VwSXRlbXModSkuZXZlcnkodD0+dGhpcy52YWx1ZS5pbmNsdWRlcyh0LnZhbHVlKSl9dG9nZ2xlVmFsdWUoKXtjb25zdCB1PXRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl07aWYodS5ncm91cD09PSEwKXtjb25zdCB0PXUudmFsdWUsRj10aGlzLmdldEdyb3VwSXRlbXModCk7dGhpcy5pc0dyb3VwU2VsZWN0ZWQodCk/dGhpcy52YWx1ZT10aGlzLnZhbHVlLmZpbHRlcihzPT5GLmZpbmRJbmRleChpPT5pLnZhbHVlPT09cyk9PT0tMSk6dGhpcy52YWx1ZT1bLi4udGhpcy52YWx1ZSwuLi5GLm1hcChzPT5zLnZhbHVlKV0sdGhpcy52YWx1ZT1BcnJheS5mcm9tKG5ldyBTZXQodGhpcy52YWx1ZSkpfWVsc2V7Y29uc3QgdD10aGlzLnZhbHVlLmluY2x1ZGVzKHUudmFsdWUpO3RoaXMudmFsdWU9dD90aGlzLnZhbHVlLmZpbHRlcihGPT5GIT09dS52YWx1ZSk6Wy4uLnRoaXMudmFsdWUsdS52YWx1ZV19fX07QT1uZXcgV2Vha01hcDt2YXIga0Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LCREPShlLHUsdCk9PnUgaW4gZT9rRChlLHUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTplW3VdPXQsSD0oZSx1LHQpPT4oJEQoZSx0eXBlb2YgdSE9XCJzeW1ib2xcIj91K1wiXCI6dSx0KSx0KTtsZXQgU0Q9Y2xhc3MgZXh0ZW5kcyB4e2NvbnN0cnVjdG9yKHUpe3N1cGVyKHUsITEpLEgodGhpcyxcIm9wdGlvbnNcIiksSCh0aGlzLFwiY3Vyc29yXCIsMCksdGhpcy5vcHRpb25zPXUub3B0aW9ucyx0aGlzLnZhbHVlPVsuLi51LmluaXRpYWxWYWx1ZXM/P1tdXSx0aGlzLmN1cnNvcj1NYXRoLm1heCh0aGlzLm9wdGlvbnMuZmluZEluZGV4KCh7dmFsdWU6dH0pPT50PT09dS5jdXJzb3JBdCksMCksdGhpcy5vbihcImtleVwiLHQ9Pnt0PT09XCJhXCImJnRoaXMudG9nZ2xlQWxsKCl9KSx0aGlzLm9uKFwiY3Vyc29yXCIsdD0+e3N3aXRjaCh0KXtjYXNlXCJsZWZ0XCI6Y2FzZVwidXBcIjp0aGlzLmN1cnNvcj10aGlzLmN1cnNvcj09PTA/dGhpcy5vcHRpb25zLmxlbmd0aC0xOnRoaXMuY3Vyc29yLTE7YnJlYWs7Y2FzZVwiZG93blwiOmNhc2VcInJpZ2h0XCI6dGhpcy5jdXJzb3I9dGhpcy5jdXJzb3I9PT10aGlzLm9wdGlvbnMubGVuZ3RoLTE/MDp0aGlzLmN1cnNvcisxO2JyZWFrO2Nhc2VcInNwYWNlXCI6dGhpcy50b2dnbGVWYWx1ZSgpO2JyZWFrfX0pfWdldCBfdmFsdWUoKXtyZXR1cm4gdGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXS52YWx1ZX10b2dnbGVBbGwoKXtjb25zdCB1PXRoaXMudmFsdWUubGVuZ3RoPT09dGhpcy5vcHRpb25zLmxlbmd0aDt0aGlzLnZhbHVlPXU/W106dGhpcy5vcHRpb25zLm1hcCh0PT50LnZhbHVlKX10b2dnbGVWYWx1ZSgpe2NvbnN0IHU9dGhpcy52YWx1ZS5pbmNsdWRlcyh0aGlzLl92YWx1ZSk7dGhpcy52YWx1ZT11P3RoaXMudmFsdWUuZmlsdGVyKHQ9PnQhPT10aGlzLl92YWx1ZSk6Wy4uLnRoaXMudmFsdWUsdGhpcy5fdmFsdWVdfX07dmFyIFREPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqRD0oZSx1LHQpPT51IGluIGU/VEQoZSx1LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6ZVt1XT10LFU9KGUsdSx0KT0+KGpEKGUsdHlwZW9mIHUhPVwic3ltYm9sXCI/dStcIlwiOnUsdCksdCk7Y2xhc3MgTUQgZXh0ZW5kcyB4e2NvbnN0cnVjdG9yKHttYXNrOnUsLi4udH0pe3N1cGVyKHQpLFUodGhpcyxcInZhbHVlV2l0aEN1cnNvclwiLFwiXCIpLFUodGhpcyxcIl9tYXNrXCIsXCJcXHUyMDIyXCIpLHRoaXMuX21hc2s9dT8/XCJcXHUyMDIyXCIsdGhpcy5vbihcImZpbmFsaXplXCIsKCk9Pnt0aGlzLnZhbHVlV2l0aEN1cnNvcj10aGlzLm1hc2tlZH0pLHRoaXMub24oXCJ2YWx1ZVwiLCgpPT57aWYodGhpcy5jdXJzb3I+PXRoaXMudmFsdWUubGVuZ3RoKXRoaXMudmFsdWVXaXRoQ3Vyc29yPWAke3RoaXMubWFza2VkfSR7di5pbnZlcnNlKHYuaGlkZGVuKFwiX1wiKSl9YDtlbHNle2NvbnN0IEY9dGhpcy5tYXNrZWQuc2xpY2UoMCx0aGlzLmN1cnNvcikscz10aGlzLm1hc2tlZC5zbGljZSh0aGlzLmN1cnNvcik7dGhpcy52YWx1ZVdpdGhDdXJzb3I9YCR7Rn0ke3YuaW52ZXJzZShzWzBdKX0ke3Muc2xpY2UoMSl9YH19KX1nZXQgY3Vyc29yKCl7cmV0dXJuIHRoaXMuX2N1cnNvcn1nZXQgbWFza2VkKCl7cmV0dXJuIHRoaXMudmFsdWUucmVwbGFjZUFsbCgvLi9nLHRoaXMuX21hc2spfX12YXIgT0Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LFBEPShlLHUsdCk9PnUgaW4gZT9PRChlLHUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTplW3VdPXQsSj0oZSx1LHQpPT4oUEQoZSx0eXBlb2YgdSE9XCJzeW1ib2xcIj91K1wiXCI6dSx0KSx0KTtjbGFzcyBMRCBleHRlbmRzIHh7Y29uc3RydWN0b3IodSl7c3VwZXIodSwhMSksSih0aGlzLFwib3B0aW9uc1wiKSxKKHRoaXMsXCJjdXJzb3JcIiwwKSx0aGlzLm9wdGlvbnM9dS5vcHRpb25zLHRoaXMuY3Vyc29yPXRoaXMub3B0aW9ucy5maW5kSW5kZXgoKHt2YWx1ZTp0fSk9PnQ9PT11LmluaXRpYWxWYWx1ZSksdGhpcy5jdXJzb3I9PT0tMSYmKHRoaXMuY3Vyc29yPTApLHRoaXMuY2hhbmdlVmFsdWUoKSx0aGlzLm9uKFwiY3Vyc29yXCIsdD0+e3N3aXRjaCh0KXtjYXNlXCJsZWZ0XCI6Y2FzZVwidXBcIjp0aGlzLmN1cnNvcj10aGlzLmN1cnNvcj09PTA/dGhpcy5vcHRpb25zLmxlbmd0aC0xOnRoaXMuY3Vyc29yLTE7YnJlYWs7Y2FzZVwiZG93blwiOmNhc2VcInJpZ2h0XCI6dGhpcy5jdXJzb3I9dGhpcy5jdXJzb3I9PT10aGlzLm9wdGlvbnMubGVuZ3RoLTE/MDp0aGlzLmN1cnNvcisxO2JyZWFrfXRoaXMuY2hhbmdlVmFsdWUoKX0pfWdldCBfdmFsdWUoKXtyZXR1cm4gdGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXX1jaGFuZ2VWYWx1ZSgpe3RoaXMudmFsdWU9dGhpcy5fdmFsdWUudmFsdWV9fXZhciBXRD1PYmplY3QuZGVmaW5lUHJvcGVydHksTkQ9KGUsdSx0KT0+dSBpbiBlP1dEKGUsdSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dH0pOmVbdV09dCxRPShlLHUsdCk9PihORChlLHR5cGVvZiB1IT1cInN5bWJvbFwiP3UrXCJcIjp1LHQpLHQpO2NsYXNzIElEIGV4dGVuZHMgeHtjb25zdHJ1Y3Rvcih1KXtzdXBlcih1LCExKSxRKHRoaXMsXCJvcHRpb25zXCIpLFEodGhpcyxcImN1cnNvclwiLDApLHRoaXMub3B0aW9ucz11Lm9wdGlvbnM7Y29uc3QgdD10aGlzLm9wdGlvbnMubWFwKCh7dmFsdWU6W0ZdfSk9PkY/LnRvTG93ZXJDYXNlKCkpO3RoaXMuY3Vyc29yPU1hdGgubWF4KHQuaW5kZXhPZih1LmluaXRpYWxWYWx1ZSksMCksdGhpcy5vbihcImtleVwiLEY9PntpZighdC5pbmNsdWRlcyhGKSlyZXR1cm47Y29uc3Qgcz10aGlzLm9wdGlvbnMuZmluZCgoe3ZhbHVlOltpXX0pPT5pPy50b0xvd2VyQ2FzZSgpPT09Rik7cyYmKHRoaXMudmFsdWU9cy52YWx1ZSx0aGlzLnN0YXRlPVwic3VibWl0XCIsdGhpcy5lbWl0KFwic3VibWl0XCIpKX0pfX1jbGFzcyBSRCBleHRlbmRzIHh7Z2V0IHZhbHVlV2l0aEN1cnNvcigpe2lmKHRoaXMuc3RhdGU9PT1cInN1Ym1pdFwiKXJldHVybiB0aGlzLnZhbHVlO2lmKHRoaXMuY3Vyc29yPj10aGlzLnZhbHVlLmxlbmd0aClyZXR1cm5gJHt0aGlzLnZhbHVlfVxcdTI1ODhgO2NvbnN0IHU9dGhpcy52YWx1ZS5zbGljZSgwLHRoaXMuY3Vyc29yKSxbdCwuLi5GXT10aGlzLnZhbHVlLnNsaWNlKHRoaXMuY3Vyc29yKTtyZXR1cm5gJHt1fSR7di5pbnZlcnNlKHQpfSR7Ri5qb2luKFwiXCIpfWB9Z2V0IGN1cnNvcigpe3JldHVybiB0aGlzLl9jdXJzb3J9Y29uc3RydWN0b3IodSl7c3VwZXIodSksdGhpcy5vbihcImZpbmFsaXplXCIsKCk9Pnt0aGlzLnZhbHVlfHwodGhpcy52YWx1ZT11LmRlZmF1bHRWYWx1ZSl9KX19ZXhwb3J0e2REIGFzIENvbmZpcm1Qcm9tcHQsX0QgYXMgR3JvdXBNdWx0aVNlbGVjdFByb21wdCxTRCBhcyBNdWx0aVNlbGVjdFByb21wdCxNRCBhcyBQYXNzd29yZFByb21wdCx4IGFzIFByb21wdCxJRCBhcyBTZWxlY3RLZXlQcm9tcHQsTEQgYXMgU2VsZWN0UHJvbXB0LFJEIGFzIFRleHRQcm9tcHQsZkQgYXMgYmxvY2sscEQgYXMgaXNDYW5jZWwsY0QgYXMgdXBkYXRlU2V0dGluZ3N9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwKICAgICJpbXBvcnR7c3RyaXBWVENvbnRyb2xDaGFyYWN0ZXJzIGFzIFN9ZnJvbVwibm9kZTp1dGlsXCI7aW1wb3J0e1RleHRQcm9tcHQgYXMgUSxQYXNzd29yZFByb21wdCBhcyBYLENvbmZpcm1Qcm9tcHQgYXMgWixTZWxlY3RQcm9tcHQgYXMgZWUsU2VsZWN0S2V5UHJvbXB0IGFzIHRlLE11bHRpU2VsZWN0UHJvbXB0IGFzIHJlLEdyb3VwTXVsdGlTZWxlY3RQcm9tcHQgYXMgc2UsaXNDYW5jZWwgYXMgaWUsYmxvY2sgYXMgbmV9ZnJvbVwiQGNsYWNrL2NvcmVcIjtleHBvcnR7aXNDYW5jZWwsdXBkYXRlU2V0dGluZ3N9ZnJvbVwiQGNsYWNrL2NvcmVcIjtpbXBvcnQgeSBmcm9tXCJub2RlOnByb2Nlc3NcIjtpbXBvcnQgZSBmcm9tXCJwaWNvY29sb3JzXCI7aW1wb3J0e2N1cnNvciBhcyBvZSxlcmFzZSBhcyBhZX1mcm9tXCJzaXN0ZXJhbnNpXCI7ZnVuY3Rpb24gY2UoKXtyZXR1cm4geS5wbGF0Zm9ybSE9PVwid2luMzJcIj95LmVudi5URVJNIT09XCJsaW51eFwiOiEheS5lbnYuQ0l8fCEheS5lbnYuV1RfU0VTU0lPTnx8ISF5LmVudi5URVJNSU5VU19TVUJMSU1FfHx5LmVudi5Db25FbXVUYXNrPT09XCJ7Y21kOjpDbWRlcn1cInx8eS5lbnYuVEVSTV9QUk9HUkFNPT09XCJUZXJtaW51cy1TdWJsaW1lXCJ8fHkuZW52LlRFUk1fUFJPR1JBTT09PVwidnNjb2RlXCJ8fHkuZW52LlRFUk09PT1cInh0ZXJtLTI1NmNvbG9yXCJ8fHkuZW52LlRFUk09PT1cImFsYWNyaXR0eVwifHx5LmVudi5URVJNSU5BTF9FTVVMQVRPUj09PVwiSmV0QnJhaW5zLUplZGlUZXJtXCJ9Y29uc3QgVj1jZSgpLHU9KHQsbik9PlY/dDpuLGxlPXUoXCJcXHUyNUM2XCIsXCIqXCIpLEw9dShcIlxcdTI1QTBcIixcInhcIiksVz11KFwiXFx1MjVCMlwiLFwieFwiKSxDPXUoXCJcXHUyNUM3XCIsXCJvXCIpLHVlPXUoXCJcXHUyNTBDXCIsXCJUXCIpLG89dShcIlxcdTI1MDJcIixcInxcIiksZD11KFwiXFx1MjUxNFwiLFwiXFx1MjAxNFwiKSxrPXUoXCJcXHUyNUNGXCIsXCI+XCIpLFA9dShcIlxcdTI1Q0JcIixcIiBcIiksQT11KFwiXFx1MjVGQlwiLFwiW1xcdTIwMjJdXCIpLFQ9dShcIlxcdTI1RkNcIixcIlsrXVwiKSxGPXUoXCJcXHUyNUZCXCIsXCJbIF1cIiksJGU9dShcIlxcdTI1QUFcIixcIlxcdTIwMjJcIiksXz11KFwiXFx1MjUwMFwiLFwiLVwiKSxtZT11KFwiXFx1MjU2RVwiLFwiK1wiKSxkZT11KFwiXFx1MjUxQ1wiLFwiK1wiKSxwZT11KFwiXFx1MjU2RlwiLFwiK1wiKSxxPXUoXCJcXHUyNUNGXCIsXCJcXHUyMDIyXCIpLEQ9dShcIlxcdTI1QzZcIixcIipcIiksVT11KFwiXFx1MjVCMlwiLFwiIVwiKSxLPXUoXCJcXHUyNUEwXCIsXCJ4XCIpLGI9dD0+e3N3aXRjaCh0KXtjYXNlXCJpbml0aWFsXCI6Y2FzZVwiYWN0aXZlXCI6cmV0dXJuIGUuY3lhbihsZSk7Y2FzZVwiY2FuY2VsXCI6cmV0dXJuIGUucmVkKEwpO2Nhc2VcImVycm9yXCI6cmV0dXJuIGUueWVsbG93KFcpO2Nhc2VcInN1Ym1pdFwiOnJldHVybiBlLmdyZWVuKEMpfX0sRz10PT57Y29uc3R7Y3Vyc29yOm4sb3B0aW9uczpyLHN0eWxlOml9PXQscz10Lm1heEl0ZW1zPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYz1NYXRoLm1heChwcm9jZXNzLnN0ZG91dC5yb3dzLTQsMCksYT1NYXRoLm1pbihjLE1hdGgubWF4KHMsNSkpO2xldCBsPTA7bj49bCthLTM/bD1NYXRoLm1heChNYXRoLm1pbihuLWErMyxyLmxlbmd0aC1hKSwwKTpuPGwrMiYmKGw9TWF0aC5tYXgobi0yLDApKTtjb25zdCAkPWE8ci5sZW5ndGgmJmw+MCxnPWE8ci5sZW5ndGgmJmwrYTxyLmxlbmd0aDtyZXR1cm4gci5zbGljZShsLGwrYSkubWFwKChwLHYsZik9Pntjb25zdCBqPXY9PT0wJiYkLEU9dj09PWYubGVuZ3RoLTEmJmc7cmV0dXJuIGp8fEU/ZS5kaW0oXCIuLi5cIik6aShwLHYrbD09PW4pfSl9LGhlPXQ9Pm5ldyBRKHt2YWxpZGF0ZTp0LnZhbGlkYXRlLHBsYWNlaG9sZGVyOnQucGxhY2Vob2xkZXIsZGVmYXVsdFZhbHVlOnQuZGVmYXVsdFZhbHVlLGluaXRpYWxWYWx1ZTp0LmluaXRpYWxWYWx1ZSxyZW5kZXIoKXtjb25zdCBuPWAke2UuZ3JheShvKX1cbiR7Yih0aGlzLnN0YXRlKX0gICR7dC5tZXNzYWdlfVxuYCxyPXQucGxhY2Vob2xkZXI/ZS5pbnZlcnNlKHQucGxhY2Vob2xkZXJbMF0pK2UuZGltKHQucGxhY2Vob2xkZXIuc2xpY2UoMSkpOmUuaW52ZXJzZShlLmhpZGRlbihcIl9cIikpLGk9dGhpcy52YWx1ZT90aGlzLnZhbHVlV2l0aEN1cnNvcjpyO3N3aXRjaCh0aGlzLnN0YXRlKXtjYXNlXCJlcnJvclwiOnJldHVybmAke24udHJpbSgpfVxuJHtlLnllbGxvdyhvKX0gICR7aX1cbiR7ZS55ZWxsb3coZCl9ICAke2UueWVsbG93KHRoaXMuZXJyb3IpfVxuYDtjYXNlXCJzdWJtaXRcIjpyZXR1cm5gJHtufSR7ZS5ncmF5KG8pfSAgJHtlLmRpbSh0aGlzLnZhbHVlfHx0LnBsYWNlaG9sZGVyKX1gO2Nhc2VcImNhbmNlbFwiOnJldHVybmAke259JHtlLmdyYXkobyl9ICAke2Uuc3RyaWtldGhyb3VnaChlLmRpbSh0aGlzLnZhbHVlPz9cIlwiKSl9JHt0aGlzLnZhbHVlPy50cmltKCk/YFxuJHtlLmdyYXkobyl9YDpcIlwifWA7ZGVmYXVsdDpyZXR1cm5gJHtufSR7ZS5jeWFuKG8pfSAgJHtpfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKSxnZT10PT5uZXcgWCh7dmFsaWRhdGU6dC52YWxpZGF0ZSxtYXNrOnQubWFzaz8/JGUscmVuZGVyKCl7Y29uc3Qgbj1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmAscj10aGlzLnZhbHVlV2l0aEN1cnNvcixpPXRoaXMubWFza2VkO3N3aXRjaCh0aGlzLnN0YXRlKXtjYXNlXCJlcnJvclwiOnJldHVybmAke24udHJpbSgpfVxuJHtlLnllbGxvdyhvKX0gICR7aX1cbiR7ZS55ZWxsb3coZCl9ICAke2UueWVsbG93KHRoaXMuZXJyb3IpfVxuYDtjYXNlXCJzdWJtaXRcIjpyZXR1cm5gJHtufSR7ZS5ncmF5KG8pfSAgJHtlLmRpbShpKX1gO2Nhc2VcImNhbmNlbFwiOnJldHVybmAke259JHtlLmdyYXkobyl9ICAke2Uuc3RyaWtldGhyb3VnaChlLmRpbShpPz9cIlwiKSl9JHtpP2BcbiR7ZS5ncmF5KG8pfWA6XCJcIn1gO2RlZmF1bHQ6cmV0dXJuYCR7bn0ke2UuY3lhbihvKX0gICR7cn1cbiR7ZS5jeWFuKGQpfVxuYH19fSkucHJvbXB0KCkseWU9dD0+e2NvbnN0IG49dC5hY3RpdmU/P1wiWWVzXCIscj10LmluYWN0aXZlPz9cIk5vXCI7cmV0dXJuIG5ldyBaKHthY3RpdmU6bixpbmFjdGl2ZTpyLGluaXRpYWxWYWx1ZTp0LmluaXRpYWxWYWx1ZT8/ITAscmVuZGVyKCl7Y29uc3QgaT1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmAscz10aGlzLnZhbHVlP246cjtzd2l0Y2godGhpcy5zdGF0ZSl7Y2FzZVwic3VibWl0XCI6cmV0dXJuYCR7aX0ke2UuZ3JheShvKX0gICR7ZS5kaW0ocyl9YDtjYXNlXCJjYW5jZWxcIjpyZXR1cm5gJHtpfSR7ZS5ncmF5KG8pfSAgJHtlLnN0cmlrZXRocm91Z2goZS5kaW0ocykpfVxuJHtlLmdyYXkobyl9YDtkZWZhdWx0OnJldHVybmAke2l9JHtlLmN5YW4obyl9ICAke3RoaXMudmFsdWU/YCR7ZS5ncmVlbihrKX0gJHtufWA6YCR7ZS5kaW0oUCl9ICR7ZS5kaW0obil9YH0gJHtlLmRpbShcIi9cIil9ICR7dGhpcy52YWx1ZT9gJHtlLmRpbShQKX0gJHtlLmRpbShyKX1gOmAke2UuZ3JlZW4oayl9ICR7cn1gfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKX0sdmU9dD0+e2NvbnN0IG49KHIsaSk9Pntjb25zdCBzPXIubGFiZWw/P1N0cmluZyhyLnZhbHVlKTtzd2l0Y2goaSl7Y2FzZVwic2VsZWN0ZWRcIjpyZXR1cm5gJHtlLmRpbShzKX1gO2Nhc2VcImFjdGl2ZVwiOnJldHVybmAke2UuZ3JlZW4oayl9ICR7c30gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gO2Nhc2VcImNhbmNlbGxlZFwiOnJldHVybmAke2Uuc3RyaWtldGhyb3VnaChlLmRpbShzKSl9YDtkZWZhdWx0OnJldHVybmAke2UuZGltKFApfSAke2UuZGltKHMpfWB9fTtyZXR1cm4gbmV3IGVlKHtvcHRpb25zOnQub3B0aW9ucyxpbml0aWFsVmFsdWU6dC5pbml0aWFsVmFsdWUscmVuZGVyKCl7Y29uc3Qgcj1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmA7c3dpdGNoKHRoaXMuc3RhdGUpe2Nhc2VcInN1Ym1pdFwiOnJldHVybmAke3J9JHtlLmdyYXkobyl9ICAke24odGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXSxcInNlbGVjdGVkXCIpfWA7Y2FzZVwiY2FuY2VsXCI6cmV0dXJuYCR7cn0ke2UuZ3JheShvKX0gICR7bih0aGlzLm9wdGlvbnNbdGhpcy5jdXJzb3JdLFwiY2FuY2VsbGVkXCIpfVxuJHtlLmdyYXkobyl9YDtkZWZhdWx0OnJldHVybmAke3J9JHtlLmN5YW4obyl9ICAke0coe2N1cnNvcjp0aGlzLmN1cnNvcixvcHRpb25zOnRoaXMub3B0aW9ucyxtYXhJdGVtczp0Lm1heEl0ZW1zLHN0eWxlOihpLHMpPT5uKGkscz9cImFjdGl2ZVwiOlwiaW5hY3RpdmVcIil9KS5qb2luKGBcbiR7ZS5jeWFuKG8pfSAgYCl9XG4ke2UuY3lhbihkKX1cbmB9fX0pLnByb21wdCgpfSx3ZT10PT57Y29uc3Qgbj0ocixpPVwiaW5hY3RpdmVcIik9Pntjb25zdCBzPXIubGFiZWw/P1N0cmluZyhyLnZhbHVlKTtyZXR1cm4gaT09PVwic2VsZWN0ZWRcIj9gJHtlLmRpbShzKX1gOmk9PT1cImNhbmNlbGxlZFwiP2Ake2Uuc3RyaWtldGhyb3VnaChlLmRpbShzKSl9YDppPT09XCJhY3RpdmVcIj9gJHtlLmJnQ3lhbihlLmdyYXkoYCAke3IudmFsdWV9IGApKX0gJHtzfSAke3IuaGludD9lLmRpbShgKCR7ci5oaW50fSlgKTpcIlwifWA6YCR7ZS5ncmF5KGUuYmdXaGl0ZShlLmludmVyc2UoYCAke3IudmFsdWV9IGApKSl9ICR7c30gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gfTtyZXR1cm4gbmV3IHRlKHtvcHRpb25zOnQub3B0aW9ucyxpbml0aWFsVmFsdWU6dC5pbml0aWFsVmFsdWUscmVuZGVyKCl7Y29uc3Qgcj1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmA7c3dpdGNoKHRoaXMuc3RhdGUpe2Nhc2VcInN1Ym1pdFwiOnJldHVybmAke3J9JHtlLmdyYXkobyl9ICAke24odGhpcy5vcHRpb25zLmZpbmQoaT0+aS52YWx1ZT09PXRoaXMudmFsdWUpPz90Lm9wdGlvbnNbMF0sXCJzZWxlY3RlZFwiKX1gO2Nhc2VcImNhbmNlbFwiOnJldHVybmAke3J9JHtlLmdyYXkobyl9ICAke24odGhpcy5vcHRpb25zWzBdLFwiY2FuY2VsbGVkXCIpfVxuJHtlLmdyYXkobyl9YDtkZWZhdWx0OnJldHVybmAke3J9JHtlLmN5YW4obyl9ICAke3RoaXMub3B0aW9ucy5tYXAoKGkscyk9Pm4oaSxzPT09dGhpcy5jdXJzb3I/XCJhY3RpdmVcIjpcImluYWN0aXZlXCIpKS5qb2luKGBcbiR7ZS5jeWFuKG8pfSAgYCl9XG4ke2UuY3lhbihkKX1cbmB9fX0pLnByb21wdCgpfSxmZT10PT57Y29uc3Qgbj0ocixpKT0+e2NvbnN0IHM9ci5sYWJlbD8/U3RyaW5nKHIudmFsdWUpO3JldHVybiBpPT09XCJhY3RpdmVcIj9gJHtlLmN5YW4oQSl9ICR7c30gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gOmk9PT1cInNlbGVjdGVkXCI/YCR7ZS5ncmVlbihUKX0gJHtlLmRpbShzKX0gJHtyLmhpbnQ/ZS5kaW0oYCgke3IuaGludH0pYCk6XCJcIn1gOmk9PT1cImNhbmNlbGxlZFwiP2Ake2Uuc3RyaWtldGhyb3VnaChlLmRpbShzKSl9YDppPT09XCJhY3RpdmUtc2VsZWN0ZWRcIj9gJHtlLmdyZWVuKFQpfSAke3N9ICR7ci5oaW50P2UuZGltKGAoJHtyLmhpbnR9KWApOlwiXCJ9YDppPT09XCJzdWJtaXR0ZWRcIj9gJHtlLmRpbShzKX1gOmAke2UuZGltKEYpfSAke2UuZGltKHMpfWB9O3JldHVybiBuZXcgcmUoe29wdGlvbnM6dC5vcHRpb25zLGluaXRpYWxWYWx1ZXM6dC5pbml0aWFsVmFsdWVzLHJlcXVpcmVkOnQucmVxdWlyZWQ/PyEwLGN1cnNvckF0OnQuY3Vyc29yQXQsdmFsaWRhdGUocil7aWYodGhpcy5yZXF1aXJlZCYmci5sZW5ndGg9PT0wKXJldHVybmBQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBvcHRpb24uXG4ke2UucmVzZXQoZS5kaW0oYFByZXNzICR7ZS5ncmF5KGUuYmdXaGl0ZShlLmludmVyc2UoXCIgc3BhY2UgXCIpKSl9IHRvIHNlbGVjdCwgJHtlLmdyYXkoZS5iZ1doaXRlKGUuaW52ZXJzZShcIiBlbnRlciBcIikpKX0gdG8gc3VibWl0YCkpfWB9LHJlbmRlcigpe2NvbnN0IHI9YCR7ZS5ncmF5KG8pfVxuJHtiKHRoaXMuc3RhdGUpfSAgJHt0Lm1lc3NhZ2V9XG5gLGk9KHMsYyk9Pntjb25zdCBhPXRoaXMudmFsdWUuaW5jbHVkZXMocy52YWx1ZSk7cmV0dXJuIGMmJmE/bihzLFwiYWN0aXZlLXNlbGVjdGVkXCIpOmE/bihzLFwic2VsZWN0ZWRcIik6bihzLGM/XCJhY3RpdmVcIjpcImluYWN0aXZlXCIpfTtzd2l0Y2godGhpcy5zdGF0ZSl7Y2FzZVwic3VibWl0XCI6cmV0dXJuYCR7cn0ke2UuZ3JheShvKX0gICR7dGhpcy5vcHRpb25zLmZpbHRlcigoe3ZhbHVlOnN9KT0+dGhpcy52YWx1ZS5pbmNsdWRlcyhzKSkubWFwKHM9Pm4ocyxcInN1Ym1pdHRlZFwiKSkuam9pbihlLmRpbShcIiwgXCIpKXx8ZS5kaW0oXCJub25lXCIpfWA7Y2FzZVwiY2FuY2VsXCI6e2NvbnN0IHM9dGhpcy5vcHRpb25zLmZpbHRlcigoe3ZhbHVlOmN9KT0+dGhpcy52YWx1ZS5pbmNsdWRlcyhjKSkubWFwKGM9Pm4oYyxcImNhbmNlbGxlZFwiKSkuam9pbihlLmRpbShcIiwgXCIpKTtyZXR1cm5gJHtyfSR7ZS5ncmF5KG8pfSAgJHtzLnRyaW0oKT9gJHtzfVxuJHtlLmdyYXkobyl9YDpcIlwifWB9Y2FzZVwiZXJyb3JcIjp7Y29uc3Qgcz10aGlzLmVycm9yLnNwbGl0KGBcbmApLm1hcCgoYyxhKT0+YT09PTA/YCR7ZS55ZWxsb3coZCl9ICAke2UueWVsbG93KGMpfWA6YCAgICR7Y31gKS5qb2luKGBcbmApO3JldHVybmAke3IrZS55ZWxsb3cobyl9ICAke0coe29wdGlvbnM6dGhpcy5vcHRpb25zLGN1cnNvcjp0aGlzLmN1cnNvcixtYXhJdGVtczp0Lm1heEl0ZW1zLHN0eWxlOml9KS5qb2luKGBcbiR7ZS55ZWxsb3cobyl9ICBgKX1cbiR7c31cbmB9ZGVmYXVsdDpyZXR1cm5gJHtyfSR7ZS5jeWFuKG8pfSAgJHtHKHtvcHRpb25zOnRoaXMub3B0aW9ucyxjdXJzb3I6dGhpcy5jdXJzb3IsbWF4SXRlbXM6dC5tYXhJdGVtcyxzdHlsZTppfSkuam9pbihgXG4ke2UuY3lhbihvKX0gIGApfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKX0sYmU9dD0+e2NvbnN0e3NlbGVjdGFibGVHcm91cHM6bj0hMH09dCxyPShpLHMsYz1bXSk9Pntjb25zdCBhPWkubGFiZWw/P1N0cmluZyhpLnZhbHVlKSxsPXR5cGVvZiBpLmdyb3VwPT1cInN0cmluZ1wiLCQ9bCYmKGNbYy5pbmRleE9mKGkpKzFdPz97Z3JvdXA6ITB9KSxnPWwmJiQuZ3JvdXA9PT0hMCxwPWw/bj9gJHtnP2Q6b30gYDpcIiAgXCI6XCJcIjtpZihzPT09XCJhY3RpdmVcIilyZXR1cm5gJHtlLmRpbShwKX0ke2UuY3lhbihBKX0gJHthfSAke2kuaGludD9lLmRpbShgKCR7aS5oaW50fSlgKTpcIlwifWA7aWYocz09PVwiZ3JvdXAtYWN0aXZlXCIpcmV0dXJuYCR7cH0ke2UuY3lhbihBKX0gJHtlLmRpbShhKX1gO2lmKHM9PT1cImdyb3VwLWFjdGl2ZS1zZWxlY3RlZFwiKXJldHVybmAke3B9JHtlLmdyZWVuKFQpfSAke2UuZGltKGEpfWA7aWYocz09PVwic2VsZWN0ZWRcIil7Y29uc3QgZj1sfHxuP2UuZ3JlZW4oVCk6XCJcIjtyZXR1cm5gJHtlLmRpbShwKX0ke2Z9ICR7ZS5kaW0oYSl9ICR7aS5oaW50P2UuZGltKGAoJHtpLmhpbnR9KWApOlwiXCJ9YH1pZihzPT09XCJjYW5jZWxsZWRcIilyZXR1cm5gJHtlLnN0cmlrZXRocm91Z2goZS5kaW0oYSkpfWA7aWYocz09PVwiYWN0aXZlLXNlbGVjdGVkXCIpcmV0dXJuYCR7ZS5kaW0ocCl9JHtlLmdyZWVuKFQpfSAke2F9ICR7aS5oaW50P2UuZGltKGAoJHtpLmhpbnR9KWApOlwiXCJ9YDtpZihzPT09XCJzdWJtaXR0ZWRcIilyZXR1cm5gJHtlLmRpbShhKX1gO2NvbnN0IHY9bHx8bj9lLmRpbShGKTpcIlwiO3JldHVybmAke2UuZGltKHApfSR7dn0gJHtlLmRpbShhKX1gfTtyZXR1cm4gbmV3IHNlKHtvcHRpb25zOnQub3B0aW9ucyxpbml0aWFsVmFsdWVzOnQuaW5pdGlhbFZhbHVlcyxyZXF1aXJlZDp0LnJlcXVpcmVkPz8hMCxjdXJzb3JBdDp0LmN1cnNvckF0LHNlbGVjdGFibGVHcm91cHM6bix2YWxpZGF0ZShpKXtpZih0aGlzLnJlcXVpcmVkJiZpLmxlbmd0aD09PTApcmV0dXJuYFBsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIG9wdGlvbi5cbiR7ZS5yZXNldChlLmRpbShgUHJlc3MgJHtlLmdyYXkoZS5iZ1doaXRlKGUuaW52ZXJzZShcIiBzcGFjZSBcIikpKX0gdG8gc2VsZWN0LCAke2UuZ3JheShlLmJnV2hpdGUoZS5pbnZlcnNlKFwiIGVudGVyIFwiKSkpfSB0byBzdWJtaXRgKSl9YH0scmVuZGVyKCl7Y29uc3QgaT1gJHtlLmdyYXkobyl9XG4ke2IodGhpcy5zdGF0ZSl9ICAke3QubWVzc2FnZX1cbmA7c3dpdGNoKHRoaXMuc3RhdGUpe2Nhc2VcInN1Ym1pdFwiOnJldHVybmAke2l9JHtlLmdyYXkobyl9ICAke3RoaXMub3B0aW9ucy5maWx0ZXIoKHt2YWx1ZTpzfSk9PnRoaXMudmFsdWUuaW5jbHVkZXMocykpLm1hcChzPT5yKHMsXCJzdWJtaXR0ZWRcIikpLmpvaW4oZS5kaW0oXCIsIFwiKSl9YDtjYXNlXCJjYW5jZWxcIjp7Y29uc3Qgcz10aGlzLm9wdGlvbnMuZmlsdGVyKCh7dmFsdWU6Y30pPT50aGlzLnZhbHVlLmluY2x1ZGVzKGMpKS5tYXAoYz0+cihjLFwiY2FuY2VsbGVkXCIpKS5qb2luKGUuZGltKFwiLCBcIikpO3JldHVybmAke2l9JHtlLmdyYXkobyl9ICAke3MudHJpbSgpP2Ake3N9XG4ke2UuZ3JheShvKX1gOlwiXCJ9YH1jYXNlXCJlcnJvclwiOntjb25zdCBzPXRoaXMuZXJyb3Iuc3BsaXQoYFxuYCkubWFwKChjLGEpPT5hPT09MD9gJHtlLnllbGxvdyhkKX0gICR7ZS55ZWxsb3coYyl9YDpgICAgJHtjfWApLmpvaW4oYFxuYCk7cmV0dXJuYCR7aX0ke2UueWVsbG93KG8pfSAgJHt0aGlzLm9wdGlvbnMubWFwKChjLGEsbCk9Pntjb25zdCAkPXRoaXMudmFsdWUuaW5jbHVkZXMoYy52YWx1ZSl8fGMuZ3JvdXA9PT0hMCYmdGhpcy5pc0dyb3VwU2VsZWN0ZWQoYCR7Yy52YWx1ZX1gKSxnPWE9PT10aGlzLmN1cnNvcjtyZXR1cm4hZyYmdHlwZW9mIGMuZ3JvdXA9PVwic3RyaW5nXCImJnRoaXMub3B0aW9uc1t0aGlzLmN1cnNvcl0udmFsdWU9PT1jLmdyb3VwP3IoYywkP1wiZ3JvdXAtYWN0aXZlLXNlbGVjdGVkXCI6XCJncm91cC1hY3RpdmVcIixsKTpnJiYkP3IoYyxcImFjdGl2ZS1zZWxlY3RlZFwiLGwpOiQ/cihjLFwic2VsZWN0ZWRcIixsKTpyKGMsZz9cImFjdGl2ZVwiOlwiaW5hY3RpdmVcIixsKX0pLmpvaW4oYFxuJHtlLnllbGxvdyhvKX0gIGApfVxuJHtzfVxuYH1kZWZhdWx0OnJldHVybmAke2l9JHtlLmN5YW4obyl9ICAke3RoaXMub3B0aW9ucy5tYXAoKHMsYyxhKT0+e2NvbnN0IGw9dGhpcy52YWx1ZS5pbmNsdWRlcyhzLnZhbHVlKXx8cy5ncm91cD09PSEwJiZ0aGlzLmlzR3JvdXBTZWxlY3RlZChgJHtzLnZhbHVlfWApLCQ9Yz09PXRoaXMuY3Vyc29yO3JldHVybiEkJiZ0eXBlb2Ygcy5ncm91cD09XCJzdHJpbmdcIiYmdGhpcy5vcHRpb25zW3RoaXMuY3Vyc29yXS52YWx1ZT09PXMuZ3JvdXA/cihzLGw/XCJncm91cC1hY3RpdmUtc2VsZWN0ZWRcIjpcImdyb3VwLWFjdGl2ZVwiLGEpOiQmJmw/cihzLFwiYWN0aXZlLXNlbGVjdGVkXCIsYSk6bD9yKHMsXCJzZWxlY3RlZFwiLGEpOnIocywkP1wiYWN0aXZlXCI6XCJpbmFjdGl2ZVwiLGEpfSkuam9pbihgXG4ke2UuY3lhbihvKX0gIGApfVxuJHtlLmN5YW4oZCl9XG5gfX19KS5wcm9tcHQoKX0sTWU9KHQ9XCJcIixuPVwiXCIpPT57Y29uc3Qgcj1gXG4ke3R9XG5gLnNwbGl0KGBcbmApLGk9UyhuKS5sZW5ndGgscz1NYXRoLm1heChyLnJlZHVjZSgoYSxsKT0+e2NvbnN0ICQ9UyhsKTtyZXR1cm4gJC5sZW5ndGg+YT8kLmxlbmd0aDphfSwwKSxpKSsyLGM9ci5tYXAoYT0+YCR7ZS5ncmF5KG8pfSAgJHtlLmRpbShhKX0ke1wiIFwiLnJlcGVhdChzLVMoYSkubGVuZ3RoKX0ke2UuZ3JheShvKX1gKS5qb2luKGBcbmApO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2UuZ3JheShvKX1cbiR7ZS5ncmVlbihDKX0gICR7ZS5yZXNldChuKX0gJHtlLmdyYXkoXy5yZXBlYXQoTWF0aC5tYXgocy1pLTEsMSkpK21lKX1cbiR7Y31cbiR7ZS5ncmF5KGRlK18ucmVwZWF0KHMrMikrcGUpfVxuYCl9LHhlPSh0PVwiXCIpPT57cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7ZS5ncmF5KGQpfSAgJHtlLnJlZCh0KX1cblxuYCl9LEllPSh0PVwiXCIpPT57cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7ZS5ncmF5KHVlKX0gICR7dH1cbmApfSxTZT0odD1cIlwiKT0+e3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2UuZ3JheShvKX1cbiR7ZS5ncmF5KGQpfSAgJHt0fVxuXG5gKX0sTT17bWVzc2FnZToodD1cIlwiLHtzeW1ib2w6bj1lLmdyYXkobyl9PXt9KT0+e2NvbnN0IHI9W2Ake2UuZ3JheShvKX1gXTtpZih0KXtjb25zdFtpLC4uLnNdPXQuc3BsaXQoYFxuYCk7ci5wdXNoKGAke259ICAke2l9YCwuLi5zLm1hcChjPT5gJHtlLmdyYXkobyl9ICAke2N9YCkpfXByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3Iuam9pbihgXG5gKX1cbmApfSxpbmZvOnQ9PntNLm1lc3NhZ2UodCx7c3ltYm9sOmUuYmx1ZShxKX0pfSxzdWNjZXNzOnQ9PntNLm1lc3NhZ2UodCx7c3ltYm9sOmUuZ3JlZW4oRCl9KX0sc3RlcDp0PT57TS5tZXNzYWdlKHQse3N5bWJvbDplLmdyZWVuKEMpfSl9LHdhcm46dD0+e00ubWVzc2FnZSh0LHtzeW1ib2w6ZS55ZWxsb3coVSl9KX0sd2FybmluZzp0PT57TS53YXJuKHQpfSxlcnJvcjp0PT57TS5tZXNzYWdlKHQse3N5bWJvbDplLnJlZChLKX0pfX0sSj1gJHtlLmdyYXkobyl9ICBgLHg9e21lc3NhZ2U6YXN5bmModCx7c3ltYm9sOm49ZS5ncmF5KG8pfT17fSk9Pntwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtlLmdyYXkobyl9XG4ke259ICBgKTtsZXQgcj0zO2ZvciBhd2FpdChsZXQgaSBvZiB0KXtpPWkucmVwbGFjZSgvXFxuL2csYFxuJHtKfWApLGkuaW5jbHVkZXMoYFxuYCkmJihyPTMrUyhpLnNsaWNlKGkubGFzdEluZGV4T2YoYFxuYCkpKS5sZW5ndGgpO2NvbnN0IHM9UyhpKS5sZW5ndGg7citzPHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM/KHIrPXMscHJvY2Vzcy5zdGRvdXQud3JpdGUoaSkpOihwcm9jZXNzLnN0ZG91dC53cml0ZShgXG4ke0p9JHtpLnRyaW1TdGFydCgpfWApLHI9MytTKGkudHJpbVN0YXJ0KCkpLmxlbmd0aCl9cHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxuYCl9LGluZm86dD0+eC5tZXNzYWdlKHQse3N5bWJvbDplLmJsdWUocSl9KSxzdWNjZXNzOnQ9PngubWVzc2FnZSh0LHtzeW1ib2w6ZS5ncmVlbihEKX0pLHN0ZXA6dD0+eC5tZXNzYWdlKHQse3N5bWJvbDplLmdyZWVuKEMpfSksd2Fybjp0PT54Lm1lc3NhZ2UodCx7c3ltYm9sOmUueWVsbG93KFUpfSksd2FybmluZzp0PT54Lndhcm4odCksZXJyb3I6dD0+eC5tZXNzYWdlKHQse3N5bWJvbDplLnJlZChLKX0pfSxZPSh7aW5kaWNhdG9yOnQ9XCJkb3RzXCJ9PXt9KT0+e2NvbnN0IG49Vj9bXCJcXHUyNUQyXCIsXCJcXHUyNUQwXCIsXCJcXHUyNUQzXCIsXCJcXHUyNUQxXCJdOltcIlxcdTIwMjJcIixcIm9cIixcIk9cIixcIjBcIl0scj1WPzgwOjEyMCxpPXByb2Nlc3MuZW52LkNJPT09XCJ0cnVlXCI7bGV0IHMsYyxhPSExLGw9XCJcIiwkLGc9cGVyZm9ybWFuY2Uubm93KCk7Y29uc3QgcD1tPT57Y29uc3QgaD1tPjE/XCJTb21ldGhpbmcgd2VudCB3cm9uZ1wiOlwiQ2FuY2VsZWRcIjthJiZOKGgsbSl9LHY9KCk9PnAoMiksZj0oKT0+cCgxKSxqPSgpPT57cHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvclwiLHYpLHByb2Nlc3Mub24oXCJ1bmhhbmRsZWRSZWplY3Rpb25cIix2KSxwcm9jZXNzLm9uKFwiU0lHSU5UXCIsZikscHJvY2Vzcy5vbihcIlNJR1RFUk1cIixmKSxwcm9jZXNzLm9uKFwiZXhpdFwiLHApfSxFPSgpPT57cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihcInVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvclwiLHYpLHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoXCJ1bmhhbmRsZWRSZWplY3Rpb25cIix2KSxwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKFwiU0lHSU5UXCIsZikscHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihcIlNJR1RFUk1cIixmKSxwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKFwiZXhpdFwiLHApfSxCPSgpPT57aWYoJD09PXZvaWQgMClyZXR1cm47aSYmcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxuYCk7Y29uc3QgbT0kLnNwbGl0KGBcbmApO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKG9lLm1vdmUoLTk5OSxtLmxlbmd0aC0xKSkscHJvY2Vzcy5zdGRvdXQud3JpdGUoYWUuZG93bihtLmxlbmd0aCkpfSxSPW09Pm0ucmVwbGFjZSgvXFwuKyQvLFwiXCIpLE89bT0+e2NvbnN0IGg9KHBlcmZvcm1hbmNlLm5vdygpLW0pLzFlMyx3PU1hdGguZmxvb3IoaC82MCksST1NYXRoLmZsb29yKGglNjApO3JldHVybiB3PjA/YFske3d9bSAke0l9c11gOmBbJHtJfXNdYH0sSD0obT1cIlwiKT0+e2E9ITAscz1uZSgpLGw9UihtKSxnPXBlcmZvcm1hbmNlLm5vdygpLHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2UuZ3JheShvKX1cbmApO2xldCBoPTAsdz0wO2ooKSxjPXNldEludGVydmFsKCgpPT57aWYoaSYmbD09PSQpcmV0dXJuO0IoKSwkPWw7Y29uc3QgST1lLm1hZ2VudGEobltoXSk7aWYoaSlwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtJfSAgJHtsfS4uLmApO2Vsc2UgaWYodD09PVwidGltZXJcIilwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtJfSAgJHtsfSAke08oZyl9YCk7ZWxzZXtjb25zdCB6PVwiLlwiLnJlcGVhdChNYXRoLmZsb29yKHcpKS5zbGljZSgwLDMpO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0l9ICAke2x9JHt6fWApfWg9aCsxPG4ubGVuZ3RoP2grMTowLHc9dzxuLmxlbmd0aD93Ky4xMjU6MH0scil9LE49KG09XCJcIixoPTApPT57YT0hMSxjbGVhckludGVydmFsKGMpLEIoKTtjb25zdCB3PWg9PT0wP2UuZ3JlZW4oQyk6aD09PTE/ZS5yZWQoTCk6ZS5yZWQoVyk7bD1SKG0/P2wpLHQ9PT1cInRpbWVyXCI/cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7d30gICR7bH0gJHtPKGcpfVxuYCk6cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7d30gICR7bH1cbmApLEUoKSxzKCl9O3JldHVybntzdGFydDpILHN0b3A6TixtZXNzYWdlOihtPVwiXCIpPT57bD1SKG0/P2wpfX19LENlPWFzeW5jKHQsbik9Pntjb25zdCByPXt9LGk9T2JqZWN0LmtleXModCk7Zm9yKGNvbnN0IHMgb2YgaSl7Y29uc3QgYz10W3NdLGE9YXdhaXQgYyh7cmVzdWx0czpyfSk/LmNhdGNoKGw9Pnt0aHJvdyBsfSk7aWYodHlwZW9mIG4/Lm9uQ2FuY2VsPT1cImZ1bmN0aW9uXCImJmllKGEpKXtyW3NdPVwiY2FuY2VsZWRcIixuLm9uQ2FuY2VsKHtyZXN1bHRzOnJ9KTtjb250aW51ZX1yW3NdPWF9cmV0dXJuIHJ9LFRlPWFzeW5jIHQ9Pntmb3IoY29uc3QgbiBvZiB0KXtpZihuLmVuYWJsZWQ9PT0hMSljb250aW51ZTtjb25zdCByPVkoKTtyLnN0YXJ0KG4udGl0bGUpO2NvbnN0IGk9YXdhaXQgbi50YXNrKHIubWVzc2FnZSk7ci5zdG9wKGl8fG4udGl0bGUpfX07ZXhwb3J0e3hlIGFzIGNhbmNlbCx5ZSBhcyBjb25maXJtLENlIGFzIGdyb3VwLGJlIGFzIGdyb3VwTXVsdGlzZWxlY3QsSWUgYXMgaW50cm8sTSBhcyBsb2csZmUgYXMgbXVsdGlzZWxlY3QsTWUgYXMgbm90ZSxTZSBhcyBvdXRybyxnZSBhcyBwYXNzd29yZCx2ZSBhcyBzZWxlY3Qsd2UgYXMgc2VsZWN0S2V5LFkgYXMgc3Bpbm5lcix4IGFzIHN0cmVhbSxUZSBhcyB0YXNrcyxoZSBhcyB0ZXh0fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsCiAgICAiY29uc3QgaXNDb2xvckVuYWJsZWQgPSAhcHJvY2Vzcy5lbnYuTk9fQ09MT1IgJiYgKHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8IHByb2Nlc3Muc3Rkb3V0LmlzVFRZKTtcblxuY29uc3QgYmFzZUNvbG9ycyA9IFtcImJsdWVcIiwgXCJjeWFuXCIsIFwiZ3JheVwiLCBcImdyZWVuXCIsIFwibWFnZW50YVwiLCBcInJlZFwiLCBcIndoaXRlXCIsIFwieWVsbG93XCJdIGFzIGNvbnN0O1xuY29uc3QgYmFzZURlY29yYXRpb25zID0gW1wiYm9sZFwiLCBcImRpbVwiLCBcIml0YWxpY1wiLCBcInVuZGVybGluZVwiLCBcInJlc2V0XCJdIGFzIGNvbnN0O1xuY29uc3QgYW5zaUNvZGVzID0ge1xuICBib2xkOiBcIlxceDFiWzFtXCIsXG4gIGRpbTogXCJcXHgxYlsybVwiLFxuICBpdGFsaWM6IFwiXFx4MWJbM21cIixcbiAgcmVzZXQ6IFwiXFx4MWJbMG1cIixcbiAgdW5kZXJsaW5lOiBcIlxceDFiWzRtXCIsXG59O1xuXG5jb25zdCBicmlnaHRDb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgXCJcXHgxYlszMG1cIjogXCJcXHgxYls5MG1cIixcbiAgXCJcXHgxYlszMW1cIjogXCJcXHgxYls5MW1cIixcbiAgXCJcXHgxYlszMm1cIjogXCJcXHgxYls5Mm1cIixcbiAgXCJcXHgxYlszM21cIjogXCJcXHgxYls5M21cIixcbiAgXCJcXHgxYlszNG1cIjogXCJcXHgxYls5NG1cIixcbiAgXCJcXHgxYlszNW1cIjogXCJcXHgxYls5NW1cIixcbiAgXCJcXHgxYlszNm1cIjogXCJcXHgxYls5Nm1cIixcbiAgXCJcXHgxYlszN21cIjogXCJcXHgxYls5N21cIixcbn07XG5cbmZ1bmN0aW9uIGNvbG9yaXplKGNvbG9yQ29kZTogc3RyaW5nKSB7XG4gIHJldHVybiAodGV4dDogc3RyaW5nKSA9PiAoaXNDb2xvckVuYWJsZWQgPyBgJHtjb2xvckNvZGV9JHt0ZXh0fSR7YW5zaUNvZGVzLnJlc2V0fWAgOiB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29sb3JDb2RlKHsgYnJpZ2h0ID0gZmFsc2UsIGNvbG9yIH06IHsgYnJpZ2h0PzogYm9vbGVhbjsgY29sb3I6IHN0cmluZyB9KSB7XG4gIGNvbnN0IGJhc2VDb2xvciA9IEJ1bi5jb2xvcihjb2xvciwgXCJhbnNpXCIpO1xuICBpZiAoIWJhc2VDb2xvcikgcmV0dXJuIFwiXCI7XG5cbiAgcmV0dXJuIGJyaWdodCA/IGJyaWdodENvbG9yTWFwW2Jhc2VDb2xvcl0gfHwgYmFzZUNvbG9yIDogYmFzZUNvbG9yO1xufVxuXG5jb25zdCBjb2xvckRlY29yYXRpb25zID0gYmFzZUNvbG9ycy5yZWR1Y2UoXG4gIChhY2MsIGNvbG9yKSA9PiB7XG4gICAgYWNjW2NvbG9yXSA9IGNvbG9yaXplKGdldENvbG9yQ29kZSh7IGNvbG9yIH0pKTtcbiAgICBhY2NbYCR7Y29sb3J9QnJpZ2h0YF0gPSBjb2xvcml6ZShnZXRDb2xvckNvZGUoeyBicmlnaHQ6IHRydWUsIGNvbG9yIH0pKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LFxuICB7fSBhcyBSZWNvcmQ8XG4gICAgKHR5cGVvZiBiYXNlQ29sb3JzKVtudW1iZXJdIHwgYCR7KHR5cGVvZiBiYXNlQ29sb3JzKVtudW1iZXJdfUJyaWdodGAsXG4gICAgKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nXG4gID4sXG4pO1xuXG5jb25zdCBkZWNvcmF0aW9ucyA9IGJhc2VEZWNvcmF0aW9ucy5yZWR1Y2UoXG4gIChhY2MsIGRlY29yYXRpb24pID0+IHtcbiAgICBhY2NbZGVjb3JhdGlvbl0gPSBjb2xvcml6ZShhbnNpQ29kZXNbZGVjb3JhdGlvbl0pO1xuICAgIHJldHVybiBhY2M7XG4gIH0sXG4gIHt9IGFzIFJlY29yZDwodHlwZW9mIGJhc2VEZWNvcmF0aW9ucylbbnVtYmVyXSwgKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nPixcbik7XG5cbmV4cG9ydCBjb25zdCBjb2xvcnMgPSB7IC4uLmNvbG9yRGVjb3JhdGlvbnMsIC4uLmRlY29yYXRpb25zIH07XG4iLAogICAgImNvbnN0IHBlcSA9IG5ldyBVaW50MzJBcnJheSgweDEwMDAwKTtcbmNvbnN0IG15ZXJzXzMyID0gKGEsIGIpID0+IHtcbiAgICBjb25zdCBuID0gYS5sZW5ndGg7XG4gICAgY29uc3QgbSA9IGIubGVuZ3RoO1xuICAgIGNvbnN0IGxzdCA9IDEgPDwgKG4gLSAxKTtcbiAgICBsZXQgcHYgPSAtMTtcbiAgICBsZXQgbXYgPSAwO1xuICAgIGxldCBzYyA9IG47XG4gICAgbGV0IGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgcGVxW2EuY2hhckNvZGVBdChpKV0gfD0gMSA8PCBpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgIGxldCBlcSA9IHBlcVtiLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBjb25zdCB4diA9IGVxIHwgbXY7XG4gICAgICAgIGVxIHw9ICgoZXEgJiBwdikgKyBwdikgXiBwdjtcbiAgICAgICAgbXYgfD0gfihlcSB8IHB2KTtcbiAgICAgICAgcHYgJj0gZXE7XG4gICAgICAgIGlmIChtdiAmIGxzdCkge1xuICAgICAgICAgICAgc2MrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHYgJiBsc3QpIHtcbiAgICAgICAgICAgIHNjLS07XG4gICAgICAgIH1cbiAgICAgICAgbXYgPSAobXYgPDwgMSkgfCAxO1xuICAgICAgICBwdiA9IChwdiA8PCAxKSB8IH4oeHYgfCBtdik7XG4gICAgICAgIG12ICY9IHh2O1xuICAgIH1cbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHBlcVthLmNoYXJDb2RlQXQoaSldID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHNjO1xufTtcbmNvbnN0IG15ZXJzX3ggPSAoYiwgYSkgPT4ge1xuICAgIGNvbnN0IG4gPSBhLmxlbmd0aDtcbiAgICBjb25zdCBtID0gYi5sZW5ndGg7XG4gICAgY29uc3QgbWhjID0gW107XG4gICAgY29uc3QgcGhjID0gW107XG4gICAgY29uc3QgaHNpemUgPSBNYXRoLmNlaWwobiAvIDMyKTtcbiAgICBjb25zdCB2c2l6ZSA9IE1hdGguY2VpbChtIC8gMzIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaHNpemU7IGkrKykge1xuICAgICAgICBwaGNbaV0gPSAtMTtcbiAgICAgICAgbWhjW2ldID0gMDtcbiAgICB9XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAoOyBqIDwgdnNpemUgLSAxOyBqKyspIHtcbiAgICAgICAgbGV0IG12ID0gMDtcbiAgICAgICAgbGV0IHB2ID0gLTE7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gaiAqIDMyO1xuICAgICAgICBjb25zdCB2bGVuID0gTWF0aC5taW4oMzIsIG0pICsgc3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGsgPSBzdGFydDsgayA8IHZsZW47IGsrKykge1xuICAgICAgICAgICAgcGVxW2IuY2hhckNvZGVBdChrKV0gfD0gMSA8PCBrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcSA9IHBlcVthLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICAgICAgY29uc3QgcGIgPSAocGhjWyhpIC8gMzIpIHwgMF0gPj4+IGkpICYgMTtcbiAgICAgICAgICAgIGNvbnN0IG1iID0gKG1oY1soaSAvIDMyKSB8IDBdID4+PiBpKSAmIDE7XG4gICAgICAgICAgICBjb25zdCB4diA9IGVxIHwgbXY7XG4gICAgICAgICAgICBjb25zdCB4aCA9ICgoKChlcSB8IG1iKSAmIHB2KSArIHB2KSBeIHB2KSB8IGVxIHwgbWI7XG4gICAgICAgICAgICBsZXQgcGggPSBtdiB8IH4oeGggfCBwdik7XG4gICAgICAgICAgICBsZXQgbWggPSBwdiAmIHhoO1xuICAgICAgICAgICAgaWYgKChwaCA+Pj4gMzEpIF4gcGIpIHtcbiAgICAgICAgICAgICAgICBwaGNbKGkgLyAzMikgfCAwXSBePSAxIDw8IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1oID4+PiAzMSkgXiBtYikge1xuICAgICAgICAgICAgICAgIG1oY1soaSAvIDMyKSB8IDBdIF49IDEgPDwgaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBoID0gKHBoIDw8IDEpIHwgcGI7XG4gICAgICAgICAgICBtaCA9IChtaCA8PCAxKSB8IG1iO1xuICAgICAgICAgICAgcHYgPSBtaCB8IH4oeHYgfCBwaCk7XG4gICAgICAgICAgICBtdiA9IHBoICYgeHY7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IHN0YXJ0OyBrIDwgdmxlbjsgaysrKSB7XG4gICAgICAgICAgICBwZXFbYi5jaGFyQ29kZUF0KGspXSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG12ID0gMDtcbiAgICBsZXQgcHYgPSAtMTtcbiAgICBjb25zdCBzdGFydCA9IGogKiAzMjtcbiAgICBjb25zdCB2bGVuID0gTWF0aC5taW4oMzIsIG0gLSBzdGFydCkgKyBzdGFydDtcbiAgICBmb3IgKGxldCBrID0gc3RhcnQ7IGsgPCB2bGVuOyBrKyspIHtcbiAgICAgICAgcGVxW2IuY2hhckNvZGVBdChrKV0gfD0gMSA8PCBrO1xuICAgIH1cbiAgICBsZXQgc2NvcmUgPSBtO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVxID0gcGVxW2EuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGNvbnN0IHBiID0gKHBoY1soaSAvIDMyKSB8IDBdID4+PiBpKSAmIDE7XG4gICAgICAgIGNvbnN0IG1iID0gKG1oY1soaSAvIDMyKSB8IDBdID4+PiBpKSAmIDE7XG4gICAgICAgIGNvbnN0IHh2ID0gZXEgfCBtdjtcbiAgICAgICAgY29uc3QgeGggPSAoKCgoZXEgfCBtYikgJiBwdikgKyBwdikgXiBwdikgfCBlcSB8IG1iO1xuICAgICAgICBsZXQgcGggPSBtdiB8IH4oeGggfCBwdik7XG4gICAgICAgIGxldCBtaCA9IHB2ICYgeGg7XG4gICAgICAgIHNjb3JlICs9IChwaCA+Pj4gKG0gLSAxKSkgJiAxO1xuICAgICAgICBzY29yZSAtPSAobWggPj4+IChtIC0gMSkpICYgMTtcbiAgICAgICAgaWYgKChwaCA+Pj4gMzEpIF4gcGIpIHtcbiAgICAgICAgICAgIHBoY1soaSAvIDMyKSB8IDBdIF49IDEgPDwgaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKG1oID4+PiAzMSkgXiBtYikge1xuICAgICAgICAgICAgbWhjWyhpIC8gMzIpIHwgMF0gXj0gMSA8PCBpO1xuICAgICAgICB9XG4gICAgICAgIHBoID0gKHBoIDw8IDEpIHwgcGI7XG4gICAgICAgIG1oID0gKG1oIDw8IDEpIHwgbWI7XG4gICAgICAgIHB2ID0gbWggfCB+KHh2IHwgcGgpO1xuICAgICAgICBtdiA9IHBoICYgeHY7XG4gICAgfVxuICAgIGZvciAobGV0IGsgPSBzdGFydDsgayA8IHZsZW47IGsrKykge1xuICAgICAgICBwZXFbYi5jaGFyQ29kZUF0KGspXSA9IDA7XG4gICAgfVxuICAgIHJldHVybiBzY29yZTtcbn07XG5jb25zdCBkaXN0YW5jZSA9IChhLCBiKSA9PiB7XG4gICAgaWYgKGEubGVuZ3RoIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG1wID0gYjtcbiAgICAgICAgYiA9IGE7XG4gICAgICAgIGEgPSB0bXA7XG4gICAgfVxuICAgIGlmIChiLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCA8PSAzMikge1xuICAgICAgICByZXR1cm4gbXllcnNfMzIoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBteWVyc194KGEsIGIpO1xufTtcbmNvbnN0IGNsb3Nlc3QgPSAoc3RyLCBhcnIpID0+IHtcbiAgICBsZXQgbWluX2Rpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgbGV0IG1pbl9pbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGlzdCA9IGRpc3RhbmNlKHN0ciwgYXJyW2ldKTtcbiAgICAgICAgaWYgKGRpc3QgPCBtaW5fZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIG1pbl9kaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICBtaW5faW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJbbWluX2luZGV4XTtcbn07XG5leHBvcnQgeyBjbG9zZXN0LCBkaXN0YW5jZSB9O1xuIiwKICAgICJpbXBvcnQgeyBjbG9zZXN0LCBkaXN0YW5jZSB9IGZyb20gXCJmYXN0ZXN0LWxldmVuc2h0ZWluXCI7XG5cbi8qKlxuICogRmluZCB0aGUgY2xvc2VzdCBtYXRjaCBmcm9tIGEgbGlzdCBvZiBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2VzdE1hdGNoKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzdWx0ID0gY2xvc2VzdChcbiAgICBpbnB1dC50b0xvd2VyQ2FzZSgpLFxuICAgIG9wdGlvbnMubWFwKChvKSA9PiBvLnRvTG93ZXJDYXNlKCkpLFxuICApO1xuICBjb25zdCBpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLnRvTG93ZXJDYXNlKCkgPT09IHJlc3VsdCk7XG4gIGNvbnN0IG1hdGNoID0gaW5kZXggIT09IC0xID8gb3B0aW9uc1tpbmRleF0gOiBudWxsO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIC8vIE9ubHkgc3VnZ2VzdCBpZiB0aGUgZGlzdGFuY2UgaXMgcmVhc29uYWJsZSAobGVzcyB0aGFuIGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQpXG4gIGNvbnN0IG1hdGNoRGlzdGFuY2UgPSBkaXN0YW5jZShpbnB1dC50b0xvd2VyQ2FzZSgpLCBtYXRjaC50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKG1hdGNoRGlzdGFuY2UgPiBNYXRoLm1heCgzLCBpbnB1dC5sZW5ndGggLyAyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIEdldCBzdWdnZXN0aW9ucyBmb3IgYSBtaXN0eXBlZCBjb21tYW5kXG4gKiBSZXR1cm5zIHVwIHRvIDMgY2xvc2VzdCBtYXRjaGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWdnZXN0aW9ucyhpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBzdHJpbmdbXSwgbWF4U3VnZ2VzdGlvbnMgPSAzKTogc3RyaW5nW10ge1xuICBjb25zdCBkaXN0YW5jZXMgPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgIGRpc3RhbmNlOiBkaXN0YW5jZShpbnB1dC50b0xvd2VyQ2FzZSgpLCBvcHRpb24udG9Mb3dlckNhc2UoKSksXG4gICAgb3B0aW9uLFxuICB9KSk7XG5cbiAgLy8gU29ydCBieSBkaXN0YW5jZSBhbmQgZmlsdGVyIHJlYXNvbmFibGUgbWF0Y2hlc1xuICBjb25zdCBzdWdnZXN0aW9ucyA9IGRpc3RhbmNlc1xuICAgIC5maWx0ZXIoKHsgZGlzdGFuY2UgfSkgPT4gZGlzdGFuY2UgPD0gTWF0aC5tYXgoMywgaW5wdXQubGVuZ3RoIC8gMikpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlKVxuICAgIC5zbGljZSgwLCBtYXhTdWdnZXN0aW9ucylcbiAgICAubWFwKCh7IG9wdGlvbiB9KSA9PiBvcHRpb24pO1xuXG4gIHJldHVybiBzdWdnZXN0aW9ucztcbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgY29tbW9uIHR5cG9zIGFuZCBhYmJyZXZpYXRpb25zIHVzaW5nIGEgcHJvdmlkZWQgbWFwcGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDb21tb25NaXN0YWtlcyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgbWlzdGFrZXNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIG1pc3Rha2VzTWFwW2lucHV0LnRvTG93ZXJDYXNlKCldIHx8IG51bGw7XG59XG4iLAogICAgImV4cG9ydCBpbnRlcmZhY2UgR3JhY2VmdWxPcHRpb25zIHtcbiAgZmFsbGJhY2s/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgbG9nTGV2ZWw/OiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ3JhY2VmdWxUcnk8VD4oXG4gIG9wZXJhdGlvbjogKCkgPT4gVCB8IFByb21pc2U8VD4sXG4gIG9wdGlvbnM6IEdyYWNlZnVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgZmFsbGJhY2ssIGxvZ0xldmVsID0gXCJ3YXJuXCIsIG1lc3NhZ2UgPSBcIk9wZXJhdGlvbiBmYWlsZWQgZ3JhY2VmdWxseVwiIH0gPSBvcHRpb25zO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBjb25zb2xlW2xvZ0xldmVsXShgJHttZXNzYWdlfTogJHtlcnJvck1lc3NhZ2V9YCk7XG5cbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICB9IGNhdGNoIChmYWxsYmFja0Vycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYEZhbGxiYWNrIGFsc28gZmFpbGVkOiAke2ZhbGxiYWNrRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhbGxiYWNrRXJyb3IubWVzc2FnZSA6IFN0cmluZyhmYWxsYmFja0Vycm9yKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyYWNlZnVsV3JhcHBlcjxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICBmbjogVCxcbiAgb3B0aW9uczogR3JhY2VmdWxPcHRpb25zID0ge30sXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPFQ+IHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4ge1xuICAgIHJldHVybiBncmFjZWZ1bFRyeSgoKSA9PiBmbiguLi5hcmdzKSwgb3B0aW9ucyk7XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGNvbG9ycyB9IGZyb20gXCIuL2NvbG9yc1wiO1xuXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIERFQlVHID0gMCxcbiAgSU5GTyA9IDEsXG4gIFdBUk4gPSAyLFxuICBFUlJPUiA9IDMsXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoe1xuICBwcmVmaXggPSBcIlwiLFxuICBsZXZlbCA9IHByb2Nlc3MuZW52LkRFQlVHID8gTG9nTGV2ZWwuREVCVUcgOiBMb2dMZXZlbC5JTkZPLFxufToge1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIGxldmVsPzogTG9nTGV2ZWw7XG59ID0ge30pID0+IHtcbiAgZnVuY3Rpb24gZGVidWcoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgaWYgKGxldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXJncy5qb2luKFwiIFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKGZvcm1hdCh7IGxldmVsOiBjb2xvcnMuZGltKFwiREVCVUdcIiksIG1lc3NhZ2UsIHByZWZpeCB9KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5mbyguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwuSU5GTykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3Muam9pbihcIiBcIik7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0KHsgbGV2ZWw6IGNvbG9ycy5jeWFuKFwiSU5GTyBcIiksIG1lc3NhZ2UsIHByZWZpeCB9KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd2FybiguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwuV0FSTikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3Muam9pbihcIiBcIik7XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0KHsgbGV2ZWw6IGNvbG9ycy55ZWxsb3coXCJXQVJOIFwiKSwgbWVzc2FnZSwgcHJlZml4IH0pKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwuRVJST1IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLmpvaW4oXCIgXCIpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoeyBsZXZlbDogY29sb3JzLnJlZChcIkVSUk9SXCIpLCBtZXNzYWdlLCBwcmVmaXggfSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoaWxkKGNoaWxkUHJlZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9nZ2VyKHsgbGV2ZWwsIHByZWZpeDogYCR7cHJlZml4fToke2NoaWxkUHJlZml4fWAgfSk7XG4gIH1cblxuICByZXR1cm4geyBjaGlsZCwgZGVidWcsIGVycm9yLCBpbmZvLCB3YXJuIH07XG59O1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCk7XG5cbmZ1bmN0aW9uIGZvcm1hdCh7IHByZWZpeCwgbGV2ZWwsIG1lc3NhZ2UgfTogeyBwcmVmaXg6IHN0cmluZzsgbGV2ZWw6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0pIHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVsxXT8uc3BsaXQoXCIuXCIpWzBdIHx8IFwiXCI7XG4gIGNvbnN0IGZvcm1hdFByZWZpeCA9IHByZWZpeCA/IGBbJHtwcmVmaXh9XSBgIDogXCJcIjtcbiAgcmV0dXJuIGAke2NvbG9ycy5kaW0odGltZXN0YW1wIHx8IFwiXCIpfSAke2xldmVsfSAke2Zvcm1hdFByZWZpeH0ke21lc3NhZ2V9YDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIkByNW4vdG9vbHMvdXRpbHMvbG9nZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIGluaXRpYWxEZWxheT86IG51bWJlcjtcbiAgbWF4RGVsYXk/OiBudW1iZXI7XG4gIGJhY2tvZmZNdWx0aXBsaWVyPzogbnVtYmVyO1xuICByZXRyeWFibGVFcnJvcnM/OiBzdHJpbmdbXTtcbiAgb25SZXRyeT86IChhdHRlbXB0OiBudW1iZXIsIGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9PUFRJT05TOiBSZXF1aXJlZDxSZXRyeU9wdGlvbnM+ID0ge1xuICBiYWNrb2ZmTXVsdGlwbGllcjogMixcbiAgaW5pdGlhbERlbGF5OiAxMDAwLFxuICBtYXhBdHRlbXB0czogMyxcbiAgbWF4RGVsYXk6IDMwMDAwLFxuICBvblJldHJ5OiAoYXR0ZW1wdCwgZXJyb3IpID0+IHtcbiAgICBsb2dnZXIud2FybihgUmV0cnkgYXR0ZW1wdCAke2F0dGVtcHR9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gIH0sXG4gIHJldHJ5YWJsZUVycm9yczogW1xuICAgIFwiRUNPTk5SRUZVU0VEXCIsXG4gICAgXCJFQ09OTlJFU0VUXCIsXG4gICAgXCJFVElNRURPVVRcIixcbiAgICBcIkVOT1RGT1VORFwiLFxuICAgIFwicmF0ZSBsaW1pdFwiLFxuICAgIFwiNDI5XCIsXG4gICAgXCI1MDNcIixcbiAgICBcIjUwMlwiLFxuICAgIFwiNTA0XCIsXG4gICAgXCJucG0gRVJSIVwiLFxuICAgIFwiRVBVQkxJU0hDT05GTElDVFwiLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgb3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBvcHRpb25zOiBSZXRyeU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvcHRzID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcbiAgbGV0IGxhc3RFcnJvcjogRXJyb3IgPSBuZXcgRXJyb3IoXCJPcGVyYXRpb24gZmFpbGVkXCIpO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG9wdHMubWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcblxuICAgICAgY29uc3QgaXNSZXRyeWFibGUgPSBvcHRzLnJldHJ5YWJsZUVycm9ycy5zb21lKChyZXRyeWFibGVFcnJvcikgPT5cbiAgICAgICAgbGFzdEVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhyZXRyeWFibGVFcnJvci50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNSZXRyeWFibGUgfHwgYXR0ZW1wdCA9PT0gb3B0cy5tYXhBdHRlbXB0cykge1xuICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICB9XG5cbiAgICAgIG9wdHMub25SZXRyeShhdHRlbXB0LCBsYXN0RXJyb3IpO1xuXG4gICAgICBjb25zdCBkZWxheSA9IE1hdGgubWluKFxuICAgICAgICBvcHRzLmluaXRpYWxEZWxheSAqIG9wdHMuYmFja29mZk11bHRpcGxpZXIgKiogKGF0dGVtcHQgLSAxKSxcbiAgICAgICAgb3B0cy5tYXhEZWxheSxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbGFzdEVycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmV0cnlhYmxlT3BlcmF0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55Pj4oXG4gIG9wZXJhdGlvbjogVCxcbiAgb3B0aW9uczogUmV0cnlPcHRpb25zID0ge30sXG4pOiBUIHtcbiAgcmV0dXJuIChhc3luYyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4ge1xuICAgIHJldHVybiB3aXRoUmV0cnkoKCkgPT4gb3BlcmF0aW9uKC4uLmFyZ3MpLCBvcHRpb25zKTtcbiAgfSkgYXMgVDtcbn1cbiIsCiAgICAiLy8gQ29yZVxuZXhwb3J0IGNvbnN0IGJhbmRpdHlwZSA9IChjYXN0KSA9PiB7XG4gICAgY2FzdC5tYXAgPSAoZXh0cmEpID0+IGJhbmRpdHlwZSgocmF3KSA9PiBleHRyYShjYXN0KHJhdykpKTtcbiAgICBjYXN0Lm9yID0gKGV4dHJhKSA9PiBiYW5kaXR5cGUoKHJhdykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNhc3QocmF3KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0cmEocmF3KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjYXN0O1xufTtcbi8vIEVycm9yIGhlbHBlclxuZXhwb3J0IGNvbnN0IGZhaWwgPSAoKSA9PiBcImJhZCBiYW5kaXR5cGVcIigpO1xuZXhwb3J0IGNvbnN0IG5ldmVyID0gKCkgPT4gYmFuZGl0eXBlKCgpID0+IGZhaWwoKSk7XG5leHBvcnQgY29uc3QgdW5rbm93biA9ICgpID0+IGJhbmRpdHlwZSgocmF3KSA9PiByYXcpO1xuZXhwb3J0IGNvbnN0IGVudW1zID0gKGl0ZW1zKSA9PiBiYW5kaXR5cGUoKHJhdykgPT4gaXRlbXMuaW5jbHVkZXMocmF3KSA/IHJhdyA6IGZhaWwoKSk7XG5leHBvcnQgY29uc3QgbGlrZSA9ICgodGFnKSA9PiBiYW5kaXR5cGUoKHJhdykgPT4gKHR5cGVvZiByYXcgPT09IHR5cGVvZiB0YWcgPyByYXcgOiBmYWlsKCkpKSk7XG5leHBvcnQgY29uc3Qgc3RyaW5nID0gKCkgPT4gbGlrZShcIlwiKTtcbmV4cG9ydCBjb25zdCBudW1iZXIgPSAoKSA9PiBsaWtlKDApO1xuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiBsaWtlKHRydWUpO1xuZXhwb3J0IGNvbnN0IGZ1bmMgPSAoKSA9PiBsaWtlKGZhaWwpO1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsID0gKCkgPT4gbGlrZSgpO1xuZXhwb3J0IGNvbnN0IG51bGxhYmxlID0gKCkgPT4gYmFuZGl0eXBlKChyYXcpID0+IChyYXcgPT09IG51bGwgPyByYXcgOiBmYWlsKCkpKTtcbi8vIENsYXNzZXNcbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IChwcm90bykgPT4gYmFuZGl0eXBlKChyYXcpID0+IChyYXcgaW5zdGFuY2VvZiBwcm90byA/IHJhdyA6IGZhaWwoKSkpO1xuLy8gb2JqZWN0c1xuZXhwb3J0IGNvbnN0IHJlY29yZCA9IChjYXN0VmFsdWUpID0+IGluc3RhbmNlKE9iamVjdCkubWFwKChyYXcpID0+IHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgICAgY29uc3QgZiA9IGNhc3RWYWx1ZShyYXdba2V5XSk7XG4gICAgICAgIGYgIT09IHVuZGVmaW5lZCAmJiAocmVzW2tleV0gPSBmKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn0pO1xuZXhwb3J0IGNvbnN0IG9iamVjdCA9IChzY2hlbWEpID0+IGluc3RhbmNlKE9iamVjdCkubWFwKChyYXcpID0+IHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgZiA9IHNjaGVtYVtrZXldKHJhd1trZXldKTtcbiAgICAgICAgZiAhPT0gdW5kZWZpbmVkICYmIChyZXNba2V5XSA9IGYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufSk7XG5leHBvcnQgY29uc3Qgb2JqZWN0TG9vc2UgPSAoc2NoZW1hKSA9PiBpbnN0YW5jZShPYmplY3QpLm1hcCgocmF3KSA9PiB7XG4gICAgY29uc3QgcmVzID0geyAuLi5yYXcgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgZiA9IHNjaGVtYVtrZXldKHJhd1trZXldKTtcbiAgICAgICAgZiAhPT0gdW5kZWZpbmVkICYmIChyZXNba2V5XSA9IGYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufSk7XG4vLyBhcnJheXNcbmV4cG9ydCBjb25zdCBhcnJheSA9IChjYXN0SXRlbSkgPT4gaW5zdGFuY2UoQXJyYXkpLm1hcCgoYXJyKSA9PiBhcnIubWFwKGNhc3RJdGVtKSk7XG5leHBvcnQgY29uc3QgdHVwbGUgPSAoc2NoZW1hKSA9PiBpbnN0YW5jZShBcnJheSkubWFwKChhcnIpID0+IHtcbiAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2FzdCwgaSkgPT4gY2FzdChhcnJbaV0pKTtcbn0pO1xuZXhwb3J0IGNvbnN0IHNldCA9IChjYXN0SXRlbSkgPT4gaW5zdGFuY2UoU2V0KS5tYXAoKHNldCkgPT4gbmV3IFNldChbLi4uc2V0XS5tYXAoY2FzdEl0ZW0pKSk7XG5leHBvcnQgY29uc3QgbWFwID0gKGNhc3RLZXksIGNhc3RWYWx1ZSkgPT4gaW5zdGFuY2UoTWFwKS5tYXAoKG1hcCkgPT4ge1xuICAgIHJldHVybiBuZXcgTWFwKFsuLi5tYXBdLm1hcCgoW2ssIHZdKSA9PiBbY2FzdEtleShrKSwgY2FzdFZhbHVlKHYpXSkpO1xufSk7XG5leHBvcnQgY29uc3QgbGF6eSA9IChjYXN0KSA9PiBiYW5kaXR5cGUoKHJhdykgPT4gY2FzdCgpKHJhdykpO1xuIiwKICAgICJpbXBvcnQge1xuICBhcnJheSxcbiAgdHlwZSBJbmZlciBhcyBCVEluZmVyLFxuICBib29sZWFuLFxuICB0eXBlIENhc3QsXG4gIGVudW1zLFxuICBmYWlsLFxuICBudW1iZXIsXG4gIG9iamVjdCxcbiAgb3B0aW9uYWwsXG4gIHJlY29yZCxcbiAgc3RyaW5nLFxuICBiYW5kaXR5cGUgYXMgdmFsaWRhdG9yLFxufSBmcm9tIFwiYmFuZGl0eXBlc1wiO1xuXG5leHBvcnQgeyBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgb2JqZWN0LCBhcnJheSwgb3B0aW9uYWwsIHJlY29yZCwgZW51bXMsIGZhaWwgfTtcblxuZXhwb3J0IHR5cGUgSW5mZXI8VCBleHRlbmRzIENhc3Q8dW5rbm93bj4+ID0gQlRJbmZlcjxUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uPEEsIEI+KHNjaGVtYUE6IENhc3Q8QT4sIHNjaGVtYUI6IENhc3Q8Qj4pOiBDYXN0PEEgfCBCPiB7XG4gIHJldHVybiB2YWxpZGF0b3IoKGRhdGE6IHVua25vd24pOiBBIHwgQiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzY2hlbWFBKGRhdGEpIGFzIEE7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2NoZW1hQihkYXRhKSBhcyBCO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHNjaGVtYSBpbiB1bmlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFRvPFQ+KHNjaGVtYTogQ2FzdDxUPiwgZGVmYXVsdFZhbHVlOiBUKSB7XG4gIHJldHVybiAoZGF0YTogdW5rbm93bikgPT4ge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgcmV0dXJuIHNjaGVtYShkYXRhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aXZlSW50KCkge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbiA9IG51bWJlcigpKGRhdGEpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBuIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmwoKSB7XG4gIHJldHVybiB2YWxpZGF0b3IoKGRhdGE6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzID0gc3RyaW5nKCkoZGF0YSk7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwocyk7XG4gICAgICByZXR1cm4gcztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgYmUgYSB2YWxpZCBVUkxcIik7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKCkge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0cmluZygpKGRhdGEpO1xuICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBiZSBhIHZhbGlkIGVtYWlsXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfSk7XG59XG5cbi8vIE1pbi9tYXggaGVscGVyc1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihtaW5WYWw6IG51bWJlcikge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbiA9IG51bWJlcigpKGRhdGEpO1xuICAgIGlmIChuIDwgbWluVmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE11c3QgYmUgYXQgbGVhc3QgJHttaW5WYWx9YCk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbkxlbmd0aChtaW5MZW46IG51bWJlcikge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0cmluZygpKGRhdGEpO1xuICAgIGlmIChzLmxlbmd0aCA8IG1pbkxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdXN0IGJlIGF0IGxlYXN0ICR7bWluTGVufSBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4KHBhdHRlcm46IFJlZ0V4cCwgbWVzc2FnZT86IHN0cmluZykge1xuICByZXR1cm4gdmFsaWRhdG9yKChkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0cmluZygpKGRhdGEpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSB8fCBgTXVzdCBtYXRjaCBwYXR0ZXJuICR7cGF0dGVybn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH0pO1xufVxuXG4vLyBIZWxwZXIgdG8gY3JlYXRlIHNjaGVtYXMgd2l0aCBiZXR0ZXIgZXJyb3IgaGFuZGxpbmdcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdG9yOiBDYXN0PFQ+KSB7XG4gIHJldHVybiB7XG4gICAgcGFyc2UodmFsdWU6IHVua25vd24pOiBUIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJWYWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNhZmVQYXJzZSh2YWx1ZTogdW5rbm93bik6IHsgc3VjY2VzczogdHJ1ZTsgZGF0YTogVCB9IHwgeyBzdWNjZXNzOiBmYWxzZTsgZXJyb3I6IEVycm9yIH0ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogdmFsaWRhdG9yKHZhbHVlKSwgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIiksXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0b3IsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maWdWYWxpZGF0b3I8VD4oc2NoZW1hOiBDYXN0PFQ+KSB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IGNyZWF0ZVNjaGVtYShzY2hlbWEpO1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHZhbGlkYXRvci5wYXJzZSxcbiAgICBwYXJzZUpTT04oanNvbjogc3RyaW5nKTogVCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNhZmVQYXJzZTogdmFsaWRhdG9yLnNhZmVQYXJzZSxcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHsgY29uZmlybSwgaXNDYW5jZWwsIHRleHQgfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gXCJAcjVuL2NsaS1jb3JlXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBnZXRQcm9maWxlLCBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0UGFja2FnZVBhdGggfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgd29ya2VyTWFuYWdlciB9IGZyb20gXCIuLi9saWIvd29ya2VyLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3JlYXRlQXJncyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoeyBwcmVmaXg6IFwiY3JlYXRlTWFjaGluZXNcIiB9KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1hY2hpbmVzKCkge1xuICBjb25zdCBhcmdzID0gYXdhaXQgZ2V0QXJncygpO1xuICBjb25zdCB7IG92ZXJ3cml0ZSwgZGlyZWN0b3J5LCBudW1iZXJPZk1hY2hpbmVzLCBvcywgcnVuLCBuYW1lLCBsYWJlbHMsIHJ1bm5lckdyb3VwIH0gPSBhcmdzO1xuICBsZXQgeyB0b2tlbiwgdXJsIH0gPSBhcmdzO1xuXG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVVJMICgtdSkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIGNvbnN0IHNldHRpbmdzVXJsID0gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsKTtcblxuICAgIGNvbnN0IHNob3VsZE9wZW4gPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6IGBObyB0b2tlbiBwcm92aWRlZC4gV291bGQgeW91IGxpa2UgdG8gb3BlbiBHaXRIdWIgdG8gZ2V0IGEgcnVubmVyIHRva2VuP1xcbiAgJHtzZXR0aW5nc1VybH1gLFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHNob3VsZE9wZW4pIHx8ICFzaG91bGRPcGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgcnVubmVyc1wiKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcIk9wZW5pbmcgR2l0SHViIHJ1bm5lciBzZXR0aW5ncy4uLlwiKTtcbiAgICBhd2FpdCAkYG9wZW4gJHtzZXR0aW5nc1VybH1gLnF1aWV0KCk7XG5cbiAgICBjb25zdCB0b2tlbklucHV0ID0gYXdhaXQgdGV4dCh7XG4gICAgICBtZXNzYWdlOiBcIkVudGVyIHRoZSBydW5uZXIgcmVnaXN0cmF0aW9uIHRva2VuOlwiLFxuICAgICAgcGxhY2Vob2xkZXI6IFwiQVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcIixcbiAgICAgIHZhbGlkYXRlOiAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFwiVG9rZW4gaXMgcmVxdWlyZWRcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChpc0NhbmNlbCh0b2tlbklucHV0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIHJ1bm5lcnNcIik7XG4gICAgfVxuXG4gICAgdG9rZW4gPSB0b2tlbklucHV0LnRyaW0oKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGBDcmVhdGluZyAke251bWJlck9mTWFjaGluZXN9IHJ1bm5lcnMgaW4gJHtkaXJlY3Rvcnl9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgT1M6ICR7b3N9LCBOYW1lOiAke25hbWV9LCBMYWJlbHM6ICR7bGFiZWxzIHx8IFwibm9uZVwifWApO1xuXG4gIGNvbnN0IGRpcmVjdG9yeUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKGRpcmVjdG9yeSkuZXhpc3RzKCk7XG4gIGlmIChkaXJlY3RvcnlFeGlzdHMpIHtcbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICBsb2dnZXIud2FybihgRGlyZWN0b3J5ICR7ZGlyZWN0b3J5fSBleGlzdHMsIHJlbW92aW5nLi4uYCk7XG4gICAgICBhd2FpdCAkYHJtIC1yZiAke2RpcmVjdG9yeX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERpcmVjdG9yeSAke2RpcmVjdG9yeX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBydW5uZXJCYXNlID0gYXdhaXQgZG93bmxvYWRMYXRlc3RSdW5uZXJJbWFnZSh7IGRpcmVjdG9yeSwgb3MgfSk7XG4gIGF3YWl0IGV4dHJhY3RBbmRDb3B5UnVubmVyQmFzZSh7IGRpcmVjdG9yeSwgbnVtYmVyT2ZNYWNoaW5lcywgb3ZlcndyaXRlLCBydW5uZXJCYXNlIH0pO1xuXG4gIGlmICghcnVuKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJSdW5uZXJzIGNyZWF0ZWQgYnV0IG5vdCBzdGFydGVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXJ0UnVubmVycyh7IGRpcmVjdG9yeSwgbGFiZWxzLCBuYW1lLCBudW1iZXJPZk1hY2hpbmVzLCBydW5uZXJHcm91cCwgdG9rZW4sIHVybCB9KTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgR2l0SHViIFVSTCBmb3JtYXRzXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSA9PT0gXCJnaXRodWIuY29tXCIgfHwgcGFyc2VkVXJsLmhvc3RuYW1lID09PSBcInd3dy5naXRodWIuY29tXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICAvLyBPcmdhbml6YXRpb24gVVJMOiBodHRwczovL2dpdGh1Yi5jb20vb3Jncy9teW9yZ1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIC8vIFJlcG9zaXRvcnkgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwb1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3BhdGhQYXJ0c1swXX0vJHtwYXRoUGFydHNbMV19L3NldHRpbmdzL2FjdGlvbnMvcnVubmVycy9uZXdgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHaXRIdWIgRW50ZXJwcmlzZSBVUkxcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vb3JnYW5pemF0aW9ucy8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBVUkwgaWYgd2UgY2FuJ3QgcGFyc2UgaXRcbiAgICByZXR1cm4gdXJsO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBVUkwgcGFyc2luZyBmYWlscywgcmV0dXJuIHRoZSBvcmlnaW5hbFxuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXJncygpOiBQcm9taXNlPENyZWF0ZUFyZ3M+IHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzOiBCdW4uYXJndixcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb25maWc6IHsgc2hvcnQ6IFwiY1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkaXJlY3Rvcnk6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsIHNob3J0OiBcImRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbmFtZTogeyBkZWZhdWx0OiBcInJ1bm5lclwiLCBzaG9ydDogXCJuXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIG51bWJlck9mTWFjaGluZXM6IHsgZGVmYXVsdDogXCIxXCIsIHNob3J0OiBcIm1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgb3M6IHsgZGVmYXVsdDogXCJvc3hcIiwgc2hvcnQ6IFwic1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBvdmVyd3JpdGU6IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcImZcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgIHByb2ZpbGU6IHsgc2hvcnQ6IFwicFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBydW46IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcInJcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgIHJ1bm5lckdyb3VwOiB7IHNob3J0OiBcImdcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB1cmw6IHsgc2hvcnQ6IFwidVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoeyBjb25maWdQYXRoOiB2YWx1ZXMuY29uZmlnIGFzIHN0cmluZyB9KTtcbiAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoY29uZmlnLCB2YWx1ZXMucHJvZmlsZSBhcyBzdHJpbmcpO1xuXG4gIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgIGRpcmVjdG9yeTogdmFsdWVzLmRpcmVjdG9yeSBhcyBzdHJpbmcsXG4gICAgbGFiZWxzOiB2YWx1ZXMubGFiZWxzIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBuYW1lOiB2YWx1ZXMubmFtZSBhcyBzdHJpbmcsXG4gICAgbnVtYmVyT2ZNYWNoaW5lczogdmFsdWVzLm51bWJlck9mTWFjaGluZXMgYXMgc3RyaW5nLFxuICAgIG9zOiB2YWx1ZXMub3MgYXMgc3RyaW5nLFxuICAgIG92ZXJ3cml0ZTogdmFsdWVzLm92ZXJ3cml0ZSBhcyBib29sZWFuLFxuICAgIHJ1bjogdmFsdWVzLnJ1biBhcyBib29sZWFuLFxuICAgIHJ1bm5lckdyb3VwOiB2YWx1ZXMucnVubmVyR3JvdXAgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRva2VuOiB2YWx1ZXMudG9rZW4gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHVybDogdmFsdWVzLnVybCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIH07XG5cbiAgLy8gTWVyZ2Ugd2l0aCBwcm9maWxlXG4gIGlmIChwcm9maWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdG9yeTogYmFzZUFyZ3MuZGlyZWN0b3J5ID8/IHByb2ZpbGUuZGlyZWN0b3J5ID8/IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLFxuICAgICAgbGFiZWxzOiBiYXNlQXJncy5sYWJlbHMgPz8gcHJvZmlsZS5sYWJlbHMsXG4gICAgICBuYW1lOiBiYXNlQXJncy5uYW1lID8/IHByb2ZpbGUubmFtZSA/PyBcInJ1bm5lclwiLFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogYmFzZUFyZ3MubnVtYmVyT2ZNYWNoaW5lcyA/PyBTdHJpbmcocHJvZmlsZS5udW1iZXJPZk1hY2hpbmVzKSA/PyBcIjFcIixcbiAgICAgIG9zOiAoYmFzZUFyZ3Mub3MgPz8gcHJvZmlsZS5vcyA/PyBcIm9zeFwiKSBhcyBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCIsXG4gICAgICBvdmVyd3JpdGU6IGJhc2VBcmdzLm92ZXJ3cml0ZSA/PyBwcm9maWxlLm92ZXJ3cml0ZSA/PyBmYWxzZSxcbiAgICAgIHJ1bjogYmFzZUFyZ3MucnVuID8/IHByb2ZpbGUucnVuID8/IGZhbHNlLFxuICAgICAgcnVubmVyR3JvdXA6IGJhc2VBcmdzLnJ1bm5lckdyb3VwID8/IHByb2ZpbGUucnVubmVyR3JvdXAsXG4gICAgICB0b2tlbjogYmFzZUFyZ3MudG9rZW4sXG4gICAgICB1cmw6IGJhc2VBcmdzLnVybCA/PyBwcm9maWxlLnVybCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkaXJlY3Rvcnk6IGJhc2VBcmdzLmRpcmVjdG9yeSxcbiAgICBsYWJlbHM6IGJhc2VBcmdzLmxhYmVscyxcbiAgICBuYW1lOiBiYXNlQXJncy5uYW1lLFxuICAgIG51bWJlck9mTWFjaGluZXM6IGJhc2VBcmdzLm51bWJlck9mTWFjaGluZXMsXG4gICAgb3M6IGJhc2VBcmdzLm9zIGFzIFwib3N4XCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIixcbiAgICBvdmVyd3JpdGU6IGJhc2VBcmdzLm92ZXJ3cml0ZSxcbiAgICBydW46IGJhc2VBcmdzLnJ1bixcbiAgICBydW5uZXJHcm91cDogYmFzZUFyZ3MucnVubmVyR3JvdXAsXG4gICAgdG9rZW46IGJhc2VBcmdzLnRva2VuLFxuICAgIHVybDogYmFzZUFyZ3MudXJsLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZExhdGVzdFJ1bm5lckltYWdlKHsgZGlyZWN0b3J5LCBvcyB9OiB7IGRpcmVjdG9yeTogc3RyaW5nOyBvczogc3RyaW5nIH0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmNoaWxkKFwiZG93bmxvYWRcIik7XG5cbiAgbG9nLmluZm8oYEZldGNoaW5nIGxhdGVzdCBydW5uZXIgdmVyc2lvbiBmb3IgJHtvc30uLi5gKTtcbiAgY29uc3QgcmVsZWFzZUluZm8gPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT5cbiAgICAgIChcbiAgICAgICAgYXdhaXQgJGBjdXJsIC1McyAtbyAvZGV2L251bGwgLXcgXCIle3VybF9lZmZlY3RpdmV9XCIgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzL2xhdGVzdGBcbiAgICAgICkudGV4dCgpLFxuICAgIHtcbiAgICAgIG9uUmV0cnk6IChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICBsb2cud2FybihgUmV0cnlpbmcgR2l0SHViIEFQSSBjYWxsIChhdHRlbXB0ICR7YXR0ZW1wdH0pOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIGNvbnN0IGxhc3RSZWxlYXNlID0gKGF3YWl0ICRgYmFzZW5hbWUgJHtyZWxlYXNlSW5mb31gKS50ZXh0KCk7XG5cbiAgY29uc3QgdmVyc2lvbiA9IGxhc3RSZWxlYXNlLnRyaW0oKS5yZXBsYWNlKFwidlwiLCBcIlwiKTtcbiAgY29uc3QgcnVubmVyQmFzZSA9IGBhY3Rpb25zLXJ1bm5lci0ke29zfS14NjQtJHt2ZXJzaW9ufS50YXIuZ3pgO1xuICBjb25zdCBnaXRodWJSZWxlYXNlVXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3J1bm5lci9yZWxlYXNlcy9kb3dubG9hZC92JHt2ZXJzaW9ufS8ke3J1bm5lckJhc2V9YDtcblxuICBsb2cuZGVidWcoYFJ1bm5lciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG4gIGxvZy5kZWJ1ZyhgRG93bmxvYWQgVVJMOiAke2dpdGh1YlJlbGVhc2VVcmx9YCk7XG5cbiAgYXdhaXQgJGBta2RpciAtcCAke2RpcmVjdG9yeX1gO1xuICBhd2FpdCAkYG1rZGlyIC1wICR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG5cbiAgY29uc3QgcnVubmVyRmlsZUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKGAke2RpcmVjdG9yeX0vJHtydW5uZXJCYXNlfWApLmV4aXN0cygpO1xuICBpZiAoIXJ1bm5lckZpbGVFeGlzdHMpIHtcbiAgICBsb2cuaW5mbyhcIkRvd25sb2FkaW5nIHJ1bm5lciBpbWFnZS4uLlwiKTtcbiAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCAkYGN1cmwgLW8gJHtkaXJlY3Rvcnl9LyR7cnVubmVyQmFzZX0gLUwgJHtnaXRodWJSZWxlYXNlVXJsfWAsXG4gICAgICB7XG4gICAgICAgIG1heEF0dGVtcHRzOiA1LFxuICAgICAgICBvblJldHJ5OiAoYXR0ZW1wdCwgZXJyb3IpID0+IHtcbiAgICAgICAgICBsb2cud2FybihgUmV0cnlpbmcgcnVubmVyIGRvd25sb2FkIChhdHRlbXB0ICR7YXR0ZW1wdH0pOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgbG9nLmluZm8oXCJEb3dubG9hZCBjb21wbGV0ZVwiKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhcIlJ1bm5lciBpbWFnZSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgZG93bmxvYWRcIik7XG4gIH1cblxuICByZXR1cm4gcnVubmVyQmFzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdEFuZENvcHlSdW5uZXJCYXNlKHtcbiAgb3ZlcndyaXRlLFxuICBudW1iZXJPZk1hY2hpbmVzLFxuICBkaXJlY3RvcnksXG4gIHJ1bm5lckJhc2UsXG59OiB7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgbnVtYmVyT2ZNYWNoaW5lczogc3RyaW5nO1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgcnVubmVyQmFzZTogc3RyaW5nO1xufSkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuY2hpbGQoXCJleHRyYWN0XCIpO1xuICBjb25zdCBudW1NYWNoaW5lcyA9IE51bWJlcihudW1iZXJPZk1hY2hpbmVzKTtcblxuICBjb25zdCBjcHVDb3VudCA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1bi5zcGF3blN5bmMoW1wibnByb2NcIl0pO1xuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChyZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpLCAxMCkgfHwgNDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1bi5zcGF3blN5bmMoW1wic3lzY3RsXCIsIFwiLW5cIiwgXCJody5uY3B1XCJdKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChyZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpLCAxMCkgfHwgNDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gNDtcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gTWF0aC5taW4oTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihjcHVDb3VudCAvIDIpKSwgbnVtTWFjaGluZXMsIDgpO1xuXG4gIGxvZy5pbmZvKGBFeHRyYWN0aW5nICR7bnVtTWFjaGluZXN9IHJ1bm5lcnMgd2l0aCBjb25jdXJyZW5jeSBvZiAke2NvbmN1cnJlbmN5fWApO1xuXG4gIGNvbnN0IHRhc2tzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtTWFjaGluZXMgfSwgKF8sIGkpID0+IGkgKyAxKS5tYXAoKHJ1bm5lckluZGV4KSA9PiAoe1xuICAgIGV4ZWN1dGU6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hY2hpbmVEaXJlY3RvcnkgPSBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YDtcbiAgICAgIGNvbnN0IG1hY2hpbmVFeGlzdHMgPSBhd2FpdCBCdW4uZmlsZShtYWNoaW5lRGlyZWN0b3J5KS5leGlzdHMoKTtcblxuICAgICAgaWYgKG1hY2hpbmVFeGlzdHMpIHtcbiAgICAgICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgTWFjaGluZSAke3J1bm5lckluZGV4fSBhbHJlYWR5IGV4aXN0cywgcmVtb3ZpbmcuLi5gKTtcbiAgICAgICAgICBhd2FpdCAkYHJtIC1yZiAke21hY2hpbmVEaXJlY3Rvcnl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZGVidWcoYE1hY2hpbmUgJHtydW5uZXJJbmRleH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nLi4uYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0ICRgbWtkaXIgLXAgJHttYWNoaW5lRGlyZWN0b3J5fWA7XG5cbiAgICAgIGF3YWl0ICRgdGFyIHh6ZiAke3J1bm5lckJhc2V9IC1DICR7bWFjaGluZURpcmVjdG9yeS5yZXBsYWNlKGAke2RpcmVjdG9yeX0vYCwgXCJcIil9YC5jd2QoXG4gICAgICAgIGRpcmVjdG9yeSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJ1bm5lclBhdGggPSBgJHtnZXRQYWNrYWdlUGF0aCgpfS9zcmMvcnVubmVyYDtcblxuICAgICAgYXdhaXQgJGBjcCAtUiAke3J1bm5lclBhdGh9L2hvb2tzICR7bWFjaGluZURpcmVjdG9yeX1gO1xuICAgICAgYXdhaXQgJGBjcCAtUiAke3J1bm5lclBhdGh9Ly5ydW5uZXItZW52ICR7bWFjaGluZURpcmVjdG9yeX0vLnJ1bm5lci1lbnZgO1xuXG4gICAgICBsb2cuZGVidWcoYE1hY2hpbmUgJHtydW5uZXJJbmRleH0gZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseWApO1xuICAgIH0sXG4gICAgcnVubmVySW5kZXgsXG4gIH0pKTtcblxuICBjb25zdCByZXN1bHRzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpICs9IGNvbmN1cnJlbmN5KSB7XG4gICAgY29uc3QgYmF0Y2ggPSB0YXNrcy5zbGljZShpLCBpICsgY29uY3VycmVuY3kpO1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaC5tYXAoKHRhc2spID0+IHRhc2suZXhlY3V0ZSgpKSk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzdWx0XSBvZiBiYXRjaFJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgcnVubmVyICR7YmF0Y2hbaW5kZXhdPy5ydW5uZXJJbmRleH06ICR7cmVzdWx0LnJlYXNvbn1gKTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LnJlYXNvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgZXh0cmFjdGVkICR7bnVtTWFjaGluZXN9IHJ1bm5lcnNgKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRSdW5uZXJzKHtcbiAgZGlyZWN0b3J5LFxuICBudW1iZXJPZk1hY2hpbmVzLFxuICB0b2tlbixcbiAgdXJsLFxuICBuYW1lLFxuICBsYWJlbHMsXG4gIHJ1bm5lckdyb3VwLFxufToge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgbnVtYmVyT2ZNYWNoaW5lczogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbHM/OiBzdHJpbmc7XG4gIHJ1bm5lckdyb3VwPzogc3RyaW5nO1xufSkge1xuICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgJHtudW1iZXJPZk1hY2hpbmVzfSBydW5uZXJzLi4uYCk7XG5cbiAgZm9yIChsZXQgcnVubmVySW5kZXggPSAxOyBydW5uZXJJbmRleCA8PSBOdW1iZXIobnVtYmVyT2ZNYWNoaW5lcyk7IHJ1bm5lckluZGV4KyspIHtcbiAgICBjb25zdCB3b3JrZXJQYXRoID0gYCR7Z2V0UGFja2FnZVBhdGgoKX0vc3JjL3J1bm5lci13b3JrZXIudHNgO1xuICAgIGNvbnN0IHdvcmtlck5hbWUgPSBgJHtuYW1lfS0ke3J1bm5lckluZGV4fWA7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJQYXRoLCB7IG5hbWU6IHdvcmtlck5hbWUsIHJlZjogdHJ1ZSB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7d29ya2VyTmFtZX0gc3RhcnRlZGApO1xuXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBpbmRleDogcnVubmVySW5kZXgsXG4gICAgICAgIGxhYmVscyxcbiAgICAgICAgbWFjaGluZUN3ZDogYCR7ZGlyZWN0b3J5fS9tYWNoaW5lcy8ke3J1bm5lckluZGV4fWAsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJ1bm5lckdyb3VwLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgdXJsLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHsgZGF0YSB9KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGRhdGEudHlwZSA9PT0gXCJlcnJvclwiID8gXCJlcnJvclwiIDogXCJpbmZvXCI7XG4gICAgICBsb2dnZXJbbGV2ZWxdKGAke3dvcmtlck5hbWV9OiAke2RhdGEubWVzc2FnZX1gKTtcbiAgICB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFdvcmtlciAke3dvcmtlck5hbWV9IGVycm9yOmAsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYFdvcmtlciAke3dvcmtlck5hbWV9IGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApO1xuICAgIH0pO1xuXG4gICAgd29ya2VyTWFuYWdlci5hZGQod29ya2VyKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKFwiQWxsIHdvcmtlcnMgc3RhcnRlZC4gUHJlc3MgQ3RybCtDIHRvIHN0b3AgYWxsIG1hY2hpbmVzXCIpO1xufVxuIiwKICAgICJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IFBBVEhTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZywgQ29uZmlnRmlsZU9wdGlvbnMsIFByb2ZpbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uZmlnU2NoZW1hIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ09ORklHX0ZJTEVfTkFNRVMgPSBbXCJoeWRyYS5qc29uXCIsIFwiLmh5ZHJhLmpzb25cIiwgXCJoeWRyYS50b21sXCIsIFwiLmh5ZHJhLnRvbWxcIl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShzdGFydFBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBDT05GSUdfRklMRV9OQU1FUykge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHN0YXJ0UGF0aCwgZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGUgPSBCdW4uZmlsZShjb25maWdQYXRoKTtcbiAgICBpZiAoYXdhaXQgZmlsZS5leGlzdHMoKSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ1BhdGg7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhvcHRpb25zPzogQ29uZmlnRmlsZU9wdGlvbnMpOiBQcm9taXNlPENvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IG9wdGlvbnM/LmNvbmZpZ1BhdGggfHwgKGF3YWl0IGZpbmRDb25maWdGaWxlKCkpO1xuXG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IEJ1bi5maWxlKGNvbmZpZ1BhdGgpO1xuICBpZiAoIShhd2FpdCBmaWxlLmV4aXN0cygpKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG4gICAgY29uc3QgZGF0YSA9IGNvbmZpZ1BhdGguZW5kc1dpdGgoXCIudG9tbFwiKSA/IGF3YWl0IHBhcnNlVG9tbChjb250ZW50KSA6IEpTT04ucGFyc2UoY29udGVudCk7XG5cbiAgICByZXR1cm4gQ29uZmlnU2NoZW1hLnBhcnNlKGRhdGEpIGFzIENvbmZpZztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmZpZyBmaWxlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9maWxlKFxuICBjb25maWc6IENvbmZpZyB8IG51bGwsXG4gIHByb2ZpbGVOYW1lPzogc3RyaW5nLFxuKTogUHJvbWlzZTxQcm9maWxlIHwgbnVsbD4ge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgbmFtZSA9IHByb2ZpbGVOYW1lIHx8IGNvbmZpZy5kZWZhdWx0UHJvZmlsZTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gY29uZmlnLnByb2ZpbGVzW25hbWVdIHx8IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByb2ZpbGVXaXRoQXJnczxUIGV4dGVuZHMgUGFydGlhbDxQcm9maWxlPj4oXG4gIHByb2ZpbGU6IFByb2ZpbGUgfCBudWxsLFxuICBhcmdzOiBULFxuKTogVCB7XG4gIGlmICghcHJvZmlsZSkgcmV0dXJuIGFyZ3M7XG5cbiAgY29uc3QgbWVyZ2VkID0geyAuLi5hcmdzIH0gYXMgVDtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9maWxlKSkge1xuICAgIGlmICgobWVyZ2VkIGFzIGFueSlba2V5XSA9PT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIChtZXJnZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VUb21sKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgdGVtcEZpbGUgPSBqb2luKFBBVEhTLlRFTVBfRElSLCBgaHlkcmEtY29uZmlnLSR7RGF0ZS5ub3coKX0udG9tbGApO1xuICBhd2FpdCBCdW4ud3JpdGUodGVtcEZpbGUsIGNvbnRlbnQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHRlbXBGaWxlKTtcbiAgICBhd2FpdCAkYHJtIC1mICR7dGVtcEZpbGV9YC5xdWlldCgpO1xuICAgIHJldHVybiBtb2R1bGUuZGVmYXVsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhd2FpdCAkYHJtIC1mICR7dGVtcEZpbGV9YC5xdWlldCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIFRPTUwgY29uZmlndXJhdGlvbjogJHtlcnJvcn1gKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVFMgPSB7XG4gIERJUkVDVE9SWTogXCIuL2doLXJ1bm5lcnNcIixcbiAgTkFNRTogXCJydW5uZXJcIixcbiAgTlVNQkVSX09GX01BQ0hJTkVTOiAxLFxuICBPUzogXCJvc3hcIiBhcyBjb25zdCxcbiAgUFJPRklMRTogXCJkZWZhdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgRklMRV9FWFRFTlNJT05TID0geyBKU09OOiBcIi5qc29uXCIsIFRPTUw6IFwiLnRvbWxcIiB9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgV09SS0VSX01FU1NBR0VTID0geyBFUlJPUjogXCJlcnJvclwiLCBTVUNDRVNTOiBcInN1Y2Nlc3NcIiB9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUEFUSFMgPSB7IE1BQ0hJTkVTX0RJUjogXCJtYWNoaW5lc1wiLCBURU1QX0RJUjogdG1wZGlyKCkgfSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFRJTUVPVVRTID0geyBET1dOTE9BRDogMzAwMDAwLCBXT1JLRVJfUkVTUE9OU0U6IDUwMDAgfSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9PUyA9IFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luXCJdIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU3VwcG9ydGVkT1MgPSAodHlwZW9mIFNVUFBPUlRFRF9PUylbbnVtYmVyXTtcbiIsCiAgICAiaW1wb3J0IHtcbiAgYm9vbGVhbixcbiAgY3JlYXRlU2NoZW1hLFxuICBkZWZhdWx0VG8sXG4gIGVudW1zLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsLFxuICBwb3NpdGl2ZUludCxcbiAgcmVjb3JkLFxuICBzdHJpbmcsXG4gIHVuaW9uLFxufSBmcm9tIFwiQHI1bi9jbGktY29yZVwiO1xuXG5jb25zdCBwcm9maWxlVmFsaWRhdG9yID0gb2JqZWN0KHtcbiAgZGlyZWN0b3J5OiBkZWZhdWx0VG8oc3RyaW5nKCksIFwiLi9naC1ydW5uZXJzXCIpLFxuICBsYWJlbHM6IHVuaW9uKG9wdGlvbmFsKCksIHN0cmluZygpKSxcbiAgbmFtZTogZGVmYXVsdFRvKHN0cmluZygpLCBcInJ1bm5lclwiKSxcbiAgbnVtYmVyT2ZNYWNoaW5lczogZGVmYXVsdFRvKHBvc2l0aXZlSW50KCksIDEpLFxuICBvczogZGVmYXVsdFRvKGVudW1zKFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luZG93c1wiXSksIFwibGludXhcIiksXG4gIG92ZXJ3cml0ZTogZGVmYXVsdFRvKGJvb2xlYW4oKSwgZmFsc2UpLFxuICBydW46IGRlZmF1bHRUbyhib29sZWFuKCksIGZhbHNlKSxcbiAgcnVubmVyR3JvdXA6IHVuaW9uKG9wdGlvbmFsKCksIHN0cmluZygpKSxcbiAgdXJsOiB1bmlvbihvcHRpb25hbCgpLCBzdHJpbmcoKSksXG59KTtcblxuZXhwb3J0IGNvbnN0IFByb2ZpbGVTY2hlbWEgPSBjcmVhdGVTY2hlbWEocHJvZmlsZVZhbGlkYXRvcik7XG5cbmV4cG9ydCBjb25zdCBDb25maWdTY2hlbWEgPSBjcmVhdGVTY2hlbWEoXG4gIG9iamVjdCh7XG4gICAgZGVmYXVsdFByb2ZpbGU6IHVuaW9uKG9wdGlvbmFsKCksIHN0cmluZygpKSxcbiAgICBwcm9maWxlczogcmVjb3JkKFByb2ZpbGVTY2hlbWEudmFsaWRhdG9yKSxcbiAgfSksXG4pO1xuXG4vLyBNYW51YWxseSBkZWZpbmUgdHlwZXMgZm9yIGJldHRlciB0cmVlLXNoYWtpbmdcbmV4cG9ydCB0eXBlIFByb2ZpbGUgPSB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBsYWJlbHM/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVtYmVyT2ZNYWNoaW5lczogbnVtYmVyO1xuICBvczogXCJvc3hcIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiO1xuICBvdmVyd3JpdGU6IGJvb2xlYW47XG4gIHJ1bjogYm9vbGVhbjtcbiAgcnVubmVyR3JvdXA/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHsgZGVmYXVsdFByb2ZpbGU/OiBzdHJpbmc7IHByb2ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9maWxlPiB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZpbGVPcHRpb25zIHtcbiAgY29uZmlnUGF0aD86IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmdzIHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIG9zOiBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCI7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgcnVuOiBib29sZWFuO1xuICBydW5uZXJHcm91cD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5BcmdzIHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIHJ1bm5lckdyb3VwPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZUFyZ3Mge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgZm9yY2U6IGJvb2xlYW47XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHtcbiAgYm9vbGVhbixcbiAgY3JlYXRlU2NoZW1hLFxuICBkZWZhdWx0VG8sXG4gIGVudW1zLFxuICBvYmplY3QsXG4gIG9wdGlvbmFsLFxuICByZWdleCxcbiAgc3RyaW5nLFxuICB1bmlvbixcbiAgdXJsLFxufSBmcm9tIFwiQHI1bi9jbGktY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVBhdGgoKSB7XG4gIGNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGltcG9ydC5tZXRhLnBhdGg7XG5cbiAgY29uc3QgY3VycmVudERpciA9IGN1cnJlbnRGaWxlUGF0aC5zdWJzdHJpbmcoMCwgY3VycmVudEZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cbiAgY29uc3Qgc3JjRGlyID0gY3VycmVudERpci5zdWJzdHJpbmcoMCwgY3VycmVudERpci5sYXN0SW5kZXhPZihcIi9cIikpO1xuXG4gIHJldHVybiBzcmNEaXI7XG59XG5cbmNvbnN0IGNsaUFyZ3NWYWxpZGF0b3IgPSBvYmplY3Qoe1xuICBkaXJlY3Rvcnk6IGRlZmF1bHRUbyhzdHJpbmcoKSwgYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2ApLFxuICBsYWJlbHM6IHVuaW9uKHN0cmluZygpLCBvcHRpb25hbCgpKSxcbiAgbmFtZTogZGVmYXVsdFRvKHN0cmluZygpLCBcInJ1bm5lclwiKSxcbiAgbnVtYmVyT2ZNYWNoaW5lczogZGVmYXVsdFRvKHJlZ2V4KC9eXFxkKyQvLCBcIk51bWJlciBvZiBtYWNoaW5lcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlclwiKSwgXCIxXCIpLFxuICBvczogZGVmYXVsdFRvKGVudW1zKFtcIm9zeFwiLCBcImxpbnV4XCIsIFwid2luZG93c1wiXSksIFwib3N4XCIpLFxuICBvdmVyd3JpdGU6IGRlZmF1bHRUbyhib29sZWFuKCksIGZhbHNlKSxcbiAgcnVuOiBkZWZhdWx0VG8oYm9vbGVhbigpLCBmYWxzZSksXG4gIHRva2VuOiBkZWZhdWx0VG8oc3RyaW5nKCksIHByb2Nlc3MuZW52LkdJVEhVQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU4gPz8gXCJcIiksXG4gIHVybDogdXJsKCksXG59KTtcblxuY29uc3QgQ2xpQXJnc1NjaGVtYSA9IGNyZWF0ZVNjaGVtYShjbGlBcmdzVmFsaWRhdG9yKTtcblxuZXhwb3J0IHR5cGUgQ2xpQXJncyA9IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIG9zOiBcIm9zeFwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCI7XG4gIG92ZXJ3cml0ZTogYm9vbGVhbjtcbiAgcnVuOiBib29sZWFuO1xuICB0b2tlbjogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGlBcmdzKCk6IENsaUFyZ3Mge1xuICB0cnkge1xuICAgIGNvbnN0IHsgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAgIGFyZ3M6IEJ1bi5hcmd2LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBjb25maWc6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vLmh5ZHJhLmpzb25gLCBzaG9ydDogXCJjXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZGlyZWN0b3J5OiB7IGRlZmF1bHQ6IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLCBzaG9ydDogXCJkXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBuYW1lOiB7IGRlZmF1bHQ6IFwicnVubmVyXCIsIHNob3J0OiBcIm5cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBudW1iZXJPZk1hY2hpbmVzOiB7IGRlZmF1bHQ6IFwiMVwiLCBzaG9ydDogXCJtXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgb3M6IHsgZGVmYXVsdDogXCJvc3hcIiwgc2hvcnQ6IFwic1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIG92ZXJ3cml0ZTogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiZlwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICBydW46IHsgZGVmYXVsdDogZmFsc2UsIHNob3J0OiBcInJcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHVybDogeyBzaG9ydDogXCJ1XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIH0sXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBDbGlBcmdzU2NoZW1hLnNhZmVQYXJzZSh2YWx1ZXMpO1xuXG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50czogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkZhaWxlZCB0byBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXCIsXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9sb2dnZXJcIjtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHsgcHJlZml4OiBcIldvcmtlck1hbmFnZXJcIiB9KTtcblxuZXhwb3J0IGNsYXNzIFdvcmtlck1hbmFnZXIge1xuICBwcml2YXRlIHdvcmtlcnM6IFNldDxXb3JrZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGNsZWFudXBSZWdpc3RlcmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RlckNsZWFudXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsZWFudXBSZWdpc3RlcmVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNsZWFudXBSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy53b3JrZXJzLnNpemUgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiQ2xlYW5pbmcgdXAgd29ya2Vycy4uLlwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVybWluYXRlQWxsKCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJleGl0XCIsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIChlcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKFwiVW5jYXVnaHQgZXhjZXB0aW9uOlwiLCBlcnJvcik7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGQod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtlcnMuYWRkKHdvcmtlcik7XG4gICAgbG9nZ2VyLmRlYnVnKGBXb3JrZXIgYWRkZWQuIFRvdGFsIHdvcmtlcnM6ICR7dGhpcy53b3JrZXJzLnNpemV9YCk7XG5cbiAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy53b3JrZXJzLmRlbGV0ZSh3b3JrZXIpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBXb3JrZXIgZXhpdGVkLiBSZW1haW5pbmcgd29ya2VyczogJHt0aGlzLndvcmtlcnMuc2l6ZX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZSh3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtlcnMuaGFzKHdvcmtlcikpIHtcbiAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgIHRoaXMud29ya2Vycy5kZWxldGUod29ya2VyKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgV29ya2VyIHJlbW92ZWQuIFJlbWFpbmluZyB3b3JrZXJzOiAke3RoaXMud29ya2Vycy5zaXplfWApO1xuICAgIH1cbiAgfVxuXG4gIHRlcm1pbmF0ZUFsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZXJzLnNpemUgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVGVybWluYXRpbmcgJHt0aGlzLndvcmtlcnMuc2l6ZX0gd29ya2Vycy4uLmApO1xuICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy53b3JrZXJzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHRlcm1pbmF0ZSB3b3JrZXI6YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLndvcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndvcmtlcnMuc2l6ZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2VyTWFuYWdlciA9IG5ldyBXb3JrZXJNYW5hZ2VyKCk7XG4iLAogICAgImltcG9ydCB7IGNvbG9ycyB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2NvbG9yc1wiO1xuXG5jb25zdCBDT01NQU5EX0hFTFA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGNyZWF0ZTogYFxuaHlkcmEgY3JlYXRlIC0gQ3JlYXRlIGFuZCByZWdpc3RlciBuZXcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuXG5VU0FHRVxuICBoeWRyYSBjcmVhdGUgW29wdGlvbnNdXG5cbk9QVElPTlNcbiAgLXQsIC0tdG9rZW4gICAgICAgICAgICAgR2l0SHViIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLXUsIC0tdXJsICAgICAgICAgICAgICAgR2l0SHViIHJlcG9zaXRvcnkgb3Igb3JnIFVSTCAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLW0sIC0tbnVtYmVyT2ZNYWNoaW5lcyAgTnVtYmVyIG9mIG1hY2hpbmVzICAgICAgICAgICAgICAgIFtudW1iZXJdIChkZWZhdWx0OiAxKVxuICAtbiwgLS1uYW1lICAgICAgICAgICAgICBSdW5uZXIgbmFtZSBwcmVmaXggICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWwsIC0tbGFiZWxzICAgICAgICAgICAgQ29tbWEtc2VwYXJhdGVkIHJ1bm5lciBsYWJlbHMgICAgIFtzdHJpbmddXG4gIC1vLCAtLW9zICAgICAgICAgICAgICAgIFJ1bm5lciBPUyAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyaW5nXSAoZGVmYXVsdDogbGludXgpXG4gIC1kLCAtLWRpcmVjdG9yeSAgICAgICAgIFJ1bm5lcnMgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtTywgLS1vdmVyd3JpdGUgICAgICAgICBPdmVyd3JpdGUgZXhpc3RpbmcgcnVubmVycyAgICAgICAgW2Jvb2xlYW5dXG4gIC1wLCAtLXByb2ZpbGUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvZmlsZSAgICAgICAgICAgICBbc3RyaW5nXVxuICAtYywgLS1jb25maWcgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgcGF0aCAgICAgICAgICAgW3N0cmluZ11cblxuRVhBTVBMRVNcbiAgIyBDcmVhdGUgYSBzaW5nbGUgcnVubmVyXG4gIGh5ZHJhIGNyZWF0ZSAtdCBUT0tFTiAtdSBodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cblxuICAjIENyZWF0ZSAzIHJ1bm5lcnMgd2l0aCBsYWJlbHNcbiAgaHlkcmEgY3JlYXRlIC1tIDMgLXQgVE9LRU4gLXUgVVJMIC1sIGRvY2tlcixncHVcblxuICAjIENyZWF0ZSB1c2luZyBwcm9maWxlXG4gIGh5ZHJhIGNyZWF0ZSAtcCBwcm9kdWN0aW9uIC10IFRPS0VOXG5gLFxuICBpbml0OiBgXG5oeWRyYSBpbml0IC0gSW5pdGlhbGl6ZSBhIG5ldyBIeWRyYSBjb25maWd1cmF0aW9uIGZpbGVcblxuVVNBR0VcbiAgaHlkcmEgaW5pdCBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b21sICAgICAgVXNlIFRPTUwgZm9ybWF0IGluc3RlYWQgb2YgSlNPTiAgICAgICAgIFtib29sZWFuXVxuXG5FWEFNUExFU1xuICAjIEluaXRpYWxpemUgd2l0aCBpbnRlcmFjdGl2ZSBwcm9tcHRzXG4gIGh5ZHJhIGluaXRcblxuICAjIEluaXRpYWxpemUgd2l0aCBUT01MIGZvcm1hdFxuICBoeWRyYSBpbml0IC0tdG9tbFxuYCxcblxuICByZW1vdmU6IGBcbmh5ZHJhIHJlbW92ZSAtIFJlbW92ZSBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIHJlbW92ZSBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtbSwgLS1udW1iZXJPZk1hY2hpbmVzICBOdW1iZXIgb2YgbWFjaGluZXMgICAgICAgICAgICAgICAgW251bWJlcl0gKGRlZmF1bHQ6IDEpXG4gIC1uLCAtLW5hbWUgICAgICAgICAgICAgIFJ1bm5lciBuYW1lIHByZWZpeCAgICAgICAgICAgICAgICBbc3RyaW5nXVxuICAtZCwgLS1kaXJlY3RvcnkgICAgICAgICBSdW5uZXJzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWYsIC0tZm9yY2UgICAgICAgICAgICAgRm9yY2UgcmVtb3ZhbCAgICAgICAgICAgICAgICAgICAgIFtib29sZWFuXVxuICAtcCwgLS1wcm9maWxlICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb2ZpbGUgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWMsIC0tY29uZmlnICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhdGggICAgICAgICAgIFtzdHJpbmddXG5cbkVYQU1QTEVTXG4gICMgUmVtb3ZlIGFuZCB1bnJlZ2lzdGVyXG4gIGh5ZHJhIHJlbW92ZSAtdCBUT0tFTiAtdSBodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cblxuICAjIEZvcmNlIHJlbW92ZVxuICBoeWRyYSByZW1vdmUgLW0gMiAtLWZvcmNlXG5cbiAgIyBSZW1vdmUgc3BlY2lmaWMgcnVubmVyc1xuICBoeWRyYSByZW1vdmUgLW4gY3VzdG9tIC1tIDMgLXQgVE9LRU4gLXUgVVJMXG5gLFxuXG4gIHJ1bjogYFxuaHlkcmEgcnVuIC0gU3RhcnQgZXhpc3RpbmcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuXG5VU0FHRVxuICBoeWRyYSBydW4gW29wdGlvbnNdXG5cbk9QVElPTlNcbiAgLXQsIC0tdG9rZW4gICAgICAgICAgICAgR2l0SHViIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLXUsIC0tdXJsICAgICAgICAgICAgICAgR2l0SHViIHJlcG9zaXRvcnkgb3Igb3JnIFVSTCAgICAgIFtzdHJpbmddIChyZXF1aXJlZClcbiAgLW0sIC0tbnVtYmVyT2ZNYWNoaW5lcyAgTnVtYmVyIG9mIG1hY2hpbmVzICAgICAgICAgICAgICAgIFtudW1iZXJdIChkZWZhdWx0OiAxKVxuICAtbiwgLS1uYW1lICAgICAgICAgICAgICBSdW5uZXIgbmFtZSBwcmVmaXggICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWQsIC0tZGlyZWN0b3J5ICAgICAgICAgUnVubmVycyBkaXJlY3RvcnkgICAgICAgICAgICAgICAgIFtzdHJpbmddXG4gIC1wLCAtLXByb2ZpbGUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcHJvZmlsZSAgICAgICAgICAgICBbc3RyaW5nXVxuICAtYywgLS1jb25maWcgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGUgcGF0aCAgICAgICAgICAgW3N0cmluZ11cblxuRVhBTVBMRVNcbiAgIyBSdW4gZXhpc3RpbmcgcnVubmVyc1xuICBoeWRyYSBydW4gLXQgVE9LRU4gLXUgaHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvXG5cbiAgIyBSdW4gc3BlY2lmaWMgcnVubmVyc1xuICBoeWRyYSBydW4gLW0gMiAtbiBjdXN0b20gLXQgVE9LRU4gLXUgVVJMXG5gLFxuXG4gIHN0YXR1czogYFxuaHlkcmEgc3RhdHVzIC0gQ2hlY2sgdGhlIHN0YXR1cyBvZiBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG5cblVTQUdFXG4gIGh5ZHJhIHN0YXR1cyBbb3B0aW9uc11cblxuT1BUSU9OU1xuICAtdCwgLS10b2tlbiAgICAgICAgICAgICBHaXRIdWIgUGVyc29uYWwgQWNjZXNzIFRva2VuICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtdSwgLS11cmwgICAgICAgICAgICAgICBHaXRIdWIgcmVwb3NpdG9yeSBvciBvcmcgVVJMICAgICAgW3N0cmluZ10gKHJlcXVpcmVkKVxuICAtZCwgLS1kaXJlY3RvcnkgICAgICAgICBSdW5uZXJzIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWosIC0tanNvbiAgICAgICAgICAgICAgT3V0cHV0IHN0YXR1cyBpbiBKU09OIGZvcm1hdCAgICAgIFtib29sZWFuXVxuICAtcCwgLS1wcm9maWxlICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb2ZpbGUgICAgICAgICAgICAgW3N0cmluZ11cbiAgLWMsIC0tY29uZmlnICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlIHBhdGggICAgICAgICAgIFtzdHJpbmddXG5cbkVYQU1QTEVTXG4gICMgQ2hlY2sgcnVubmVyIHN0YXR1c1xuICBoeWRyYSBzdGF0dXMgLXQgVE9LRU4gLXUgaHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvXG5cbiAgIyBPdXRwdXQgYXMgSlNPTlxuICBoeWRyYSBzdGF0dXMgLXQgVE9LRU4gLXUgVVJMIC0tanNvblxuXG4gICMgU3RhdHVzIHVzaW5nIHByb2ZpbGVcbiAgaHlkcmEgc3RhdHVzIC1wIHByb2R1Y3Rpb25cbmAsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaGVscChjb21tYW5kTmFtZT86IHN0cmluZykge1xuICBpZiAoY29tbWFuZE5hbWUgJiYgQ09NTUFORF9IRUxQW2NvbW1hbmROYW1lXSkge1xuICAgIGNvbnN0IGhlbHBUZXh0ID0gQ09NTUFORF9IRUxQW2NvbW1hbmROYW1lXTtcbiAgICBjb25zdCBjb2xvcmVkSGVscCA9IGhlbHBUZXh0XG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcImh5ZHJhXCIpKSByZXR1cm4gY29sb3JzLmJvbGQobGluZSk7XG4gICAgICAgIGlmIChsaW5lID09PSBcIlVTQUdFXCIgfHwgbGluZSA9PT0gXCJPUFRJT05TXCIgfHwgbGluZSA9PT0gXCJFWEFNUExFU1wiKSByZXR1cm4gY29sb3JzLmJvbGQobGluZSk7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCIgIC1cIikpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oXFxzKy1cXHcsXFxzLS1cXHcrKVxccysoLispJC8pO1xuICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgWywgZmxhZ3MgPSBcIlwiLCBkZXNjcmlwdGlvbiA9IFwiXCJdID0gbWF0Y2g7XG4gICAgICAgICAgICBjb25zdCBjb2xvcmVkRGVzYyA9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgIC5yZXBsYWNlKFwiKHJlcXVpcmVkKVwiLCBjb2xvcnMucmVkKFwiKHJlcXVpcmVkKVwiKSlcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKGRlZmF1bHQ6IChbXildKylcXCkvZywgKF8sIHZhbHVlKSA9PiBjb2xvcnMuZGltKGAoZGVmYXVsdDogJHt2YWx1ZX0pYCkpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFtib29sZWFuXFxdL2csIGNvbG9ycy5jeWFuKFwiW2Jvb2xlYW5dXCIpKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbc3RyaW5nXFxdL2csIGNvbG9ycy5ncmVlbihcIltzdHJpbmddXCIpKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbbnVtYmVyXFxdL2csIGNvbG9ycy5tYWdlbnRhKFwiW251bWJlcl1cIikpO1xuXG4gICAgICAgICAgICByZXR1cm4gYCAgJHtjb2xvcnMueWVsbG93KGZsYWdzLnBhZEVuZCgyNikpfSAke2NvbG9yZWREZXNjfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCIgICMgXCIpKSByZXR1cm4gY29sb3JzLmRpbShsaW5lKTtcbiAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcIiAgaHlkcmFcIikpIHJldHVybiBgICAke2NvbG9ycy5jeWFuKGxpbmUudHJpbSgpKX1gO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIGNvbnNvbGUuaW5mbyhjb2xvcmVkSGVscCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBcbiR7Y29sb3JzLmJvbGQoXCJIeWRyYSAtIEdpdEh1YiBzZWxmLWhvc3RlZCBydW5uZXIgbWFuYWdlclwiKX1cblxuJHtjb2xvcnMuYm9sZChcIlVTQUdFXCIpfVxuICBoeWRyYSA8Y29tbWFuZD4gW29wdGlvbnNdXG5cbiR7Y29sb3JzLmJvbGQoXCJDT01NQU5EU1wiKX1cbiAgJHtjb2xvcnMuZ3JlZW4oXCJpbml0XCIpfSAgICAgICAgICAgSW5pdGlhbGl6ZSBhIG5ldyBIeWRyYSBjb25maWd1cmF0aW9uIGZpbGVcbiAgJHtjb2xvcnMuZ3JlZW4oXCJjcmVhdGVcIil9ICAgICAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXcgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuICAke2NvbG9ycy5ncmVlbihcInJ1blwiKX0gICAgICAgICAgICBTdGFydCBleGlzdGluZyBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG4gICR7Y29sb3JzLmdyZWVuKFwicmVtb3ZlXCIpfSAgICAgICAgIFJlbW92ZSBHaXRIdWIgcnVubmVyIG1hY2hpbmVzXG4gICR7Y29sb3JzLmdyZWVuKFwic3RhdHVzXCIpfSAgICAgICAgIENoZWNrIHRoZSBzdGF0dXMgb2YgR2l0SHViIHJ1bm5lciBtYWNoaW5lc1xuICAke2NvbG9ycy5ncmVlbihcImhlbHBcIil9ICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXG5cblVzZSAke2NvbG9ycy5jeWFuKFwiaHlkcmEgPGNvbW1hbmQ+IC0taGVscFwiKX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21tYW5kLlxuYCk7XG59XG4iLAogICAgImltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5pbXBvcnQgeyBjYW5jZWwsIGNvbmZpcm0sIGdyb3VwLCBpbnRybywgaXNDYW5jZWwsIG91dHJvLCB0ZXh0IH0gZnJvbSBcIkBjbGFjay9wcm9tcHRzXCI7XG5pbXBvcnQgeyBncmFjZWZ1bFRyeSB9IGZyb20gXCJAcjVuL2NsaS1jb3JlXCI7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9jb2xvcnNcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgY29uc3QgeyB0b21sIH0gPSBnZXRBcmdzKCk7XG5cbiAgY29uc3QgY29uZmlnRmlsZU5hbWUgPSB0b21sID8gXCJoeWRyYS50b21sXCIgOiBcImh5ZHJhLmpzb25cIjtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnRmlsZU5hbWUpO1xuXG4gIGNvbnN0IGZpbGUgPSBCdW4uZmlsZShjb25maWdQYXRoKTtcbiAgaWYgKGF3YWl0IGZpbGUuZXhpc3RzKCkpIHtcbiAgICBjb25zdCBvdmVyd3JpdGUgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIGluaXRpYWxWYWx1ZTogZmFsc2UsXG4gICAgICBtZXNzYWdlOiBgQ29uZmlndXJhdGlvbiBmaWxlICR7Y29uZmlnRmlsZU5hbWV9IGFscmVhZHkgZXhpc3RzLiBPdmVyd3JpdGU/YCxcbiAgICB9KTtcbiAgICBpZiAoaXNDYW5jZWwob3ZlcndyaXRlKSB8fCAhb3ZlcndyaXRlKSB7XG4gICAgICBjYW5jZWwoXCJDb25maWd1cmF0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH1cblxuICBpbnRybyhjb2xvcnMuY3lhbihcIvCfmoAgSHlkcmEgQ29uZmlndXJhdGlvbiBTZXR1cFwiKSk7XG4gIGNvbnNvbGUuaW5mbyhjb2xvcnMuZGltKFwiVGhpcyB3aWxsIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHlvdXIgcnVubmVyIHNldHRpbmdzLlwiKSk7XG4gIGNvbnNvbGUuaW5mbyhjb2xvcnMuZGltKFwiWW91IGNhbiBhbHdheXMgZWRpdCB0aGUgZmlsZSBsYXRlciBvciBjcmVhdGUgYWRkaXRpb25hbCBwcm9maWxlcy5cXG5cIikpO1xuXG4gIGNvbnN0IGFuc3dlcnMgPSBhd2FpdCBncm91cChcbiAgICAvLyBiaW9tZS1pZ25vcmUgYXNzaXN0L3NvdXJjZS91c2VTb3J0ZWRLZXlzOiBTa2lwIGxpbnQgdGhlcmVcbiAgICB7XG4gICAgICBwcm9maWxlTmFtZTogKCkgPT4gdGV4dCh7IG1lc3NhZ2U6IFwiUHJvZmlsZSBuYW1lP1wiLCBwbGFjZWhvbGRlcjogXCJkZWZhdWx0XCIgfSksXG4gICAgICBkaXJlY3Rvcnk6ICgpID0+XG4gICAgICAgIHRleHQoe1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXCIuL2doLXJ1bm5lcnNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIkRpcmVjdG9yeSB0byBzdG9yZSBydW5uZXJzP1wiLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIi4vZ2gtcnVubmVyc1wiLFxuICAgICAgICB9KSxcbiAgICAgIG5hbWU6ICgpID0+XG4gICAgICAgIHRleHQoeyBkZWZhdWx0VmFsdWU6IFwicnVubmVyXCIsIG1lc3NhZ2U6IFwiUnVubmVyIG5hbWUgcHJlZml4P1wiLCBwbGFjZWhvbGRlcjogXCJydW5uZXJcIiB9KSxcbiAgICAgIGxhYmVsczogKHsgcmVzdWx0cyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gKHJlc3VsdHMubmFtZSB8fCBcInJ1bm5lclwiKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgcmV0dXJuIHRleHQoe1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcGxhY2Vob2xkZXIsXG4gICAgICAgICAgbWVzc2FnZTogXCJSdW5uZXIgbGFiZWxzIChjb21tYS1zZXBhcmF0ZWQpP1wiLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBudW1iZXJPZk1hY2hpbmVzOiAoKSA9PlxuICAgICAgICB0ZXh0KHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IFwiMVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiTnVtYmVyIG9mIHJ1bm5lciBtYWNoaW5lcz9cIixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogXCIxXCIsXG4gICAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bSkgfHwgbnVtIDwgMSkgcmV0dXJuIFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwXCI7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgdXJsOiAoKSA9PlxuICAgICAgICB0ZXh0KHtcbiAgICAgICAgICBtZXNzYWdlOiBcIkdpdEh1YiByZXBvc2l0b3J5IG9yIG9yZ2FuaXphdGlvbiBVUkw/IChvcHRpb25hbClcIixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogXCJodHRwczovL2dpdGh1Yi5jb20vb3JnL3JlcG9cIixcbiAgICAgICAgfSksXG4gICAgfSxcbiAgICB7XG4gICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICBjYW5jZWwoXCJDb25maWd1cmF0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHsgcHJvZmlsZU5hbWUsIGxhYmVscywgbnVtYmVyT2ZNYWNoaW5lcywgLi4ucHJvZmlsZSB9ID0gYW5zd2VycztcbiAgY29uc3QgY29uZmlnOiBDb25maWcgPSB7XG4gICAgZGVmYXVsdFByb2ZpbGU6IHByb2ZpbGVOYW1lLFxuICAgIHByb2ZpbGVzOiB7XG4gICAgICBbcHJvZmlsZU5hbWVdOiB7XG4gICAgICAgIC4uLnByb2ZpbGUsXG4gICAgICAgIGxhYmVsczogbGFiZWxzIGFzIHN0cmluZyxcbiAgICAgICAgbnVtYmVyT2ZNYWNoaW5lczogTnVtYmVyLnBhcnNlSW50KG51bWJlck9mTWFjaGluZXMsIDEwKSxcbiAgICAgICAgb3M6IFwib3N4XCIgYXMgY29uc3QsXG4gICAgICAgIG92ZXJ3cml0ZTogZmFsc2UsXG4gICAgICAgIHJ1bjogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMik7XG5cbiAgYXdhaXQgQnVuLndyaXRlKGNvbmZpZ1BhdGgsIGNvbnRlbnQpO1xuXG4gIGF3YWl0IGdyYWNlZnVsVHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0ICRgY2htb2QgNjAwICR7Y29uZmlnUGF0aH1gLnF1aWV0KCk7XG4gICAgfSxcbiAgICB7IGxvZ0xldmVsOiBcIndhcm5cIiwgbWVzc2FnZTogXCJDb3VsZCBub3Qgc2V0IHNlY3VyZSBmaWxlIHBlcm1pc3Npb25zXCIgfSxcbiAgKTtcblxuICBvdXRybyhjb2xvcnMuZ3JlZW4oYOKckyBDb25maWd1cmF0aW9uIHNhdmVkIHRvICR7Y29uZmlnRmlsZU5hbWV9YCkpO1xuXG4gIGNvbnNvbGUuaW5mbyhcIlxcbkV4YW1wbGUgdXNhZ2U6XCIpO1xuICBjb25zb2xlLmluZm8oXG4gICAgY29sb3JzLmN5YW4oXG4gICAgICBgICBoeWRyYSBjcmVhdGUgLXAgJHtwcm9maWxlTmFtZX0gLS10b2tlbiBZT1VSX1RPS0VOJHthbnN3ZXJzLnVybCA/IFwiXCIgOiBcIiAtLXVybCBSRVBPX1VSTFwifWAsXG4gICAgKSxcbiAgKTtcbiAgY29uc29sZS5pbmZvKFwiXFxuWW91IGNhbiBhZGQgbW9yZSBwcm9maWxlcyBieSBlZGl0aW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuXCIpO1xuXG4gIGlmIChhbnN3ZXJzLnVybCkge1xuICAgIGF3YWl0IG9wZW5HaXRIdWJTZXR0aW5ncyhhbnN3ZXJzLnVybCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gb3BlbkdpdEh1YlNldHRpbmdzKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IGdpdGh1YlJlZ2V4ID0gL2dpdGh1YlxcLmNvbVs6L10oW14vXSspKD86XFwvKFteLy5dKykpPy87XG4gIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKGdpdGh1YlJlZ2V4KTtcblxuICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3JnT3JPd25lciwgcmVwb10gPSBtYXRjaDtcblxuICBjb25zdCByZXBvVXJsID0gcmVwbyA/IGAke29yZ09yT3duZXJ9LyR7cmVwb31gIDogYG9yZ2FuaXphdGlvbnMvJHtvcmdPck93bmVyfWA7XG4gIGNvbnN0IHNldHRpbmdzVXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9Vcmx9L3NldHRpbmdzL2FjdGlvbnMvcnVubmVyc2A7XG5cbiAgY29uc29sZS5pbmZvKGBcXG5PcGVuaW5nIEdpdEh1YiBzZXR0aW5nczogJHtjb2xvcnMuY3lhbihzZXR0aW5nc1VybCl9YCk7XG5cbiAgYXdhaXQgZ3JhY2VmdWxUcnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgJGBvcGVuICR7c2V0dGluZ3NVcmx9YC5xdWlldCgpO1xuICAgIH0sXG4gICAge1xuICAgICAgZmFsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZ3JhY2VmdWxUcnkoXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgJGB4ZGctb3BlbiAke3NldHRpbmdzVXJsfWAucXVpZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlxcblBsZWFzZSBvcGVuIHRoZSBVUkwgbWFudWFsbHkgdG8gYWRkIGEgbmV3IHJ1bm5lciB0b2tlbi5cIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nTGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJBbHRlcm5hdGl2ZSBicm93c2VyIG9wZW4gbWV0aG9kIGFsc28gZmFpbGVkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBsb2dMZXZlbDogXCJpbmZvXCIsXG4gICAgICBtZXNzYWdlOiBcIkNvdWxkIG5vdCBvcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseVwiLFxuICAgIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEFyZ3MoKSB7XG4gIGNvbnN0IHsgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgIGFsbG93UG9zaXRpb25hbHM6IHRydWUsXG4gICAgYXJnczogQnVuLmFyZ3YsXG4gICAgb3B0aW9uczogeyB0b21sOiB7IGRlZmF1bHQ6IGZhbHNlLCBzaG9ydDogXCJ0XCIsIHR5cGU6IFwiYm9vbGVhblwiIH0gfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZXM7XG59XG4iLAogICAgImltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7IGNvbmZpcm0sIGlzQ2FuY2VsLCB0ZXh0IH0gZnJvbSBcIkBjbGFjay9wcm9tcHRzXCI7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9jb2xvcnNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGdldFByb2ZpbGUsIGxvYWRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IFJlbW92ZUFyZ3MgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHsgcHJlZml4OiBcInJlbW92ZU1hY2hpbmVzXCIgfSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVNYWNoaW5lcygpIHtcbiAgY29uc3QgYXJncyA9IGF3YWl0IGdldEFyZ3MoKTtcbiAgY29uc3QgeyBkaXJlY3RvcnksIG51bWJlck9mTWFjaGluZXMsIGZvcmNlIH0gPSBhcmdzO1xuICBsZXQgeyB0b2tlbiwgdXJsIH0gPSBhcmdzO1xuXG4gIGNvbnN0IG1hY2hpbmVzRGlyID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG4gIGNvbnN0IGRpcmVjdG9yeUV4aXN0cyA9IGF3YWl0IEJ1bi5maWxlKG1hY2hpbmVzRGlyKS5leGlzdHMoKTtcbiAgaWYgKCFkaXJlY3RvcnlFeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1hY2hpbmVzIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJHttYWNoaW5lc0Rpcn0uIE5vdGhpbmcgdG8gcmVtb3ZlLmApO1xuICB9XG5cbiAgaWYgKCF0b2tlbiAmJiAhZm9yY2UpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjb2xvcnMueWVsbG93KFwi4pqg77iPIE5vIHRva2VuIG9yIFVSTCBwcm92aWRlZC4gUnVubmVycyB3aWxsIG5vdCBiZSB1bnJlZ2lzdGVyZWQgZnJvbSBHaXRIdWIuXCIpLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUud2Fybihjb2xvcnMueWVsbG93KFwiVXNlIC0tZm9yY2UgdG8gcmVtb3ZlIHJ1bm5lcnMgd2l0aG91dCB1bnJlZ2lzdGVyaW5nIHRoZW0uXCIpKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuICgtdCkgYW5kIFVSTCAoLXUpIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkIG9yIHVzZSAtLWZvcmNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzVXJsID0gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsKTtcblxuICAgIGNvbnN0IHNob3VsZE9wZW4gPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6IGBObyB0b2tlbiBwcm92aWRlZC4gV291bGQgeW91IGxpa2UgdG8gb3BlbiBHaXRIdWIgdG8gZ2V0IGEgcnVubmVyIHRva2VuIGZvciB1bnJlZ2lzdHJhdGlvbj9cXG4gICR7c2V0dGluZ3NVcmx9YCxcbiAgICB9KTtcblxuICAgIGlmIChpc0NhbmNlbChzaG91bGRPcGVuKSB8fCAhc2hvdWxkT3Blbikge1xuICAgICAgY29uc29sZS53YXJuKGNvbG9ycy55ZWxsb3coXCJVc2UgLS1mb3JjZSB0byByZW1vdmUgcnVubmVycyB3aXRob3V0IHVucmVnaXN0ZXJpbmcgdGhlbS5cIikpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gaXMgcmVxdWlyZWQgdG8gdW5yZWdpc3RlciBydW5uZXJzIChvciB1c2UgLS1mb3JjZSlcIik7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJPcGVuaW5nIEdpdEh1YiBydW5uZXIgc2V0dGluZ3MuLi5cIik7XG4gICAgYXdhaXQgJGBvcGVuICR7c2V0dGluZ3NVcmx9YC5xdWlldCgpO1xuXG4gICAgY29uc3QgdG9rZW5JbnB1dCA9IGF3YWl0IHRleHQoe1xuICAgICAgbWVzc2FnZTogXCJFbnRlciB0aGUgcnVubmVyIHJlbW92YWwgdG9rZW46XCIsXG4gICAgICBwbGFjZWhvbGRlcjogXCJBWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFwiLFxuICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gXCJUb2tlbiBpcyByZXF1aXJlZFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHRva2VuSW5wdXQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oY29sb3JzLnllbGxvdyhcIlVzZSAtLWZvcmNlIHRvIHJlbW92ZSBydW5uZXJzIHdpdGhvdXQgdW5yZWdpc3RlcmluZyB0aGVtLlwiKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byB1bnJlZ2lzdGVyIHJ1bm5lcnMgKG9yIHVzZSAtLWZvcmNlKVwiKTtcbiAgICB9XG5cbiAgICB0b2tlbiA9IHRva2VuSW5wdXQudHJpbSgpO1xuICB9XG5cbiAgaWYgKHRva2VuICYmIHVybCkge1xuICAgIGNvbnNvbGUuaW5mbyhjb2xvcnMuY3lhbihcIlVucmVnaXN0ZXJpbmcgcnVubmVycyBmcm9tIEdpdEh1Yi4uLlwiKSk7XG4gICAgYXdhaXQgdW5yZWdpc3RlclJ1bm5lcnMoeyBkaXJlY3RvcnksIG51bWJlck9mTWFjaGluZXMsIHRva2VuIH0pO1xuICB9IGVsc2UgaWYgKCFmb3JjZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNvbG9ycy55ZWxsb3coXCLimqDvuI8gTm8gdG9rZW4gb3IgVVJMIHByb3ZpZGVkLiBSdW5uZXJzIHdpbGwgbm90IGJlIHVucmVnaXN0ZXJlZCBmcm9tIEdpdEh1Yi5cIiksXG4gICAgKTtcbiAgICBjb25zb2xlLndhcm4oY29sb3JzLnllbGxvdyhcIlVzZSAtLWZvcmNlIHRvIHJlbW92ZSBydW5uZXJzIHdpdGhvdXQgdW5yZWdpc3RlcmluZyB0aGVtLlwiKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gKC10KSBhbmQgVVJMICgtdSkgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQgb3IgdXNlIC0tZm9yY2VcIik7XG4gIH1cblxuICBhd2FpdCByZW1vdmVSdW5uZXJEaXJlY3Rvcmllcyh7IGRpcmVjdG9yeSwgbnVtYmVyT2ZNYWNoaW5lcyB9KTtcblxuICBjb25zb2xlLmluZm8oY29sb3JzLmdyZWVuKFwi4pyTIFJ1bm5lcnMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWRcIikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcmdzKCk6IFByb21pc2U8UmVtb3ZlQXJncz4ge1xuICBjb25zdCB7IHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcbiAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIGFyZ3M6IEJ1bi5hcmd2LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNvbmZpZzogeyBzaG9ydDogXCJjXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRpcmVjdG9yeTogeyBkZWZhdWx0OiBgJHtwcm9jZXNzLmN3ZCgpfS9naC1ydW5uZXJzYCwgc2hvcnQ6IFwiZFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBmb3JjZTogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwiZlwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogeyBkZWZhdWx0OiBcIjFcIiwgc2hvcnQ6IFwibVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBwcm9maWxlOiB7IHNob3J0OiBcInBcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB1cmw6IHsgc2hvcnQ6IFwidVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoeyBjb25maWdQYXRoOiB2YWx1ZXMuY29uZmlnIGFzIHN0cmluZyB9KTtcbiAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoY29uZmlnLCB2YWx1ZXMucHJvZmlsZSBhcyBzdHJpbmcpO1xuXG4gIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgIGRpcmVjdG9yeTogdmFsdWVzLmRpcmVjdG9yeSBhcyBzdHJpbmcsXG4gICAgZm9yY2U6IHZhbHVlcy5mb3JjZSBhcyBib29sZWFuLFxuICAgIG51bWJlck9mTWFjaGluZXM6IHZhbHVlcy5udW1iZXJPZk1hY2hpbmVzIGFzIHN0cmluZyxcbiAgICB0b2tlbjogdmFsdWVzLnRva2VuIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB1cmw6IHZhbHVlcy51cmwgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB9O1xuXG4gIGlmIChwcm9maWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdG9yeTogYmFzZUFyZ3MuZGlyZWN0b3J5ID8/IHByb2ZpbGUuZGlyZWN0b3J5ID8/IGAke3Byb2Nlc3MuY3dkKCl9L2doLXJ1bm5lcnNgLFxuICAgICAgZm9yY2U6IGJhc2VBcmdzLmZvcmNlLFxuICAgICAgbnVtYmVyT2ZNYWNoaW5lczogYmFzZUFyZ3MubnVtYmVyT2ZNYWNoaW5lcyA/PyBTdHJpbmcocHJvZmlsZS5udW1iZXJPZk1hY2hpbmVzKSA/PyBcIjFcIixcbiAgICAgIHRva2VuOiBiYXNlQXJncy50b2tlbixcbiAgICAgIHVybDogYmFzZUFyZ3MudXJsID8/IHByb2ZpbGUudXJsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gYmFzZUFyZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVucmVnaXN0ZXJSdW5uZXJzKHtcbiAgZGlyZWN0b3J5LFxuICBudW1iZXJPZk1hY2hpbmVzLFxuICB0b2tlbixcbn06IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmNoaWxkKFwidW5yZWdpc3RlclwiKTtcbiAgY29uc3QgbnVtTWFjaGluZXMgPSBOdW1iZXIobnVtYmVyT2ZNYWNoaW5lcyk7XG5cbiAgY29uc3QgY3B1Q291bnQgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBCdW4uc3Bhd25TeW5jKFtcIm5wcm9jXCJdKTtcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQocmVzdWx0LnN0ZG91dC50b1N0cmluZygpLnRyaW0oKSwgMTApIHx8IDQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBCdW4uc3Bhd25TeW5jKFtcInN5c2N0bFwiLCBcIi1uXCIsIFwiaHcubmNwdVwiXSk7XG4gICAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQocmVzdWx0LnN0ZG91dC50b1N0cmluZygpLnRyaW0oKSwgMTApIHx8IDQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWluKE1hdGgubWF4KDIsIE1hdGguZmxvb3IoY3B1Q291bnQgLyAyKSksIG51bU1hY2hpbmVzLCA4KTtcblxuICBsb2cuaW5mbyhgVW5yZWdpc3RlcmluZyAke251bU1hY2hpbmVzfSBydW5uZXJzIHdpdGggY29uY3VycmVuY3kgb2YgJHtjb25jdXJyZW5jeX1gKTtcblxuICBjb25zdCB0YXNrcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG51bU1hY2hpbmVzIH0sIChfLCBpKSA9PiBpICsgMSkubWFwKChydW5uZXJJbmRleCkgPT4gKHtcbiAgICBleGVjdXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtYWNoaW5lRGlyZWN0b3J5ID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lcy8ke3J1bm5lckluZGV4fWA7XG4gICAgICBjb25zdCBtYWNoaW5lRXhpc3RzID0gYXdhaXQgQnVuLmZpbGUobWFjaGluZURpcmVjdG9yeSkuZXhpc3RzKCk7XG5cbiAgICAgIGlmICghbWFjaGluZUV4aXN0cykge1xuICAgICAgICBsb2cuZGVidWcoYE1hY2hpbmUgJHtydW5uZXJJbmRleH0gZG9lc24ndCBleGlzdCwgc2tpcHBpbmcuLi5gKTtcbiAgICAgICAgcmV0dXJuIHsgcnVubmVySW5kZXgsIHN0YXR1czogXCJza2lwcGVkXCIgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBVbnJlZ2lzdGVyaW5nIG1hY2hpbmUgJHtydW5uZXJJbmRleH0uLi5gKTtcbiAgICAgICAgYXdhaXQgJGAke21hY2hpbmVEaXJlY3Rvcnl9L2NvbmZpZy5zaCByZW1vdmUgLS10b2tlbiAke3Rva2VufWAucXVpZXQoKTtcbiAgICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQgbWFjaGluZSAke3J1bm5lckluZGV4fSBmcm9tIEdpdEh1YmApO1xuICAgICAgICByZXR1cm4geyBydW5uZXJJbmRleCwgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byB1bnJlZ2lzdGVyIG1hY2hpbmUgJHtydW5uZXJJbmRleH06ICR7ZXJyb3J9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yLCBydW5uZXJJbmRleCwgc3RhdHVzOiBcImZhaWxlZFwiIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBydW5uZXJJbmRleCxcbiAgfSkpO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkgKz0gY29uY3VycmVuY3kpIHtcbiAgICBjb25zdCBiYXRjaCA9IHRhc2tzLnNsaWNlKGksIGkgKyBjb25jdXJyZW5jeSk7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGJhdGNoLm1hcCgodGFzaykgPT4gdGFzay5leGVjdXRlKCkpKTtcbiAgICByZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgfVxuXG4gIGNvbnN0IHN1Y2Nlc3NmdWwgPSByZXN1bHRzLmZpbHRlcihcbiAgICAocikgPT4gci5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgci52YWx1ZT8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIixcbiAgKS5sZW5ndGg7XG4gIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKFxuICAgIChyKSA9PiByLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByLnZhbHVlPy5zdGF0dXMgPT09IFwiZmFpbGVkXCIsXG4gICkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkID0gcmVzdWx0cy5maWx0ZXIoXG4gICAgKHIpID0+IHIuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHIudmFsdWU/LnN0YXR1cyA9PT0gXCJza2lwcGVkXCIsXG4gICkubGVuZ3RoO1xuXG4gIGxvZy5pbmZvKFxuICAgIGBVbnJlZ2lzdHJhdGlvbiBjb21wbGV0ZTogJHtzdWNjZXNzZnVsfSBzdWNjZXNzZnVsLCAke2ZhaWxlZH0gZmFpbGVkLCAke3NraXBwZWR9IHNraXBwZWRgLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVSdW5uZXJEaXJlY3Rvcmllcyh7XG4gIGRpcmVjdG9yeSxcbiAgbnVtYmVyT2ZNYWNoaW5lcyxcbn06IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIG51bWJlck9mTWFjaGluZXM6IHN0cmluZztcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmNoaWxkKFwicmVtb3ZlRGlyZWN0b3JpZXNcIik7XG4gIGNvbnN0IG51bU1hY2hpbmVzID0gTnVtYmVyKG51bWJlck9mTWFjaGluZXMpO1xuXG4gIGNvbnN0IHRhc2tzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtTWFjaGluZXMgfSwgKF8sIGkpID0+IGkgKyAxKS5tYXAoKHJ1bm5lckluZGV4KSA9PiAoe1xuICAgIGV4ZWN1dGU6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hY2hpbmVEaXJlY3RvcnkgPSBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YDtcbiAgICAgIGNvbnN0IG1hY2hpbmVFeGlzdHMgPSBhd2FpdCBCdW4uZmlsZShtYWNoaW5lRGlyZWN0b3J5KS5leGlzdHMoKTtcblxuICAgICAgaWYgKCFtYWNoaW5lRXhpc3RzKSB7XG4gICAgICAgIHJldHVybiB7IHJ1bm5lckluZGV4LCBzdGF0dXM6IFwic2tpcHBlZFwiIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0ICRgcm0gLXJmICR7bWFjaGluZURpcmVjdG9yeX1gLnF1aWV0KCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVtb3ZlZCBtYWNoaW5lICR7cnVubmVySW5kZXh9IGRpcmVjdG9yeWApO1xuICAgICAgICByZXR1cm4geyBydW5uZXJJbmRleCwgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nLmVycm9yKGBFcnJvciByZW1vdmluZyBtYWNoaW5lICR7cnVubmVySW5kZXh9IGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3IsIHJ1bm5lckluZGV4LCBzdGF0dXM6IFwiZmFpbGVkXCIgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJ1bm5lckluZGV4LFxuICB9KSk7XG5cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0YXNrcy5tYXAoKHRhc2spID0+IHRhc2suZXhlY3V0ZSgpKSk7XG5cbiAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKFxuICAgIChyKSA9PiByLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByLnZhbHVlPy5zdGF0dXMgPT09IFwic3VjY2Vzc1wiLFxuICApLmxlbmd0aDtcbiAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoXG4gICAgKHIpID0+IHIuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHIudmFsdWU/LnN0YXR1cyA9PT0gXCJmYWlsZWRcIixcbiAgKS5sZW5ndGg7XG5cbiAgbG9nLmluZm8oYERpcmVjdG9yeSByZW1vdmFsIGNvbXBsZXRlOiAke3N1Y2Nlc3NmdWx9IHJlbW92ZWQsICR7ZmFpbGVkfSBmYWlsZWRgKTtcblxuICBpZiAoZmFpbGVkID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlbW92ZSAke2ZhaWxlZH0gcnVubmVyIGRpcmVjdG9yaWVzYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG1hY2hpbmVzRGlyID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG4gICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgJGBscyAtQSAke21hY2hpbmVzRGlyfWAudGV4dCgpKS50cmltKCk7XG5cbiAgICBpZiAoIWZpbGVzKSB7XG4gICAgICBhd2FpdCAkYHJtIC1yZiAke21hY2hpbmVzRGlyfWAucXVpZXQoKTtcblxuICAgICAgY29uc3QgcGFyZW50RmlsZXMgPSAoYXdhaXQgJGBscyAtQSAke2RpcmVjdG9yeX1gLnRleHQoKSkudHJpbSgpO1xuICAgICAgaWYgKCFwYXJlbnRGaWxlcykge1xuICAgICAgICBhd2FpdCAkYHJtIC1yZiAke2RpcmVjdG9yeX1gLnF1aWV0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuaW5mbyhjb2xvcnMuZ3JlZW4oYOKckyBSZW1vdmVkIGVtcHR5IGRpcmVjdG9yaWVzYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoX2Vycm9yKSB7fVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSdW5uZXJTZXR0aW5nc1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSA9PT0gXCJnaXRodWIuY29tXCIgfHwgcGFyc2VkVXJsLmhvc3RuYW1lID09PSBcInd3dy5naXRodWIuY29tXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnNgO1xuICAgICAgfSBlbHNlIGlmIChwYXRoUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnNgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGF0aFBhcnRzWzBdID09PSBcIm9yZ3NcIiAmJiBwYXRoUGFydHNbMV0pIHtcbiAgICAgICAgcmV0dXJuIGAke3BhcnNlZFVybC5vcmlnaW59L29yZ2FuaXphdGlvbnMvJHtwYXRoUGFydHNbMV19L3NldHRpbmdzL2FjdGlvbnMvcnVubmVyc2A7XG4gICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnNgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHsgY29uZmlybSwgaXNDYW5jZWwsIHRleHQgfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGdldFByb2ZpbGUsIGxvYWRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRQYWNrYWdlUGF0aCB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyB3b3JrZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL2xpYi93b3JrZXItbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBSdW5BcmdzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih7IHByZWZpeDogXCJydW5NYWNoaW5lc1wiIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWFjaGluZXMoKSB7XG4gIGNvbnN0IGFyZ3MgPSBhd2FpdCBnZXRBcmdzKCk7XG4gIGNvbnN0IHsgZGlyZWN0b3J5LCBudW1iZXJPZk1hY2hpbmVzLCBuYW1lLCBsYWJlbHMsIHJ1bm5lckdyb3VwIH0gPSBhcmdzO1xuICBsZXQgeyB0b2tlbiwgdXJsIH0gPSBhcmdzO1xuXG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVVJMICgtdSkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIGNvbnN0IHNldHRpbmdzVXJsID0gY29uc3RydWN0UnVubmVyU2V0dGluZ3NVcmwodXJsKTtcblxuICAgIGNvbnN0IHNob3VsZE9wZW4gPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6IGBObyB0b2tlbiBwcm92aWRlZC4gV291bGQgeW91IGxpa2UgdG8gb3BlbiBHaXRIdWIgdG8gZ2V0IGEgcnVubmVyIHRva2VuP1xcbiAgJHtzZXR0aW5nc1VybH1gLFxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ2FuY2VsKHNob3VsZE9wZW4pIHx8ICFzaG91bGRPcGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBpcyByZXF1aXJlZCB0byBydW4gbWFjaGluZXNcIik7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJPcGVuaW5nIEdpdEh1YiBydW5uZXIgc2V0dGluZ3MuLi5cIik7XG4gICAgYXdhaXQgJGBvcGVuICR7c2V0dGluZ3NVcmx9YC5xdWlldCgpO1xuXG4gICAgY29uc3QgdG9rZW5JbnB1dCA9IGF3YWl0IHRleHQoe1xuICAgICAgbWVzc2FnZTogXCJFbnRlciB0aGUgcnVubmVyIHJlZ2lzdHJhdGlvbiB0b2tlbjpcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBcIkFYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXCIsXG4gICAgICB2YWxpZGF0ZTogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBcIlRva2VuIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoaXNDYW5jZWwodG9rZW5JbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuIGlzIHJlcXVpcmVkIHRvIHJ1biBtYWNoaW5lc1wiKTtcbiAgICB9XG5cbiAgICB0b2tlbiA9IHRva2VuSW5wdXQudHJpbSgpO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICR7bnVtYmVyT2ZNYWNoaW5lc30gcnVubmVycyBmcm9tICR7ZGlyZWN0b3J5fWApO1xuICBsb2dnZXIuZGVidWcoYE5hbWU6ICR7bmFtZX0sIExhYmVsczogJHtsYWJlbHMgfHwgXCJub25lXCJ9YCk7XG5cbiAgY29uc3QgZGlyZWN0b3J5RXhpc3RzID0gYXdhaXQgQnVuLmZpbGUoYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2ApLmV4aXN0cygpO1xuICBpZiAoIWRpcmVjdG9yeUV4aXN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNYWNoaW5lcyBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0ICR7ZGlyZWN0b3J5fS9tYWNoaW5lcy4gUnVuICdoeWRyYSBjcmVhdGUnIGZpcnN0LmAsXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHN0YXJ0UnVubmVycyh7IGRpcmVjdG9yeSwgbGFiZWxzLCBuYW1lLCBudW1iZXJPZk1hY2hpbmVzLCBydW5uZXJHcm91cCwgdG9rZW4sIHVybCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXJncygpOiBQcm9taXNlPFJ1bkFyZ3M+IHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzOiBCdW4uYXJndixcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb25maWc6IHsgc2hvcnQ6IFwiY1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkaXJlY3Rvcnk6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsIHNob3J0OiBcImRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbGFiZWxzOiB7IHNob3J0OiBcImxcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgbmFtZTogeyBkZWZhdWx0OiBcInJ1bm5lclwiLCBzaG9ydDogXCJuXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIG51bWJlck9mTWFjaGluZXM6IHsgZGVmYXVsdDogXCIxXCIsIHNob3J0OiBcIm1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgcHJvZmlsZTogeyBzaG9ydDogXCJwXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIHJ1bm5lckdyb3VwOiB7IHNob3J0OiBcImdcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdG9rZW46IHsgc2hvcnQ6IFwidFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB1cmw6IHsgc2hvcnQ6IFwidVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgfSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoeyBjb25maWdQYXRoOiB2YWx1ZXMuY29uZmlnIGFzIHN0cmluZyB9KTtcbiAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoY29uZmlnLCB2YWx1ZXMucHJvZmlsZSBhcyBzdHJpbmcpO1xuXG4gIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgIGRpcmVjdG9yeTogdmFsdWVzLmRpcmVjdG9yeSBhcyBzdHJpbmcsXG4gICAgbGFiZWxzOiB2YWx1ZXMubGFiZWxzIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBuYW1lOiB2YWx1ZXMubmFtZSBhcyBzdHJpbmcsXG4gICAgbnVtYmVyT2ZNYWNoaW5lczogdmFsdWVzLm51bWJlck9mTWFjaGluZXMgYXMgc3RyaW5nLFxuICAgIHJ1bm5lckdyb3VwOiB2YWx1ZXMucnVubmVyR3JvdXAgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRva2VuOiB2YWx1ZXMudG9rZW4gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHVybDogdmFsdWVzLnVybCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIH07XG5cbiAgaWYgKHByb2ZpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlyZWN0b3J5OiBiYXNlQXJncy5kaXJlY3RvcnkgPz8gcHJvZmlsZS5kaXJlY3RvcnkgPz8gYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsXG4gICAgICBsYWJlbHM6IGJhc2VBcmdzLmxhYmVscyA/PyBwcm9maWxlLmxhYmVscyxcbiAgICAgIG5hbWU6IGJhc2VBcmdzLm5hbWUgPz8gcHJvZmlsZS5uYW1lID8/IFwicnVubmVyXCIsXG4gICAgICBudW1iZXJPZk1hY2hpbmVzOiBiYXNlQXJncy5udW1iZXJPZk1hY2hpbmVzID8/IFN0cmluZyhwcm9maWxlLm51bWJlck9mTWFjaGluZXMpID8/IFwiMVwiLFxuICAgICAgcnVubmVyR3JvdXA6IGJhc2VBcmdzLnJ1bm5lckdyb3VwID8/IHByb2ZpbGUucnVubmVyR3JvdXAsXG4gICAgICB0b2tlbjogYmFzZUFyZ3MudG9rZW4sXG4gICAgICB1cmw6IGJhc2VBcmdzLnVybCA/PyBwcm9maWxlLnVybCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGJhc2VBcmdzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydFJ1bm5lcnMoe1xuICBkaXJlY3RvcnksXG4gIG51bWJlck9mTWFjaGluZXMsXG4gIHRva2VuLFxuICB1cmwsXG4gIG5hbWUsXG4gIGxhYmVscyxcbiAgcnVubmVyR3JvdXAsXG59OiB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBudW1iZXJPZk1hY2hpbmVzOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVscz86IHN0cmluZztcbiAgcnVubmVyR3JvdXA/OiBzdHJpbmc7XG59KSB7XG4gIGxvZ2dlci5pbmZvKGBTdGFydGluZyAke251bWJlck9mTWFjaGluZXN9IHdvcmtlcnMuLi5gKTtcblxuICBmb3IgKGxldCBydW5uZXJJbmRleCA9IDE7IHJ1bm5lckluZGV4IDw9IE51bWJlcihudW1iZXJPZk1hY2hpbmVzKTsgcnVubmVySW5kZXgrKykge1xuICAgIGNvbnN0IG1hY2hpbmVEaXJlY3RvcnkgPSBgJHtkaXJlY3Rvcnl9L21hY2hpbmVzLyR7cnVubmVySW5kZXh9YDtcbiAgICBjb25zdCBtYWNoaW5lRXhpc3RzID0gYXdhaXQgQnVuLmZpbGUobWFjaGluZURpcmVjdG9yeSkuZXhpc3RzKCk7XG5cbiAgICBpZiAoIW1hY2hpbmVFeGlzdHMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBNYWNoaW5lICR7cnVubmVySW5kZXh9IGRvZXNuJ3QgZXhpc3QsIHNraXBwaW5nLi4uYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXJQYXRoID0gYCR7Z2V0UGFja2FnZVBhdGgoKX0vc3JjL3J1bm5lci13b3JrZXIudHNgO1xuICAgIGNvbnN0IHdvcmtlck5hbWUgPSBgJHtuYW1lfS0ke3J1bm5lckluZGV4fWA7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJQYXRoLCB7IG5hbWU6IHdvcmtlck5hbWUsIHJlZjogdHJ1ZSB9KTtcblxuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoeyBkYXRhIH0pID0+IHtcbiAgICAgIGNvbnN0IGxldmVsID0gZGF0YS50eXBlID09PSBcImVycm9yXCIgPyBcImVycm9yXCIgOiBcImluZm9cIjtcbiAgICAgIGxvZ2dlcltsZXZlbF0oYCR7d29ya2VyTmFtZX06ICR7ZGF0YS5tZXNzYWdlfWApO1xuICAgIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgV29ya2VyICR7d29ya2VyTmFtZX0gZXJyb3I6YCwgZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7d29ya2VyTmFtZX0gZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgfSk7XG5cbiAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgaW5kZXg6IHJ1bm5lckluZGV4LFxuICAgICAgbGFiZWxzLFxuICAgICAgbWFjaGluZUN3ZDogbWFjaGluZURpcmVjdG9yeSxcbiAgICAgIG5hbWUsXG4gICAgICBydW5uZXJHcm91cCxcbiAgICAgIHRva2VuLFxuICAgICAgdXJsLFxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYFdvcmtlciAke3dvcmtlck5hbWV9IHN0YXJ0aW5nLi4uYCk7XG4gICAgd29ya2VyTWFuYWdlci5hZGQod29ya2VyKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKFwiQWxsIHdvcmtlcnMgc3RhcnRlZC4gUHJlc3MgQ3RybCtDIHRvIHN0b3AgYWxsIG1hY2hpbmVzXCIpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSdW5uZXJTZXR0aW5nc1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSA9PT0gXCJnaXRodWIuY29tXCIgfHwgcGFyc2VkVXJsLmhvc3RuYW1lID09PSBcInd3dy5naXRodWIuY29tXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdhbml6YXRpb25zLyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7cGF0aFBhcnRzWzBdfS8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRoUGFydHNbMF0gPT09IFwib3Jnc1wiICYmIHBhdGhQYXJ0c1sxXSkge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vb3JnYW5pemF0aW9ucy8ke3BhdGhQYXJ0c1sxXX0vc2V0dGluZ3MvYWN0aW9ucy9ydW5uZXJzL25ld2A7XG4gICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gYCR7cGFyc2VkVXJsLm9yaWdpbn0vJHtwYXRoUGFydHNbMF19LyR7cGF0aFBhcnRzWzFdfS9zZXR0aW5ncy9hY3Rpb25zL3J1bm5lcnMvbmV3YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXJsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7IGxvZywgc3Bpbm5lciB9IGZyb20gXCJAY2xhY2svcHJvbXB0c1wiO1xuaW1wb3J0IHsgZ3JhY2VmdWxUcnksIHdpdGhSZXRyeSB9IGZyb20gXCJAcjVuL2NsaS1jb3JlXCI7XG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tIFwiQHI1bi90b29scy91dGlscy9jb2xvcnNcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBnZXRQcm9maWxlLCBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG5pbnRlcmZhY2UgUnVubmVyU3RhdHVzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzdGF0dXM6IFwib25saW5lXCIgfCBcIm9mZmxpbmVcIiB8IFwiYnVzeVwiO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBidXN5OiBib29sZWFuO1xuICBvczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2l0SHViUnVubmVyUmVzcG9uc2Uge1xuICBydW5uZXJzOiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgb3M6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBidXN5OiBib29sZWFuO1xuICAgIGxhYmVsczogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT47XG4gIH0+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhdHVzKCkge1xuICBjb25zdCBhcmdzID0gYXdhaXQgZ2V0QXJncygpO1xuICBjb25zdCB7IGRpcmVjdG9yeSwgdG9rZW4sIHVybCwganNvbiB9ID0gYXJncztcblxuICBpZiAoIXRva2VuIHx8ICF1cmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiAoLXQpIGFuZCBVUkwgKC11KSBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c1NwaW5uZXIgPSBzcGlubmVyKCk7XG4gIHN0YXR1c1NwaW5uZXIuc3RhcnQoXCJGZXRjaGluZyBydW5uZXIgc3RhdHVzLi4uXCIpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbG9jYWxSdW5uZXJzID0gYXdhaXQgZ2V0TG9jYWxSdW5uZXJzKGRpcmVjdG9yeSk7XG4gICAgY29uc3QgZ2l0aHViUnVubmVycyA9IGF3YWl0IGZldGNoR2l0SHViUnVubmVycyh1cmwsIHRva2VuKTtcbiAgICBjb25zdCBydW5uZXJTdGF0dXNlcyA9IGNvbWJpbmVSdW5uZXJTdGF0dXMobG9jYWxSdW5uZXJzLCBnaXRodWJSdW5uZXJzKTtcblxuICAgIHN0YXR1c1NwaW5uZXIuc3RvcChcIlJ1bm5lciBzdGF0dXMgZmV0Y2hlZFwiKTtcblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShydW5uZXJTdGF0dXNlcywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5UnVubmVyU3RhdHVzKHJ1bm5lclN0YXR1c2VzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3RhdHVzU3Bpbm5lci5zdG9wKFwiRmFpbGVkIHRvIGZldGNoIHJ1bm5lciBzdGF0dXNcIik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXJncygpIHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzOiBCdW4uYXJndixcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb25maWc6IHsgc2hvcnQ6IFwiY1wiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkaXJlY3Rvcnk6IHsgZGVmYXVsdDogYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsIHNob3J0OiBcImRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAganNvbjogeyBkZWZhdWx0OiBmYWxzZSwgc2hvcnQ6IFwialwiLCB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgcHJvZmlsZTogeyBzaG9ydDogXCJwXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIHRva2VuOiB7IHNob3J0OiBcInRcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgdXJsOiB7IHNob3J0OiBcInVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgIH0sXG4gICAgc3RyaWN0OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHsgY29uZmlnUGF0aDogdmFsdWVzLmNvbmZpZyBhcyBzdHJpbmcgfSk7XG4gIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQcm9maWxlKGNvbmZpZywgdmFsdWVzLnByb2ZpbGUgYXMgc3RyaW5nKTtcblxuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeTogKHZhbHVlcy5kaXJlY3RvcnkgYXMgc3RyaW5nKSB8fCBwcm9maWxlPy5kaXJlY3RvcnkgfHwgYCR7cHJvY2Vzcy5jd2QoKX0vZ2gtcnVubmVyc2AsXG4gICAganNvbjogdmFsdWVzLmpzb24gYXMgYm9vbGVhbixcbiAgICB0b2tlbjogdmFsdWVzLnRva2VuIGFzIHN0cmluZyxcbiAgICB1cmw6ICh2YWx1ZXMudXJsIGFzIHN0cmluZykgfHwgcHJvZmlsZT8udXJsLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMb2NhbFJ1bm5lcnMoZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IG1hY2hpbmVzRGlyID0gYCR7ZGlyZWN0b3J5fS9tYWNoaW5lc2A7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ3JhY2VmdWxUcnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgJGBscyAke21hY2hpbmVzRGlyfSAyPi9kZXYvbnVsbCB8fCB0cnVlYC5xdWlldCgpO1xuICAgICAgcmV0dXJuIG91dHB1dC5zdGRvdXQudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoXCJcXG5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH0sXG4gICAgeyBmYWxsYmFjazogKCkgPT4ge30sIGxvZ0xldmVsOiBcImRlYnVnXCIsIG1lc3NhZ2U6IFwiTm8gbG9jYWwgcnVubmVycyBmb3VuZFwiIH0sXG4gICk7XG5cbiAgcmV0dXJuIHJlc3VsdCB8fCBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hHaXRIdWJSdW5uZXJzKHVybDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxHaXRIdWJSdW5uZXJSZXNwb25zZT4ge1xuICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvZ2l0aHViXFwuY29tWzovXShbXi9dKykoPzpcXC8oW14vLl0rKSk/Lyk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEdpdEh1YiBVUkxcIik7XG4gIH1cblxuICBjb25zdCBbLCBvcmdPck93bmVyLCByZXBvXSA9IG1hdGNoO1xuICBjb25zdCBhcGlVcmwgPSByZXBvXG4gICAgPyBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke29yZ09yT3duZXJ9LyR7cmVwb30vYWN0aW9ucy9ydW5uZXJzYFxuICAgIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8ke29yZ09yT3duZXJ9L2FjdGlvbnMvcnVubmVyc2A7XG5cbiAgcmV0dXJuIHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhcGlVcmwsIHsgaGVhZGVycyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIHtcbiAgICAgIG9uUmV0cnk6IChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICBsb2cud2FybihgUmV0cnlpbmcgR2l0SHViIEFQSSBjYWxsIChhdHRlbXB0ICR7YXR0ZW1wdH0pOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVSdW5uZXJTdGF0dXMoXG4gIGxvY2FsUnVubmVyczogc3RyaW5nW10sXG4gIGdpdGh1YkRhdGE6IEdpdEh1YlJ1bm5lclJlc3BvbnNlLFxuKTogUnVubmVyU3RhdHVzW10ge1xuICBjb25zdCBzdGF0dXNlczogUnVubmVyU3RhdHVzW10gPSBbXTtcbiAgY29uc3QgZ2l0aHViUnVubmVyTWFwID0gbmV3IE1hcChnaXRodWJEYXRhLnJ1bm5lcnMubWFwKChydW5uZXIpID0+IFtydW5uZXIubmFtZSwgcnVubmVyXSkpO1xuXG4gIGZvciAoY29uc3QgcnVubmVyRGlyIG9mIGxvY2FsUnVubmVycykge1xuICAgIGNvbnN0IHJ1bm5lck5hbWUgPSBgcnVubmVyLSR7cnVubmVyRGlyfWA7XG4gICAgY29uc3QgZ2l0aHViUnVubmVyID0gZ2l0aHViUnVubmVyTWFwLmdldChydW5uZXJOYW1lKTtcblxuICAgIGlmIChnaXRodWJSdW5uZXIpIHtcbiAgICAgIHN0YXR1c2VzLnB1c2goe1xuICAgICAgICBidXN5OiBnaXRodWJSdW5uZXIuYnVzeSxcbiAgICAgICAgbGFiZWxzOiBnaXRodWJSdW5uZXIubGFiZWxzLm1hcCgobCkgPT4gbC5uYW1lKSxcbiAgICAgICAgbmFtZTogcnVubmVyTmFtZSxcbiAgICAgICAgb3M6IGdpdGh1YlJ1bm5lci5vcyxcbiAgICAgICAgc3RhdHVzOiBnaXRodWJSdW5uZXIuYnVzeVxuICAgICAgICAgID8gXCJidXN5XCJcbiAgICAgICAgICA6IGdpdGh1YlJ1bm5lci5zdGF0dXMgPT09IFwib25saW5lXCJcbiAgICAgICAgICAgID8gXCJvbmxpbmVcIlxuICAgICAgICAgICAgOiBcIm9mZmxpbmVcIixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNlcy5wdXNoKHtcbiAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgIGxhYmVsczogW10sXG4gICAgICAgIG5hbWU6IHJ1bm5lck5hbWUsXG4gICAgICAgIG9zOiBcInVua25vd25cIixcbiAgICAgICAgc3RhdHVzOiBcIm9mZmxpbmVcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZGlzcGxheVJ1bm5lclN0YXR1cyhzdGF0dXNlczogUnVubmVyU3RhdHVzW10pIHtcbiAgaWYgKHN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZy5pbmZvKFwiTm8gcnVubmVycyBmb3VuZFwiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmxvZyhgXFxuJHtjb2xvcnMuYm9sZChcIlJ1bm5lciBTdGF0dXM6XCIpfWApO1xuICBjb25zb2xlLmxvZyhcIuKUgFwiLnJlcGVhdCg4MCkpO1xuXG4gIGNvbnN0IHN0YXR1c0NvbG9ycyA9IHsgYnVzeTogY29sb3JzLnllbGxvdywgb2ZmbGluZTogY29sb3JzLnJlZCwgb25saW5lOiBjb2xvcnMuZ3JlZW4gfTtcblxuICBmb3IgKGNvbnN0IHJ1bm5lciBvZiBzdGF0dXNlcykge1xuICAgIGNvbnN0IHN0YXR1c0NvbG9yID0gc3RhdHVzQ29sb3JzW3J1bm5lci5zdGF0dXNdO1xuICAgIGNvbnN0IHN0YXR1c1RleHQgPSBydW5uZXIuc3RhdHVzLnRvVXBwZXJDYXNlKCkucGFkRW5kKDcpO1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtzdGF0dXNDb2xvcihcIuKXj1wiKX0gJHtzdGF0dXNDb2xvcihzdGF0dXNUZXh0KX0gJHtjb2xvcnMuY3lhbihydW5uZXIubmFtZS5wYWRFbmQoMjApKX0gYCArXG4gICAgICAgIGAke2NvbG9ycy5kaW0oYE9TOiAke3J1bm5lci5vcy5wYWRFbmQoMTApfWApfSBgICtcbiAgICAgICAgYCR7cnVubmVyLmxhYmVscy5sZW5ndGggPiAwID8gY29sb3JzLmRpbShgTGFiZWxzOiAke3J1bm5lci5sYWJlbHMuam9pbihcIiwgXCIpfWApIDogXCJcIn1gLFxuICAgICk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhcIuKUgFwiLnJlcGVhdCg4MCkpO1xuXG4gIGNvbnN0IHN1bW1hcnkgPSB7XG4gICAgYnVzeTogc3RhdHVzZXMuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gXCJidXN5XCIpLmxlbmd0aCxcbiAgICBvZmZsaW5lOiBzdGF0dXNlcy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBcIm9mZmxpbmVcIikubGVuZ3RoLFxuICAgIG9ubGluZTogc3RhdHVzZXMuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gXCJvbmxpbmVcIikubGVuZ3RoLFxuICAgIHRvdGFsOiBzdGF0dXNlcy5sZW5ndGgsXG4gIH07XG5cbiAgY29uc29sZS5sb2coXG4gICAgYFxcbiR7Y29sb3JzLmJvbGQoXCJTdW1tYXJ5OlwiKX0gYCArXG4gICAgICBgVG90YWw6ICR7c3VtbWFyeS50b3RhbH0gfCBgICtcbiAgICAgIGAke2NvbG9ycy5ncmVlbihgT25saW5lOiAke3N1bW1hcnkub25saW5lfWApfSB8IGAgK1xuICAgICAgYCR7Y29sb3JzLnllbGxvdyhgQnVzeTogJHtzdW1tYXJ5LmJ1c3l9YCl9IHwgYCArXG4gICAgICBgJHtjb2xvcnMucmVkKGBPZmZsaW5lOiAke3N1bW1hcnkub2ZmbGluZX1gKX1cXG5gLFxuICApO1xufVxuIiwKICAgICJpbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGNsYWNrL3Byb21wdHNcIjtcbmltcG9ydCB7IGNoZWNrQ29tbW9uTWlzdGFrZXMsIGdldFN1Z2dlc3Rpb25zIH0gZnJvbSBcIkByNW4vY2xpLWNvcmVcIjtcbmltcG9ydCB7IGNvbG9ycyB9IGZyb20gXCJAcjVuL3Rvb2xzL3V0aWxzL2NvbG9yc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWFjaGluZXMgfSBmcm9tIFwiLi9tZXRob2RzL2NyZWF0ZU1hY2hpbmVzXCI7XG5pbXBvcnQgeyBoZWxwIH0gZnJvbSBcIi4vbWV0aG9kcy9oZWxwXCI7XG5pbXBvcnQgeyBpbml0IH0gZnJvbSBcIi4vbWV0aG9kcy9pbml0XCI7XG5pbXBvcnQgeyByZW1vdmVNYWNoaW5lcyB9IGZyb20gXCIuL21ldGhvZHMvcmVtb3ZlTWFjaGluZXNcIjtcbmltcG9ydCB7IHJ1bk1hY2hpbmVzIH0gZnJvbSBcIi4vbWV0aG9kcy9ydW5NYWNoaW5lc1wiO1xuaW1wb3J0IHsgc3RhdHVzIH0gZnJvbSBcIi4vbWV0aG9kcy9zdGF0dXNcIjtcblxuY29uc3QgQ09NTUFORFMgPSBbXCJpbml0XCIsIFwiY3JlYXRlXCIsIFwicnVuXCIsIFwicmVtb3ZlXCIsIFwic3RhdHVzXCIsIFwiaGVscFwiXTtcblxuY29uc3QgQ09NTU9OX01JU1RBS0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBjOiBcImNyZWF0ZVwiLFxuICBjZWF0ZTogXCJjcmVhdGVcIixcbiAgY3JhZXRlOiBcImNyZWF0ZVwiLFxuICBjcmV0YWU6IFwiY3JlYXRlXCIsXG4gIGRlbDogXCJyZW1vdmVcIixcbiAgZGVsZXRlOiBcInJlbW92ZVwiLFxuICBoOiBcImhlbHBcIixcbiAgaTogXCJpbml0XCIsXG4gIGluZm86IFwic3RhdHVzXCIsXG4gIGluaXRpYWxpc2U6IFwiaW5pdFwiLFxuICBpbnRpOiBcImluaXRcIixcbiAgaW50aWFsaXplOiBcImluaXRcIixcbiAgbGlzdDogXCJzdGF0dXNcIixcbiAgbHM6IFwic3RhdHVzXCIsXG4gIG5ldzogXCJjcmVhdGVcIixcbiAgcjogXCJydW5cIixcbiAgcmVtdm9lOiBcInJlbW92ZVwiLFxuICBybTogXCJyZW1vdmVcIixcbiAgcm1vdmU6IFwicmVtb3ZlXCIsXG4gIHJudTogXCJydW5cIixcbiAgcnVubjogXCJydW5cIixcbiAgczogXCJzdGF0dXNcIixcbiAgc3RhcnQ6IFwicnVuXCIsXG4gIHN0YXQ6IFwic3RhdHVzXCIsXG4gIHN0b3A6IFwicmVtb3ZlXCIsXG4gIHN0dGF1czogXCJzdGF0dXNcIixcbiAgdDogXCJ0cm91Ymxlc2hvb3RcIixcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgWywgLCBjb21tYW5kTmFtZSwgLi4uYXJnc10gPSBwcm9jZXNzLmFyZ3Y7XG5cbiAgICBpZiAoIWNvbW1hbmROYW1lIHx8IGNvbW1hbmROYW1lID09PSBcIi0taGVscFwiIHx8IGNvbW1hbmROYW1lID09PSBcIi1oXCIpIHtcbiAgICAgIGhlbHAoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsQ29tbWFuZCA9IGNvbW1hbmROYW1lO1xuXG4gICAgaWYgKCFDT01NQU5EUy5pbmNsdWRlcyhjb21tYW5kTmFtZSkpIHtcbiAgICAgIGNvbnN0IGNvcnJlY3RlZCA9IGNoZWNrQ29tbW9uTWlzdGFrZXMoY29tbWFuZE5hbWUsIENPTU1PTl9NSVNUQUtFUyk7XG4gICAgICBpZiAoY29ycmVjdGVkICYmIENPTU1BTkRTLmluY2x1ZGVzKGNvcnJlY3RlZCkpIHtcbiAgICAgICAgYWN0dWFsQ29tbWFuZCA9IGNvcnJlY3RlZDtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLnllbGxvdyhgQXNzdW1pbmcgeW91IG1lYW50ICcke2NvcnJlY3RlZH0nXFxuYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghQ09NTUFORFMuaW5jbHVkZXMoYWN0dWFsQ29tbWFuZCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY29sb3JzLnJlZChgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmROYW1lfWApKTtcblxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBnZXRTdWdnZXN0aW9ucyhjb21tYW5kTmFtZSwgQ09NTUFORFMpO1xuICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlxcbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgICR7Y29sb3JzLmN5YW4oc3VnZ2VzdGlvbil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBoZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoXCItLWhlbHBcIikgfHwgYXJncy5pbmNsdWRlcyhcIi1oXCIpKSB7XG4gICAgICBoZWxwKGFjdHVhbENvbW1hbmQpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYWN0dWFsQ29tbWFuZCkge1xuICAgICAgY2FzZSBcImluaXRcIjpcbiAgICAgICAgYXdhaXQgaW5pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJjcmVhdGVcIjpcbiAgICAgICAgYXdhaXQgY3JlYXRlTWFjaGluZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicnVuXCI6XG4gICAgICAgIGF3YWl0IHJ1bk1hY2hpbmVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbW92ZVwiOlxuICAgICAgICBhd2FpdCByZW1vdmVNYWNoaW5lcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzdGF0dXNcIjpcbiAgICAgICAgYXdhaXQgc3RhdHVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImhlbHBcIjoge1xuICAgICAgICBjb25zdCB0YXJnZXRDb21tYW5kID0gYXJnc1swXTtcbiAgICAgICAgaGVscCh0YXJnZXRDb21tYW5kKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHthY3R1YWxDb21tYW5kfWApO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck9iaiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICBsb2cuZXJyb3IoZXJyb3JPYmoubWVzc2FnZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVBLElBQU0sTUFBTTtBQUFBLEVBQ1osSUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNmLElBQU0sT0FBTztBQUFBLEVBRWIsSUFBTSxTQUFTO0FBQUEsSUFDYixFQUFFLENBQUMsR0FBRyxHQUFHO0FBQUEsTUFDUCxLQUFLO0FBQUEsUUFBRyxPQUFPLEdBQUcsTUFBTSxJQUFJO0FBQUEsTUFDNUIsT0FBTyxHQUFHLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFBQTtBQUFBLElBRS9CLElBQUksQ0FBQyxHQUFHLEdBQUc7QUFBQSxNQUNULElBQUksTUFBTTtBQUFBLE1BRVYsSUFBSSxJQUFJO0FBQUEsUUFBRyxPQUFPLEdBQUcsT0FBTztBQUFBLE1BQ3ZCLFNBQUksSUFBSTtBQUFBLFFBQUcsT0FBTyxHQUFHLE1BQU07QUFBQSxNQUVoQyxJQUFJLElB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RUFBQyxPQUFPLEtBQUcsRUFBRSxjQUFZLE9BQU8sVUFBVSxlQUFlLEtBQUssR0FBRSxTQUFTLElBQUUsRUFBRSxVQUFRO0FBQUE7QUFBRSxJQUFJLElBQUUsRUFBQyxTQUFRLENBQUMsRUFBQztBQUFBLENBQUcsUUFBUSxDQUFDLEdBQUU7QUFBQSxFQUFDLElBQUksSUFBRSxDQUFDO0FBQUEsRUFBRSxFQUFFLFVBQVEsR0FBRSxFQUFFLGlCQUFlLFFBQVEsQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsRUFBRSxXQUFXLENBQUMsR0FBRSxJQUFFLEVBQUUsVUFBUSxJQUFFLEVBQUUsV0FBVyxDQUFDLElBQUUsR0FBRSxJQUFFO0FBQUEsSUFBRSxPQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsVUFBUSxLQUFHLE1BQUssS0FBRyxNQUFLLElBQUUsS0FBRyxLQUFHLEdBQUUsS0FBRyxRQUFPLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFFBQU0sTUFBSSxLQUFHLFFBQU0sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFFBQU0sTUFBSSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFNBQU8sTUFBSSxNQUFJLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsUUFBTSxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLEtBQUcsT0FBSyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxPQUFLLEtBQUcsS0FBRyxPQUFLLE9BQUssS0FBRyxLQUFHLE9BQUssT0FBSyxLQUFHLEtBQUcsT0FBSyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sS0FBRyxRQUFNLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxRQUFNLEtBQUcsS0FBRyxRQUFNLFFBQU0sS0FBRyxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFFBQU0sUUFBTSxLQUFHLEtBQUcsUUFBTSxLQUFHLFNBQU8sS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxTQUFPLEtBQUcsS0FBRyxTQUFPLFNBQU8sS0FBRyxLQUFHLFNBQU8sU0FBTyxLQUFHLEtBQUcsU0FBTyxLQUFHLFNBQU8sVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFVBQVEsVUFBUSxLQUFHLEtBQUcsVUFBUSxVQUFRLEtBQUcsS0FBRyxVQUFRLFVBQVEsS0FBRyxLQUFHLFdBQVMsV0FBUyxLQUFHLEtBQUcsVUFBUSxNQUFJO0FBQUEsS0FBSyxFQUFFLGtCQUFnQixRQUFRLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssZUFBZSxDQUFDO0FBQUEsSUFBRSxPQUFPLEtBQUcsT0FBSyxLQUFHLE9BQUssS0FBRyxNQUFJLElBQUU7QUFBQTtBQUFBLEVBQUcsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLElBQUMsT0FBTyxFQUFFLE1BQU0sa0RBQWtELEtBQUcsQ0FBQztBQUFBO0FBQUEsRUFBRSxFQUFFLFNBQU8sUUFBUSxDQUFDLEdBQUU7QUFBQSxJQUFDLFNBQVEsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEdBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxRQUFPO0FBQUEsTUFBSSxJQUFFLElBQUUsS0FBSyxnQkFBZ0IsRUFBRSxFQUFFO0FBQUEsSUFBRSxPQUFPO0FBQUEsS0FBRyxFQUFFLFFBQU0sUUFBUSxDQUFDLEdBQUUsR0FBRSxHQUFFO0FBQUEsSUFBQyxVQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBRSxNQUFJLElBQUUsVUFBUSxJQUFHLElBQUUsTUFBSSxJQUFFLFVBQVE7QUFBQSxJQUFHLFNBQVEsSUFBRSxJQUFHLElBQUUsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxJQUFHLElBQUUsRUFBRSxPQUFPLENBQUM7QUFBQSxNQUFFLElBQUcsS0FBRyxLQUFHLEtBQUcsSUFBRSxJQUFFO0FBQUEsUUFBRyxJQUFHLElBQUUsS0FBRztBQUFBLFVBQUUsS0FBRztBQUFBLFFBQU87QUFBQTtBQUFBLE1BQU0sS0FBRztBQUFBLElBQUM7QUFBQSxJQUFDLE9BQU87QUFBQTtBQUFBLEdBQUssQ0FBQztBQUFFLElBQUksS0FBRyxFQUFFO0FBQVEsSUFBTSxLQUFHLEVBQUUsRUFBRTtBQUFFLElBQUksS0FBRyxRQUFRLEdBQUU7QUFBQSxFQUFDLE9BQU07QUFBQTtBQUFreWUsSUFBTSxLQUFHLEVBQUUsRUFBRTtBQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUU7QUFBQSxFQUFDLElBQUcsT0FBTyxLQUFHLFlBQVUsRUFBRSxXQUFTLE1BQUksSUFBRSxFQUFDLG1CQUFrQixTQUFNLEVBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsV0FBUztBQUFBLElBQUcsT0FBTztBQUFBLEVBQUUsSUFBRSxFQUFFLFFBQVEsR0FBRyxHQUFFLElBQUk7QUFBQSxFQUFFLE1BQU0sSUFBRSxFQUFFLG9CQUFrQixJQUFFO0FBQUEsRUFBRSxJQUFJLElBQUU7QUFBQSxFQUFFLFdBQVUsS0FBSyxHQUFFO0FBQUEsSUFBQyxNQUFNLElBQUUsRUFBRSxZQUFZLENBQUM7QUFBQSxJQUFFLElBQUcsS0FBRyxNQUFJLEtBQUcsT0FBSyxLQUFHLE9B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QUEsSUFBRSxFQUFFLFdBQVMsTUFBSSxJQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxPQUFHLElBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUFBLElBQUcsTUFBTSxJQUFFLE9BQU8sU0FBUyxHQUFFLEVBQUU7QUFBQSxJQUFFLE9BQU0sQ0FBQyxLQUFHLEtBQUcsS0FBSSxLQUFHLElBQUUsS0FBSSxJQUFFLEdBQUc7QUFBQSxLQUFHLFlBQVcsTUFBRSxHQUFFLGNBQWEsRUFBQyxPQUFNLE9BQUcsRUFBRSxhQUFhLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFLFlBQVcsTUFBRSxHQUFFLGVBQWMsRUFBQyxPQUFNLE9BQUc7QUFBQSxJQUFDLElBQUcsSUFBRTtBQUFBLE1BQUUsT0FBTyxLQUFHO0FBQUEsSUFBRSxJQUFHLElBQUU7QUFBQSxNQUFHLE9BQU8sTUFBSSxJQUFFO0FBQUEsSUFBRyxJQUFJLEdBQUUsR0FBRTtBQUFBLElBQUUsSUFBRyxLQUFHO0FBQUEsTUFBSSxNQUFJLElBQUUsT0FBSyxLQUFHLEtBQUcsS0FBSSxJQUFFLEdBQUUsSUFBRTtBQUFBLElBQU07QUFBQSxNQUFDLEtBQUc7QUFBQSxNQUFHLE1BQU0sSUFBRSxJQUFFO0FBQUEsTUFBRyxJQUFFLEtBQUssTUFBTSxJQUFFLEVBQUUsSUFBRSxHQUFFLElBQUUsS0FBSyxNQUFNLElBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUU7QUFBQTtBQUFBLElBQUUsTUFBTSxJQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxJQUFFO0FBQUEsSUFBRSxJQUFHLE1BQUk7QUFBQSxNQUFFLE9BQU87QUFBQSxJQUFHLElBQUksSUFBRSxNQUFJLEtBQUssTUFBTSxDQUFDLEtBQUcsSUFBRSxLQUFLLE1BQU0sQ0FBQyxLQUFHLElBQUUsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUFHLE9BQU8sTUFBSSxNQUFJLEtBQUcsS0FBSTtBQUFBLEtBQUcsWUFBVyxNQUFFLEdBQUUsV0FBVSxFQUFDLE9BQU0sQ0FBQyxHQUFFLEdBQUUsTUFBSSxFQUFFLGNBQWMsRUFBRSxhQUFhLEdBQUUsR0FBRSxDQUFDLENBQUMsR0FBRSxZQUFXLE1BQUUsR0FBRSxXQUFVLEVBQUMsT0FBTSxPQUFHLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUUsWUFBVyxNQUFFLEVBQUMsQ0FBQyxHQUFFO0FBQUE7QUFBRSxJQUFNLEtBQUcsR0FBRztBQUFaLElBQWMsSUFBRSxJQUFJLElBQUksQ0FBQyxRQUFPLE1BQU0sQ0FBQztBQUF2QyxJQUF5QyxLQUFHO0FBQTVDLElBQStDLElBQUU7QUFBakQsSUFBd0QsSUFBRTtBQUExRCxJQUE4RCxLQUFHO0FBQWpFLElBQXFFLElBQUU7QUFBdkUsSUFBMkUsSUFBRSxHQUFHO0FBQWhGLElBQXdGLElBQUUsT0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksSUFBSTtBQUFsSSxJQUFzSSxJQUFFLE9BQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLElBQUk7QUFBaEwsSUFBb0wsS0FBRyxPQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsSUFBSSxPQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQWxOLElBQW9OLElBQUUsQ0FBQyxHQUFFLEdBQUUsTUFBSTtBQUFBLEVBQUMsTUFBTSxJQUFFLENBQUMsR0FBRyxDQUFDO0FBQUEsRUFBRSxJQUFJLElBQUUsT0FBRyxJQUFFLE9BQUcsSUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQU8sRUFBRSxDQUFDO0FBQUEsRUFBRSxZQUFVLEdBQUUsTUFBSyxFQUFFLFFBQVEsR0FBRTtBQUFBLElBQUMsTUFBTSxJQUFFLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRyxJQUFFLEtBQUcsSUFBRSxFQUFFLEVBQUUsU0FBTyxNQUFJLEtBQUcsRUFBRSxLQUFLLENBQUMsR0FBRSxJQUFFLElBQUcsRUFBRSxJQUFJLENBQUMsTUFBSSxJQUFFLE1BQUcsSUFBRSxFQUFFLE1BQU0sSUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUcsR0FBRTtBQUFBLE1BQUMsSUFBRSxNQUFJLE1BQUksSUFBRSxPQUFHLElBQUUsU0FBSSxNQUFJLE1BQUksSUFBRTtBQUFBLE1BQUk7QUFBQSxJQUFRO0FBQUEsSUFBQyxLQUFHLEdBQUUsTUFBSSxLQUFHLElBQUUsRUFBRSxTQUFPLE1BQUksRUFBRSxLQUFLLEVBQUUsR0FBRSxJQUFFO0FBQUEsRUFBRTtBQUFBLEdBQUUsS0FBRyxFQUFFLEVBQUUsU0FBTyxHQUFHLFNBQU8sS0FBRyxFQUFFLFNBQU8sTUFBSSxFQUFFLEVBQUUsU0FBTyxNQUFJLEVBQUUsSUFBSTtBQUFBO0FBQXhqQixJQUE0akIsS0FBRyxPQUFHO0FBQUEsRUFBQyxNQUFNLElBQUUsRUFBRSxNQUFNLEdBQUc7QUFBQSxFQUFFLElBQUksSUFBRSxFQUFFO0FBQUEsRUFBTyxNQUFLLElBQUUsT0FBSyxFQUFFLEVBQUUsSUFBRSxFQUFFLElBQUU7QUFBQSxJQUFJO0FBQUEsRUFBSSxPQUFPLE1BQUksRUFBRSxTQUFPLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUE7QUFBcHNCLElBQXVzQixLQUFHLENBQUMsR0FBRSxHQUFFLElBQUUsQ0FBQyxNQUFJO0FBQUEsRUFBQyxJQUFHLEVBQUUsU0FBTyxTQUFJLEVBQUUsS0FBSyxNQUFJO0FBQUEsSUFBRyxPQUFNO0FBQUEsRUFBRyxJQUFJLElBQUUsSUFBRyxHQUFFO0FBQUEsRUFBRSxNQUFNLElBQUUsR0FBRyxDQUFDO0FBQUEsRUFBRSxJQUFJLElBQUUsQ0FBQyxFQUFFO0FBQUEsRUFBRSxZQUFVLEdBQUUsTUFBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLFFBQVEsR0FBRTtBQUFBLElBQUMsRUFBRSxTQUFPLFVBQUssRUFBRSxFQUFFLFNBQU8sS0FBRyxFQUFFLEVBQUUsU0FBTyxHQUFHLFVBQVU7QUFBQSxJQUFHLElBQUksSUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFPLEVBQUU7QUFBQSxJQUFFLElBQUcsTUFBSSxNQUFJLEtBQUcsTUFBSSxFQUFFLGFBQVcsU0FBSSxFQUFFLFNBQU8sV0FBTSxFQUFFLEtBQUssRUFBRSxHQUFFLElBQUUsS0FBSSxJQUFFLEtBQUcsRUFBRSxTQUFPLFdBQU0sRUFBRSxFQUFFLFNBQU8sTUFBSSxLQUFJLE9BQU0sRUFBRSxRQUFNLEVBQUUsS0FBRyxHQUFFO0FBQUEsTUFBQyxNQUFNLElBQUUsSUFBRSxHQUFFLElBQUUsSUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFHLElBQUUsS0FBRyxDQUFDO0FBQUEsTUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFHLEtBQUcsQ0FBQyxJQUFFLEtBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQVE7QUFBQSxJQUFDLElBQUcsSUFBRSxFQUFFLEtBQUcsS0FBRyxJQUFFLEtBQUcsRUFBRSxLQUFHLEdBQUU7QUFBQSxNQUFDLElBQUcsRUFBRSxhQUFXLFNBQUksSUFBRSxHQUFFO0FBQUEsUUFBQyxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLEVBQUUsS0FBSyxFQUFFO0FBQUEsSUFBQztBQUFBLElBQUMsSUFBRyxJQUFFLEVBQUUsS0FBRyxLQUFHLEVBQUUsYUFBVyxPQUFHO0FBQUEsTUFBQyxFQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQVE7QUFBQSxJQUFDLEVBQUUsRUFBRSxTQUFPLE1BQUk7QUFBQSxFQUFDO0FBQUEsRUFBQyxFQUFFLFNBQU8sVUFBSyxJQUFFLEVBQUUsSUFBSSxPQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsRUFBRyxNQUFNLElBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSztBQUFBLENBQzV0d0IsQ0FBQztBQUFBLEVBQUUsWUFBVSxHQUFFLE1BQUssRUFBRSxRQUFRLEdBQUU7QUFBQSxJQUFDLElBQUcsS0FBRyxHQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUU7QUFBQSxN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QUFRLEVBQUMsQ0FBQztBQUFBLEVBQUkscUJBQW1CLEdBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBTyxFQUFFLFdBQVcsSUFBRTtBQUFBLEVBQUUsTUFBTSxJQUFFLENBQUMsS0FBRyxNQUFLLEdBQUUsVUFBUyxRQUFLO0FBQUEsSUFBQyxNQUFNLElBQUUsT0FBTyxDQUFDO0FBQUEsSUFBRSxJQUFHLEVBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLFFBQVEsR0FBRTtBQUFBLE1BQUMsS0FBRyxFQUFFLE1BQU0seUJBQUUsSUFBSSxHQUFFLFFBQVEsS0FBSyxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQU07QUFBQSxJQUFDLEtBQUk7QUFBQSxNQUFFO0FBQUEsSUFBTyxNQUFNLElBQUUsTUFBSSxXQUFTLElBQUUsSUFBRyxJQUFFLE1BQUksV0FBUyxLQUFHO0FBQUEsSUFBSSxhQUFXLEdBQUUsR0FBRSxHQUFFLE1BQUk7QUFBQSxNQUFHLFlBQVUsR0FBRSxHQUFFLE1BQUk7QUFBQSxRQUFDLEVBQUUsS0FBSyxZQUFXLENBQUM7QUFBQSxPQUFFO0FBQUEsS0FBRTtBQUFBO0FBQUEsRUFBRyxPQUFPLEtBQUcsRUFBRSxNQUFNLHlCQUFFLElBQUksR0FBRSxFQUFFLEtBQUssWUFBVyxDQUFDLEdBQUUsTUFBSTtBQUFBLElBQUMsRUFBRSxJQUFJLFlBQVcsQ0FBQyxHQUFFLEtBQUcsRUFBRSxNQUFNLHlCQUFFLElBQUksR0FBRSxFQUFFLFVBQVEsTUFBSSxFQUFFLFdBQVcsS0FBRSxHQUFFLEVBQUUsV0FBUyxPQUFHLEVBQUUsTUFBTTtBQUFBO0FBQUE7QUFBRyxJQUFJLEtBQUcsT0FBTztBQUFkLElBQTZCLEtBQUcsQ0FBQyxHQUFFLEdBQUUsT0FBSSxLQUFLLEtBQUUsR0FBRyxHQUFFLEdBQUUsRUFBQyxZQUFXLE1BQUcsY0FBYSxNQUFHLFVBQVMsTUFBRyxPQUFNLEVBQUMsQ0FBQyxJQUFFLEVBQUUsS0FBRztBQUFqSCxJQUFtSCxJQUFFLENBQUMsR0FBRSxHQUFFLE9BQUssR0FBRyxHQUFFLE9BQU8sS0FBRyxXQUFTLElBQUUsS0FBRyxHQUFFLENBQUMsR0FBRTtBQUFBO0FBQUcsTUFBTSxFQUFDO0FBQUEsRUFBQyxXQUFXLENBQUMsR0FBRSxJQUFFLE1BQUc7QUFBQSxJQUFDLEVBQUUsTUFBSyxPQUFPLEdBQUUsRUFBRSxNQUFLLFFBQVEsR0FBRSxFQUFFLE1BQUssY0FBYyxHQUFFLEVBQUUsTUFBSyxJQUFJLEdBQUUsRUFBRSxNQUFLLE1BQU0sR0FBRSxFQUFFLE1BQUssU0FBUyxHQUFFLEVBQUUsTUFBSyxVQUFTLEtBQUUsR0FBRSxFQUFFLE1BQUssY0FBYSxFQUFFLEdBQUUsRUFBRSxNQUFLLGdCQUFlLElBQUksR0FBRyxHQUFFLEVBQUUsTUFBSyxXQUFVLENBQUMsR0FBRSxFQUFFLE1BQUssU0FBUSxTQUFTLEdBQUUsRUFBRSxNQUFLLFNBQVEsRUFBRSxHQUFFLEVBQUUsTUFBSyxPQUFPO0FBQUEsSUFBRSxRQUFNLE9BQU0sSUFBRSxHQUFFLFFBQU8sSUFBRSxHQUFFLFFBQU8sR0FBRSxRQUFPLE1BQUssTUFBRztBQUFBLElBQUUsS0FBSyxPQUFLLEdBQUUsS0FBSyxhQUFXLEtBQUssV0FBVyxLQUFLLElBQUksR0FBRSxLQUFLLFFBQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFFLEtBQUssU0FBTyxLQUFLLE9BQU8sS0FBSyxJQUFJLEdBQUUsS0FBSyxVQUFRLEVBQUUsS0FBSyxJQUFJLEdBQUUsS0FBSyxTQUFPLEdBQUUsS0FBSyxlQUFhLEdBQUUsS0FBSyxRQUFNLEdBQUUsS0FBSyxTQUFPO0FBQUE7QUFBQSxFQUFFLFdBQVcsR0FBRTtBQUFBLElBQUMsS0FBSyxhQUFhLE1BQU07QUFBQTtBQUFBLEVBQUUsYUFBYSxDQUFDLEdBQUUsR0FBRTtBQUFBLElBQUMsTUFBTSxJQUFFLEtBQUssYUFBYSxJQUFJLENBQUMsS0FBRyxDQUFDO0FBQUEsSUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFFLEtBQUssYUFBYSxJQUFJLEdBQUUsQ0FBQztBQUFBO0FBQUEsRUFBRSxFQUFFLENBQUMsR0FBRSxHQUFFO0FBQUEsSUFBQyxLQUFLLGNBQWMsR0FBRSxFQUFDLElBQUcsRUFBQyxDQUFDO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFDLEtBQUssY0FBYyxHQUFFLEVBQUMsSUFBRyxHQUFFLE1BQUssS0FBRSxDQUFDO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxNQUFLLEdBQUU7QUFBQSxJQUFDLE1BQU0sSUFBRSxLQUFLLGFBQWEsSUFBSSxDQUFDLEtBQUcsQ0FBQyxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUUsV0FBVSxLQUFLO0FBQUEsTUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUUsRUFBRSxRQUFNLEVBQUUsS0FBSyxNQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFFLENBQUMsQ0FBQztBQUFBLElBQUUsV0FBVSxLQUFLO0FBQUEsTUFBRSxFQUFFO0FBQUE7QUFBQSxFQUFFLE1BQU0sR0FBRTtBQUFBLElBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFFLE1BQUk7QUFBQSxNQUFDLElBQUcsS0FBSyxjQUFhO0FBQUEsUUFBQyxJQUFHLEtBQUssYUFBYTtBQUFBLFVBQVEsT0FBTyxLQUFLLFFBQU0sVUFBUyxLQUFLLE1BQU0sR0FBRSxFQUFFLENBQUM7QUFBQSxRQUFFLEtBQUssYUFBYSxpQkFBaUIsU0FBUSxNQUFJO0FBQUEsVUFBQyxLQUFLLFFBQU0sVUFBUyxLQUFLLE1BQU07QUFBQSxXQUFHLEVBQUMsTUFBSyxLQUFFLENBQUM7QUFBQSxNQUFDO0FBQUEsTUFBQyxNQUFNLElBQUUsSUFBSTtBQUFBLE1BQUUsRUFBRSxTQUFPLENBQUMsR0FBRSxHQUFFLE1BQUk7QUFBQSxRQUFDLEtBQUssV0FBUyxLQUFLLFFBQU0sS0FBSyxJQUFJLEtBQUssUUFBUSxPQUFNLEVBQUUsR0FBRSxLQUFLLFVBQVEsS0FBSyxJQUFJLFVBQVEsR0FBRSxLQUFLLEtBQUssU0FBUSxLQUFLLEtBQUssSUFBRyxFQUFFO0FBQUEsU0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUUs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RSxNQUFNO0FBQUEsQ0FDeE0sRUFBRSxNQUFNLENBQUM7QUFBQSxVQUFFLEtBQUssT0FBTyxNQUFNLEVBQUUsS0FBSztBQUFBLENBQ3BDLENBQUMsR0FBRSxLQUFLLGFBQVc7QUFBQSxVQUFFO0FBQUEsUUFBTTtBQUFBLFFBQUMsS0FBSyxPQUFPLE1BQU0sd0JBQUUsS0FBSyxDQUFDO0FBQUE7QUFBQSxNQUFFLEtBQUssT0FBTyxNQUFNLENBQUMsR0FBRSxLQUFLLFVBQVEsY0FBWSxLQUFLLFFBQU0sV0FBVSxLQUFLLGFBQVc7QUFBQSxJQUFDO0FBQUE7QUFBRTtBQUFBO0FBQUMsTUFBTSxXQUFXLEVBQUM7QUFBQSxNQUFLLE1BQU0sR0FBRTtBQUFBLElBQUMsT0FBTyxLQUFLLFFBQU0sSUFBRTtBQUFBO0FBQUEsTUFBTSxNQUFNLEdBQUU7QUFBQSxJQUFDLE9BQU8sS0FBSyxXQUFTO0FBQUE7QUFBQSxFQUFFLFdBQVcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxNQUFNLEdBQUUsS0FBRSxHQUFFLEtBQUssVUFBUSxFQUFFLGNBQWEsS0FBSyxHQUFHLFNBQVEsTUFBSTtBQUFBLE1BQUMsS0FBSyxRQUFNLEtBQUs7QUFBQSxLQUFPLEdBQUUsS0FBSyxHQUFHLFdBQVUsT0FBRztBQUFBLE1BQUMsS0FBSyxPQUFPLE1BQU0seUJBQUUsS0FBSyxHQUFFLEVBQUUsQ0FBQyxHQUFFLEtBQUssUUFBTSxHQUFFLEtBQUssUUFBTSxVQUFTLEtBQUssTUFBTTtBQUFBLEtBQUUsR0FBRSxLQUFLLEdBQUcsVUFBUyxNQUFJO0FBQUEsTUFBQyxLQUFLLFNBQU8sS0FBSztBQUFBLEtBQU07QUFBQTtBQUFFO0FBQUMsSUFBaWY7QUFBNDZDLElBQUUsSUFBSTtBQUFtNUYsTUFBTSxXQUFXLEVBQUM7QUFBQSxNQUFLLGVBQWUsR0FBRTtBQUFBLElBQUMsSUFBRyxLQUFLLFVBQVE7QUFBQSxNQUFTLE9BQU8sS0FBSztBQUFBLElBQU0sSUFBRyxLQUFLLFVBQVEsS0FBSyxNQUFNO0FBQUEsTUFBTyxPQUFNLEdBQUcsS0FBSztBQUFB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QUMsTUFBTSxNQUFHLFlBQVksSUFBSSxJQUFFLE1BQUcsTUFBSSxLQUFFLEtBQUssTUFBTSxLQUFFLEVBQUUsR0FBRSxLQUFFLEtBQUssTUFBTSxLQUFFLEVBQUU7QUFBQSxJQUFFLE9BQU8sS0FBRSxJQUFFLElBQUksT0FBTSxTQUFNLElBQUk7QUFBQSxLQUFPLElBQUUsQ0FBQyxLQUFFLE9BQUs7QUFBQSxJQUFDLElBQUUsTUFBRyxJQUFFLEdBQUcsR0FBRSxLQUFFLEdBQUUsRUFBQyxHQUFFLEtBQUUsWUFBWSxJQUFJLEdBQUUsUUFBUSxPQUFPLE1BQU0sR0FBRywyQkFBRSxLQUFLLENBQUM7QUFBQSxDQUMxVDtBQUFBLElBQUUsSUFBSSxLQUFFLEdBQUUsS0FBRTtBQUFBLElBQUUsR0FBRSxHQUFFLElBQUUsWUFBWSxNQUFJO0FBQUEsTUFBQyxJQUFHLEtBQUcsT0FBSTtBQUFBLFFBQUU7QUFBQSxNQUFPLEdBQUUsR0FBRSxLQUFFO0FBQUEsTUFBRSxNQUFNLEtBQUUsMkJBQUUsUUFBUSxFQUFFLEdBQUU7QUFBQSxNQUFFLElBQUc7QUFBQSxRQUFFLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxPQUFNO0FBQUEsTUFBTyxTQUFHLE1BQUk7QUFBQSxRQUFRLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxNQUFLLEdBQUUsRUFBQyxHQUFHO0FBQUEsTUFBTTtBQUFBLFFBQUMsTUFBTSxLQUFFLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBQSxRQUFFLFFBQVEsT0FBTyxNQUFNLEdBQUcsT0FBTSxLQUFJLElBQUc7QUFBQTtBQUFBLE1BQUUsS0FBRSxLQUFFLElBQUUsRUFBRSxTQUFPLEtBQUUsSUFBRSxHQUFFLEtBQUUsS0FBRSxFQUFFLFNBQU8sS0FBRSxRQUFLO0FBQUEsT0FBRyxFQUFDO0FBQUEsS0FBRyxLQUFFLENBQUMsS0FBRSxJQUFHLEtBQUUsTUFBSTtBQUFBLElBQUMsSUFBRSxPQUFHLGNBQWMsQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFF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QUNHO0FBQUEsUUFDSCxNQUFNLFlBQVk7QUFBQSxRQUNsQjtBQUFBLFdBQ0c7QUFBQSxRQUNILE1BQU0sZUFBZTtBQUFBLFFBQ3JCO0FBQUEsV0FDRztBQUFBLFFBQ0gsTUFBTSxPQUFPO0FBQUEsUUFDYjtBQUFBLFdBQ0csUUFBUTtBQUFBLFFBQ1gsTUFBTSxnQkFBZ0IsS0FBSztBQUFBLFFBQzNCLEtBQUssYUFBYTtBQUFBLFFBQ2xCO0FBQUEsTUFDRjtBQUFBO0FBQUEsUUFFRSxNQUFNLElBQUksTUFBTSxvQkFBb0IsZUFBZTtBQUFBO0FBQUEsSUFHdkQsUUFBUSxLQUFLLENBQUM7QUFBQSxJQUNkLE9BQU8sUUFBTztBQUFBLElBQ2QsTUFBTSxXQUFXLGtCQUFpQixRQUFRLFNBQVEsSUFBSSxNQUFNLE9BQU8sTUFBSyxDQUFDO0FBQUEsSUFDekUsR0FBSSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQzFCLFFBQVEsS0FBSyxDQUFDO0FBQUE7QUFBQTtBQUlsQixNQUFNLEtBQUs7IiwKICAiZGVidWdJZCI6ICIxNzIzMTk3NjY4MDNGQkUwNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==