windsor-bot 0.1.0 → 0.1.2

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.
@@ -0,0 +1,955 @@
1
+ // node_modules/preact/dist/preact.module.js
2
+ var n;
3
+ var l;
4
+ var u;
5
+ var t;
6
+ var i;
7
+ var r;
8
+ var o;
9
+ var e;
10
+ var f;
11
+ var c;
12
+ var a;
13
+ var s;
14
+ var h;
15
+ var p;
16
+ var v;
17
+ var y;
18
+ var d = {};
19
+ var w = [];
20
+ var _ = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
21
+ var g = Array.isArray;
22
+ function m(n2, l3) {
23
+ for (var u4 in l3) n2[u4] = l3[u4];
24
+ return n2;
25
+ }
26
+ function b(n2) {
27
+ n2 && n2.parentNode && n2.parentNode.removeChild(n2);
28
+ }
29
+ function k(l3, u4, t3) {
30
+ var i3, r3, o3, e3 = {};
31
+ for (o3 in u4) "key" == o3 ? i3 = u4[o3] : "ref" == o3 ? r3 = u4[o3] : e3[o3] = u4[o3];
32
+ if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n.call(arguments, 2) : t3), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
33
+ return x(l3, e3, i3, r3, null);
34
+ }
35
+ function x(n2, t3, i3, r3, o3) {
36
+ var e3 = { type: n2, props: t3, key: i3, ref: r3, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: null == o3 ? ++u : o3, __i: -1, __u: 0 };
37
+ return null == o3 && null != l.vnode && l.vnode(e3), e3;
38
+ }
39
+ function S(n2) {
40
+ return n2.children;
41
+ }
42
+ function C(n2, l3) {
43
+ this.props = n2, this.context = l3;
44
+ }
45
+ function $(n2, l3) {
46
+ if (null == l3) return n2.__ ? $(n2.__, n2.__i + 1) : null;
47
+ for (var u4; l3 < n2.__k.length; l3++) if (null != (u4 = n2.__k[l3]) && null != u4.__e) return u4.__e;
48
+ return "function" == typeof n2.type ? $(n2) : null;
49
+ }
50
+ function I(n2) {
51
+ if (n2.__P && n2.__d) {
52
+ var u4 = n2.__v, t3 = u4.__e, i3 = [], r3 = [], o3 = m({}, u4);
53
+ o3.__v = u4.__v + 1, l.vnode && l.vnode(o3), q(n2.__P, o3, u4, n2.__n, n2.__P.namespaceURI, 32 & u4.__u ? [t3] : null, i3, null == t3 ? $(u4) : t3, !!(32 & u4.__u), r3), o3.__v = u4.__v, o3.__.__k[o3.__i] = o3, D(i3, o3, r3), u4.__e = u4.__ = null, o3.__e != t3 && P(o3);
54
+ }
55
+ }
56
+ function P(n2) {
57
+ if (null != (n2 = n2.__) && null != n2.__c) return n2.__e = n2.__c.base = null, n2.__k.some(function(l3) {
58
+ if (null != l3 && null != l3.__e) return n2.__e = n2.__c.base = l3.__e;
59
+ }), P(n2);
60
+ }
61
+ function A(n2) {
62
+ (!n2.__d && (n2.__d = true) && i.push(n2) && !H.__r++ || r != l.debounceRendering) && ((r = l.debounceRendering) || o)(H);
63
+ }
64
+ function H() {
65
+ try {
66
+ for (var n2, l3 = 1; i.length; ) i.length > l3 && i.sort(e), n2 = i.shift(), l3 = i.length, I(n2);
67
+ } finally {
68
+ i.length = H.__r = 0;
69
+ }
70
+ }
71
+ function L(n2, l3, u4, t3, i3, r3, o3, e3, f4, c3, a3) {
72
+ var s3, h3, p3, v3, y3, _2, g2, m3 = t3 && t3.__k || w, b2 = l3.length;
73
+ for (f4 = T(u4, l3, m3, f4, b2), s3 = 0; s3 < b2; s3++) null != (p3 = u4.__k[s3]) && (h3 = -1 != p3.__i && m3[p3.__i] || d, p3.__i = s3, _2 = q(n2, p3, h3, i3, r3, o3, e3, f4, c3, a3), v3 = p3.__e, p3.ref && h3.ref != p3.ref && (h3.ref && J(h3.ref, null, p3), a3.push(p3.ref, p3.__c || v3, p3)), null == y3 && null != v3 && (y3 = v3), (g2 = !!(4 & p3.__u)) || h3.__k === p3.__k ? (f4 = j(p3, f4, n2, g2), g2 && h3.__e && (h3.__e = null)) : "function" == typeof p3.type && void 0 !== _2 ? f4 = _2 : v3 && (f4 = v3.nextSibling), p3.__u &= -7);
74
+ return u4.__e = y3, f4;
75
+ }
76
+ function T(n2, l3, u4, t3, i3) {
77
+ var r3, o3, e3, f4, c3, a3 = u4.length, s3 = a3, h3 = 0;
78
+ for (n2.__k = new Array(i3), r3 = 0; r3 < i3; r3++) null != (o3 = l3[r3]) && "boolean" != typeof o3 && "function" != typeof o3 ? ("string" == typeof o3 || "number" == typeof o3 || "bigint" == typeof o3 || o3.constructor == String ? o3 = n2.__k[r3] = x(null, o3, null, null, null) : g(o3) ? o3 = n2.__k[r3] = x(S, { children: o3 }, null, null, null) : void 0 === o3.constructor && o3.__b > 0 ? o3 = n2.__k[r3] = x(o3.type, o3.props, o3.key, o3.ref ? o3.ref : null, o3.__v) : n2.__k[r3] = o3, f4 = r3 + h3, o3.__ = n2, o3.__b = n2.__b + 1, e3 = null, -1 != (c3 = o3.__i = O(o3, u4, f4, s3)) && (s3--, (e3 = u4[c3]) && (e3.__u |= 2)), null == e3 || null == e3.__v ? (-1 == c3 && (i3 > a3 ? h3-- : i3 < a3 && h3++), "function" != typeof o3.type && (o3.__u |= 4)) : c3 != f4 && (c3 == f4 - 1 ? h3-- : c3 == f4 + 1 ? h3++ : (c3 > f4 ? h3-- : h3++, o3.__u |= 4))) : n2.__k[r3] = null;
79
+ if (s3) for (r3 = 0; r3 < a3; r3++) null != (e3 = u4[r3]) && 0 == (2 & e3.__u) && (e3.__e == t3 && (t3 = $(e3)), K(e3, e3));
80
+ return t3;
81
+ }
82
+ function j(n2, l3, u4, t3) {
83
+ var i3, r3;
84
+ if ("function" == typeof n2.type) {
85
+ for (i3 = n2.__k, r3 = 0; i3 && r3 < i3.length; r3++) i3[r3] && (i3[r3].__ = n2, l3 = j(i3[r3], l3, u4, t3));
86
+ return l3;
87
+ }
88
+ n2.__e != l3 && (t3 && (l3 && n2.type && !l3.parentNode && (l3 = $(n2)), u4.insertBefore(n2.__e, l3 || null)), l3 = n2.__e);
89
+ do {
90
+ l3 = l3 && l3.nextSibling;
91
+ } while (null != l3 && 8 == l3.nodeType);
92
+ return l3;
93
+ }
94
+ function O(n2, l3, u4, t3) {
95
+ var i3, r3, o3, e3 = n2.key, f4 = n2.type, c3 = l3[u4], a3 = null != c3 && 0 == (2 & c3.__u);
96
+ if (null === c3 && null == e3 || a3 && e3 == c3.key && f4 == c3.type) return u4;
97
+ if (t3 > (a3 ? 1 : 0)) {
98
+ for (i3 = u4 - 1, r3 = u4 + 1; i3 >= 0 || r3 < l3.length; ) if (null != (c3 = l3[o3 = i3 >= 0 ? i3-- : r3++]) && 0 == (2 & c3.__u) && e3 == c3.key && f4 == c3.type) return o3;
99
+ }
100
+ return -1;
101
+ }
102
+ function z(n2, l3, u4) {
103
+ "-" == l3[0] ? n2.setProperty(l3, null == u4 ? "" : u4) : n2[l3] = null == u4 ? "" : "number" != typeof u4 || _.test(l3) ? u4 : u4 + "px";
104
+ }
105
+ function N(n2, l3, u4, t3, i3) {
106
+ var r3, o3;
107
+ n: if ("style" == l3) if ("string" == typeof u4) n2.style.cssText = u4;
108
+ else {
109
+ if ("string" == typeof t3 && (n2.style.cssText = t3 = ""), t3) for (l3 in t3) u4 && l3 in u4 || z(n2.style, l3, "");
110
+ if (u4) for (l3 in u4) t3 && u4[l3] == t3[l3] || z(n2.style, l3, u4[l3]);
111
+ }
112
+ else if ("o" == l3[0] && "n" == l3[1]) r3 = l3 != (l3 = l3.replace(s, "$1")), o3 = l3.toLowerCase(), l3 = o3 in n2 || "onFocusOut" == l3 || "onFocusIn" == l3 ? o3.slice(2) : l3.slice(2), n2.l || (n2.l = {}), n2.l[l3 + r3] = u4, u4 ? t3 ? u4[a] = t3[a] : (u4[a] = h, n2.addEventListener(l3, r3 ? v : p, r3)) : n2.removeEventListener(l3, r3 ? v : p, r3);
113
+ else {
114
+ if ("http://www.w3.org/2000/svg" == i3) l3 = l3.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
115
+ else if ("width" != l3 && "height" != l3 && "href" != l3 && "list" != l3 && "form" != l3 && "tabIndex" != l3 && "download" != l3 && "rowSpan" != l3 && "colSpan" != l3 && "role" != l3 && "popover" != l3 && l3 in n2) try {
116
+ n2[l3] = null == u4 ? "" : u4;
117
+ break n;
118
+ } catch (n3) {
119
+ }
120
+ "function" == typeof u4 || (null == u4 || false === u4 && "-" != l3[4] ? n2.removeAttribute(l3) : n2.setAttribute(l3, "popover" == l3 && 1 == u4 ? "" : u4));
121
+ }
122
+ }
123
+ function V(n2) {
124
+ return function(u4) {
125
+ if (this.l) {
126
+ var t3 = this.l[u4.type + n2];
127
+ if (null == u4[c]) u4[c] = h++;
128
+ else if (u4[c] < t3[a]) return;
129
+ return t3(l.event ? l.event(u4) : u4);
130
+ }
131
+ };
132
+ }
133
+ function q(n2, u4, t3, i3, r3, o3, e3, f4, c3, a3) {
134
+ var s3, h3, p3, v3, y3, d3, _2, k3, x2, M, $2, I2, P2, A2, H2, T2, j3 = u4.type;
135
+ if (void 0 !== u4.constructor) return null;
136
+ 128 & t3.__u && (c3 = !!(32 & t3.__u), o3 = [f4 = u4.__e = t3.__e]), (s3 = l.__b) && s3(u4);
137
+ n: if ("function" == typeof j3) {
138
+ h3 = e3.length;
139
+ try {
140
+ if (x2 = u4.props, M = j3.prototype && j3.prototype.render, $2 = (s3 = j3.contextType) && i3[s3.__c], I2 = s3 ? $2 ? $2.props.value : s3.__ : i3, t3.__c ? k3 = (p3 = u4.__c = t3.__c).__ = p3.__E : (M ? u4.__c = p3 = new j3(x2, I2) : (u4.__c = p3 = new C(x2, I2), p3.constructor = j3, p3.render = Q), $2 && $2.sub(p3), p3.state || (p3.state = {}), p3.__n = i3, v3 = p3.__d = true, p3.__h = [], p3._sb = []), M && null == p3.__s && (p3.__s = p3.state), M && null != j3.getDerivedStateFromProps && (p3.__s == p3.state && (p3.__s = m({}, p3.__s)), m(p3.__s, j3.getDerivedStateFromProps(x2, p3.__s))), y3 = p3.props, d3 = p3.state, p3.__v = u4, v3) M && null == j3.getDerivedStateFromProps && null != p3.componentWillMount && p3.componentWillMount(), M && null != p3.componentDidMount && p3.__h.push(p3.componentDidMount);
141
+ else {
142
+ if (M && null == j3.getDerivedStateFromProps && x2 !== y3 && null != p3.componentWillReceiveProps && p3.componentWillReceiveProps(x2, I2), u4.__v == t3.__v || !p3.__e && null != p3.shouldComponentUpdate && false === p3.shouldComponentUpdate(x2, p3.__s, I2)) {
143
+ u4.__v != t3.__v && (p3.props = x2, p3.state = p3.__s, p3.__d = false), u4.__e = t3.__e, u4.__k = t3.__k, u4.__k.some(function(n3) {
144
+ n3 && (n3.__ = u4);
145
+ }), w.push.apply(p3.__h, p3._sb), p3._sb = [], p3.__h.length && e3.push(p3);
146
+ break n;
147
+ }
148
+ null != p3.componentWillUpdate && p3.componentWillUpdate(x2, p3.__s, I2), M && null != p3.componentDidUpdate && p3.__h.push(function() {
149
+ p3.componentDidUpdate(y3, d3, _2);
150
+ });
151
+ }
152
+ if (p3.context = I2, p3.props = x2, p3.__P = n2, p3.__e = false, P2 = l.__r, A2 = 0, M) p3.state = p3.__s, p3.__d = false, P2 && P2(u4), s3 = p3.render(p3.props, p3.state, p3.context), w.push.apply(p3.__h, p3._sb), p3._sb = [];
153
+ else do {
154
+ p3.__d = false, P2 && P2(u4), s3 = p3.render(p3.props, p3.state, p3.context), p3.state = p3.__s;
155
+ } while (p3.__d && ++A2 < 25);
156
+ p3.state = p3.__s, null != p3.getChildContext && (i3 = m(m({}, i3), p3.getChildContext())), M && !v3 && null != p3.getSnapshotBeforeUpdate && (_2 = p3.getSnapshotBeforeUpdate(y3, d3)), H2 = null != s3 && s3.type === S && null == s3.key ? E(s3.props.children) : s3, f4 = L(n2, g(H2) ? H2 : [H2], u4, t3, i3, r3, o3, e3, f4, c3, a3), p3.base = u4.__e, u4.__u &= -161, p3.__h.length && e3.push(p3), k3 && (p3.__E = p3.__ = null);
157
+ } catch (n3) {
158
+ if (e3.length = h3, u4.__v = null, c3 || null != o3) {
159
+ if (n3.then) {
160
+ for (u4.__u |= c3 ? 160 : 128; f4 && 8 == f4.nodeType && f4.nextSibling; ) f4 = f4.nextSibling;
161
+ null != o3 && (o3[o3.indexOf(f4)] = null), u4.__e = f4;
162
+ } else if (null != o3) for (T2 = o3.length; T2--; ) b(o3[T2]);
163
+ } else u4.__e = t3.__e;
164
+ null == u4.__k && (u4.__k = t3.__k || []), n3.then || B(u4), l.__e(n3, u4, t3);
165
+ }
166
+ } else null == o3 && u4.__v == t3.__v ? (u4.__k = t3.__k, u4.__e = t3.__e) : f4 = u4.__e = G(t3.__e, u4, t3, i3, r3, o3, e3, c3, a3);
167
+ return (s3 = l.diffed) && s3(u4), 128 & u4.__u ? void 0 : f4;
168
+ }
169
+ function B(n2) {
170
+ n2 && (n2.__c && (n2.__c.__e = true), n2.__k && n2.__k.some(B));
171
+ }
172
+ function D(n2, u4, t3) {
173
+ for (var i3 = 0; i3 < t3.length; i3++) J(t3[i3], t3[++i3], t3[++i3]);
174
+ l.__c && l.__c(u4, n2), n2.some(function(u5) {
175
+ try {
176
+ n2 = u5.__h, u5.__h = [], n2.some(function(n3) {
177
+ n3.call(u5);
178
+ });
179
+ } catch (n3) {
180
+ l.__e(n3, u5.__v);
181
+ }
182
+ });
183
+ }
184
+ function E(n2) {
185
+ return "object" != typeof n2 || null == n2 || n2.__b > 0 ? n2 : g(n2) ? n2.map(E) : void 0 !== n2.constructor ? null : m({}, n2);
186
+ }
187
+ function G(u4, t3, i3, r3, o3, e3, f4, c3, a3) {
188
+ var s3, h3, p3, v3, y3, w3, _2, m3 = i3.props || d, k3 = t3.props, x2 = t3.type;
189
+ if ("svg" == x2 ? o3 = "http://www.w3.org/2000/svg" : "math" == x2 ? o3 = "http://www.w3.org/1998/Math/MathML" : o3 || (o3 = "http://www.w3.org/1999/xhtml"), null != e3) {
190
+ for (s3 = 0; s3 < e3.length; s3++) if ((y3 = e3[s3]) && "setAttribute" in y3 == !!x2 && (x2 ? y3.localName == x2 : 3 == y3.nodeType)) {
191
+ u4 = y3, e3[s3] = null;
192
+ break;
193
+ }
194
+ }
195
+ if (null == u4) {
196
+ if (null == x2) return document.createTextNode(k3);
197
+ u4 = document.createElementNS(o3, x2, k3.is && k3), c3 && (l.__m && l.__m(t3, e3), c3 = false), e3 = null;
198
+ }
199
+ if (null == x2) m3 === k3 || c3 && u4.data == k3 || (u4.data = k3);
200
+ else {
201
+ if (e3 = "textarea" == x2 && null != k3.defaultValue ? null : e3 && n.call(u4.childNodes), !c3 && null != e3) for (m3 = {}, s3 = 0; s3 < u4.attributes.length; s3++) m3[(y3 = u4.attributes[s3]).name] = y3.value;
202
+ for (s3 in m3) y3 = m3[s3], "dangerouslySetInnerHTML" == s3 ? p3 = y3 : "children" == s3 || s3 in k3 || "value" == s3 && "defaultValue" in k3 || "checked" == s3 && "defaultChecked" in k3 || N(u4, s3, null, y3, o3);
203
+ for (s3 in k3) y3 = k3[s3], "children" == s3 ? v3 = y3 : "dangerouslySetInnerHTML" == s3 ? h3 = y3 : "value" == s3 ? w3 = y3 : "checked" == s3 ? _2 = y3 : c3 && "function" != typeof y3 || m3[s3] === y3 || N(u4, s3, y3, m3[s3], o3);
204
+ if (h3) c3 || p3 && (h3.__html == p3.__html || h3.__html == u4.innerHTML) || (u4.innerHTML = h3.__html), t3.__k = [];
205
+ else if (p3 && (u4.innerHTML = ""), L("template" == t3.type ? u4.content : u4, g(v3) ? v3 : [v3], t3, i3, r3, "foreignObject" == x2 ? "http://www.w3.org/1999/xhtml" : o3, e3, f4, e3 ? e3[0] : i3.__k && $(i3, 0), c3, a3), null != e3) for (s3 = e3.length; s3--; ) b(e3[s3]);
206
+ c3 && "textarea" != x2 || (s3 = "value", "progress" == x2 && null == w3 ? u4.removeAttribute("value") : null != w3 && (w3 !== u4[s3] || "progress" == x2 && !w3 || "option" == x2 && w3 != m3[s3]) && N(u4, s3, w3, m3[s3], o3), s3 = "checked", null != _2 && _2 != u4[s3] && N(u4, s3, _2, m3[s3], o3));
207
+ }
208
+ return u4;
209
+ }
210
+ function J(n2, u4, t3) {
211
+ try {
212
+ if ("function" == typeof n2) {
213
+ var i3 = "function" == typeof n2.__u;
214
+ i3 && n2.__u(), i3 && null == u4 || (n2.__u = n2(u4));
215
+ } else n2.current = u4;
216
+ } catch (n3) {
217
+ l.__e(n3, t3);
218
+ }
219
+ }
220
+ function K(n2, u4, t3) {
221
+ var i3, r3;
222
+ if (l.unmount && l.unmount(n2), (i3 = n2.ref) && (i3.current && i3.current != n2.__e || J(i3, null, u4)), null != (i3 = n2.__c)) {
223
+ if (i3.componentWillUnmount) try {
224
+ i3.componentWillUnmount();
225
+ } catch (n3) {
226
+ l.__e(n3, u4);
227
+ }
228
+ i3.base = i3.__P = i3.__n = null;
229
+ }
230
+ if (i3 = n2.__k) for (r3 = 0; r3 < i3.length; r3++) i3[r3] && K(i3[r3], u4, t3 || "function" != typeof n2.type);
231
+ t3 || b(n2.__e), n2.__c = n2.__ = n2.__e = void 0;
232
+ }
233
+ function Q(n2, l3, u4) {
234
+ return this.constructor(n2, u4);
235
+ }
236
+ function R(u4, t3, i3) {
237
+ var r3, o3, e3, f4;
238
+ t3 == document && (t3 = document.documentElement), l.__ && l.__(u4, t3), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t3.__k, e3 = [], f4 = [], q(t3, u4 = (!r3 && i3 || t3).__k = k(S, null, [u4]), o3 || d, d, t3.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t3.firstChild ? n.call(t3.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t3.firstChild, r3, f4), D(e3, u4, f4), u4.props.children = null;
239
+ }
240
+ n = w.slice, l = { __e: function(n2, l3, u4, t3) {
241
+ for (var i3, r3, o3; l3 = l3.__; ) if ((i3 = l3.__c) && !i3.__) try {
242
+ if ((r3 = i3.constructor) && null != r3.getDerivedStateFromError && (i3.setState(r3.getDerivedStateFromError(n2)), o3 = i3.__d), null != i3.componentDidCatch && (i3.componentDidCatch(n2, t3 || {}), o3 = i3.__d), o3) return i3.__E = i3;
243
+ } catch (l4) {
244
+ n2 = l4;
245
+ }
246
+ throw n2;
247
+ } }, u = 0, t = function(n2) {
248
+ return null != n2 && void 0 === n2.constructor;
249
+ }, C.prototype.setState = function(n2, l3) {
250
+ var u4;
251
+ u4 = null != this.__s && this.__s != this.state ? this.__s : this.__s = m({}, this.state), "function" == typeof n2 && (n2 = n2(m({}, u4), this.props)), n2 && m(u4, n2), null != n2 && this.__v && (l3 && this._sb.push(l3), A(this));
252
+ }, C.prototype.forceUpdate = function(n2) {
253
+ this.__v && (this.__e = true, n2 && this.__h.push(n2), A(this));
254
+ }, C.prototype.render = S, i = [], o = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, e = function(n2, l3) {
255
+ return n2.__v.__b - l3.__v.__b;
256
+ }, H.__r = 0, f = Math.random().toString(8), c = "__d" + f, a = "__a" + f, s = /(PointerCapture)$|Capture$/i, h = 0, p = V(false), v = V(true), y = 0;
257
+
258
+ // node_modules/preact/hooks/dist/hooks.module.js
259
+ var t2;
260
+ var r2;
261
+ var u2;
262
+ var i2;
263
+ var o2 = 0;
264
+ var f2 = [];
265
+ var c2 = l;
266
+ var e2 = c2.__b;
267
+ var a2 = c2.__r;
268
+ var v2 = c2.diffed;
269
+ var l2 = c2.__c;
270
+ var m2 = c2.unmount;
271
+ var p2 = c2.__;
272
+ function s2(n2, t3) {
273
+ c2.__h && c2.__h(r2, n2, o2 || t3), o2 = 0;
274
+ var u4 = r2.__H || (r2.__H = { __: [], __h: [] });
275
+ return n2 >= u4.__.length && u4.__.push({}), u4.__[n2];
276
+ }
277
+ function d2(n2) {
278
+ return o2 = 1, y2(D2, n2);
279
+ }
280
+ function y2(n2, u4, i3) {
281
+ var o3 = s2(t2++, 2);
282
+ if (o3.t = n2, !o3.__c && (o3.__ = [i3 ? i3(u4) : D2(void 0, u4), function(n3) {
283
+ var t3 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t3, n3);
284
+ t3 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
285
+ }], o3.__c = r2, !r2.__f)) {
286
+ var f4 = function(n3, t3, r3) {
287
+ if (!o3.__c.__H) return true;
288
+ var u5 = false, i4 = o3.__c.props !== n3;
289
+ if (o3.__c.__H.__.some(function(n4) {
290
+ if (n4.__N) {
291
+ u5 = true;
292
+ var t4 = n4.__[0];
293
+ n4.__ = n4.__N, n4.__N = void 0, t4 !== n4.__[0] && (i4 = true);
294
+ }
295
+ }), c3) {
296
+ var f5 = c3.call(this, n3, t3, r3);
297
+ return u5 ? f5 || i4 : f5;
298
+ }
299
+ return !u5 || i4;
300
+ };
301
+ r2.__f = true;
302
+ var c3 = r2.shouldComponentUpdate, e3 = r2.componentWillUpdate;
303
+ r2.componentWillUpdate = function(n3, t3, r3) {
304
+ if (this.__e) {
305
+ var u5 = c3;
306
+ c3 = void 0, f4(n3, t3, r3), c3 = u5;
307
+ }
308
+ e3 && e3.call(this, n3, t3, r3);
309
+ }, r2.shouldComponentUpdate = f4;
310
+ }
311
+ return o3.__N || o3.__;
312
+ }
313
+ function h2(n2, u4) {
314
+ var i3 = s2(t2++, 3);
315
+ !c2.__s && C2(i3.__H, u4) && (i3.__ = n2, i3.u = u4, r2.__H.__h.push(i3));
316
+ }
317
+ function j2() {
318
+ for (var n2; n2 = f2.shift(); ) {
319
+ var t3 = n2.__H;
320
+ if (n2.__P && t3) try {
321
+ t3.__h.some(z2), t3.__h.some(B2), t3.__h = [];
322
+ } catch (r3) {
323
+ t3.__h = [], c2.__e(r3, n2.__v);
324
+ }
325
+ }
326
+ }
327
+ c2.__b = function(n2) {
328
+ r2 = null, e2 && e2(n2);
329
+ }, c2.__ = function(n2, t3) {
330
+ n2 && t3.__k && t3.__k.__m && (n2.__m = t3.__k.__m), p2 && p2(n2, t3);
331
+ }, c2.__r = function(n2) {
332
+ a2 && a2(n2), t2 = 0;
333
+ var i3 = (r2 = n2.__c).__H;
334
+ i3 && (u2 === r2 ? (i3.__h = [], r2.__h = [], i3.__.some(function(n3) {
335
+ n3.__N && (n3.__ = n3.__N), n3.u = n3.__N = void 0;
336
+ })) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t2 = 0)), u2 = r2;
337
+ }, c2.diffed = function(n2) {
338
+ v2 && v2(n2);
339
+ var t3 = n2.__c;
340
+ t3 && t3.__H && (t3.__H.__h.length && (1 !== f2.push(t3) && i2 === c2.requestAnimationFrame || ((i2 = c2.requestAnimationFrame) || w2)(j2)), t3.__H.__.some(function(n3) {
341
+ n3.u && (n3.__H = n3.u, n3.u = void 0);
342
+ })), u2 = r2 = null;
343
+ }, c2.__c = function(n2, t3) {
344
+ t3.some(function(n3) {
345
+ try {
346
+ n3.__h.some(z2), n3.__h = n3.__h.filter(function(n4) {
347
+ return !n4.__ || B2(n4);
348
+ });
349
+ } catch (r3) {
350
+ t3.some(function(n4) {
351
+ n4.__h && (n4.__h = []);
352
+ }), t3 = [], c2.__e(r3, n3.__v);
353
+ }
354
+ }), l2 && l2(n2, t3);
355
+ }, c2.unmount = function(n2) {
356
+ m2 && m2(n2);
357
+ var t3, r3 = n2.__c;
358
+ r3 && r3.__H && (r3.__H.__.some(function(n3) {
359
+ try {
360
+ z2(n3);
361
+ } catch (n4) {
362
+ t3 = n4;
363
+ }
364
+ }), r3.__H = void 0, t3 && c2.__e(t3, r3.__v));
365
+ };
366
+ var k2 = "function" == typeof requestAnimationFrame;
367
+ function w2(n2) {
368
+ var t3, r3 = function() {
369
+ clearTimeout(u4), k2 && cancelAnimationFrame(t3), setTimeout(n2);
370
+ }, u4 = setTimeout(r3, 35);
371
+ k2 && (t3 = requestAnimationFrame(r3));
372
+ }
373
+ function z2(n2) {
374
+ var t3 = r2, u4 = n2.__c;
375
+ "function" == typeof u4 && (n2.__c = void 0, u4()), r2 = t3;
376
+ }
377
+ function B2(n2) {
378
+ var t3 = r2;
379
+ n2.__c = n2.__(), r2 = t3;
380
+ }
381
+ function C2(n2, t3) {
382
+ return !n2 || n2.length !== t3.length || t3.some(function(t4, r3) {
383
+ return t4 !== n2[r3];
384
+ });
385
+ }
386
+ function D2(n2, t3) {
387
+ return "function" == typeof t3 ? t3(n2) : t3;
388
+ }
389
+
390
+ // node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
391
+ var f3 = 0;
392
+ function u3(e3, t3, n2, o3, i3, u4) {
393
+ t3 || (t3 = {});
394
+ var a3, c3, p3 = t3;
395
+ if ("ref" in p3) for (c3 in p3 = {}, t3) "ref" == c3 ? a3 = t3[c3] : p3[c3] = t3[c3];
396
+ var l3 = { type: e3, props: p3, key: n2, ref: a3, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f3, __i: -1, __u: 0, __source: i3, __self: u4 };
397
+ if ("function" == typeof e3 && (a3 = e3.defaultProps)) for (c3 in a3) void 0 === p3[c3] && (p3[c3] = a3[c3]);
398
+ return l.vnode && l.vnode(l3), l3;
399
+ }
400
+
401
+ // src/web/app.tsx
402
+ var S2 = {
403
+ box: { background: "#151922", border: "1px solid #2b3340", borderRadius: "10px", padding: "16px", marginBottom: "16px" },
404
+ input: { background: "#0f1115", color: "#f5f7fa", border: "1px solid #354051", borderRadius: "6px", padding: "8px 10px", width: "100%", boxSizing: "border-box" },
405
+ btn: { background: "#2e7dff", color: "#fff", border: "none", borderRadius: "6px", padding: "8px 14px", cursor: "pointer", marginRight: "8px" },
406
+ btnDanger: { background: "#c0392b", color: "#fff", border: "none", borderRadius: "6px", padding: "4px 10px", cursor: "pointer" },
407
+ label: { display: "block", marginBottom: "12px" },
408
+ labelText: { display: "block", marginBottom: "4px", color: "#b4bdc8" },
409
+ select: { background: "#0f1115", color: "#f5f7fa", border: "1px solid #354051", borderRadius: "6px", padding: "8px 10px" },
410
+ th: { textAlign: "left", padding: "8px", borderBottom: "1px solid #2b3340" },
411
+ td: { padding: "8px", borderBottom: "1px solid #1a2030", verticalAlign: "top", wordBreak: "break-word" },
412
+ row: { cursor: "pointer", background: "transparent" },
413
+ rowHover: { background: "#1a2030" },
414
+ grid2: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "12px" },
415
+ grid3: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: "8px", alignItems: "end" },
416
+ err: { color: "#ff8080", margin: "8px 0" },
417
+ ok: { color: "#8ff0a4", margin: "8px 0" },
418
+ mono: { fontFamily: "monospace", fontSize: "0.85em" }
419
+ };
420
+ async function apiFetch(url, options) {
421
+ const res = await fetch(url, options);
422
+ const json = await res.json();
423
+ if (!res.ok) throw new Error(json.error ?? "Request failed");
424
+ return json;
425
+ }
426
+ function jsonPost(url, body) {
427
+ return apiFetch(url, {
428
+ method: "POST",
429
+ headers: { "Content-Type": "application/json" },
430
+ body: JSON.stringify(body)
431
+ });
432
+ }
433
+ function jsonPut(url, body) {
434
+ return apiFetch(url, {
435
+ method: "PUT",
436
+ headers: { "Content-Type": "application/json" },
437
+ body: JSON.stringify(body)
438
+ });
439
+ }
440
+ async function jsonDelete(url) {
441
+ return apiFetch(url, { method: "DELETE" });
442
+ }
443
+ function Field({ label, type = "text", value, onChange, placeholder }) {
444
+ return /* @__PURE__ */ u3("label", { style: S2.label, children: [
445
+ /* @__PURE__ */ u3("span", { style: S2.labelText, children: label }),
446
+ /* @__PURE__ */ u3(
447
+ "input",
448
+ {
449
+ type,
450
+ value,
451
+ placeholder: placeholder ?? "",
452
+ onInput: (e3) => onChange(e3.currentTarget.value),
453
+ style: S2.input
454
+ }
455
+ )
456
+ ] });
457
+ }
458
+ function CheckField({ label, checked, onChange }) {
459
+ return /* @__PURE__ */ u3("label", { style: { ...S2.label, display: "flex", alignItems: "center", gap: "8px", cursor: "pointer" }, children: [
460
+ /* @__PURE__ */ u3("input", { type: "checkbox", checked, onChange: (e3) => onChange(e3.currentTarget.checked) }),
461
+ label
462
+ ] });
463
+ }
464
+ function BehaviorConfig({ config, onChange }) {
465
+ const t3 = config.type;
466
+ return /* @__PURE__ */ u3("div", { style: { paddingTop: "12px" }, children: [
467
+ (t3 === "immediate-print" || t3 === "accumulating-list" || t3 === "recurring-print") && /* @__PURE__ */ u3(S, { children: [
468
+ /* @__PURE__ */ u3(
469
+ Field,
470
+ {
471
+ label: "Header",
472
+ value: config.header ?? "",
473
+ onChange: (v3) => {
474
+ const c3 = { ...config };
475
+ if (v3) {
476
+ c3.header = v3;
477
+ } else {
478
+ delete c3.header;
479
+ }
480
+ onChange(c3);
481
+ },
482
+ placeholder: "Optional header text"
483
+ }
484
+ ),
485
+ /* @__PURE__ */ u3(
486
+ Field,
487
+ {
488
+ label: "Footer",
489
+ value: config.footer ?? "",
490
+ onChange: (v3) => {
491
+ const c3 = { ...config };
492
+ if (v3) {
493
+ c3.footer = v3;
494
+ } else {
495
+ delete c3.footer;
496
+ }
497
+ onChange(c3);
498
+ },
499
+ placeholder: "Optional footer text"
500
+ }
501
+ ),
502
+ /* @__PURE__ */ u3(
503
+ CheckField,
504
+ {
505
+ label: "Include metadata footer",
506
+ checked: config.includeMetadata ?? false,
507
+ onChange: (v3) => onChange({ ...config, includeMetadata: v3 })
508
+ }
509
+ )
510
+ ] }),
511
+ (t3 === "immediate-print" || t3 === "recurring-print") && /* @__PURE__ */ u3(
512
+ CheckField,
513
+ {
514
+ label: "Include AI-generated icon (requires OpenAI key)",
515
+ checked: config.includeIcon ?? false,
516
+ onChange: (v3) => onChange({ ...config, includeIcon: v3 })
517
+ }
518
+ ),
519
+ t3 === "accumulating-list" && /* @__PURE__ */ u3(
520
+ CheckField,
521
+ {
522
+ label: "Include checklist boxes",
523
+ checked: config.includeChecklist ?? false,
524
+ onChange: (v3) => onChange({ ...config, includeChecklist: v3 })
525
+ }
526
+ )
527
+ ] });
528
+ }
529
+ function ChannelRow({ mapping, onDelete, onUpdate }) {
530
+ const [expanded, setExpanded] = d2(false);
531
+ const [hovered, setHovered] = d2(false);
532
+ return /* @__PURE__ */ u3("tbody", { children: [
533
+ /* @__PURE__ */ u3(
534
+ "tr",
535
+ {
536
+ style: hovered ? S2.rowHover : S2.row,
537
+ onClick: () => setExpanded(!expanded),
538
+ onMouseEnter: () => setHovered(true),
539
+ onMouseLeave: () => setHovered(false),
540
+ children: [
541
+ /* @__PURE__ */ u3("td", { style: S2.td, children: [
542
+ "# ",
543
+ mapping.channelName
544
+ ] }),
545
+ /* @__PURE__ */ u3("td", { style: S2.td, children: mapping.config.type }),
546
+ /* @__PURE__ */ u3("td", { style: { ...S2.td, textAlign: "right" }, children: /* @__PURE__ */ u3(
547
+ "button",
548
+ {
549
+ style: S2.btnDanger,
550
+ onClick: (e3) => {
551
+ e3.stopPropagation();
552
+ onDelete();
553
+ },
554
+ children: "Delete"
555
+ }
556
+ ) })
557
+ ]
558
+ }
559
+ ),
560
+ expanded && /* @__PURE__ */ u3("tr", { children: /* @__PURE__ */ u3("td", { colSpan: 3, style: { ...S2.td, background: "#0f1115", padding: "16px" }, children: /* @__PURE__ */ u3(
561
+ BehaviorConfig,
562
+ {
563
+ config: mapping.config,
564
+ onChange: (c3) => onUpdate(c3)
565
+ }
566
+ ) }) })
567
+ ] });
568
+ }
569
+ function BotSetup({ config, onSave }) {
570
+ const [discordToken, setDiscordToken] = d2(config?.discordToken ?? "");
571
+ const [serverId, setServerId] = d2(config?.serverId ?? "");
572
+ const [openaiKey, setOpenaiKey] = d2(config?.openaiKey ?? "");
573
+ const [diagnosticsPort, setDiagnosticsPort] = d2(String(config?.diagnosticsPort ?? 8080));
574
+ const [msg, setMsg] = d2("");
575
+ const [err, setErr] = d2("");
576
+ const [saving, setSaving] = d2(false);
577
+ h2(() => {
578
+ setDiscordToken(config?.discordToken ?? "");
579
+ setServerId(config?.serverId ?? "");
580
+ setOpenaiKey(config?.openaiKey ?? "");
581
+ setDiagnosticsPort(String(config?.diagnosticsPort ?? 8080));
582
+ }, [config?.discordToken, config?.openaiKey, config?.serverId, config?.diagnosticsPort]);
583
+ async function save() {
584
+ setSaving(true);
585
+ setErr("");
586
+ setMsg("");
587
+ try {
588
+ const body = {
589
+ discordToken: discordToken.trim(),
590
+ openaiKey: openaiKey.trim(),
591
+ serverId: serverId.trim() || null,
592
+ diagnosticsPort: Number(diagnosticsPort)
593
+ };
594
+ await jsonPost("/api/config", body);
595
+ setMsg("Saved.");
596
+ onSave();
597
+ } catch (e3) {
598
+ setErr(e3 instanceof Error ? e3.message : String(e3));
599
+ } finally {
600
+ setSaving(false);
601
+ }
602
+ }
603
+ return /* @__PURE__ */ u3("section", { style: S2.box, children: [
604
+ /* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Bot Setup" }),
605
+ config && /* @__PURE__ */ u3("p", { style: { color: "#b4bdc8", marginTop: 0 }, children: [
606
+ "Config: ",
607
+ config.configPath
608
+ ] }),
609
+ err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
610
+ msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
611
+ /* @__PURE__ */ u3(Field, { label: "Discord Token", value: discordToken, onChange: setDiscordToken, placeholder: "Discord bot token" }),
612
+ /* @__PURE__ */ u3(Field, { label: "Server ID (required)", value: serverId, onChange: setServerId, placeholder: "Required \u2014 Discord server ID" }),
613
+ /* @__PURE__ */ u3(Field, { label: "OpenAI Key", value: openaiKey, onChange: setOpenaiKey, placeholder: "OpenAI API key" }),
614
+ /* @__PURE__ */ u3(Field, { label: "Diagnostics Port", type: "number", value: diagnosticsPort, onChange: setDiagnosticsPort, placeholder: "8080" }),
615
+ /* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void save(), disabled: saving, children: saving ? "Saving\u2026" : "Save" })
616
+ ] });
617
+ }
618
+ function ChannelBehaviors({ refreshKey }) {
619
+ const [data, setData] = d2(null);
620
+ const [err, setErr] = d2("");
621
+ const [addChannelId, setAddChannelId] = d2("");
622
+ const [addBehavior, setAddBehavior] = d2("immediate-print");
623
+ async function load() {
624
+ try {
625
+ const d3 = await apiFetch("/api/channels");
626
+ setData(d3);
627
+ } catch (e3) {
628
+ setErr(e3 instanceof Error ? e3.message : String(e3));
629
+ }
630
+ }
631
+ h2(() => {
632
+ void load();
633
+ }, [refreshKey]);
634
+ async function addMapping() {
635
+ if (!addChannelId) return;
636
+ const dc = data?.discordChannels.find((c3) => c3.id === addChannelId);
637
+ if (!dc) return;
638
+ const defaultConfig = addBehavior === "immediate-print" ? { type: "immediate-print", includeIcon: false, includeMetadata: false } : addBehavior === "accumulating-list" ? { type: "accumulating-list", includeChecklist: false, includeMetadata: false } : addBehavior === "recurring-print" ? { type: "recurring-print", includeIcon: false, includeMetadata: false } : { type: "on-demand" };
639
+ await jsonPost("/api/channels", { channelId: dc.id, channelName: dc.name, config: defaultConfig });
640
+ setAddChannelId("");
641
+ await load();
642
+ }
643
+ async function deleteChannel(id) {
644
+ await jsonDelete(`/api/channels/${id}`);
645
+ await load();
646
+ }
647
+ async function updateChannel(id, config) {
648
+ await jsonPut(`/api/channels/${id}`, { config });
649
+ await load();
650
+ }
651
+ async function refreshFromDiscord() {
652
+ try {
653
+ const d3 = await apiFetch("/api/channels/refresh", { method: "POST" });
654
+ setData(d3);
655
+ } catch (e3) {
656
+ setErr(e3 instanceof Error ? e3.message : String(e3));
657
+ }
658
+ }
659
+ return /* @__PURE__ */ u3("section", { style: S2.box, children: [
660
+ /* @__PURE__ */ u3("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "12px" }, children: [
661
+ /* @__PURE__ */ u3("h2", { style: { marginTop: 0, marginBottom: 0 }, children: "Channel Behaviors" }),
662
+ /* @__PURE__ */ u3("button", { style: { ...S2.btn, marginRight: 0 }, onClick: () => void refreshFromDiscord(), children: "Refresh Channels" })
663
+ ] }),
664
+ err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
665
+ /* @__PURE__ */ u3("table", { style: { width: "100%", borderCollapse: "collapse", marginBottom: "16px" }, children: [
666
+ /* @__PURE__ */ u3("thead", { children: /* @__PURE__ */ u3("tr", { children: [
667
+ /* @__PURE__ */ u3("th", { style: S2.th, children: "Channel" }),
668
+ /* @__PURE__ */ u3("th", { style: S2.th, children: "Behavior" }),
669
+ /* @__PURE__ */ u3("th", { style: { ...S2.th, textAlign: "right" }, children: "Actions" })
670
+ ] }) }),
671
+ data?.channels.map((m3) => /* @__PURE__ */ u3(
672
+ ChannelRow,
673
+ {
674
+ mapping: m3,
675
+ onDelete: () => void deleteChannel(m3.channelId),
676
+ onUpdate: (c3) => void updateChannel(m3.channelId, c3)
677
+ },
678
+ m3.channelId
679
+ )),
680
+ (!data || data.channels.length === 0) && /* @__PURE__ */ u3("tbody", { children: /* @__PURE__ */ u3("tr", { children: /* @__PURE__ */ u3("td", { colSpan: 3, style: { ...S2.td, color: "#b4bdc8" }, children: "No channel mappings yet." }) }) })
681
+ ] }),
682
+ /* @__PURE__ */ u3("div", { style: S2.grid3, children: [
683
+ /* @__PURE__ */ u3("label", { style: S2.label, children: [
684
+ /* @__PURE__ */ u3("span", { style: S2.labelText, children: "Channel" }),
685
+ /* @__PURE__ */ u3("select", { style: S2.select, value: addChannelId, onChange: (e3) => setAddChannelId(e3.currentTarget.value), children: [
686
+ /* @__PURE__ */ u3("option", { value: "", children: "Select channel\u2026" }),
687
+ data?.unmapped.map((c3) => /* @__PURE__ */ u3("option", { value: c3.id, children: [
688
+ "#",
689
+ c3.name
690
+ ] }, c3.id))
691
+ ] })
692
+ ] }),
693
+ /* @__PURE__ */ u3("label", { style: S2.label, children: [
694
+ /* @__PURE__ */ u3("span", { style: S2.labelText, children: "Behavior" }),
695
+ /* @__PURE__ */ u3("select", { style: S2.select, value: addBehavior, onChange: (e3) => setAddBehavior(e3.currentTarget.value), children: [
696
+ /* @__PURE__ */ u3("option", { value: "immediate-print", children: "\u{1F5A8}\uFE0F Immediate Print" }),
697
+ /* @__PURE__ */ u3("option", { value: "accumulating-list", children: "\u{1F6D2} Accumulating List" }),
698
+ /* @__PURE__ */ u3("option", { value: "recurring-print", children: "\u{1F504} Recurring Print" }),
699
+ /* @__PURE__ */ u3("option", { value: "on-demand", children: "\u{1F4AC} On-Demand" })
700
+ ] })
701
+ ] }),
702
+ /* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void addMapping(), disabled: !addChannelId, children: "Add" })
703
+ ] })
704
+ ] });
705
+ }
706
+ function PrintModeSection() {
707
+ const [printConfig, setPrintConfig] = d2(null);
708
+ const [mode, setMode] = d2("escp");
709
+ const [serialPort, setSerialPort] = d2("/dev/ttyUSB0");
710
+ const [printerName, setPrinterName] = d2("");
711
+ const [paperSize, setPaperSize] = d2("Letter");
712
+ const [paperName, setPaperName] = d2("");
713
+ const [msg, setMsg] = d2("");
714
+ const [err, setErr] = d2("");
715
+ const [saving, setSaving] = d2(false);
716
+ const [testing, setTesting] = d2(false);
717
+ async function load() {
718
+ try {
719
+ const d3 = await apiFetch("/api/print-config");
720
+ if (d3.printConfig) {
721
+ setPrintConfig(d3.printConfig);
722
+ setMode(d3.printConfig.mode);
723
+ if (d3.printConfig.mode === "escp") setSerialPort(d3.printConfig.serialPort);
724
+ if (d3.printConfig.mode === "cups") {
725
+ setPrinterName(d3.printConfig.printerName);
726
+ setPaperSize(d3.printConfig.paperSize);
727
+ setPaperName(d3.printConfig.paperName);
728
+ }
729
+ }
730
+ } catch (e3) {
731
+ setErr(e3 instanceof Error ? e3.message : String(e3));
732
+ }
733
+ }
734
+ h2(() => {
735
+ void load();
736
+ }, []);
737
+ async function save() {
738
+ setSaving(true);
739
+ setErr("");
740
+ setMsg("");
741
+ try {
742
+ let cfg;
743
+ if (mode === "escp") {
744
+ cfg = { mode: "escp", serialPort: serialPort.trim() };
745
+ } else if (mode === "cups") {
746
+ cfg = { mode: "cups", printerName: printerName.trim(), paperSize: paperSize.trim(), paperName: paperName.trim() };
747
+ } else {
748
+ cfg = { mode: "imagefeed" };
749
+ }
750
+ await jsonPost("/api/print-config", { printConfig: cfg });
751
+ setPrintConfig(cfg);
752
+ setMsg("Print mode saved.");
753
+ } catch (e3) {
754
+ setErr(e3 instanceof Error ? e3.message : String(e3));
755
+ } finally {
756
+ setSaving(false);
757
+ }
758
+ }
759
+ async function testPrint() {
760
+ setTesting(true);
761
+ setErr("");
762
+ setMsg("");
763
+ try {
764
+ await jsonPost("/api/printer/test", {});
765
+ setMsg(mode === "imagefeed" ? "Test job added to image feed." : "Test page sent to printer.");
766
+ } catch (e3) {
767
+ setErr(e3 instanceof Error ? e3.message : String(e3));
768
+ } finally {
769
+ setTesting(false);
770
+ }
771
+ }
772
+ const modeLabel = {
773
+ escp: "\u{1F50C} ESC/P via Serial Port",
774
+ cups: "\u{1F4C4} PDF via CUPS",
775
+ imagefeed: "\u{1F5BC}\uFE0F Image Feed (testing)"
776
+ };
777
+ return /* @__PURE__ */ u3("section", { style: S2.box, children: [
778
+ /* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Print Mode" }),
779
+ err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
780
+ msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
781
+ /* @__PURE__ */ u3("label", { style: S2.label, children: [
782
+ /* @__PURE__ */ u3("span", { style: S2.labelText, children: "Output Mode" }),
783
+ /* @__PURE__ */ u3(
784
+ "select",
785
+ {
786
+ style: S2.select,
787
+ value: mode,
788
+ onChange: (e3) => setMode(e3.currentTarget.value),
789
+ children: ["escp", "cups", "imagefeed"].map((m3) => /* @__PURE__ */ u3("option", { value: m3, children: modeLabel[m3] }, m3))
790
+ }
791
+ )
792
+ ] }),
793
+ mode === "escp" && /* @__PURE__ */ u3(
794
+ Field,
795
+ {
796
+ label: "Serial Port",
797
+ value: serialPort,
798
+ onChange: setSerialPort,
799
+ placeholder: "e.g. /dev/ttyUSB0 or COM3"
800
+ }
801
+ ),
802
+ mode === "cups" && /* @__PURE__ */ u3(S, { children: [
803
+ /* @__PURE__ */ u3(Field, { label: "CUPS Printer Name", value: printerName, onChange: setPrinterName, placeholder: "e.g. TM-T88V" }),
804
+ /* @__PURE__ */ u3(Field, { label: "Paper Size", value: paperSize, onChange: setPaperSize, placeholder: "e.g. Letter, A4, 80x297mm" }),
805
+ /* @__PURE__ */ u3(Field, { label: "Paper Name (display label)", value: paperName, onChange: setPaperName, placeholder: "e.g. Receipt Roll" })
806
+ ] }),
807
+ mode === "imagefeed" && /* @__PURE__ */ u3("p", { style: { color: "#b4bdc8", marginTop: 0 }, children: [
808
+ "Print jobs will be rendered as PNGs and shown at",
809
+ " ",
810
+ /* @__PURE__ */ u3("a", { href: "/feed", target: "_blank", rel: "noopener noreferrer", children: "/feed" }),
811
+ "."
812
+ ] }),
813
+ /* @__PURE__ */ u3("div", { style: { display: "flex", gap: "8px", marginTop: "8px" }, children: [
814
+ /* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void save(), disabled: saving, children: saving ? "Saving\u2026" : "Save" }),
815
+ /* @__PURE__ */ u3(
816
+ "button",
817
+ {
818
+ style: { ...S2.btn, background: "#1a7a3a" },
819
+ onClick: () => void testPrint(),
820
+ disabled: testing || !printConfig,
821
+ title: !printConfig ? "Save a mode first" : "",
822
+ children: testing ? "Printing\u2026" : "Print Test Page"
823
+ }
824
+ )
825
+ ] })
826
+ ] });
827
+ }
828
+ function SecuritySection({ onSave }) {
829
+ const [password, setPassword] = d2("");
830
+ const [msg, setMsg] = d2("");
831
+ const [err, setErr] = d2("");
832
+ const [saving, setSaving] = d2(false);
833
+ async function save() {
834
+ setSaving(true);
835
+ setErr("");
836
+ setMsg("");
837
+ try {
838
+ await jsonPost("/api/config", { password });
839
+ setPassword("");
840
+ setMsg(password ? "Password set." : "Password cleared.");
841
+ onSave();
842
+ } catch (e3) {
843
+ setErr(e3 instanceof Error ? e3.message : String(e3));
844
+ } finally {
845
+ setSaving(false);
846
+ }
847
+ }
848
+ return /* @__PURE__ */ u3("section", { style: S2.box, children: [
849
+ /* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Security" }),
850
+ err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
851
+ msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
852
+ /* @__PURE__ */ u3(Field, { label: "Control Panel Password", type: "password", value: password, onChange: setPassword, placeholder: "Leave blank to remove password" }),
853
+ /* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void save(), disabled: saving, children: saving ? "Saving\u2026" : "Set Password" })
854
+ ] });
855
+ }
856
+ function LogSection() {
857
+ const [events, setEvents] = d2([]);
858
+ const [status, setStatus] = d2(null);
859
+ async function load() {
860
+ const d3 = await apiFetch("/api/events");
861
+ setEvents(d3.events);
862
+ setStatus(d3.status);
863
+ }
864
+ h2(() => {
865
+ void load();
866
+ const t3 = setInterval(() => void load(), 4e3);
867
+ return () => clearInterval(t3);
868
+ }, []);
869
+ const typeColor = {
870
+ startup: "#8ab4ff",
871
+ success: "#8ff0a4",
872
+ error: "#ff8080",
873
+ print: "#ffd580",
874
+ info: "#b4bdc8",
875
+ command: "#d2a8ff"
876
+ };
877
+ return /* @__PURE__ */ u3("section", { style: S2.box, children: [
878
+ /* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Bot Status & Log" }),
879
+ status && /* @__PURE__ */ u3("dl", { style: { display: "grid", gridTemplateColumns: "140px 1fr", gap: "4px 12px", marginBottom: "16px" }, children: [
880
+ /* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Connected" }),
881
+ /* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.connected ? "\u2705 yes" : "\u274C no" }),
882
+ /* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Bot" }),
883
+ /* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.tag ?? "\u2014" }),
884
+ /* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Started" }),
885
+ /* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.startedAt ?? "\u2014" }),
886
+ /* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Server ID" }),
887
+ /* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.configuredServerId ?? "\u2014" }),
888
+ /* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Servers" }),
889
+ /* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.guilds.join(", ") || "\u2014" })
890
+ ] }),
891
+ /* @__PURE__ */ u3("div", { style: { maxHeight: "400px", overflow: "auto", border: "1px solid #2b3340", borderRadius: "8px" }, children: events.length === 0 ? /* @__PURE__ */ u3("p", { style: { padding: "12px", margin: 0, color: "#b4bdc8" }, children: "No events yet." }) : /* @__PURE__ */ u3("table", { style: { width: "100%", borderCollapse: "collapse" }, children: [
892
+ /* @__PURE__ */ u3("thead", { children: /* @__PURE__ */ u3("tr", { children: [
893
+ /* @__PURE__ */ u3("th", { style: S2.th, children: "Time" }),
894
+ /* @__PURE__ */ u3("th", { style: S2.th, children: "Type" }),
895
+ /* @__PURE__ */ u3("th", { style: S2.th, children: "Message" })
896
+ ] }) }),
897
+ /* @__PURE__ */ u3("tbody", { children: events.map((e3, i3) => /* @__PURE__ */ u3("tr", { children: [
898
+ /* @__PURE__ */ u3("td", { style: { ...S2.td, ...S2.mono, whiteSpace: "nowrap" }, children: e3.timestamp }),
899
+ /* @__PURE__ */ u3("td", { style: { ...S2.td, color: typeColor[e3.type] ?? "#b4bdc8" }, children: e3.type }),
900
+ /* @__PURE__ */ u3("td", { style: S2.td, children: e3.message })
901
+ ] }, String(i3))) })
902
+ ] }) })
903
+ ] });
904
+ }
905
+ function RestartSection() {
906
+ const [msg, setMsg] = d2("");
907
+ const [err, setErr] = d2("");
908
+ const [restarting, setRestarting] = d2(false);
909
+ async function restart() {
910
+ setRestarting(true);
911
+ setErr("");
912
+ setMsg("");
913
+ try {
914
+ await jsonPost("/api/restart", {});
915
+ setMsg("Restart signal sent. The server will restart shortly.");
916
+ } catch (e3) {
917
+ setErr(e3 instanceof Error ? e3.message : String(e3));
918
+ setRestarting(false);
919
+ }
920
+ }
921
+ return /* @__PURE__ */ u3("section", { style: S2.box, children: [
922
+ /* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Server Control" }),
923
+ err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
924
+ msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
925
+ /* @__PURE__ */ u3("button", { style: { ...S2.btn, background: "#8a6d00" }, onClick: () => void restart(), disabled: restarting, children: restarting ? "Restarting\u2026" : "Restart Server" })
926
+ ] });
927
+ }
928
+ function App() {
929
+ const [config, setConfig] = d2(null);
930
+ const [refreshKey, setRefreshKey] = d2(0);
931
+ async function loadConfig() {
932
+ const d3 = await apiFetch("/api/config");
933
+ setConfig(d3);
934
+ }
935
+ h2(() => {
936
+ void loadConfig();
937
+ }, []);
938
+ function handleSave() {
939
+ void loadConfig();
940
+ setRefreshKey((k3) => k3 + 1);
941
+ }
942
+ return /* @__PURE__ */ u3("main", { style: { maxWidth: "860px", margin: "0 auto", padding: "24px" }, children: [
943
+ /* @__PURE__ */ u3("h1", { style: { marginTop: 0 }, children: "\u{1F5A8}\uFE0F Windsor Control Panel" }),
944
+ /* @__PURE__ */ u3(BotSetup, { config, onSave: handleSave }),
945
+ /* @__PURE__ */ u3(ChannelBehaviors, { refreshKey }),
946
+ /* @__PURE__ */ u3(PrintModeSection, {}),
947
+ /* @__PURE__ */ u3(SecuritySection, { onSave: () => void loadConfig() }),
948
+ /* @__PURE__ */ u3(LogSection, {}),
949
+ /* @__PURE__ */ u3(RestartSection, {})
950
+ ] });
951
+ }
952
+ var root = document.getElementById("app");
953
+ if (!root) throw new Error("Missing #app");
954
+ R(/* @__PURE__ */ u3(App, {}), root);
955
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL3V0aWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvb3B0aW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtZWxlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jb21wb25lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9wcm9wcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtY29udGV4dC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9kaWZmL2NoaWxkcmVuLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2RpZmYvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvcmVuZGVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2Nsb25lLWVsZW1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jYXRjaC1lcnJvci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L2hvb2tzL3NyYy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L2pzeC1ydW50aW1lL3NyYy91dGlscy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jb25zdGFudHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9qc3gtcnVudGltZS9zcmMvaW5kZXguanMiLCAiLi4vLi4vc3JjL3dlYi9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiogTm9ybWFsIGh5ZHJhdGlvbiB0aGF0IGF0dGFjaGVzIHRvIGEgRE9NIHRyZWUgYnV0IGRvZXMgbm90IGRpZmYgaXQuICovXG5leHBvcnQgY29uc3QgTU9ERV9IWURSQVRFID0gMSA8PCA1O1xuLyoqIFNpZ25pZmllcyB0aGlzIFZOb2RlIHN1c3BlbmRlZCBvbiB0aGUgcHJldmlvdXMgcmVuZGVyICovXG5leHBvcnQgY29uc3QgTU9ERV9TVVNQRU5ERUQgPSAxIDw8IDc7XG4vKiogSW5kaWNhdGVzIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGJlIGluc2VydGVkIHdoaWxlIHBhdGNoaW5nIGNoaWxkcmVuICovXG5leHBvcnQgY29uc3QgSU5TRVJUX1ZOT0RFID0gMSA8PCAyO1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTtcblxuLyoqIFJlc2V0IGFsbCBtb2RlIGZsYWdzICovXG5leHBvcnQgY29uc3QgUkVTRVRfTU9ERSA9IH4oTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERUQpO1xuXG5leHBvcnQgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5leHBvcnQgY29uc3QgWEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuZXhwb3J0IGNvbnN0IE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuXG5leHBvcnQgY29uc3QgTlVMTCA9IG51bGw7XG5leHBvcnQgY29uc3QgVU5ERUZJTkVEID0gdW5kZWZpbmVkO1xuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgRU1QVFlfQVJSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQXNzaWduIHByb3BlcnRpZXMgZnJvbSBgcHJvcHNgIHRvIGBvYmpgXG4gKiBAdGVtcGxhdGUgTywgUCBUaGUgb2JqIGFuZCBwcm9wcyB0eXBlc1xuICogQHBhcmFtIHtPfSBvYmogVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG9cbiAqIEBwYXJhbSB7UH0gcHJvcHMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybnMge08gJiBQfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKG9iaiwgcHJvcHMpIHtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBXZSBjaGFuZ2UgdGhlIHR5cGUgb2YgYG9iamAgdG8gYmUgYE8gJiBQYFxuXHRmb3IgKGxldCBpIGluIHByb3BzKSBvYmpbaV0gPSBwcm9wc1tpXTtcblx0cmV0dXJuIC8qKiBAdHlwZSB7TyAmIFB9ICovIChvYmopO1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGNoaWxkIG5vZGUgZnJvbSBpdHMgcGFyZW50IGlmIGF0dGFjaGVkLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3JcbiAqIElFMTEgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUoKWAuIFVzaW5nIHRoaXMgZnVuY3Rpb25cbiAqIGlzIHNtYWxsZXIgdGhhbiBpbmNsdWRpbmcgYSBkZWRpY2F0ZWQgcG9seWZpbGwuXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkNvbnRhaW5lck5vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcblx0aWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZSA9IEVNUFRZX0FSUi5zbGljZTtcbiIsICJpbXBvcnQgeyBfY2F0Y2hFcnJvciB9IGZyb20gJy4vZGlmZi9jYXRjaC1lcnJvcic7XG5cbi8qKlxuICogVGhlIGBvcHRpb25gIG9iamVjdCBjYW4gcG90ZW50aWFsbHkgY29udGFpbiBjYWxsYmFjayBmdW5jdGlvbnNcbiAqIHRoYXQgYXJlIGNhbGxlZCBkdXJpbmcgdmFyaW91cyBzdGFnZXMgb2Ygb3VyIHJlbmRlcmVyLiBUaGlzIGlzIHRoZVxuICogZm91bmRhdGlvbiBvbiB3aGljaCBhbGwgb3VyIGFkZG9ucyBsaWtlIGBwcmVhY3QvZGVidWdgLCBgcHJlYWN0L2NvbXBhdGAsXG4gKiBhbmQgYHByZWFjdC9ob29rc2AgYXJlIGJhc2VkIG9uLiBTZWUgdGhlIGBPcHRpb25zYCB0eXBlIGluIGBpbnRlcm5hbC5kLnRzYFxuICogZm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb24gaG9va3MgKG1vc3QgZWRpdG9ycy9JREVzIGFsbG93IHlvdSB0b1xuICogY3RybCtjbGljayBvciBjbWQrY2xpY2sgb24gbWFjIHRoZSB0eXBlIGRlZmluaXRpb24gYmVsb3cpLlxuICogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLk9wdGlvbnN9XG4gKi9cbmNvbnN0IG9wdGlvbnMgPSB7XG5cdF9jYXRjaEVycm9yXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcHRpb25zO1xuIiwgImltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBOVUxMLCBVTkRFRklORUQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmxldCB2bm9kZUlkID0gMDtcblxuLyoqXG4gKiBDcmVhdGUgYW4gdmlydHVhbCBub2RlICh1c2VkIGZvciBKU1gpXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlW1widHlwZVwiXX0gdHlwZSBUaGUgbm9kZSBuYW1lIG9yIENvbXBvbmVudCBjb25zdHJ1Y3RvciBmb3IgdGhpc1xuICogdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdCB8IG51bGwgfCB1bmRlZmluZWR9IFtwcm9wc10gVGhlIHByb3BlcnRpZXMgb2YgdGhlIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4nKS5Db21wb25lbnRDaGlsZHJlbj59IFtjaGlsZHJlbl0gVGhlIGNoaWxkcmVuIG9mIHRoZVxuICogdmlydHVhbCBub2RlXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0ge30sXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXHRmb3IgKGkgaW4gcHJvcHMpIHtcblx0XHRpZiAoaSA9PSAna2V5Jykga2V5ID0gcHJvcHNbaV07XG5cdFx0ZWxzZSBpZiAoaSA9PSAncmVmJykgcmVmID0gcHJvcHNbaV07XG5cdFx0ZWxzZSBub3JtYWxpemVkUHJvcHNbaV0gPSBwcm9wc1tpXTtcblx0fVxuXG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdG5vcm1hbGl6ZWRQcm9wcy5jaGlsZHJlbiA9XG5cdFx0XHRhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGNoaWxkcmVuO1xuXHR9XG5cblx0Ly8gSWYgYSBDb21wb25lbnQgVk5vZGUsIGNoZWNrIGZvciBhbmQgYXBwbHkgZGVmYXVsdFByb3BzXG5cdC8vIE5vdGU6IHR5cGUgbWF5IGJlIHVuZGVmaW5lZCBpbiBkZXZlbG9wbWVudCwgbXVzdCBuZXZlciBlcnJvciBoZXJlLlxuXHRpZiAodHlwZW9mIHR5cGUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlLmRlZmF1bHRQcm9wcyAhPSBOVUxMKSB7XG5cdFx0Zm9yIChpIGluIHR5cGUuZGVmYXVsdFByb3BzKSB7XG5cdFx0XHRpZiAobm9ybWFsaXplZFByb3BzW2ldID09PSBVTkRFRklORUQpIHtcblx0XHRcdFx0bm9ybWFsaXplZFByb3BzW2ldID0gdHlwZS5kZWZhdWx0UHJvcHNbaV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG5vcm1hbGl6ZWRQcm9wcywga2V5LCByZWYsIE5VTEwpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIFZOb2RlICh1c2VkIGludGVybmFsbHkgYnkgUHJlYWN0KVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZVtcInR5cGVcIl19IHR5cGUgVGhlIG5vZGUgbmFtZSBvciBDb21wb25lbnRcbiAqIENvbnN0cnVjdG9yIGZvciB0aGlzIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBwcm9wcyBUaGUgcHJvcGVydGllcyBvZiB0aGlzIHZpcnR1YWwgbm9kZS5cbiAqIElmIHRoaXMgdmlydHVhbCBub2RlIHJlcHJlc2VudHMgYSB0ZXh0IG5vZGUsIHRoaXMgaXMgdGhlIHRleHQgb2YgdGhlIG5vZGUgKHN0cmluZyBvciBudW1iZXIpLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBrZXkgVGhlIGtleSBmb3IgdGhpcyB2aXJ0dWFsIG5vZGUsIHVzZWQgd2hlblxuICogZGlmZmluZyBpdCBhZ2FpbnN0IGl0cyBjaGlsZHJlblxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZVtcInJlZlwiXX0gcmVmIFRoZSByZWYgcHJvcGVydHkgdGhhdCB3aWxsXG4gKiByZWNlaXZlIGEgcmVmZXJlbmNlIHRvIGl0cyBjcmVhdGVkIGNoaWxkXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywga2V5LCByZWYsIG9yaWdpbmFsKSB7XG5cdC8vIFY4IHNlZW1zIHRvIGJlIGJldHRlciBhdCBkZXRlY3RpbmcgdHlwZSBzaGFwZXMgaWYgdGhlIG9iamVjdCBpcyBhbGxvY2F0ZWQgZnJvbSB0aGUgc2FtZSBjYWxsIHNpdGVcblx0Ly8gRG8gbm90IGlubGluZSBpbnRvIGNyZWF0ZUVsZW1lbnQgYW5kIGNvZXJjZVRvVk5vZGUhXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9ICovXG5cdGNvbnN0IHZub2RlID0ge1xuXHRcdHR5cGUsXG5cdFx0cHJvcHMsXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRfY2hpbGRyZW46IE5VTEwsXG5cdFx0X3BhcmVudDogTlVMTCxcblx0XHRfZGVwdGg6IDAsXG5cdFx0X2RvbTogTlVMTCxcblx0XHRfY29tcG9uZW50OiBOVUxMLFxuXHRcdGNvbnN0cnVjdG9yOiBVTkRFRklORUQsXG5cdFx0X29yaWdpbmFsOiBvcmlnaW5hbCA9PSBOVUxMID8gKyt2bm9kZUlkIDogb3JpZ2luYWwsXG5cdFx0X2luZGV4OiAtMSxcblx0XHRfZmxhZ3M6IDBcblx0fTtcblxuXHQvLyBPbmx5IGludm9rZSB0aGUgdm5vZGUgaG9vayBpZiB0aGlzIHdhcyAqbm90KiBhIGRpcmVjdCBjb3B5OlxuXHRpZiAob3JpZ2luYWwgPT0gTlVMTCAmJiBvcHRpb25zLnZub2RlICE9IE5VTEwpIG9wdGlvbnMudm5vZGUodm5vZGUpO1xuXG5cdHJldHVybiB2bm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcblx0cmV0dXJuIHsgY3VycmVudDogTlVMTCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRnJhZ21lbnQocHJvcHMpIHtcblx0cmV0dXJuIHByb3BzLmNoaWxkcmVuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgdGhlIGFyZ3VtZW50IGlzIGEgdmFsaWQgUHJlYWN0IFZOb2RlLlxuICogQHBhcmFtIHsqfSB2bm9kZVxuICogQHJldHVybnMge3Zub2RlIGlzIFZOb2RlfVxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEVsZW1lbnQgPSB2bm9kZSA9PlxuXHR2bm9kZSAhPSBOVUxMICYmIHZub2RlLmNvbnN0cnVjdG9yID09PSBVTkRFRklORUQ7XG4iLCAiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGRpZmYsIGNvbW1pdFJvb3QgfSBmcm9tICcuL2RpZmYvaW5kZXgnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBNT0RFX0hZRFJBVEUsIE5VTEwgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQmFzZSBDb21wb25lbnQgY2xhc3MuIFByb3ZpZGVzIGBzZXRTdGF0ZSgpYCBhbmQgYGZvcmNlVXBkYXRlKClgLCB3aGljaFxuICogdHJpZ2dlciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBUaGUgaW5pdGlhbCBjb21wb25lbnQgcHJvcHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0IFRoZSBpbml0aWFsIGNvbnRleHQgZnJvbSBwYXJlbnQgY29tcG9uZW50cydcbiAqIGdldENoaWxkQ29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gQmFzZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuXHR0aGlzLnByb3BzID0gcHJvcHM7XG5cdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbi8qKlxuICogVXBkYXRlIGNvbXBvbmVudCBzdGF0ZSBhbmQgc2NoZWR1bGUgYSByZS1yZW5kZXIuXG4gKiBAdGhpcyB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fVxuICogQHBhcmFtIHtvYmplY3QgfCAoKHM6IG9iamVjdCwgcDogb2JqZWN0KSA9PiBvYmplY3QpfSB1cGRhdGUgQSBoYXNoIG9mIHN0YXRlXG4gKiBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB3aXRoIG5ldyB2YWx1ZXMgb3IgYSBmdW5jdGlvbiB0aGF0IGdpdmVuIHRoZSBjdXJyZW50XG4gKiBzdGF0ZSBhbmQgcHJvcHMgcmV0dXJucyBhIG5ldyBwYXJ0aWFsIHN0YXRlXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IFtjYWxsYmFja10gQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBjb21wb25lbnQgc3RhdGUgaXNcbiAqIHVwZGF0ZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAodXBkYXRlLCBjYWxsYmFjaykge1xuXHQvLyBvbmx5IGNsb25lIHN0YXRlIHdoZW4gY29weWluZyB0byBuZXh0U3RhdGUgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBzO1xuXHRpZiAodGhpcy5fbmV4dFN0YXRlICE9IE5VTEwgJiYgdGhpcy5fbmV4dFN0YXRlICE9IHRoaXMuc3RhdGUpIHtcblx0XHRzID0gdGhpcy5fbmV4dFN0YXRlO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSB0aGlzLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIHRoaXMuc3RhdGUpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB1cGRhdGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdC8vIFNvbWUgbGlicmFyaWVzIGxpa2UgYGltbWVyYCBtYXJrIHRoZSBjdXJyZW50IHN0YXRlIGFzIHJlYWRvbmx5LFxuXHRcdC8vIHByZXZlbnRpbmcgdXMgZnJvbSBtdXRhdGluZyBpdCwgc28gd2UgbmVlZCB0byBjbG9uZSBpdC4gU2VlICMyNzE2XG5cdFx0dXBkYXRlID0gdXBkYXRlKGFzc2lnbih7fSwgcyksIHRoaXMucHJvcHMpO1xuXHR9XG5cblx0aWYgKHVwZGF0ZSkge1xuXHRcdGFzc2lnbihzLCB1cGRhdGUpO1xuXHR9XG5cblx0Ly8gU2tpcCB1cGRhdGUgaWYgdXBkYXRlciBmdW5jdGlvbiByZXR1cm5lZCBudWxsXG5cdGlmICh1cGRhdGUgPT0gTlVMTCkgcmV0dXJuO1xuXG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdGlmIChjYWxsYmFjaykge1xuXHRcdFx0dGhpcy5fc3RhdGVDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG5cdFx0fVxuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogSW1tZWRpYXRlbHkgcGVyZm9ybSBhIHN5bmNocm9ub3VzIHJlLXJlbmRlciBvZiB0aGUgY29tcG9uZW50XG4gKiBAdGhpcyB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpc1xuICogcmUtcmVuZGVyZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0aWYgKHRoaXMuX3Zub2RlKSB7XG5cdFx0Ly8gU2V0IHJlbmRlciBtb2RlIHNvIHRoYXQgd2UgY2FuIGRpZmZlcmVudGlhdGUgd2hlcmUgdGhlIHJlbmRlciByZXF1ZXN0XG5cdFx0Ly8gaXMgY29taW5nIGZyb20uIFdlIG5lZWQgdGhpcyBiZWNhdXNlIGZvcmNlVXBkYXRlIHNob3VsZCBuZXZlciBjYWxsXG5cdFx0Ly8gc2hvdWxkQ29tcG9uZW50VXBkYXRlXG5cdFx0dGhpcy5fZm9yY2UgPSB0cnVlO1xuXHRcdGlmIChjYWxsYmFjaykgdGhpcy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogQWNjZXB0cyBgcHJvcHNgIGFuZCBgc3RhdGVgLCBhbmQgcmV0dXJucyBhIG5ldyBWaXJ0dWFsIERPTSB0cmVlIHRvIGJ1aWxkLlxuICogVmlydHVhbCBET00gaXMgZ2VuZXJhbGx5IGNvbnN0cnVjdGVkIHZpYSBbSlNYXShodHRwczovL2phc29uZm9ybWF0LmNvbS93dGYtaXMtanN4KS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBQcm9wcyAoZWc6IEpTWCBhdHRyaWJ1dGVzKSByZWNlaXZlZCBmcm9tIHBhcmVudFxuICogZWxlbWVudC9jb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSBUaGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCBvYmplY3QsIGFzIHJldHVybmVkIGJ5IHRoZSBuZWFyZXN0XG4gKiBhbmNlc3RvcidzIGBnZXRDaGlsZENvbnRleHQoKWBcbiAqIEByZXR1cm5zIHtDb21wb25lbnRDaGlsZHJlbiB8IHZvaWR9XG4gKi9cbkJhc2VDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IEZyYWdtZW50O1xuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9IHZub2RlXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGx9IFtjaGlsZEluZGV4XVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tU2libGluZyh2bm9kZSwgY2hpbGRJbmRleCkge1xuXHRpZiAoY2hpbGRJbmRleCA9PSBOVUxMKSB7XG5cdFx0Ly8gVXNlIGNoaWxkSW5kZXg9PW51bGwgYXMgYSBzaWduYWwgdG8gcmVzdW1lIHRoZSBzZWFyY2ggZnJvbSB0aGUgdm5vZGUncyBzaWJsaW5nXG5cdFx0cmV0dXJuIHZub2RlLl9wYXJlbnRcblx0XHRcdD8gZ2V0RG9tU2libGluZyh2bm9kZS5fcGFyZW50LCB2bm9kZS5faW5kZXggKyAxKVxuXHRcdFx0OiBOVUxMO1xuXHR9XG5cblx0bGV0IHNpYmxpbmc7XG5cdGZvciAoOyBjaGlsZEluZGV4IDwgdm5vZGUuX2NoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKSB7XG5cdFx0c2libGluZyA9IHZub2RlLl9jaGlsZHJlbltjaGlsZEluZGV4XTtcblxuXHRcdGlmIChzaWJsaW5nICE9IE5VTEwgJiYgc2libGluZy5fZG9tICE9IE5VTEwpIHtcblx0XHRcdC8vIFNpbmNlIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIGtlZXBzIF9kb20gcG9pbnRlciBjb3JyZWN0LFxuXHRcdFx0Ly8gd2UgY2FuIHJlbHkgb24gX2RvbSB0byB0ZWxsIHVzIGlmIHRoaXMgc3VidHJlZSBjb250YWlucyBhXG5cdFx0XHQvLyByZW5kZXJlZCBET00gbm9kZSwgYW5kIHdoYXQgdGhlIGZpcnN0IHJlbmRlcmVkIERPTSBub2RlIGlzXG5cdFx0XHRyZXR1cm4gc2libGluZy5fZG9tO1xuXHRcdH1cblx0fVxuXG5cdC8vIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIG5vdCBmb3VuZCBhIERPTSBub2RlIGluIHRoaXMgdm5vZGUncyBjaGlsZHJlbi5cblx0Ly8gV2UgbXVzdCByZXN1bWUgZnJvbSB0aGlzIHZub2RlJ3Mgc2libGluZyAoaW4gaXQncyBwYXJlbnQgX2NoaWxkcmVuIGFycmF5KVxuXHQvLyBPbmx5IGNsaW1iIHVwIGFuZCBzZWFyY2ggdGhlIHBhcmVudCBpZiB3ZSBhcmVuJ3Qgc2VhcmNoaW5nIHRocm91Z2ggYSBET01cblx0Ly8gVk5vZGUgKG1lYW5pbmcgd2UgcmVhY2hlZCB0aGUgRE9NIHBhcmVudCBvZiB0aGUgb3JpZ2luYWwgdm5vZGUgdGhhdCBiZWdhblxuXHQvLyB0aGUgc2VhcmNoKVxuXHRyZXR1cm4gdHlwZW9mIHZub2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyA/IGdldERvbVNpYmxpbmcodm5vZGUpIDogTlVMTDtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGluLXBsYWNlIHJlLXJlbmRlcmluZyBvZiBhIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnQoY29tcG9uZW50KSB7XG5cdGlmIChjb21wb25lbnQuX3BhcmVudERvbSAmJiBjb21wb25lbnQuX2RpcnR5KSB7XG5cdFx0bGV0IG9sZFZOb2RlID0gY29tcG9uZW50Ll92bm9kZSxcblx0XHRcdG9sZERvbSA9IG9sZFZOb2RlLl9kb20sXG5cdFx0XHRjb21taXRRdWV1ZSA9IFtdLFxuXHRcdFx0cmVmUXVldWUgPSBbXSxcblx0XHRcdG5ld1ZOb2RlID0gYXNzaWduKHt9LCBvbGRWTm9kZSk7XG5cdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gb2xkVk5vZGUuX29yaWdpbmFsICsgMTtcblx0XHRpZiAob3B0aW9ucy52bm9kZSkgb3B0aW9ucy52bm9kZShuZXdWTm9kZSk7XG5cblx0XHRkaWZmKFxuXHRcdFx0Y29tcG9uZW50Ll9wYXJlbnREb20sXG5cdFx0XHRuZXdWTm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Y29tcG9uZW50Ll9nbG9iYWxDb250ZXh0LFxuXHRcdFx0Y29tcG9uZW50Ll9wYXJlbnREb20ubmFtZXNwYWNlVVJJLFxuXHRcdFx0b2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFID8gW29sZERvbV0gOiBOVUxMLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20gPT0gTlVMTCA/IGdldERvbVNpYmxpbmcob2xkVk5vZGUpIDogb2xkRG9tLFxuXHRcdFx0ISEob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFKSxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblxuXHRcdG5ld1ZOb2RlLl9vcmlnaW5hbCA9IG9sZFZOb2RlLl9vcmlnaW5hbDtcblx0XHRuZXdWTm9kZS5fcGFyZW50Ll9jaGlsZHJlbltuZXdWTm9kZS5faW5kZXhdID0gbmV3Vk5vZGU7XG5cdFx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgbmV3Vk5vZGUsIHJlZlF1ZXVlKTtcblx0XHRvbGRWTm9kZS5fZG9tID0gb2xkVk5vZGUuX3BhcmVudCA9IG51bGw7XG5cblx0XHRpZiAobmV3Vk5vZGUuX2RvbSAhPSBvbGREb20pIHtcblx0XHRcdHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzKG5ld1ZOb2RlKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfSB2bm9kZVxuICovXG5mdW5jdGlvbiB1cGRhdGVQYXJlbnREb21Qb2ludGVycyh2bm9kZSkge1xuXHRpZiAoKHZub2RlID0gdm5vZGUuX3BhcmVudCkgIT0gTlVMTCAmJiB2bm9kZS5fY29tcG9uZW50ICE9IE5VTEwpIHtcblx0XHR2bm9kZS5fZG9tID0gdm5vZGUuX2NvbXBvbmVudC5iYXNlID0gTlVMTDtcblx0XHR2bm9kZS5fY2hpbGRyZW4uc29tZShjaGlsZCA9PiB7XG5cdFx0XHRpZiAoY2hpbGQgIT0gTlVMTCAmJiBjaGlsZC5fZG9tICE9IE5VTEwpIHtcblx0XHRcdFx0cmV0dXJuICh2bm9kZS5fZG9tID0gdm5vZGUuX2NvbXBvbmVudC5iYXNlID0gY2hpbGQuX2RvbSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdXBkYXRlUGFyZW50RG9tUG9pbnRlcnModm5vZGUpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIHJlbmRlciBxdWV1ZVxuICogQHR5cGUge0FycmF5PGltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudD59XG4gKi9cbmxldCByZXJlbmRlclF1ZXVlID0gW107XG5cbi8qXG4gKiBUaGUgdmFsdWUgb2YgYENvbXBvbmVudC5kZWJvdW5jZWAgbXVzdCBhc3luY2hyb25vdXNseSBpbnZva2UgdGhlIHBhc3NlZCBpbiBjYWxsYmFjay4gSXQgaXNcbiAqIGltcG9ydGFudCB0aGF0IGNvbnRyaWJ1dG9ycyB0byBQcmVhY3QgY2FuIGNvbnNpc3RlbnRseSByZWFzb24gYWJvdXQgd2hhdCBjYWxscyB0byBgc2V0U3RhdGVgLCBldGMuXG4gKiBkbywgYW5kIHdoZW4gdGhlaXIgZWZmZWN0cyB3aWxsIGJlIGFwcGxpZWQuIFNlZSB0aGUgbGlua3MgYmVsb3cgZm9yIHNvbWUgZnVydGhlciByZWFkaW5nIG9uIGRlc2lnbmluZ1xuICogYXN5bmNocm9ub3VzIEFQSXMuXG4gKiAqIFtEZXNpZ25pbmcgQVBJcyBmb3IgQXN5bmNocm9ueV0oaHR0cHM6Ly9ibG9nLml6cy5tZS8yMDEzLzA4L2Rlc2lnbmluZy1hcGlzLWZvci1hc3luY2hyb255KVxuICogKiBbQ2FsbGJhY2tzIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXNdKGh0dHBzOi8vYmxvZy5vbWV0ZXIuY29tLzIwMTEvMDcvMjQvY2FsbGJhY2tzLXN5bmNocm9ub3VzLWFuZC1hc3luY2hyb25vdXMvKVxuICovXG5cbmxldCBwcmV2RGVib3VuY2U7XG5cbmNvbnN0IGRlZmVyID1cblx0dHlwZW9mIFByb21pc2UgPT0gJ2Z1bmN0aW9uJ1xuXHRcdD8gUHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKVxuXHRcdDogc2V0VGltZW91dDtcblxuLyoqXG4gKiBFbnF1ZXVlIGEgcmVyZW5kZXIgb2YgYSBjb21wb25lbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSBjIFRoZSBjb21wb25lbnQgdG8gcmVyZW5kZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVucXVldWVSZW5kZXIoYykge1xuXHRpZiAoXG5cdFx0KCFjLl9kaXJ0eSAmJlxuXHRcdFx0KGMuX2RpcnR5ID0gdHJ1ZSkgJiZcblx0XHRcdHJlcmVuZGVyUXVldWUucHVzaChjKSAmJlxuXHRcdFx0IXByb2Nlc3MuX3JlcmVuZGVyQ291bnQrKykgfHxcblx0XHRwcmV2RGVib3VuY2UgIT0gb3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZ1xuXHQpIHtcblx0XHRwcmV2RGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nO1xuXHRcdChwcmV2RGVib3VuY2UgfHwgZGVmZXIpKHByb2Nlc3MpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9IGFcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSBiXG4gKi9cbmNvbnN0IGRlcHRoU29ydCA9IChhLCBiKSA9PiBhLl92bm9kZS5fZGVwdGggLSBiLl92bm9kZS5fZGVwdGg7XG5cbi8qKiBGbHVzaCB0aGUgcmVuZGVyIHF1ZXVlIGJ5IHJlcmVuZGVyaW5nIGFsbCBxdWV1ZWQgY29tcG9uZW50cyAqL1xuZnVuY3Rpb24gcHJvY2VzcygpIHtcblx0dHJ5IHtcblx0XHRsZXQgYyxcblx0XHRcdGwgPSAxO1xuXG5cdFx0Ly8gRG9uJ3QgdXBkYXRlIGByZW5kZXJDb3VudGAgeWV0LiBLZWVwIGl0cyB2YWx1ZSBub24temVybyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5XG5cdFx0Ly8gcHJvY2VzcygpIGNhbGxzIGZyb20gZ2V0dGluZyBzY2hlZHVsZWQgd2hpbGUgYHF1ZXVlYCBpcyBzdGlsbCBiZWluZyBjb25zdW1lZC5cblx0XHR3aGlsZSAocmVyZW5kZXJRdWV1ZS5sZW5ndGgpIHtcblx0XHRcdC8vIEtlZXAgdGhlIHJlcmVuZGVyIHF1ZXVlIHNvcnRlZCBieSAoZGVwdGgsIGluc2VydGlvbiBvcmRlcikuIFRoZSBxdWV1ZVxuXHRcdFx0Ly8gd2lsbCBpbml0aWFsbHkgYmUgc29ydGVkIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gb25seSBpZiBpdCBoYXMgbW9yZSB0aGFuIDEgaXRlbS5cblx0XHRcdC8vXG5cdFx0XHQvLyBOZXcgaXRlbXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZSBlLmcuIHdoZW4gcmVyZW5kZXJpbmcgYSBwcm92aWRlciwgc28gd2Ugd2FudCB0b1xuXHRcdFx0Ly8ga2VlcCB0aGUgb3JkZXIgZnJvbSB0b3AgdG8gYm90dG9tIHdpdGggdGhvc2UgbmV3IGl0ZW1zIHNvIHdlIGNhbiBoYW5kbGUgdGhlbSBpbiBhXG5cdFx0XHQvLyBzaW5nbGUgcGFzc1xuXHRcdFx0aWYgKHJlcmVuZGVyUXVldWUubGVuZ3RoID4gbCkge1xuXHRcdFx0XHRyZXJlbmRlclF1ZXVlLnNvcnQoZGVwdGhTb3J0KTtcblx0XHRcdH1cblxuXHRcdFx0YyA9IHJlcmVuZGVyUXVldWUuc2hpZnQoKTtcblx0XHRcdGwgPSByZXJlbmRlclF1ZXVlLmxlbmd0aDtcblxuXHRcdFx0cmVuZGVyQ29tcG9uZW50KGMpO1xuXHRcdH1cblx0fSBmaW5hbGx5IHtcblx0XHRyZXJlbmRlclF1ZXVlLmxlbmd0aCA9IHByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSAwO1xuXHR9XG59XG5cbnByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSAwO1xuIiwgImltcG9ydCB7IElTX05PTl9ESU1FTlNJT05BTCwgTlVMTCwgU1ZHX05BTUVTUEFDRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLy8gUGVyLWluc3RhbmNlIHVuaXF1ZSBrZXkgZm9yIGV2ZW50IGNsb2NrIHN0YW1wcy4gRWFjaCBQcmVhY3QgY29weSBvbiB0aGUgcGFnZVxuLy8gZ2V0cyBpdHMgb3duIHJhbmRvbSBzdWZmaXggc28gdGhhdCBgX2Rpc3BhdGNoZWRgIC8gYF9hdHRhY2hlZGAgcHJvcGVydGllcyBvblxuLy8gc2hhcmVkIGV2ZW50IG9iamVjdHMgYW5kIGhhbmRsZXIgZnVuY3Rpb25zIGNhbm5vdCBjb2xsaWRlIGFjcm9zcyBpbnN0YW5jZXMuXG4vLyB+MSBpbiA2ME0gY29sbGlzaW9uIG9kZHMgLSBpZiB5b3UgaGF2ZSB0aGF0IG1hbnkgcHJhZWN0IHZlcnNpb25zIG9uIHRoZSBwYWdlLFxuLy8geW91IGRlc2VydmUgc29tZSB3ZWlyZCBidWdzLlxuLy8gSW4gMTEgd2UgY2FuIHJlcGxhY2UgdGhpcyB3aXRoIGFcbi8vIFN5bWJvbFxubGV0IF9pZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksXG5cdEVWRU5UX0RJU1BBVENIRUQgPSAnX19kJyArIF9pZCxcblx0RVZFTlRfQVRUQUNIRUQgPSAnX19hJyArIF9pZDtcblxuZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUsIGtleSwgdmFsdWUpIHtcblx0aWYgKGtleVswXSA9PSAnLScpIHtcblx0XHRzdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlID09IE5VTEwgPyAnJyA6IHZhbHVlKTtcblx0fSBlbHNlIGlmICh2YWx1ZSA9PSBOVUxMKSB7XG5cdFx0c3R5bGVba2V5XSA9ICcnO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyB8fCBJU19OT05fRElNRU5TSU9OQUwudGVzdChrZXkpKSB7XG5cdFx0c3R5bGVba2V5XSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlW2tleV0gPSB2YWx1ZSArICdweCc7XG5cdH1cbn1cblxuY29uc3QgQ0FQVFVSRV9SRUdFWCA9IC8oUG9pbnRlckNhcHR1cmUpJHxDYXB0dXJlJC9pO1xuXG4vLyBBIGxvZ2ljYWwgY2xvY2sgdG8gc29sdmUgaXNzdWVzIGxpa2UgaHR0cHM6Ly9naXRodWIuY29tL3ByZWFjdGpzL3ByZWFjdC9pc3N1ZXMvMzkyNy5cbi8vIFdoZW4gdGhlIERPTSBwZXJmb3JtcyBhbiBldmVudCBpdCBsZWF2ZXMgbWljcm8tdGlja3MgaW4gYmV0d2VlbiBidWJibGluZyB1cCB3aGljaCBtZWFucyB0aGF0XG4vLyBhbiBldmVudCBjYW4gdHJpZ2dlciBvbiBhIG5ld2x5IHJlYXRlZCBET00tbm9kZSB3aGlsZSB0aGUgZXZlbnQgYnViYmxlcyB1cC5cbi8vXG4vLyBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5IFZ1ZVxuLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9jb3JlL2Jsb2IvY2FlYjhhNjg4MTFhMWIwZjc5L3BhY2thZ2VzL3J1bnRpbWUtZG9tL3NyYy9tb2R1bGVzL2V2ZW50cy50cyNMOTAtTDEwMSksXG4vLyBidXQgbW9kaWZpZWQgdG8gdXNlIGEgbG9naWNhbCBjbG9jayBpbnN0ZWFkIG9mIERhdGUubm93KCkgaW4gY2FzZSBldmVudCBoYW5kbGVycyBnZXQgYXR0YWNoZWRcbi8vIGFuZCBldmVudHMgZ2V0IGRpc3BhdGNoZWQgZHVyaW5nIHRoZSBzYW1lIG1pbGxpc2Vjb25kLlxuLy9cbi8vIFRoZSBjbG9jayBpcyBpbmNyZW1lbnRlZCBhZnRlciBlYWNoIG5ldyBldmVudCBkaXNwYXRjaC4gVGhpcyBhbGxvd3MgMSAwMDAgMDAwIG5ldyBldmVudHNcbi8vIHBlciBzZWNvbmQgZm9yIG92ZXIgMjgwIHllYXJzIGJlZm9yZSB0aGUgdmFsdWUgcmVhY2hlcyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAoMioqNTMgLSAxKS5cbmxldCBldmVudENsb2NrID0gMDtcblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSB2YWx1ZSBvbiBhIERPTSBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBkb20gVGhlIERPTSBub2RlIHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHsqfSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlIHRoZSBwcm9wZXJ0eSBoYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgV2hldGhlciBvciBub3QgdGhpcyBET00gbm9kZSBpcyBhbiBTVkcgbm9kZSBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BlcnR5KGRvbSwgbmFtZSwgdmFsdWUsIG9sZFZhbHVlLCBuYW1lc3BhY2UpIHtcblx0bGV0IHVzZUNhcHR1cmU7XG5cblx0bzogaWYgKG5hbWUgPT0gJ3N0eWxlJykge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdGRvbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0eXBlb2Ygb2xkVmFsdWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZG9tLnN0eWxlLmNzc1RleHQgPSBvbGRWYWx1ZSA9ICcnO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob2xkVmFsdWUpIHtcblx0XHRcdFx0Zm9yIChuYW1lIGluIG9sZFZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKCEodmFsdWUgJiYgbmFtZSBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHNldFN0eWxlKGRvbS5zdHlsZSwgbmFtZSwgJycpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0Zm9yIChuYW1lIGluIHZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKCFvbGRWYWx1ZSB8fCB2YWx1ZVtuYW1lXSAhPSBvbGRWYWx1ZVtuYW1lXSkge1xuXHRcdFx0XHRcdFx0c2V0U3R5bGUoZG9tLnN0eWxlLCBuYW1lLCB2YWx1ZVtuYW1lXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEJlbmNobWFyayBmb3IgY29tcGFyaXNvbjogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81NzRjOTU0YmRiOTY1YjlhMDA5NjVhYzZcblx0ZWxzZSBpZiAobmFtZVswXSA9PSAnbycgJiYgbmFtZVsxXSA9PSAnbicpIHtcblx0XHR1c2VDYXB0dXJlID0gbmFtZSAhPSAobmFtZSA9IG5hbWUucmVwbGFjZShDQVBUVVJFX1JFR0VYLCAnJDEnKSk7XG5cdFx0Y29uc3QgbG93ZXJDYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIEluZmVyIGNvcnJlY3QgY2FzaW5nIGZvciBET00gYnVpbHQtaW4gZXZlbnRzOlxuXHRcdGlmIChsb3dlckNhc2VOYW1lIGluIGRvbSB8fCBuYW1lID09ICdvbkZvY3VzT3V0JyB8fCBuYW1lID09ICdvbkZvY3VzSW4nKVxuXHRcdFx0bmFtZSA9IGxvd2VyQ2FzZU5hbWUuc2xpY2UoMik7XG5cdFx0ZWxzZSBuYW1lID0gbmFtZS5zbGljZSgyKTtcblxuXHRcdGlmICghZG9tLl9saXN0ZW5lcnMpIGRvbS5fbGlzdGVuZXJzID0ge307XG5cdFx0ZG9tLl9saXN0ZW5lcnNbbmFtZSArIHVzZUNhcHR1cmVdID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlmICghb2xkVmFsdWUpIHtcblx0XHRcdFx0dmFsdWVbRVZFTlRfQVRUQUNIRURdID0gZXZlbnRDbG9jaztcblx0XHRcdFx0ZG9tLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHR1c2VDYXB0dXJlID8gZXZlbnRQcm94eUNhcHR1cmUgOiBldmVudFByb3h5LFxuXHRcdFx0XHRcdHVzZUNhcHR1cmVcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlW0VWRU5UX0FUVEFDSEVEXSA9IG9sZFZhbHVlW0VWRU5UX0FUVEFDSEVEXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHVzZUNhcHR1cmUgPyBldmVudFByb3h5Q2FwdHVyZSA6IGV2ZW50UHJveHksXG5cdFx0XHRcdHVzZUNhcHR1cmVcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmIChuYW1lc3BhY2UgPT0gU1ZHX05BTUVTUEFDRSkge1xuXHRcdFx0Ly8gTm9ybWFsaXplIGluY29ycmVjdCBwcm9wIHVzYWdlIGZvciBTVkc6XG5cdFx0XHQvLyAtIHhsaW5rOmhyZWYgLyB4bGlua0hyZWYgLS0+IGhyZWYgKHhsaW5rOmhyZWYgd2FzIHJlbW92ZWQgZnJvbSBTVkcgYW5kIGlzbid0IG5lZWRlZClcblx0XHRcdC8vIC0gY2xhc3NOYW1lIC0tPiBjbGFzc1xuXHRcdFx0bmFtZSA9IG5hbWUucmVwbGFjZSgveGxpbmsoSHw6aCkvLCAnaCcpLnJlcGxhY2UoL3NOYW1lJC8sICdzJyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG5hbWUgIT0gJ3dpZHRoJyAmJlxuXHRcdFx0bmFtZSAhPSAnaGVpZ2h0JyAmJlxuXHRcdFx0bmFtZSAhPSAnaHJlZicgJiZcblx0XHRcdG5hbWUgIT0gJ2xpc3QnICYmXG5cdFx0XHRuYW1lICE9ICdmb3JtJyAmJlxuXHRcdFx0Ly8gRGVmYXVsdCB2YWx1ZSBpbiBicm93c2VycyBpcyBgLTFgIGFuZCBhbiBlbXB0eSBzdHJpbmcgaXNcblx0XHRcdC8vIGNhc3QgdG8gYDBgIGluc3RlYWRcblx0XHRcdG5hbWUgIT0gJ3RhYkluZGV4JyAmJlxuXHRcdFx0bmFtZSAhPSAnZG93bmxvYWQnICYmXG5cdFx0XHRuYW1lICE9ICdyb3dTcGFuJyAmJlxuXHRcdFx0bmFtZSAhPSAnY29sU3BhbicgJiZcblx0XHRcdG5hbWUgIT0gJ3JvbGUnICYmXG5cdFx0XHRuYW1lICE9ICdwb3BvdmVyJyAmJlxuXHRcdFx0bmFtZSBpbiBkb21cblx0XHQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRvbVtuYW1lXSA9IHZhbHVlID09IE5VTEwgPyAnJyA6IHZhbHVlO1xuXHRcdFx0XHQvLyBsYWJlbGxlZCBicmVhayBpcyAxYiBzbWFsbGVyIGhlcmUgdGhhbiBhIHJldHVybiBzdGF0ZW1lbnQgKHNvcnJ5KVxuXHRcdFx0XHRicmVhayBvO1xuXHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHR9XG5cblx0XHQvLyBhcmlhLSBhbmQgZGF0YS0gYXR0cmlidXRlcyBoYXZlIG5vIGJvb2xlYW4gcmVwcmVzZW50YXRpb24uXG5cdFx0Ly8gQSBgZmFsc2VgIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhdHRyaWJ1dGUgbm90IGJlaW5nXG5cdFx0Ly8gcHJlc2VudCwgc28gd2UgY2FuJ3QgcmVtb3ZlIGl0LiBGb3Igbm9uLWJvb2xlYW4gYXJpYVxuXHRcdC8vIGF0dHJpYnV0ZXMgd2UgY291bGQgdHJlYXQgZmFsc2UgYXMgYSByZW1vdmFsLCBidXQgdGhlXG5cdFx0Ly8gYW1vdW50IG9mIGV4Y2VwdGlvbnMgd291bGQgY29zdCB0b28gbWFueSBieXRlcy4gT24gdG9wIG9mXG5cdFx0Ly8gdGhhdCBvdGhlciBmcmFtZXdvcmtzIGdlbmVyYWxseSBzdHJpbmdpZnkgYGZhbHNlYC5cblxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gbmV2ZXIgc2VyaWFsaXplIGZ1bmN0aW9ucyBhcyBhdHRyaWJ1dGUgdmFsdWVzXG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBOVUxMICYmICh2YWx1ZSAhPT0gZmFsc2UgfHwgbmFtZVs0XSA9PSAnLScpKSB7XG5cdFx0XHRkb20uc2V0QXR0cmlidXRlKG5hbWUsIG5hbWUgPT0gJ3BvcG92ZXInICYmIHZhbHVlID09IHRydWUgPyAnJyA6IHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZXZlbnQgcHJveHkgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVzZUNhcHR1cmUgSXMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBjYXB0dXJlIHBoYXNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRQcm94eSh1c2VDYXB0dXJlKSB7XG5cdC8qKlxuXHQgKiBQcm94eSBhbiBldmVudCB0byBob29rZWQgZXZlbnQgaGFuZGxlcnNcblx0ICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuUHJlYWN0RXZlbnR9IGUgVGhlIGV2ZW50IG9iamVjdCBmcm9tIHRoZSBicm93c2VyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRyZXR1cm4gZnVuY3Rpb24gKGUpIHtcblx0XHRpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG5cdFx0XHRjb25zdCBldmVudEhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgdXNlQ2FwdHVyZV07XG5cdFx0XHRpZiAoZVtFVkVOVF9ESVNQQVRDSEVEXSA9PSBOVUxMKSB7XG5cdFx0XHRcdGVbRVZFTlRfRElTUEFUQ0hFRF0gPSBldmVudENsb2NrKys7XG5cblx0XHRcdFx0Ly8gV2hlbiBgZVtFVkVOVF9ESVNQQVRDSEVEXWAgaXMgc21hbGxlciB0aGFuIHRoZSB0aW1lIHdoZW4gdGhlIHRhcmdldGVkIGV2ZW50XG5cdFx0XHRcdC8vIGhhbmRsZXIgd2FzIGF0dGFjaGVkIHdlIGtub3cgd2UgaGF2ZSBidWJibGVkIHVwIHRvIGFuIGVsZW1lbnQgdGhhdCB3YXMgYWRkZWRcblx0XHRcdFx0Ly8gZHVyaW5nIHBhdGNoaW5nIHRoZSBET00uXG5cdFx0XHR9IGVsc2UgaWYgKGVbRVZFTlRfRElTUEFUQ0hFRF0gPCBldmVudEhhbmRsZXJbRVZFTlRfQVRUQUNIRURdKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBldmVudEhhbmRsZXIob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcblx0XHR9XG5cdH07XG59XG5cbmNvbnN0IGV2ZW50UHJveHkgPSBjcmVhdGVFdmVudFByb3h5KGZhbHNlKTtcbmNvbnN0IGV2ZW50UHJveHlDYXB0dXJlID0gY3JlYXRlRXZlbnRQcm94eSh0cnVlKTtcbiIsICJpbXBvcnQgeyBlbnF1ZXVlUmVuZGVyIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgTlVMTCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGxldCBpID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG5cdGZ1bmN0aW9uIENvbnRleHQocHJvcHMpIHtcblx0XHRpZiAoIXRoaXMuZ2V0Q2hpbGRDb250ZXh0KSB7XG5cdFx0XHQvKiogQHR5cGUge1NldDxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnQ+IHwgbnVsbH0gKi9cblx0XHRcdGxldCBzdWJzID0gbmV3IFNldCgpO1xuXHRcdFx0bGV0IGN0eCA9IHt9O1xuXHRcdFx0Y3R4W0NvbnRleHQuX2lkXSA9IHRoaXM7XG5cblx0XHRcdHRoaXMuZ2V0Q2hpbGRDb250ZXh0ID0gKCkgPT4gY3R4O1xuXG5cdFx0XHR0aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuXHRcdFx0XHRzdWJzID0gTlVMTDtcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKF9wcm9wcykge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIGV2ZW5cblx0XHRcdFx0aWYgKHRoaXMucHJvcHMudmFsdWUgIT0gX3Byb3BzLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3Vicy5mb3JFYWNoKGMgPT4ge1xuXHRcdFx0XHRcdFx0Yy5fZm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5zdWIgPSBjID0+IHtcblx0XHRcdFx0c3Vicy5hZGQoYyk7XG5cdFx0XHRcdGxldCBvbGQgPSBjLmNvbXBvbmVudFdpbGxVbm1vdW50O1xuXHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChzdWJzKSB7XG5cdFx0XHRcdFx0XHRzdWJzLmRlbGV0ZShjKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9sZCkgb2xkLmNhbGwoYyk7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wcy5jaGlsZHJlbjtcblx0fVxuXG5cdENvbnRleHQuX2lkID0gJ19fY0MnICsgaSsrO1xuXHRDb250ZXh0Ll9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5GdW5jdGlvbkNvbXBvbmVudH0gKi9cblx0Q29udGV4dC5Db25zdW1lciA9IChwcm9wcywgY29udGV4dFZhbHVlKSA9PiB7XG5cdFx0cmV0dXJuIHByb3BzLmNoaWxkcmVuKGNvbnRleHRWYWx1ZSk7XG5cdH07XG5cblx0Ly8gd2UgY291bGQgYWxzbyBnZXQgcmlkIG9mIF9jb250ZXh0UmVmIGVudGlyZWx5XG5cdENvbnRleHQuUHJvdmlkZXIgPVxuXHRcdENvbnRleHQuX2NvbnRleHRSZWYgPVxuXHRcdENvbnRleHQuQ29uc3VtZXIuY29udGV4dFR5cGUgPVxuXHRcdFx0Q29udGV4dDtcblxuXHRyZXR1cm4gQ29udGV4dDtcbn1cbiIsICJpbXBvcnQgeyBkaWZmLCB1bm1vdW50LCBhcHBseVJlZiB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgY3JlYXRlVk5vZGUsIEZyYWdtZW50IH0gZnJvbSAnLi4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IHtcblx0RU1QVFlfT0JKLFxuXHRFTVBUWV9BUlIsXG5cdElOU0VSVF9WTk9ERSxcblx0TUFUQ0hFRCxcblx0VU5ERUZJTkVELFxuXHROVUxMXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnZXREb21TaWJsaW5nIH0gZnJvbSAnLi4vY29tcG9uZW50JztcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkcmVufSBDb21wb25lbnRDaGlsZHJlblxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5Db21wb25lbnR9IENvbXBvbmVudFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBQcmVhY3RFbGVtZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBWTm9kZVxuICovXG5cbi8qKlxuICogRGlmZiB0aGUgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB3aG9zZSBjaGlsZHJlbiBhcmUgYmVpbmdcbiAqIGRpZmZlZFxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbltdfSByZW5kZXJSZXN1bHRcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1BhcmVudFZOb2RlIFRoZSBuZXcgdmlydHVhbCBub2RlIHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZVxuICogZGlmZidlZCBhZ2FpbnN0IG9sZFBhcmVudFZOb2RlXG4gKiBAcGFyYW0ge1ZOb2RlfSBvbGRQYXJlbnRWTm9kZSBUaGUgb2xkIHZpcnR1YWwgbm9kZSB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmVcbiAqIGRpZmYnZWQgYWdhaW5zdCBuZXdQYXJlbnRWTm9kZVxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbENvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3QgLSBtb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIEN1cnJlbnQgbmFtZXNwYWNlIG9mIHRoZSBET00gbm9kZSAoSFRNTCwgU1ZHLCBvciBNYXRoTUwpXG4gKiBAcGFyYW0ge0FycmF5PFByZWFjdEVsZW1lbnQ+fSBleGNlc3NEb21DaGlsZHJlblxuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnQ+fSBjb21taXRRdWV1ZSBMaXN0IG9mIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBjYWxsYmFja3NcbiAqIHRvIGludm9rZSBpbiBjb21taXRSb290XG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IG9sZERvbSBUaGUgY3VycmVudCBhdHRhY2hlZCBET00gZWxlbWVudCBhbnkgbmV3IGRvbVxuICogZWxlbWVudHMgc2hvdWxkIGJlIHBsYWNlZCBhcm91bmQuIExpa2VseSBgbnVsbGAgb24gZmlyc3QgcmVuZGVyIChleGNlcHQgd2hlblxuICogaHlkcmF0aW5nKS4gQ2FuIGJlIGEgc2libGluZyBET00gZWxlbWVudCB3aGVuIGRpZmZpbmcgRnJhZ21lbnRzIHRoYXQgaGF2ZVxuICogc2libGluZ3MuIEluIG1vc3QgY2FzZXMsIGl0IHN0YXJ0cyBvdXQgYXMgYG9sZENoaWxkcmVuWzBdLl9kb21gLlxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGlsZHJlbihcblx0cGFyZW50RG9tLFxuXHRyZW5kZXJSZXN1bHQsXG5cdG5ld1BhcmVudFZOb2RlLFxuXHRvbGRQYXJlbnRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0bmFtZXNwYWNlLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdG9sZERvbSxcblx0aXNIeWRyYXRpbmcsXG5cdHJlZlF1ZXVlXG4pIHtcblx0bGV0IGksXG5cdFx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0XHRvbGRWTm9kZSxcblx0XHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRcdGNoaWxkVk5vZGUsXG5cdFx0LyoqIEB0eXBlIHtQcmVhY3RFbGVtZW50fSAqL1xuXHRcdG5ld0RvbSxcblx0XHQvKiogQHR5cGUge1ByZWFjdEVsZW1lbnR9ICovXG5cdFx0Zmlyc3RDaGlsZERvbTtcblxuXHQvLyBUaGlzIGlzIGEgY29tcHJlc3Npb24gb2Ygb2xkUGFyZW50Vk5vZGUhPW51bGwgJiYgb2xkUGFyZW50Vk5vZGUgIT0gRU1QVFlfT0JKICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbiB8fCBFTVBUWV9BUlJcblx0Ly8gYXMgRU1QVFlfT0JKLl9jaGlsZHJlbiBzaG91bGQgYmUgYHVuZGVmaW5lZGAuXG5cdC8qKiBAdHlwZSB7Vk5vZGVbXX0gKi9cblx0bGV0IG9sZENoaWxkcmVuID0gKG9sZFBhcmVudFZOb2RlICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbikgfHwgRU1QVFlfQVJSO1xuXG5cdGxldCBuZXdDaGlsZHJlbkxlbmd0aCA9IHJlbmRlclJlc3VsdC5sZW5ndGg7XG5cblx0b2xkRG9tID0gY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheShcblx0XHRuZXdQYXJlbnRWTm9kZSxcblx0XHRyZW5kZXJSZXN1bHQsXG5cdFx0b2xkQ2hpbGRyZW4sXG5cdFx0b2xkRG9tLFxuXHRcdG5ld0NoaWxkcmVuTGVuZ3RoXG5cdCk7XG5cblx0Zm9yIChpID0gMDsgaSA8IG5ld0NoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldO1xuXHRcdGlmIChjaGlsZFZOb2RlID09IE5VTEwpIGNvbnRpbnVlO1xuXG5cdFx0Ly8gQXQgdGhpcyBwb2ludCwgY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheSBoYXMgYXNzaWduZWQgX2luZGV4IHRvIGJlIHRoZVxuXHRcdC8vIG1hdGNoaW5nSW5kZXggZm9yIHRoaXMgVk5vZGUncyBvbGRWTm9kZSAob3IgLTEgaWYgdGhlcmUgaXMgbm8gb2xkVk5vZGUpLlxuXHRcdG9sZFZOb2RlID1cblx0XHRcdChjaGlsZFZOb2RlLl9pbmRleCAhPSAtMSAmJiBvbGRDaGlsZHJlbltjaGlsZFZOb2RlLl9pbmRleF0pIHx8IEVNUFRZX09CSjtcblxuXHRcdC8vIFVwZGF0ZSBjaGlsZFZOb2RlLl9pbmRleCB0byBpdHMgZmluYWwgaW5kZXhcblx0XHRjaGlsZFZOb2RlLl9pbmRleCA9IGk7XG5cblx0XHQvLyBNb3JwaCB0aGUgb2xkIGVsZW1lbnQgaW50byB0aGUgbmV3IG9uZSwgYnV0IGRvbid0IGFwcGVuZCBpdCB0byB0aGUgZG9tIHlldFxuXHRcdGxldCByZXN1bHQgPSBkaWZmKFxuXHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Z2xvYmFsQ29udGV4dCxcblx0XHRcdG5hbWVzcGFjZSxcblx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20sXG5cdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblxuXHRcdC8vIEFkanVzdCBET00gbm9kZXNcblx0XHRuZXdEb20gPSBjaGlsZFZOb2RlLl9kb207XG5cdFx0aWYgKGNoaWxkVk5vZGUucmVmICYmIG9sZFZOb2RlLnJlZiAhPSBjaGlsZFZOb2RlLnJlZikge1xuXHRcdFx0aWYgKG9sZFZOb2RlLnJlZikge1xuXHRcdFx0XHRhcHBseVJlZihvbGRWTm9kZS5yZWYsIE5VTEwsIGNoaWxkVk5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cmVmUXVldWUucHVzaChcblx0XHRcdFx0Y2hpbGRWTm9kZS5yZWYsXG5cdFx0XHRcdGNoaWxkVk5vZGUuX2NvbXBvbmVudCB8fCBuZXdEb20sXG5cdFx0XHRcdGNoaWxkVk5vZGVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGZpcnN0Q2hpbGREb20gPT0gTlVMTCAmJiBuZXdEb20gIT0gTlVMTCkge1xuXHRcdFx0Zmlyc3RDaGlsZERvbSA9IG5ld0RvbTtcblx0XHR9XG5cblx0XHRsZXQgc2hvdWxkUGxhY2UgPSAhIShjaGlsZFZOb2RlLl9mbGFncyAmIElOU0VSVF9WTk9ERSk7XG5cdFx0aWYgKHNob3VsZFBsYWNlIHx8IG9sZFZOb2RlLl9jaGlsZHJlbiA9PT0gY2hpbGRWTm9kZS5fY2hpbGRyZW4pIHtcblx0XHRcdG9sZERvbSA9IGluc2VydChjaGlsZFZOb2RlLCBvbGREb20sIHBhcmVudERvbSwgc2hvdWxkUGxhY2UpO1xuXG5cdFx0XHQvLyBXaGVuIGEgbWF0Y2hlZCBWTm9kZSBpcyBwaHlzaWNhbGx5IG1vdmVkIHZpYSBJTlNFUlRfVk5PREUsIGl0cyBvbGRcblx0XHRcdC8vIF9kb20gcG9pbnRlciBiZWNvbWVzIGEgc3RhbGUgcG9zaXRpb25hbCByZWZlcmVuY2UuIENsZWFyIGl0IHNvIHRoYXRcblx0XHRcdC8vIGdldERvbVNpYmxpbmcgKGNhbGxlZCBmcm9tIG5lc3RlZCBkaWZmcykgd29uJ3QgcmV0dXJuIHRoaXMgc3RhbGVcblx0XHRcdC8vIHJlZmVyZW5jZSBhbmQgbWlzLXBsYWNlIHN1YnNlcXVlbnQgRE9NIG5vZGVzLiBTZWUgIzUwNjUuXG5cdFx0XHRpZiAoc2hvdWxkUGxhY2UgJiYgb2xkVk5vZGUuX2RvbSkge1xuXHRcdFx0XHRvbGRWTm9kZS5fZG9tID0gTlVMTDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyAmJiByZXN1bHQgIT09IFVOREVGSU5FRCkge1xuXHRcdFx0b2xkRG9tID0gcmVzdWx0O1xuXHRcdH0gZWxzZSBpZiAobmV3RG9tKSB7XG5cdFx0XHRvbGREb20gPSBuZXdEb20ubmV4dFNpYmxpbmc7XG5cdFx0fVxuXG5cdFx0Ly8gVW5zZXQgZGlmZmluZyBmbGFnc1xuXHRcdGNoaWxkVk5vZGUuX2ZsYWdzICY9IH4oSU5TRVJUX1ZOT0RFIHwgTUFUQ0hFRCk7XG5cdH1cblxuXHRuZXdQYXJlbnRWTm9kZS5fZG9tID0gZmlyc3RDaGlsZERvbTtcblxuXHRyZXR1cm4gb2xkRG9tO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1BhcmVudFZOb2RlXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkcmVuW119IHJlbmRlclJlc3VsdFxuICogQHBhcmFtIHtWTm9kZVtdfSBvbGRDaGlsZHJlblxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5KFxuXHRuZXdQYXJlbnRWTm9kZSxcblx0cmVuZGVyUmVzdWx0LFxuXHRvbGRDaGlsZHJlbixcblx0b2xkRG9tLFxuXHRuZXdDaGlsZHJlbkxlbmd0aFxuKSB7XG5cdC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuXHRsZXQgaTtcblx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0bGV0IGNoaWxkVk5vZGU7XG5cdC8qKiBAdHlwZSB7Vk5vZGV9ICovXG5cdGxldCBvbGRWTm9kZTtcblxuXHRsZXQgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGgsXG5cdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbkxlbmd0aDtcblxuXHRsZXQgc2tldyA9IDA7XG5cblx0bmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuID0gbmV3IEFycmF5KG5ld0NoaWxkcmVuTGVuZ3RoKTtcblx0Zm9yIChpID0gMDsgaSA8IG5ld0NoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGFyZSByZXVzaW5nIHRoZSBjaGlsZFZOb2RlIHZhcmlhYmxlIHRvIGhvbGQgYm90aCB0aGVcblx0XHQvLyBwcmUgYW5kIHBvc3Qgbm9ybWFsaXplZCBjaGlsZFZOb2RlXG5cdFx0Y2hpbGRWTm9kZSA9IHJlbmRlclJlc3VsdFtpXTtcblxuXHRcdGlmIChcblx0XHRcdGNoaWxkVk5vZGUgPT0gTlVMTCB8fFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2Jvb2xlYW4nIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnZnVuY3Rpb24nXG5cdFx0KSB7XG5cdFx0XHRuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBOVUxMO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdC8vIElmIHRoaXMgbmV3Vk5vZGUgaXMgYmVpbmcgcmV1c2VkIChlLmcuIDxkaXY+e3JldXNlfXtyZXVzZX08L2Rpdj4pIGluIHRoZSBzYW1lIGRpZmYsXG5cdFx0Ly8gb3Igd2UgYXJlIHJlbmRlcmluZyBhIGNvbXBvbmVudCAoZS5nLiBzZXRTdGF0ZSkgY29weSB0aGUgb2xkVk5vZGVzIHNvIGl0IGNhbiBoYXZlXG5cdFx0Ly8gaXQncyBvd24gRE9NICYgZXRjLiBwb2ludGVyc1xuXHRcdGVsc2UgaWYgKFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ3N0cmluZycgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdudW1iZXInIHx8XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdmFsaWQtdHlwZW9mXG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYmlnaW50JyB8fFxuXHRcdFx0Y2hpbGRWTm9kZS5jb25zdHJ1Y3RvciA9PSBTdHJpbmdcblx0XHQpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRWTm9kZSkpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0RnJhZ21lbnQsXG5cdFx0XHRcdHsgY2hpbGRyZW46IGNoaWxkVk5vZGUgfSxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGNoaWxkVk5vZGUuY29uc3RydWN0b3IgPT09IFVOREVGSU5FRCAmJiBjaGlsZFZOb2RlLl9kZXB0aCA+IDApIHtcblx0XHRcdC8vIFZOb2RlIGlzIGFscmVhZHkgaW4gdXNlLCBjbG9uZSBpdC4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBmb2xsb3dpbmdcblx0XHRcdC8vIHNjZW5hcmlvOlxuXHRcdFx0Ly8gICBjb25zdCByZXVzZSA9IDxkaXYgLz5cblx0XHRcdC8vICAgPGRpdj57cmV1c2V9PHNwYW4gLz57cmV1c2V9PC9kaXY+XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdGNoaWxkVk5vZGUudHlwZSxcblx0XHRcdFx0Y2hpbGRWTm9kZS5wcm9wcyxcblx0XHRcdFx0Y2hpbGRWTm9kZS5rZXksXG5cdFx0XHRcdGNoaWxkVk5vZGUucmVmID8gY2hpbGRWTm9kZS5yZWYgOiBOVUxMLFxuXHRcdFx0XHRjaGlsZFZOb2RlLl9vcmlnaW5hbFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY2hpbGRWTm9kZTtcblx0XHR9XG5cblx0XHRjb25zdCBza2V3ZWRJbmRleCA9IGkgKyBza2V3O1xuXHRcdGNoaWxkVk5vZGUuX3BhcmVudCA9IG5ld1BhcmVudFZOb2RlO1xuXHRcdGNoaWxkVk5vZGUuX2RlcHRoID0gbmV3UGFyZW50Vk5vZGUuX2RlcHRoICsgMTtcblxuXHRcdC8vIFRlbXBvcmFyaWx5IHN0b3JlIHRoZSBtYXRjaGluZ0luZGV4IG9uIHRoZSBfaW5kZXggcHJvcGVydHkgc28gd2UgY2FuIHB1bGxcblx0XHQvLyBvdXQgdGhlIG9sZFZOb2RlIGluIGRpZmZDaGlsZHJlbi4gV2UnbGwgb3ZlcnJpZGUgdGhpcyB0byB0aGUgVk5vZGUnc1xuXHRcdC8vIGZpbmFsIGluZGV4IGFmdGVyIHVzaW5nIHRoaXMgcHJvcGVydHkgdG8gZ2V0IHRoZSBvbGRWTm9kZVxuXHRcdGNvbnN0IG1hdGNoaW5nSW5kZXggPSAoY2hpbGRWTm9kZS5faW5kZXggPSBmaW5kTWF0Y2hpbmdJbmRleChcblx0XHRcdGNoaWxkVk5vZGUsXG5cdFx0XHRvbGRDaGlsZHJlbixcblx0XHRcdHNrZXdlZEluZGV4LFxuXHRcdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW5cblx0XHQpKTtcblxuXHRcdG9sZFZOb2RlID0gTlVMTDtcblx0XHRpZiAobWF0Y2hpbmdJbmRleCAhPSAtMSkge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlblttYXRjaGluZ0luZGV4XTtcblx0XHRcdHJlbWFpbmluZ09sZENoaWxkcmVuLS07XG5cdFx0XHRpZiAob2xkVk5vZGUpIHtcblx0XHRcdFx0b2xkVk5vZGUuX2ZsYWdzIHw9IE1BVENIRUQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSGVyZSwgd2UgZGVmaW5lIGlzTW91bnRpbmcgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgc2tldyBkaWZmaW5nXG5cdFx0Ly8gYWxnb3JpdGhtLiBOb2RlcyB0aGF0IGFyZSB1bnN1c3BlbmRpbmcgYXJlIGNvbnNpZGVyZWQgbW91bnRpbmcgYW5kIHdlIGRldGVjdFxuXHRcdC8vIHRoaXMgYnkgY2hlY2tpbmcgaWYgb2xkVk5vZGUuX29yaWdpbmFsID09IG51bGxcblx0XHRjb25zdCBpc01vdW50aW5nID0gb2xkVk5vZGUgPT0gTlVMTCB8fCBvbGRWTm9kZS5fb3JpZ2luYWwgPT0gTlVMTDtcblxuXHRcdGlmIChpc01vdW50aW5nKSB7XG5cdFx0XHRpZiAobWF0Y2hpbmdJbmRleCA9PSAtMSkge1xuXHRcdFx0XHQvLyBXaGVuIHRoZSBhcnJheSBvZiBjaGlsZHJlbiBpcyBncm93aW5nIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIHNrZXdcblx0XHRcdFx0Ly8gYXMgd2UgYXJlIGFkZGluZyBhIG5ldyBlbGVtZW50IHRvIHRoZSBhcnJheS5cblx0XHRcdFx0Ly8gRXhhbXBsZTpcblx0XHRcdFx0Ly8gWzEsIDIsIDNdIC0tPiBbMCwgMSwgMiwgM11cblx0XHRcdFx0Ly8gb2xkQ2hpbGRyZW4gICBuZXdDaGlsZHJlblxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBUaGUgbmV3IGVsZW1lbnQgaXMgYXQgaW5kZXggMCwgc28gb3VyIHNrZXcgaXMgMCxcblx0XHRcdFx0Ly8gd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgc2tldyBhcyB3ZSBhcmUgYWRkaW5nIGEgbmV3IGVsZW1lbnQuXG5cdFx0XHRcdC8vIFRoZSBkZWNyZWFzZSB3aWxsIGNhdXNlIHVzIHRvIGNvbXBhcmUgdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24gMVxuXHRcdFx0XHQvLyB3aXRoIHZhbHVlIDEgd2l0aCB0aGUgZWxlbWVudCBhdCBwb3NpdGlvbiAwIHdpdGggdmFsdWUgMC5cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gQSBsaW5lYXIgY29uY2VwdCBpcyBhcHBsaWVkIHdoZW4gdGhlIGFycmF5IGlzIHNocmlua2luZyxcblx0XHRcdFx0Ly8gaWYgdGhlIGxlbmd0aCBpcyB1bmNoYW5nZWQgd2UgY2FuIGFzc3VtZSB0aGF0IG5vIHNrZXdcblx0XHRcdFx0Ly8gY2hhbmdlcyBhcmUgbmVlZGVkLlxuXHRcdFx0XHRpZiAobmV3Q2hpbGRyZW5MZW5ndGggPiBvbGRDaGlsZHJlbkxlbmd0aCkge1xuXHRcdFx0XHRcdHNrZXctLTtcblx0XHRcdFx0fSBlbHNlIGlmIChuZXdDaGlsZHJlbkxlbmd0aCA8IG9sZENoaWxkcmVuTGVuZ3RoKSB7XG5cdFx0XHRcdFx0c2tldysrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHdlIGFyZSBtb3VudGluZyBhIERPTSBWTm9kZSwgbWFyayBpdCBmb3IgaW5zZXJ0aW9uXG5cdFx0XHRpZiAodHlwZW9mIGNoaWxkVk5vZGUudHlwZSAhPSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG1hdGNoaW5nSW5kZXggIT0gc2tld2VkSW5kZXgpIHtcblx0XHRcdC8vIFdoZW4gd2UgbW92ZSBlbGVtZW50cyBhcm91bmQgaS5lLiBbMCwgMSwgMl0gLS0+IFsxLCAwLCAyXVxuXHRcdFx0Ly8gLS0+IHdlIGRpZmYgMSwgd2UgZmluZCBpdCBhdCBwb3NpdGlvbiAxIHdoaWxlIG91ciBza2V3ZWQgaW5kZXggaXMgMCBhbmQgb3VyIHNrZXcgaXMgMFxuXHRcdFx0Ly8gICAgIHdlIHNldCB0aGUgc2tldyB0byAxIGFzIHdlIGZvdW5kIGFuIG9mZnNldC5cblx0XHRcdC8vIC0tPiB3ZSBkaWZmIDAsIHdlIGZpbmQgaXQgYXQgcG9zaXRpb24gMCB3aGlsZSBvdXIgc2tld2VkIGluZGV4IGlzIGF0IDIgYW5kIG91ciBza2V3IGlzIDFcblx0XHRcdC8vICAgICB0aGlzIG1ha2VzIHVzIGluY3JlYXNlIHRoZSBza2V3IGFnYWluLlxuXHRcdFx0Ly8gLS0+IHdlIGRpZmYgMiwgd2UgZmluZCBpdCBhdCBwb3NpdGlvbiAyIHdoaWxlIG91ciBza2V3ZWQgaW5kZXggaXMgYXQgNCBhbmQgb3VyIHNrZXcgaXMgMlxuXHRcdFx0Ly9cblx0XHRcdC8vIHRoaXMgYmVjb21lcyBhbiBvcHRpbWl6YXRpb24gcXVlc3Rpb24gd2hlcmUgY3VycmVudGx5IHdlIHNlZSBhIDEgZWxlbWVudCBvZmZzZXQgYXMgYW4gaW5zZXJ0aW9uXG5cdFx0XHQvLyBvciBkZWxldGlvbiBpLmUuIHdlIG9wdGltaXplIGZvciBbMCwgMSwgMl0gLS0+IFs5LCAwLCAxLCAyXVxuXHRcdFx0Ly8gd2hpbGUgYSBtb3JlIHRoYW4gMSBvZmZzZXQgd2Ugc2VlIGFzIGEgc3dhcC5cblx0XHRcdC8vIFdlIGNvdWxkIHByb2JhYmx5IGJ1aWxkIGhldXJpc3RpY3MgZm9yIGhhdmluZyBhbiBvcHRpbWl6ZWQgY291cnNlIG9mIGFjdGlvbiBoZXJlIGFzIHdlbGwsIGJ1dFxuXHRcdFx0Ly8gbWlnaHQgZ28gYXQgdGhlIGNvc3Qgb2Ygc29tZSBieXRlcy5cblx0XHRcdC8vXG5cdFx0XHQvLyBJZiB3ZSB3YW50ZWQgdG8gb3B0aW1pemUgZm9yIGkuZS4gb25seSBzd2FwcyB3ZSdkIGp1c3QgZG8gdGhlIGxhc3QgdHdvIGNvZGUtYnJhbmNoZXMgYW5kIGhhdmVcblx0XHRcdC8vIG9ubHkgdGhlIGZpcnN0IGl0ZW0gYmUgYSByZS1zY291dGluZyBhbmQgYWxsIHRoZSBvdGhlcnMgZmFsbCBpbiB0aGVpciBza2V3ZWQgY291bnRlci1wYXJ0LlxuXHRcdFx0Ly8gV2UgY291bGQgYWxzbyBmdXJ0aGVyIG9wdGltaXplIGZvciBzd2Fwc1xuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT0gc2tld2VkSW5kZXggLSAxKSB7XG5cdFx0XHRcdHNrZXctLTtcblx0XHRcdH0gZWxzZSBpZiAobWF0Y2hpbmdJbmRleCA9PSBza2V3ZWRJbmRleCArIDEpIHtcblx0XHRcdFx0c2tldysrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPiBza2V3ZWRJbmRleCkge1xuXHRcdFx0XHRcdHNrZXctLTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRza2V3Kys7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNb3ZlIHRoaXMgVk5vZGUncyBET00gaWYgdGhlIG9yaWdpbmFsIGluZGV4IChtYXRjaGluZ0luZGV4KSBkb2Vzbid0XG5cdFx0XHRcdC8vIG1hdGNoIHRoZSBuZXcgc2tldyBpbmRleCAoaSArIG5ldyBza2V3KVxuXHRcdFx0XHQvLyBJbiB0aGUgZm9ybWVyIHR3byBicmFuY2hlcyB3ZSBrbm93IHRoYXQgaXQgbWF0Y2hlcyBhZnRlciBza2V3aW5nXG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgcmVtYWluaW5nIG9sZENoaWxkcmVuIGlmIHRoZXJlIGFyZSBhbnkuIExvb3AgZm9yd2FyZHMgc28gdGhhdCBhcyB3ZVxuXHQvLyB1bm1vdW50IERPTSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9sZENoaWxkcmVuLCB3ZSBjYW4gYWRqdXN0IG9sZERvbSB0b1xuXHQvLyBwb2ludCB0byB0aGUgbmV4dCBjaGlsZCwgd2hpY2ggbmVlZHMgdG8gYmUgdGhlIGZpcnN0IERPTSBub2RlIHRoYXQgd29uJ3QgYmVcblx0Ly8gdW5tb3VudGVkLlxuXHRpZiAocmVtYWluaW5nT2xkQ2hpbGRyZW4pIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcblx0XHRcdGlmIChvbGRWTm9kZSAhPSBOVUxMICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PSAwKSB7XG5cdFx0XHRcdGlmIChvbGRWTm9kZS5fZG9tID09IG9sZERvbSkge1xuXHRcdFx0XHRcdG9sZERvbSA9IGdldERvbVNpYmxpbmcob2xkVk5vZGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dW5tb3VudChvbGRWTm9kZSwgb2xkVk5vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvbGREb207XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gcGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQbGFjZVxuICogQHJldHVybnMge1ByZWFjdEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGluc2VydChwYXJlbnRWTm9kZSwgb2xkRG9tLCBwYXJlbnREb20sIHNob3VsZFBsYWNlKSB7XG5cdC8vIE5vdGU6IFZOb2RlcyBpbiBuZXN0ZWQgc3VzcGVuZGVkIHRyZWVzIG1heSBiZSBtaXNzaW5nIF9jaGlsZHJlbi5cblxuXHRpZiAodHlwZW9mIHBhcmVudFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdGxldCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLl9jaGlsZHJlbjtcblx0XHRmb3IgKGxldCBpID0gMDsgY2hpbGRyZW4gJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoY2hpbGRyZW5baV0pIHtcblx0XHRcdFx0Ly8gSWYgd2UgZW50ZXIgdGhpcyBjb2RlIHBhdGggb24gc0NVIGJhaWxvdXQsIHdoZXJlIHdlIGNvcHlcblx0XHRcdFx0Ly8gb2xkVk5vZGUuX2NoaWxkcmVuIHRvIG5ld1ZOb2RlLl9jaGlsZHJlbiwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG9sZFxuXHRcdFx0XHQvLyBjaGlsZHJlbidzIF9wYXJlbnQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbmV3Vk5vZGUgKHBhcmVudFZOb2RlXG5cdFx0XHRcdC8vIGhlcmUpLlxuXHRcdFx0XHRjaGlsZHJlbltpXS5fcGFyZW50ID0gcGFyZW50Vk5vZGU7XG5cdFx0XHRcdG9sZERvbSA9IGluc2VydChjaGlsZHJlbltpXSwgb2xkRG9tLCBwYXJlbnREb20sIHNob3VsZFBsYWNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2xkRG9tO1xuXHR9IGVsc2UgaWYgKHBhcmVudFZOb2RlLl9kb20gIT0gb2xkRG9tKSB7XG5cdFx0aWYgKHNob3VsZFBsYWNlKSB7XG5cdFx0XHRpZiAob2xkRG9tICYmIHBhcmVudFZOb2RlLnR5cGUgJiYgIW9sZERvbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdG9sZERvbSA9IGdldERvbVNpYmxpbmcocGFyZW50Vk5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cGFyZW50RG9tLmluc2VydEJlZm9yZShwYXJlbnRWTm9kZS5fZG9tLCBvbGREb20gfHwgTlVMTCk7XG5cdFx0fVxuXHRcdG9sZERvbSA9IHBhcmVudFZOb2RlLl9kb207XG5cdH1cblxuXHRkbyB7XG5cdFx0b2xkRG9tID0gb2xkRG9tICYmIG9sZERvbS5uZXh0U2libGluZztcblx0fSB3aGlsZSAob2xkRG9tICE9IE5VTEwgJiYgb2xkRG9tLm5vZGVUeXBlID09IDgpO1xuXG5cdHJldHVybiBvbGREb207XG59XG5cbi8qKlxuICogRmxhdHRlbiBhbmQgbG9vcCB0aHJvdWdoIHRoZSBjaGlsZHJlbiBvZiBhIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbn0gY2hpbGRyZW4gVGhlIHVuZmxhdHRlbmVkIGNoaWxkcmVuIG9mIGEgdmlydHVhbFxuICogbm9kZVxuICogQHJldHVybnMge1ZOb2RlW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NoaWxkQXJyYXkoY2hpbGRyZW4sIG91dCkge1xuXHRvdXQgPSBvdXQgfHwgW107XG5cdGlmIChjaGlsZHJlbiA9PSBOVUxMIHx8IHR5cGVvZiBjaGlsZHJlbiA9PSAnYm9vbGVhbicpIHtcblx0fSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuXHRcdGNoaWxkcmVuLnNvbWUoY2hpbGQgPT4ge1xuXHRcdFx0dG9DaGlsZEFycmF5KGNoaWxkLCBvdXQpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG91dC5wdXNoKGNoaWxkcmVuKTtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IGNoaWxkVk5vZGVcbiAqIEBwYXJhbSB7Vk5vZGVbXX0gb2xkQ2hpbGRyZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBza2V3ZWRJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IHJlbWFpbmluZ09sZENoaWxkcmVuXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdJbmRleChcblx0Y2hpbGRWTm9kZSxcblx0b2xkQ2hpbGRyZW4sXG5cdHNrZXdlZEluZGV4LFxuXHRyZW1haW5pbmdPbGRDaGlsZHJlblxuKSB7XG5cdGNvbnN0IGtleSA9IGNoaWxkVk5vZGUua2V5O1xuXHRjb25zdCB0eXBlID0gY2hpbGRWTm9kZS50eXBlO1xuXHRsZXQgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltza2V3ZWRJbmRleF07XG5cdGNvbnN0IG1hdGNoZWQgPSBvbGRWTm9kZSAhPSBOVUxMICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PSAwO1xuXG5cdC8vIFdlIG9ubHkgbmVlZCB0byBwZXJmb3JtIGEgc2VhcmNoIGlmIHRoZXJlIGFyZSBtb3JlIGNoaWxkcmVuXG5cdC8vIChyZW1haW5pbmdPbGRDaGlsZHJlbikgdG8gc2VhcmNoLiBIb3dldmVyLCBpZiB0aGUgb2xkVk5vZGUgd2UganVzdCBsb29rZWRcblx0Ly8gYXQgc2tld2VkSW5kZXggd2FzIG5vdCBhbHJlYWR5IHVzZWQgaW4gdGhpcyBkaWZmLCB0aGVuIHRoZXJlIG11c3QgYmUgYXRcblx0Ly8gbGVhc3QgMSBvdGhlciAoc28gZ3JlYXRlciB0aGFuIDEpIHJlbWFpbmluZ09sZENoaWxkcmVuIHRvIGF0dGVtcHQgdG8gbWF0Y2hcblx0Ly8gYWdhaW5zdC4gU28gdGhlIGZvbGxvd2luZyBjb25kaXRpb24gY2hlY2tzIHRoYXQgZW5zdXJpbmdcblx0Ly8gcmVtYWluaW5nT2xkQ2hpbGRyZW4gPiAxIGlmIHRoZSBvbGRWTm9kZSBpcyBub3QgYWxyZWFkeSB1c2VkL21hdGNoZWQuIEVsc2Vcblx0Ly8gaWYgdGhlIG9sZFZOb2RlIHdhcyBudWxsIG9yIG1hdGNoZWQsIHRoZW4gdGhlcmUgY291bGQgbmVlZHMgdG8gYmUgYXQgbGVhc3Rcblx0Ly8gMSAoYWthIGByZW1haW5pbmdPbGRDaGlsZHJlbiA+IDBgKSBjaGlsZHJlbiB0byBmaW5kIGFuZCBjb21wYXJlIGFnYWluc3QuXG5cdC8vXG5cdC8vIElmIHRoZXJlIGlzIGFuIHVua2V5ZWQgZnVuY3Rpb25hbCBWTm9kZSwgdGhhdCBpc24ndCBhIGJ1aWx0LWluIGxpa2Ugb3VyIEZyYWdtZW50LFxuXHQvLyB3ZSBzaG91bGQgbm90IHNlYXJjaCBhcyB3ZSByaXNrIHJlLXVzaW5nIHN0YXRlIG9mIGFuIHVucmVsYXRlZCBWTm9kZS4gKHJldmVydGVkIGZvciBub3cpXG5cdGxldCBzaG91bGRTZWFyY2ggPVxuXHRcdC8vICh0eXBlb2YgdHlwZSAhPSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09IEZyYWdtZW50IHx8IGtleSkgJiZcblx0XHRyZW1haW5pbmdPbGRDaGlsZHJlbiA+IChtYXRjaGVkID8gMSA6IDApO1xuXG5cdGlmIChcblx0XHQob2xkVk5vZGUgPT09IE5VTEwgJiYga2V5ID09IG51bGwpIHx8XG5cdFx0KG1hdGNoZWQgJiYga2V5ID09IG9sZFZOb2RlLmtleSAmJiB0eXBlID09IG9sZFZOb2RlLnR5cGUpXG5cdCkge1xuXHRcdHJldHVybiBza2V3ZWRJbmRleDtcblx0fSBlbHNlIGlmIChzaG91bGRTZWFyY2gpIHtcblx0XHRsZXQgeCA9IHNrZXdlZEluZGV4IC0gMTtcblx0XHRsZXQgeSA9IHNrZXdlZEluZGV4ICsgMTtcblx0XHR3aGlsZSAoeCA+PSAwIHx8IHkgPCBvbGRDaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGNoaWxkSW5kZXggPSB4ID49IDAgPyB4LS0gOiB5Kys7XG5cdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2NoaWxkSW5kZXhdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvbGRWTm9kZSAhPSBOVUxMICYmXG5cdFx0XHRcdChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PSAwICYmXG5cdFx0XHRcdGtleSA9PSBvbGRWTm9kZS5rZXkgJiZcblx0XHRcdFx0dHlwZSA9PSBvbGRWTm9kZS50eXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIGNoaWxkSW5kZXg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIC0xO1xufVxuIiwgImltcG9ydCB7XG5cdEVNUFRZX0FSUixcblx0RU1QVFlfT0JKLFxuXHRNQVRIX05BTUVTUEFDRSxcblx0TU9ERV9IWURSQVRFLFxuXHRNT0RFX1NVU1BFTkRFRCxcblx0TlVMTCxcblx0UkVTRVRfTU9ERSxcblx0U1ZHX05BTUVTUEFDRSxcblx0VU5ERUZJTkVELFxuXHRYSFRNTF9OQU1FU1BBQ0Vcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIGdldERvbVNpYmxpbmcgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBkaWZmQ2hpbGRyZW4gfSBmcm9tICcuL2NoaWxkcmVuJztcbmltcG9ydCB7IHNldFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBhc3NpZ24sIGlzQXJyYXksIHJlbW92ZU5vZGUsIHNsaWNlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkcmVufSBDb21wb25lbnRDaGlsZHJlblxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5Db21wb25lbnR9IENvbXBvbmVudFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBQcmVhY3RFbGVtZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBWTm9kZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHthbnl9IFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2ludGVybmFsJykuUmVmPFQ+fSBSZWY8VD5cbiAqL1xuXG4vKipcbiAqIERpZmYgdHdvIHZpcnR1YWwgbm9kZXMgYW5kIGFwcGx5IHByb3BlciBjaGFuZ2VzIHRvIHRoZSBET01cbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBwYXJlbnQgb2YgdGhlIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge1ZOb2RlfSBuZXdWTm9kZSBUaGUgbmV3IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtWTm9kZX0gb2xkVk5vZGUgVGhlIG9sZCB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxDb250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LiBNb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIEN1cnJlbnQgbmFtZXNwYWNlIG9mIHRoZSBET00gbm9kZSAoSFRNTCwgU1ZHLCBvciBNYXRoTUwpXG4gKiBAcGFyYW0ge0FycmF5PFByZWFjdEVsZW1lbnQ+fSBleGNlc3NEb21DaGlsZHJlblxuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnQ+fSBjb21taXRRdWV1ZSBMaXN0IG9mIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBjYWxsYmFja3NcbiAqIHRvIGludm9rZSBpbiBjb21taXRSb290XG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IG9sZERvbSBUaGUgY3VycmVudCBhdHRhY2hlZCBET00gZWxlbWVudCBhbnkgbmV3IGRvbVxuICogZWxlbWVudHMgc2hvdWxkIGJlIHBsYWNlZCBhcm91bmQuIExpa2VseSBgbnVsbGAgb24gZmlyc3QgcmVuZGVyIChleGNlcHQgd2hlblxuICogaHlkcmF0aW5nKS4gQ2FuIGJlIGEgc2libGluZyBET00gZWxlbWVudCB3aGVuIGRpZmZpbmcgRnJhZ21lbnRzIHRoYXQgaGF2ZVxuICogc2libGluZ3MuIEluIG1vc3QgY2FzZXMsIGl0IHN0YXJ0cyBvdXQgYXMgYG9sZENoaWxkcmVuWzBdLl9kb21gLlxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG5cdHBhcmVudERvbSxcblx0bmV3Vk5vZGUsXG5cdG9sZFZOb2RlLFxuXHRnbG9iYWxDb250ZXh0LFxuXHRuYW1lc3BhY2UsXG5cdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRjb21taXRRdWV1ZSxcblx0b2xkRG9tLFxuXHRpc0h5ZHJhdGluZyxcblx0cmVmUXVldWVcbikge1xuXHQvKiogQHR5cGUge2FueX0gKi9cblx0bGV0IHRtcCxcblx0XHRuZXdUeXBlID0gbmV3Vk5vZGUudHlwZTtcblxuXHQvLyBXaGVuIHBhc3NpbmcgdGhyb3VnaCBjcmVhdGVFbGVtZW50IGl0IGFzc2lnbnMgdGhlIG9iamVjdFxuXHQvLyBjb25zdHJ1Y3RvciBhcyB1bmRlZmluZWQuIFRoaXMgdG8gcHJldmVudCBKU09OLWluamVjdGlvbi5cblx0aWYgKG5ld1ZOb2RlLmNvbnN0cnVjdG9yICE9PSBVTkRFRklORUQpIHJldHVybiBOVUxMO1xuXG5cdC8vIElmIHRoZSBwcmV2aW91cyBkaWZmIGJhaWxlZCBvdXQsIHJlc3VtZSBjcmVhdGluZy9oeWRyYXRpbmcuXG5cdGlmIChvbGRWTm9kZS5fZmxhZ3MgJiBNT0RFX1NVU1BFTkRFRCkge1xuXHRcdGlzSHlkcmF0aW5nID0gISEob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFKTtcblx0XHRvbGREb20gPSBuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IFtvbGREb21dO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLl9kaWZmKSkgdG1wKG5ld1ZOb2RlKTtcblxuXHRvdXRlcjogaWYgKHR5cGVvZiBuZXdUeXBlID09ICdmdW5jdGlvbicpIHtcblx0XHRsZXQgb2xkQ29tbWl0UXVldWVMZW5ndGggPSBjb21taXRRdWV1ZS5sZW5ndGg7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBjLCBpc05ldywgb2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCwgY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uO1xuXHRcdFx0bGV0IG5ld1Byb3BzID0gbmV3Vk5vZGUucHJvcHM7XG5cdFx0XHRjb25zdCBpc0NsYXNzQ29tcG9uZW50ID0gbmV3VHlwZS5wcm90b3R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyO1xuXG5cdFx0XHQvLyBOZWNlc3NhcnkgZm9yIGNyZWF0ZUNvbnRleHQgYXBpLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgd2lsbCBwYXNzXG5cdFx0XHQvLyB0aGUgY29udGV4dCB2YWx1ZSBhcyBgdGhpcy5jb250ZXh0YCBqdXN0IGZvciB0aGlzIGNvbXBvbmVudC5cblx0XHRcdHRtcCA9IG5ld1R5cGUuY29udGV4dFR5cGU7XG5cdFx0XHRsZXQgcHJvdmlkZXIgPSB0bXAgJiYgZ2xvYmFsQ29udGV4dFt0bXAuX2lkXTtcblx0XHRcdGxldCBjb21wb25lbnRDb250ZXh0ID0gdG1wXG5cdFx0XHRcdD8gcHJvdmlkZXJcblx0XHRcdFx0XHQ/IHByb3ZpZGVyLnByb3BzLnZhbHVlXG5cdFx0XHRcdFx0OiB0bXAuX2RlZmF1bHRWYWx1ZVxuXHRcdFx0XHQ6IGdsb2JhbENvbnRleHQ7XG5cblx0XHRcdC8vIEdldCBjb21wb25lbnQgYW5kIHNldCBpdCB0byBgY2Bcblx0XHRcdGlmIChvbGRWTm9kZS5fY29tcG9uZW50KSB7XG5cdFx0XHRcdGMgPSBuZXdWTm9kZS5fY29tcG9uZW50ID0gb2xkVk5vZGUuX2NvbXBvbmVudDtcblx0XHRcdFx0Y2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uID0gYy5fcHJvY2Vzc2luZ0V4Y2VwdGlvbiA9IGMuX3BlbmRpbmdFcnJvcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluc3RhbnRpYXRlIHRoZSBuZXcgY29tcG9uZW50XG5cdFx0XHRcdGlmIChpc0NsYXNzQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUaGUgY2hlY2sgYWJvdmUgdmVyaWZpZXMgdGhhdCBuZXdUeXBlIGlzIHN1cHBvc2UgdG8gYmUgY29uc3RydWN0ZWRcblx0XHRcdFx0XHRuZXdWTm9kZS5fY29tcG9uZW50ID0gYyA9IG5ldyBuZXdUeXBlKG5ld1Byb3BzLCBjb21wb25lbnRDb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUcnVzdCBtZSwgQ29tcG9uZW50IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSB3ZSB3YW50XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NvbXBvbmVudCA9IGMgPSBuZXcgQmFzZUNvbXBvbmVudChcblx0XHRcdFx0XHRcdG5ld1Byb3BzLFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50Q29udGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Yy5jb25zdHJ1Y3RvciA9IG5ld1R5cGU7XG5cdFx0XHRcdFx0Yy5yZW5kZXIgPSBkb1JlbmRlcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvdmlkZXIpIHByb3ZpZGVyLnN1YihjKTtcblxuXHRcdFx0XHRpZiAoIWMuc3RhdGUpIGMuc3RhdGUgPSB7fTtcblx0XHRcdFx0Yy5fZ2xvYmFsQ29udGV4dCA9IGdsb2JhbENvbnRleHQ7XG5cdFx0XHRcdGlzTmV3ID0gYy5fZGlydHkgPSB0cnVlO1xuXHRcdFx0XHRjLl9yZW5kZXJDYWxsYmFja3MgPSBbXTtcblx0XHRcdFx0Yy5fc3RhdGVDYWxsYmFja3MgPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW52b2tlIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuXHRcdFx0aWYgKGlzQ2xhc3NDb21wb25lbnQgJiYgYy5fbmV4dFN0YXRlID09IE5VTEwpIHtcblx0XHRcdFx0Yy5fbmV4dFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzQ2xhc3NDb21wb25lbnQgJiYgbmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT0gTlVMTCkge1xuXHRcdFx0XHRpZiAoYy5fbmV4dFN0YXRlID09IGMuc3RhdGUpIHtcblx0XHRcdFx0XHRjLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIGMuX25leHRTdGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhc3NpZ24oXG5cdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5ld1Byb3BzLCBjLl9uZXh0U3RhdGUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdG9sZFByb3BzID0gYy5wcm9wcztcblx0XHRcdG9sZFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdGMuX3Zub2RlID0gbmV3Vk5vZGU7XG5cblx0XHRcdC8vIEludm9rZSBwcmUtcmVuZGVyIGxpZmVjeWNsZSBtZXRob2RzXG5cdFx0XHRpZiAoaXNOZXcpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGlzQ2xhc3NDb21wb25lbnQgJiZcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PSBOVUxMICYmXG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsTW91bnQgIT0gTlVMTFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzQ2xhc3NDb21wb25lbnQgJiYgYy5jb21wb25lbnREaWRNb3VudCAhPSBOVUxMKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goYy5jb21wb25lbnREaWRNb3VudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRpc0NsYXNzQ29tcG9uZW50ICYmXG5cdFx0XHRcdFx0bmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT0gTlVMTCAmJlxuXHRcdFx0XHRcdG5ld1Byb3BzICE9PSBvbGRQcm9wcyAmJlxuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAhPSBOVUxMXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3Vk5vZGUuX29yaWdpbmFsID09IG9sZFZOb2RlLl9vcmlnaW5hbCB8fFxuXHRcdFx0XHRcdCghYy5fZm9yY2UgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9IE5VTEwgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKFxuXHRcdFx0XHRcdFx0XHRuZXdQcm9wcyxcblx0XHRcdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRDb250ZXh0XG5cdFx0XHRcdFx0XHQpID09PSBmYWxzZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gTW9yZSBpbmZvIGFib3V0IHRoaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vSm92aURlQ3Jvb2NrL2JlYzVmMmNlOTM1NDRkMmU2MDcwZWY4ZTAwMzZlNGU4XG5cdFx0XHRcdFx0aWYgKG5ld1ZOb2RlLl9vcmlnaW5hbCAhPSBvbGRWTm9kZS5fb3JpZ2luYWwpIHtcblx0XHRcdFx0XHRcdC8vIFdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhaWwgYmVjYXVzZSBvZiBzQ1Ugd2UgaGF2ZSB0byB1cGRhdGVcblx0XHRcdFx0XHRcdC8vIHRoZSBwcm9wcywgc3RhdGUgYW5kIGRpcnR5LXN0YXRlLlxuXHRcdFx0XHRcdFx0Ly8gd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIHN0cmljdC1lcXVhbGl0eSB3ZSBkb24ndCBhcyB0aGUgY2hpbGQgY291bGQgc3RpbGxcblx0XHRcdFx0XHRcdC8vIGJlIGRpcnRpZWQgc2VlICMzODgzXG5cdFx0XHRcdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHRcdFx0Yy5fZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRcdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuLnNvbWUodm5vZGUgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHZub2RlKSB2bm9kZS5fcGFyZW50ID0gbmV3Vk5vZGU7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRFTVBUWV9BUlIucHVzaC5hcHBseShjLl9yZW5kZXJDYWxsYmFja3MsIGMuX3N0YXRlQ2FsbGJhY2tzKTtcblx0XHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXG5cdFx0XHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWsgb3V0ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnRXaWxsVXBkYXRlICE9IE5VTEwpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIGMuX25leHRTdGF0ZSwgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNDbGFzc0NvbXBvbmVudCAmJiBjLmNvbXBvbmVudERpZFVwZGF0ZSAhPSBOVUxMKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0XHRcdFx0Yy5jb21wb25lbnREaWRVcGRhdGUob2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Yy5jb250ZXh0ID0gY29tcG9uZW50Q29udGV4dDtcblx0XHRcdGMucHJvcHMgPSBuZXdQcm9wcztcblx0XHRcdGMuX3BhcmVudERvbSA9IHBhcmVudERvbTtcblx0XHRcdGMuX2ZvcmNlID0gZmFsc2U7XG5cblx0XHRcdGxldCByZW5kZXJIb29rID0gb3B0aW9ucy5fcmVuZGVyLFxuXHRcdFx0XHRjb3VudCA9IDA7XG5cdFx0XHRpZiAoaXNDbGFzc0NvbXBvbmVudCkge1xuXHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHRjLl9kaXJ0eSA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChyZW5kZXJIb29rKSByZW5kZXJIb29rKG5ld1ZOb2RlKTtcblxuXHRcdFx0XHR0bXAgPSBjLnJlbmRlcihjLnByb3BzLCBjLnN0YXRlLCBjLmNvbnRleHQpO1xuXG5cdFx0XHRcdEVNUFRZX0FSUi5wdXNoLmFwcGx5KGMuX3JlbmRlckNhbGxiYWNrcywgYy5fc3RhdGVDYWxsYmFja3MpO1xuXHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdFx0dG1wID0gYy5yZW5kZXIoYy5wcm9wcywgYy5zdGF0ZSwgYy5jb250ZXh0KTtcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBzZXRTdGF0ZSBjYWxsZWQgaW4gcmVuZGVyLCBzZWUgIzI1NTNcblx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHR9IHdoaWxlIChjLl9kaXJ0eSAmJiArK2NvdW50IDwgMjUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIYW5kbGUgc2V0U3RhdGUgY2FsbGVkIGluIHJlbmRlciwgc2VlICMyNTUzXG5cdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXG5cdFx0XHRpZiAoYy5nZXRDaGlsZENvbnRleHQgIT0gTlVMTCkge1xuXHRcdFx0XHRnbG9iYWxDb250ZXh0ID0gYXNzaWduKGFzc2lnbih7fSwgZ2xvYmFsQ29udGV4dCksIGMuZ2V0Q2hpbGRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNDbGFzc0NvbXBvbmVudCAmJiAhaXNOZXcgJiYgYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPSBOVUxMKSB7XG5cdFx0XHRcdHNuYXBzaG90ID0gYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShvbGRQcm9wcywgb2xkU3RhdGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgcmVuZGVyUmVzdWx0ID1cblx0XHRcdFx0dG1wICE9IE5VTEwgJiYgdG1wLnR5cGUgPT09IEZyYWdtZW50ICYmIHRtcC5rZXkgPT0gTlVMTFxuXHRcdFx0XHRcdD8gY2xvbmVOb2RlKHRtcC5wcm9wcy5jaGlsZHJlbilcblx0XHRcdFx0XHQ6IHRtcDtcblxuXHRcdFx0b2xkRG9tID0gZGlmZkNoaWxkcmVuKFxuXHRcdFx0XHRwYXJlbnREb20sXG5cdFx0XHRcdGlzQXJyYXkocmVuZGVyUmVzdWx0KSA/IHJlbmRlclJlc3VsdCA6IFtyZW5kZXJSZXN1bHRdLFxuXHRcdFx0XHRuZXdWTm9kZSxcblx0XHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRcdG5hbWVzcGFjZSxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0XHRvbGREb20sXG5cdFx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0XHRyZWZRdWV1ZVxuXHRcdFx0KTtcblxuXHRcdFx0Yy5iYXNlID0gbmV3Vk5vZGUuX2RvbTtcblxuXHRcdFx0Ly8gV2Ugc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkIHRoaXMgVk5vZGUsIHVuc2V0IGFueSBzdG9yZWQgaHlkcmF0aW9uL2JhaWxvdXQgc3RhdGU6XG5cdFx0XHRuZXdWTm9kZS5fZmxhZ3MgJj0gUkVTRVRfTU9ERTtcblxuXHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0Y29tbWl0UXVldWUucHVzaChjKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNsZWFyUHJvY2Vzc2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0XHRjLl9wZW5kaW5nRXJyb3IgPSBjLl9wcm9jZXNzaW5nRXhjZXB0aW9uID0gTlVMTDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHQvLyBXZSByZW1vdmUgYW55IGNvbXBvbmVudERpZE1vdW50LCAuLi5cblx0XHRcdC8vIHRoYXQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGJ5IHVzXG5cdFx0XHQvLyBpbnRlcmNlcHRpbmcgdGhlIGVycm9yLlxuXHRcdFx0Y29tbWl0UXVldWUubGVuZ3RoID0gb2xkQ29tbWl0UXVldWVMZW5ndGg7XG5cdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPSBOVUxMO1xuXHRcdFx0Ly8gaWYgaHlkcmF0aW5nIG9yIGNyZWF0aW5nIGluaXRpYWwgdHJlZSwgYmFpbG91dCBwcmVzZXJ2ZXMgRE9NOlxuXHRcdFx0aWYgKGlzSHlkcmF0aW5nIHx8IGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRcdFx0aWYgKGUudGhlbikge1xuXHRcdFx0XHRcdG5ld1ZOb2RlLl9mbGFncyB8PSBpc0h5ZHJhdGluZ1xuXHRcdFx0XHRcdFx0PyBNT0RFX0hZRFJBVEUgfCBNT0RFX1NVU1BFTkRFRFxuXHRcdFx0XHRcdFx0OiBNT0RFX1NVU1BFTkRFRDtcblxuXHRcdFx0XHRcdHdoaWxlIChvbGREb20gJiYgb2xkRG9tLm5vZGVUeXBlID09IDggJiYgb2xkRG9tLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdFx0XHRvbGREb20gPSBvbGREb20ubmV4dFNpYmxpbmc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRcdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuW2V4Y2Vzc0RvbUNoaWxkcmVuLmluZGV4T2Yob2xkRG9tKV0gPSBOVUxMO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkRG9tO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpLS07ICkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlTm9kZShleGNlc3NEb21DaGlsZHJlbltpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1ZOb2RlLl9jaGlsZHJlbiA9PSBOVUxMKSB7XG5cdFx0XHRcdG5ld1ZOb2RlLl9jaGlsZHJlbiA9IG9sZFZOb2RlLl9jaGlsZHJlbiB8fCBbXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFlLnRoZW4pIG1hcmtBc0ZvcmNlKG5ld1ZOb2RlKTtcblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgbmV3Vk5vZGUsIG9sZFZOb2RlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoXG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPT0gTlVMTCAmJlxuXHRcdG5ld1ZOb2RlLl9vcmlnaW5hbCA9PSBvbGRWTm9kZS5fb3JpZ2luYWxcblx0KSB7XG5cdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gb2xkVk5vZGUuX2NoaWxkcmVuO1xuXHRcdG5ld1ZOb2RlLl9kb20gPSBvbGRWTm9kZS5fZG9tO1xuXHR9IGVsc2Uge1xuXHRcdG9sZERvbSA9IG5ld1ZOb2RlLl9kb20gPSBkaWZmRWxlbWVudE5vZGVzKFxuXHRcdFx0b2xkVk5vZGUuX2RvbSxcblx0XHRcdG5ld1ZOb2RlLFxuXHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0bmFtZXNwYWNlLFxuXHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0cmVmUXVldWVcblx0XHQpO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLmRpZmZlZCkpIHRtcChuZXdWTm9kZSk7XG5cblx0cmV0dXJuIG5ld1ZOb2RlLl9mbGFncyAmIE1PREVfU1VTUEVOREVEID8gdW5kZWZpbmVkIDogb2xkRG9tO1xufVxuXG5mdW5jdGlvbiBtYXJrQXNGb3JjZSh2bm9kZSkge1xuXHRpZiAodm5vZGUpIHtcblx0XHRpZiAodm5vZGUuX2NvbXBvbmVudCkgdm5vZGUuX2NvbXBvbmVudC5fZm9yY2UgPSB0cnVlO1xuXHRcdGlmICh2bm9kZS5fY2hpbGRyZW4pIHZub2RlLl9jaGlsZHJlbi5zb21lKG1hcmtBc0ZvcmNlKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzXG4gKiB3aGljaCBoYXZlIGNhbGxiYWNrcyB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtWTm9kZX0gcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0Um9vdChjb21taXRRdWV1ZSwgcm9vdCwgcmVmUXVldWUpIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCByZWZRdWV1ZS5sZW5ndGg7IGkrKykge1xuXHRcdGFwcGx5UmVmKHJlZlF1ZXVlW2ldLCByZWZRdWV1ZVsrK2ldLCByZWZRdWV1ZVsrK2ldKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLl9jb21taXQpIG9wdGlvbnMuX2NvbW1pdChyb290LCBjb21taXRRdWV1ZSk7XG5cblx0Y29tbWl0UXVldWUuc29tZShjID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBSZXVzZSB0aGUgY29tbWl0UXVldWUgdmFyaWFibGUgaGVyZSBzbyB0aGUgdHlwZSBjaGFuZ2VzXG5cdFx0XHRjb21taXRRdWV1ZSA9IGMuX3JlbmRlckNhbGxiYWNrcztcblx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0Y29tbWl0UXVldWUuc29tZShjYiA9PiB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgU2VlIGFib3ZlIGNvbW1lbnQgb24gY29tbWl0UXVldWVcblx0XHRcdFx0Y2IuY2FsbChjKTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgYy5fdm5vZGUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIGNsb25lTm9kZShub2RlKSB7XG5cdGlmICh0eXBlb2Ygbm9kZSAhPSAnb2JqZWN0JyB8fCBub2RlID09IE5VTEwgfHwgbm9kZS5fZGVwdGggPiAwKSB7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH1cblxuXHRpZiAoaXNBcnJheShub2RlKSkge1xuXHRcdHJldHVybiBub2RlLm1hcChjbG9uZU5vZGUpO1xuXHR9XG5cblx0aWYgKG5vZGUuY29uc3RydWN0b3IgIT09IFVOREVGSU5FRCkgcmV0dXJuIG51bGw7XG5cblx0cmV0dXJuIGFzc2lnbih7fSwgbm9kZSk7XG59XG5cbi8qKlxuICogRGlmZiB0d28gdmlydHVhbCBub2RlcyByZXByZXNlbnRpbmcgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gZG9tIFRoZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHZpcnR1YWwgbm9kZXNcbiAqIGJlaW5nIGRpZmZlZFxuICogQHBhcmFtIHtWTm9kZX0gbmV3Vk5vZGUgVGhlIG5ldyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7Vk5vZGV9IG9sZFZOb2RlIFRoZSBvbGQgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSBDdXJyZW50IG5hbWVzcGFjZSBvZiB0aGUgRE9NIG5vZGUgKEhUTUwsIFNWRywgb3IgTWF0aE1MKVxuICogQHBhcmFtIHtBcnJheTxQcmVhY3RFbGVtZW50Pn0gZXhjZXNzRG9tQ2hpbGRyZW5cbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzIHdoaWNoIGhhdmUgY2FsbGJhY2tzXG4gKiB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqIEByZXR1cm5zIHtQcmVhY3RFbGVtZW50fVxuICovXG5mdW5jdGlvbiBkaWZmRWxlbWVudE5vZGVzKFxuXHRkb20sXG5cdG5ld1ZOb2RlLFxuXHRvbGRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0bmFtZXNwYWNlLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdGlzSHlkcmF0aW5nLFxuXHRyZWZRdWV1ZVxuKSB7XG5cdGxldCBvbGRQcm9wcyA9IG9sZFZOb2RlLnByb3BzIHx8IEVNUFRZX09CSjtcblx0bGV0IG5ld1Byb3BzID0gbmV3Vk5vZGUucHJvcHM7XG5cdGxldCBub2RlVHlwZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobmV3Vk5vZGUudHlwZSk7XG5cdC8qKiBAdHlwZSB7YW55fSAqL1xuXHRsZXQgaTtcblx0LyoqIEB0eXBlIHt7IF9faHRtbD86IHN0cmluZyB9fSAqL1xuXHRsZXQgbmV3SHRtbDtcblx0LyoqIEB0eXBlIHt7IF9faHRtbD86IHN0cmluZyB9fSAqL1xuXHRsZXQgb2xkSHRtbDtcblx0LyoqIEB0eXBlIHtDb21wb25lbnRDaGlsZHJlbn0gKi9cblx0bGV0IG5ld0NoaWxkcmVuO1xuXHRsZXQgdmFsdWU7XG5cdGxldCBpbnB1dFZhbHVlO1xuXHRsZXQgY2hlY2tlZDtcblxuXHQvLyBUcmFja3MgZW50ZXJpbmcgYW5kIGV4aXRpbmcgbmFtZXNwYWNlcyB3aGVuIGRlc2NlbmRpbmcgdGhyb3VnaCB0aGUgdHJlZS5cblx0aWYgKG5vZGVUeXBlID09ICdzdmcnKSBuYW1lc3BhY2UgPSBTVkdfTkFNRVNQQUNFO1xuXHRlbHNlIGlmIChub2RlVHlwZSA9PSAnbWF0aCcpIG5hbWVzcGFjZSA9IE1BVEhfTkFNRVNQQUNFO1xuXHRlbHNlIGlmICghbmFtZXNwYWNlKSBuYW1lc3BhY2UgPSBYSFRNTF9OQU1FU1BBQ0U7XG5cblx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlID0gZXhjZXNzRG9tQ2hpbGRyZW5baV07XG5cblx0XHRcdC8vIGlmIG5ld1ZOb2RlIG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiBvciB0aGUgYGRvbWBcblx0XHRcdC8vIGFyZ3VtZW50IG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiwgcmVtb3ZlIGl0IGZyb21cblx0XHRcdC8vIGV4Y2Vzc0RvbUNoaWxkcmVuIHNvIGl0IGlzbid0IGxhdGVyIHJlbW92ZWQgaW4gZGlmZkNoaWxkcmVuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHZhbHVlICYmXG5cdFx0XHRcdCdzZXRBdHRyaWJ1dGUnIGluIHZhbHVlID09ICEhbm9kZVR5cGUgJiZcblx0XHRcdFx0KG5vZGVUeXBlID8gdmFsdWUubG9jYWxOYW1lID09IG5vZGVUeXBlIDogdmFsdWUubm9kZVR5cGUgPT0gMylcblx0XHRcdCkge1xuXHRcdFx0XHRkb20gPSB2YWx1ZTtcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5baV0gPSBOVUxMO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoZG9tID09IE5VTEwpIHtcblx0XHRpZiAobm9kZVR5cGUgPT0gTlVMTCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld1Byb3BzKTtcblx0XHR9XG5cblx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG5cdFx0XHRuYW1lc3BhY2UsXG5cdFx0XHRub2RlVHlwZSxcblx0XHRcdG5ld1Byb3BzLmlzICYmIG5ld1Byb3BzXG5cdFx0KTtcblxuXHRcdC8vIHdlIGFyZSBjcmVhdGluZyBhIG5ldyBub2RlLCBzbyB3ZSBjYW4gYXNzdW1lIHRoaXMgaXMgYSBuZXcgc3VidHJlZSAoaW5cblx0XHQvLyBjYXNlIHdlIGFyZSBoeWRyYXRpbmcpLCB0aGlzIGRlb3B0cyB0aGUgaHlkcmF0ZVxuXHRcdGlmIChpc0h5ZHJhdGluZykge1xuXHRcdFx0aWYgKG9wdGlvbnMuX2h5ZHJhdGlvbk1pc21hdGNoKVxuXHRcdFx0XHRvcHRpb25zLl9oeWRyYXRpb25NaXNtYXRjaChuZXdWTm9kZSwgZXhjZXNzRG9tQ2hpbGRyZW4pO1xuXHRcdFx0aXNIeWRyYXRpbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gd2UgY3JlYXRlZCBhIG5ldyBwYXJlbnQsIHNvIG5vbmUgb2YgdGhlIHByZXZpb3VzbHkgYXR0YWNoZWQgY2hpbGRyZW4gY2FuIGJlIHJldXNlZDpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IE5VTEw7XG5cdH1cblxuXHRpZiAobm9kZVR5cGUgPT0gTlVMTCkge1xuXHRcdC8vIER1cmluZyBoeWRyYXRpb24sIHdlIHN0aWxsIGhhdmUgdG8gc3BsaXQgbWVyZ2VkIHRleHQgZnJvbSBTU1InZCBIVE1MLlxuXHRcdGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgJiYgKCFpc0h5ZHJhdGluZyB8fCBkb20uZGF0YSAhPSBuZXdQcm9wcykpIHtcblx0XHRcdGRvbS5kYXRhID0gbmV3UHJvcHM7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIGV4Y2Vzc0RvbUNoaWxkcmVuIHdhcyBub3QgbnVsbCwgcmVwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQncyBjaGlsZHJlbjpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9XG5cdFx0XHRub2RlVHlwZSA9PSAndGV4dGFyZWEnICYmIG5ld1Byb3BzLmRlZmF1bHRWYWx1ZSAhPSBOVUxMXG5cdFx0XHRcdD8gTlVMTFxuXHRcdFx0XHQ6IGV4Y2Vzc0RvbUNoaWxkcmVuICYmIHNsaWNlLmNhbGwoZG9tLmNoaWxkTm9kZXMpO1xuXG5cdFx0Ly8gSWYgd2UgYXJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBub3QgaHlkcmF0aW5nIGJ1dCBhcmUgdXNpbmdcblx0XHQvLyBleGlzdGluZyBET00gKGUuZy4gcmVwbGFjZU5vZGUpIHdlIHNob3VsZCByZWFkIHRoZSBleGlzdGluZyBET01cblx0XHQvLyBhdHRyaWJ1dGVzIHRvIGRpZmYgdGhlbVxuXHRcdGlmICghaXNIeWRyYXRpbmcgJiYgZXhjZXNzRG9tQ2hpbGRyZW4gIT0gTlVMTCkge1xuXHRcdFx0b2xkUHJvcHMgPSB7fTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YWx1ZSA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuXHRcdFx0XHRvbGRQcm9wc1t2YWx1ZS5uYW1lXSA9IHZhbHVlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSBpbiBvbGRQcm9wcykge1xuXHRcdFx0dmFsdWUgPSBvbGRQcm9wc1tpXTtcblx0XHRcdGlmIChpID09ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcpIHtcblx0XHRcdFx0b2xkSHRtbCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0aSAhPSAnY2hpbGRyZW4nICYmXG5cdFx0XHRcdCEoaSBpbiBuZXdQcm9wcykgJiZcblx0XHRcdFx0IShpID09ICd2YWx1ZScgJiYgJ2RlZmF1bHRWYWx1ZScgaW4gbmV3UHJvcHMpICYmXG5cdFx0XHRcdCEoaSA9PSAnY2hlY2tlZCcgJiYgJ2RlZmF1bHRDaGVja2VkJyBpbiBuZXdQcm9wcylcblx0XHRcdCkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIE5VTEwsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIER1cmluZyBoeWRyYXRpb24sIHByb3BzIGFyZSBub3QgZGlmZmVkIGF0IGFsbCAoaW5jbHVkaW5nIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKVxuXHRcdC8vIEBUT0RPIHdlIHNob3VsZCB3YXJuIGluIGRlYnVnIG1vZGUgd2hlbiBwcm9wcyBkb24ndCBtYXRjaCBoZXJlLlxuXHRcdGZvciAoaSBpbiBuZXdQcm9wcykge1xuXHRcdFx0dmFsdWUgPSBuZXdQcm9wc1tpXTtcblx0XHRcdGlmIChpID09ICdjaGlsZHJlbicpIHtcblx0XHRcdFx0bmV3Q2hpbGRyZW4gPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnKSB7XG5cdFx0XHRcdG5ld0h0bWwgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAndmFsdWUnKSB7XG5cdFx0XHRcdGlucHV0VmFsdWUgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAnY2hlY2tlZCcpIHtcblx0XHRcdFx0Y2hlY2tlZCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KCFpc0h5ZHJhdGluZyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgJiZcblx0XHRcdFx0b2xkUHJvcHNbaV0gIT09IHZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0c2V0UHJvcGVydHkoZG9tLCBpLCB2YWx1ZSwgb2xkUHJvcHNbaV0sIG5hbWVzcGFjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG5ldyB2bm9kZSBkaWRuJ3QgaGF2ZSBkYW5nZXJvdXNseVNldElubmVySFRNTCwgZGlmZiBpdHMgY2hpbGRyZW5cblx0XHRpZiAobmV3SHRtbCkge1xuXHRcdFx0Ly8gQXZvaWQgcmUtYXBwbHlpbmcgdGhlIHNhbWUgJ19faHRtbCcgaWYgaXQgZGlkIG5vdCBjaGFuZ2VkIGJldHdlZW4gcmUtcmVuZGVyXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpc0h5ZHJhdGluZyAmJlxuXHRcdFx0XHQoIW9sZEh0bWwgfHxcblx0XHRcdFx0XHQobmV3SHRtbC5fX2h0bWwgIT0gb2xkSHRtbC5fX2h0bWwgJiYgbmV3SHRtbC5fX2h0bWwgIT0gZG9tLmlubmVySFRNTCkpXG5cdFx0XHQpIHtcblx0XHRcdFx0ZG9tLmlubmVySFRNTCA9IG5ld0h0bWwuX19odG1sO1xuXHRcdFx0fVxuXG5cdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKG9sZEh0bWwpIGRvbS5pbm5lckhUTUwgPSAnJztcblxuXHRcdFx0ZGlmZkNoaWxkcmVuKFxuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yXG5cdFx0XHRcdG5ld1ZOb2RlLnR5cGUgPT0gJ3RlbXBsYXRlJyA/IGRvbS5jb250ZW50IDogZG9tLFxuXHRcdFx0XHRpc0FycmF5KG5ld0NoaWxkcmVuKSA/IG5ld0NoaWxkcmVuIDogW25ld0NoaWxkcmVuXSxcblx0XHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0XHRub2RlVHlwZSA9PSAnZm9yZWlnbk9iamVjdCcgPyBYSFRNTF9OQU1FU1BBQ0UgOiBuYW1lc3BhY2UsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5cblx0XHRcdFx0XHQ/IGV4Y2Vzc0RvbUNoaWxkcmVuWzBdXG5cdFx0XHRcdFx0OiBvbGRWTm9kZS5fY2hpbGRyZW4gJiYgZ2V0RG9tU2libGluZyhvbGRWTm9kZSwgMCksXG5cdFx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0XHRyZWZRdWV1ZVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFueSB2bm9kZS5cblx0XHRcdGlmIChleGNlc3NEb21DaGlsZHJlbiAhPSBOVUxMKSB7XG5cdFx0XHRcdGZvciAoaSA9IGV4Y2Vzc0RvbUNoaWxkcmVuLmxlbmd0aDsgaS0tOyApIHtcblx0XHRcdFx0XHRyZW1vdmVOb2RlKGV4Y2Vzc0RvbUNoaWxkcmVuW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFzIGFib3ZlLCBkb24ndCBkaWZmIHByb3BzIGR1cmluZyBoeWRyYXRpb25cblx0XHRpZiAoIWlzSHlkcmF0aW5nIHx8IG5vZGVUeXBlID09ICd0ZXh0YXJlYScpIHtcblx0XHRcdGkgPSAndmFsdWUnO1xuXHRcdFx0aWYgKG5vZGVUeXBlID09ICdwcm9ncmVzcycgJiYgaW5wdXRWYWx1ZSA9PSBOVUxMKSB7XG5cdFx0XHRcdGRvbS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRpbnB1dFZhbHVlICE9IFVOREVGSU5FRCAmJlxuXHRcdFx0XHQvLyAjMjc1NiBGb3IgdGhlIDxwcm9ncmVzcz4tZWxlbWVudCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyAwLFxuXHRcdFx0XHQvLyBkZXNwaXRlIHRoZSBhdHRyaWJ1dGUgbm90IGJlaW5nIHByZXNlbnQuIFdoZW4gdGhlIGF0dHJpYnV0ZVxuXHRcdFx0XHQvLyBpcyBtaXNzaW5nIHRoZSBwcm9ncmVzcyBiYXIgaXMgdHJlYXRlZCBhcyBpbmRldGVybWluYXRlLlxuXHRcdFx0XHQvLyBUbyBmaXggdGhhdCB3ZSdsbCBhbHdheXMgdXBkYXRlIGl0IHdoZW4gaXQgaXMgMCBmb3IgcHJvZ3Jlc3MgZWxlbWVudHNcblx0XHRcdFx0KGlucHV0VmFsdWUgIT09IGRvbVtpXSB8fFxuXHRcdFx0XHRcdChub2RlVHlwZSA9PSAncHJvZ3Jlc3MnICYmICFpbnB1dFZhbHVlKSB8fFxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgb25seSBmb3IgSUUgMTEgdG8gZml4IDxzZWxlY3Q+IHZhbHVlIG5vdCBiZWluZyB1cGRhdGVkLlxuXHRcdFx0XHRcdC8vIFRvIGF2b2lkIGEgc3RhbGUgc2VsZWN0IHZhbHVlIHdlIG5lZWQgdG8gc2V0IHRoZSBvcHRpb24udmFsdWVcblx0XHRcdFx0XHQvLyBhZ2Fpbiwgd2hpY2ggdHJpZ2dlcnMgSUUxMSB0byByZS1ldmFsdWF0ZSB0aGUgc2VsZWN0IHZhbHVlXG5cdFx0XHRcdFx0KG5vZGVUeXBlID09ICdvcHRpb24nICYmIGlucHV0VmFsdWUgIT0gb2xkUHJvcHNbaV0pKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldFByb3BlcnR5KGRvbSwgaSwgaW5wdXRWYWx1ZSwgb2xkUHJvcHNbaV0sIG5hbWVzcGFjZSk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSAnY2hlY2tlZCc7XG5cdFx0XHRpZiAoY2hlY2tlZCAhPSBVTkRFRklORUQgJiYgY2hlY2tlZCAhPSBkb21baV0pIHtcblx0XHRcdFx0c2V0UHJvcGVydHkoZG9tLCBpLCBjaGVja2VkLCBvbGRQcm9wc1tpXSwgbmFtZXNwYWNlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZG9tO1xufVxuXG4vKipcbiAqIEludm9rZSBvciB1cGRhdGUgYSByZWYsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZnVuY3Rpb24gb3Igb2JqZWN0IHJlZi5cbiAqIEBwYXJhbSB7UmVmPGFueT4gJiB7IF91bm1vdW50PzogdW5rbm93biB9fSByZWZcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVmKHJlZiwgdmFsdWUsIHZub2RlKSB7XG5cdHRyeSB7XG5cdFx0aWYgKHR5cGVvZiByZWYgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0bGV0IGhhc1JlZlVubW91bnQgPSB0eXBlb2YgcmVmLl91bm1vdW50ID09ICdmdW5jdGlvbic7XG5cdFx0XHRpZiAoaGFzUmVmVW5tb3VudCkge1xuXHRcdFx0XHQvLyBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBtb3ZpbmcgbmFycm93aW5nIGNoZWNrcyBpbnRvIHZhcmlhYmxlc1xuXHRcdFx0XHRyZWYuX3VubW91bnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFoYXNSZWZVbm1vdW50IHx8IHZhbHVlICE9IE5VTEwpIHtcblx0XHRcdFx0Ly8gU3RvcmUgdGhlIGNsZWFudXAgZnVuY3Rpb24gb24gdGhlIGZ1bmN0aW9uXG5cdFx0XHRcdC8vIGluc3RhbmNlIG9iamVjdCBpdHNlbGYgdG8gYXZvaWQgc2hhcGVcblx0XHRcdFx0Ly8gdHJhbnNpdGlvbmluZyB2bm9kZVxuXHRcdFx0XHRyZWYuX3VubW91bnQgPSByZWYodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSByZWYuY3VycmVudCA9IHZhbHVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCB2bm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBVbm1vdW50IGEgdmlydHVhbCBub2RlIGZyb20gdGhlIHRyZWUgYW5kIGFwcGx5IERPTSBjaGFuZ2VzXG4gKiBAcGFyYW0ge1ZOb2RlfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHVubW91bnRcbiAqIEBwYXJhbSB7Vk5vZGV9IHBhcmVudFZOb2RlIFRoZSBwYXJlbnQgb2YgdGhlIFZOb2RlIHRoYXQgaW5pdGlhdGVkIHRoZSB1bm1vdW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwUmVtb3ZlXSBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBwYXJlbnQgbm9kZSBvZiB0aGVcbiAqIGN1cnJlbnQgZWxlbWVudCBpcyBhbHJlYWR5IGRldGFjaGVkIGZyb20gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubW91bnQodm5vZGUsIHBhcmVudFZOb2RlLCBza2lwUmVtb3ZlKSB7XG5cdGxldCByO1xuXHRpZiAob3B0aW9ucy51bm1vdW50KSBvcHRpb25zLnVubW91bnQodm5vZGUpO1xuXG5cdGlmICgociA9IHZub2RlLnJlZikpIHtcblx0XHRpZiAoIXIuY3VycmVudCB8fCByLmN1cnJlbnQgPT0gdm5vZGUuX2RvbSkge1xuXHRcdFx0YXBwbHlSZWYociwgTlVMTCwgcGFyZW50Vk5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jb21wb25lbnQpICE9IE5VTEwpIHtcblx0XHRpZiAoci5jb21wb25lbnRXaWxsVW5tb3VudCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHBhcmVudFZOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyLmJhc2UgPSByLl9wYXJlbnREb20gPSByLl9nbG9iYWxDb250ZXh0ID0gTlVMTDtcblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jaGlsZHJlbikpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChyW2ldKSB7XG5cdFx0XHRcdHVubW91bnQoXG5cdFx0XHRcdFx0cltpXSxcblx0XHRcdFx0XHRwYXJlbnRWTm9kZSxcblx0XHRcdFx0XHRza2lwUmVtb3ZlIHx8IHR5cGVvZiB2bm9kZS50eXBlICE9ICdmdW5jdGlvbidcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIXNraXBSZW1vdmUpIHtcblx0XHRyZW1vdmVOb2RlKHZub2RlLl9kb20pO1xuXHR9XG5cblx0dm5vZGUuX2NvbXBvbmVudCA9IHZub2RlLl9wYXJlbnQgPSB2bm9kZS5fZG9tID0gVU5ERUZJTkVEO1xufVxuXG4vKiogVGhlIGAucmVuZGVyKClgIG1ldGhvZCBmb3IgYSBQRkMgYmFja2luZyBpbnN0YW5jZS4gKi9cbmZ1bmN0aW9uIGRvUmVuZGVyKHByb3BzLCBzdGF0ZSwgY29udGV4dCkge1xuXHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgRU1QVFlfT0JKLCBOVUxMIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY29tbWl0Um9vdCwgZGlmZiB9IGZyb20gJy4vZGlmZi9pbmRleCc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCB9IGZyb20gJy4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBSZW5kZXIgYSBQcmVhY3QgdmlydHVhbCBub2RlIGludG8gYSBET00gZWxlbWVudFxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZH0gdm5vZGUgVGhlIHZpcnR1YWwgbm9kZSB0byByZW5kZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuUHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB0byByZW5kZXIgaW50b1xuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50IHwgb2JqZWN0fSBbcmVwbGFjZU5vZGVdIE9wdGlvbmFsOiBBdHRlbXB0IHRvIHJlLXVzZSBhblxuICogZXhpc3RpbmcgRE9NIHRyZWUgcm9vdGVkIGF0IGByZXBsYWNlTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCByZXBsYWNlTm9kZSkge1xuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vcHJlYWN0anMvcHJlYWN0L2lzc3Vlcy8zNzk0XG5cdGlmIChwYXJlbnREb20gPT0gZG9jdW1lbnQpIHtcblx0XHRwYXJlbnREb20gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5fcm9vdCkgb3B0aW9ucy5fcm9vdCh2bm9kZSwgcGFyZW50RG9tKTtcblxuXHQvLyBXZSBhYnVzZSB0aGUgYHJlcGxhY2VOb2RlYCBwYXJhbWV0ZXIgaW4gYGh5ZHJhdGUoKWAgdG8gc2lnbmFsIGlmIHdlIGFyZSBpblxuXHQvLyBoeWRyYXRpb24gbW9kZSBvciBub3QgYnkgcGFzc2luZyB0aGUgYGh5ZHJhdGVgIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBET01cblx0Ly8gZWxlbWVudC4uXG5cdGxldCBpc0h5ZHJhdGluZyA9IHR5cGVvZiByZXBsYWNlTm9kZSA9PSAnZnVuY3Rpb24nO1xuXG5cdC8vIFRvIGJlIGFibGUgdG8gc3VwcG9ydCBjYWxsaW5nIGByZW5kZXIoKWAgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWVcblx0Ly8gRE9NIG5vZGUsIHdlIG5lZWQgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyB0cmVlLiBXZSBkb1xuXHQvLyB0aGlzIGJ5IGFzc2lnbmluZyBhIG5ldyBgX2NoaWxkcmVuYCBwcm9wZXJ0eSB0byBET00gbm9kZXMgd2hpY2ggcG9pbnRzXG5cdC8vIHRvIHRoZSBsYXN0IHJlbmRlcmVkIHRyZWUuIEJ5IGRlZmF1bHQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgd2hpY2hcblx0Ly8gbWVhbnMgdGhhdCB3ZSBhcmUgbW91bnRpbmcgYSBuZXcgdHJlZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBvbGRWTm9kZSA9IGlzSHlkcmF0aW5nXG5cdFx0PyBOVUxMXG5cdFx0OiAocmVwbGFjZU5vZGUgJiYgcmVwbGFjZU5vZGUuX2NoaWxkcmVuKSB8fCBwYXJlbnREb20uX2NoaWxkcmVuO1xuXG5cdHZub2RlID0gKCghaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGUpIHx8IHBhcmVudERvbSkuX2NoaWxkcmVuID1cblx0XHRjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBOVUxMLCBbdm5vZGVdKTtcblxuXHQvLyBMaXN0IG9mIGVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIGNhbGxlZCBhZnRlciBkaWZmaW5nLlxuXHRsZXQgY29tbWl0UXVldWUgPSBbXSxcblx0XHRyZWZRdWV1ZSA9IFtdO1xuXHRkaWZmKFxuXHRcdHBhcmVudERvbSxcblx0XHQvLyBEZXRlcm1pbmUgdGhlIG5ldyB2bm9kZSB0cmVlIGFuZCBzdG9yZSBpdCBvbiB0aGUgRE9NIGVsZW1lbnQgb25cblx0XHQvLyBvdXIgY3VzdG9tIGBfY2hpbGRyZW5gIHByb3BlcnR5LlxuXHRcdHZub2RlLFxuXHRcdG9sZFZOb2RlIHx8IEVNUFRZX09CSixcblx0XHRFTVBUWV9PQkosXG5cdFx0cGFyZW50RG9tLm5hbWVzcGFjZVVSSSxcblx0XHQhaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGVcblx0XHRcdD8gW3JlcGxhY2VOb2RlXVxuXHRcdFx0OiBvbGRWTm9kZVxuXHRcdFx0XHQ/IE5VTExcblx0XHRcdFx0OiBwYXJlbnREb20uZmlyc3RDaGlsZFxuXHRcdFx0XHRcdD8gc2xpY2UuY2FsbChwYXJlbnREb20uY2hpbGROb2Rlcylcblx0XHRcdFx0XHQ6IE5VTEwsXG5cdFx0Y29tbWl0UXVldWUsXG5cdFx0IWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlXG5cdFx0XHQ/IHJlcGxhY2VOb2RlXG5cdFx0XHQ6IG9sZFZOb2RlXG5cdFx0XHRcdD8gb2xkVk5vZGUuX2RvbVxuXHRcdFx0XHQ6IHBhcmVudERvbS5maXJzdENoaWxkLFxuXHRcdGlzSHlkcmF0aW5nLFxuXHRcdHJlZlF1ZXVlXG5cdCk7XG5cblx0Ly8gRmx1c2ggYWxsIHF1ZXVlZCBlZmZlY3RzXG5cdGNvbW1pdFJvb3QoY29tbWl0UXVldWUsIHZub2RlLCByZWZRdWV1ZSk7XG5cblx0Ly8gVGhlIGxpdmUgY2hpbGRyZW4gYXJlIHRyYWNrZWQgb24gX2NoaWxkcmVuIGFmdGVyIGRpZmZpbmcuXG5cdHZub2RlLnByb3BzLmNoaWxkcmVuID0gTlVMTDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgd2l0aCBkYXRhIGZyb20gYSBQcmVhY3QgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHJlbmRlclxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHRvIHVwZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZSh2bm9kZSwgcGFyZW50RG9tKSB7XG5cdHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCBoeWRyYXRlKTtcbn1cbiIsICJpbXBvcnQgeyBhc3NpZ24sIHNsaWNlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlIH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBOVUxMLCBVTkRFRklORUQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBnaXZlbiBWTm9kZSwgb3B0aW9uYWxseSBhZGRpbmcgYXR0cmlidXRlcy9wcm9wcyBhbmQgcmVwbGFjaW5nIGl0c1xuICogY2hpbGRyZW4uXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfSB2bm9kZSBUaGUgdmlydHVhbCBET00gZWxlbWVudCB0byBjbG9uZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIEF0dHJpYnV0ZXMvcHJvcHMgdG8gYWRkIHdoZW4gY2xvbmluZ1xuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZHJlbj59IHJlc3QgQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgdXNlZFxuICogYXMgcmVwbGFjZW1lbnQgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0gYXNzaWduKHt9LCB2bm9kZS5wcm9wcyksXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXG5cdGxldCBkZWZhdWx0UHJvcHM7XG5cblx0aWYgKHZub2RlLnR5cGUgJiYgdm5vZGUudHlwZS5kZWZhdWx0UHJvcHMpIHtcblx0XHRkZWZhdWx0UHJvcHMgPSB2bm9kZS50eXBlLmRlZmF1bHRQcm9wcztcblx0fVxuXG5cdGZvciAoaSBpbiBwcm9wcykge1xuXHRcdGlmIChpID09ICdrZXknKSBrZXkgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChpID09ICdyZWYnKSByZWYgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChwcm9wc1tpXSA9PT0gVU5ERUZJTkVEICYmIGRlZmF1bHRQcm9wcyAhPSBVTkRFRklORUQpIHtcblx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IGRlZmF1bHRQcm9wc1tpXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9ybWFsaXplZFByb3BzW2ldID0gcHJvcHNbaV07XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzLmNoaWxkcmVuID1cblx0XHRcdGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogY2hpbGRyZW47XG5cdH1cblxuXHRyZXR1cm4gY3JlYXRlVk5vZGUoXG5cdFx0dm5vZGUudHlwZSxcblx0XHRub3JtYWxpemVkUHJvcHMsXG5cdFx0a2V5IHx8IHZub2RlLmtleSxcblx0XHRyZWYgfHwgdm5vZGUucmVmLFxuXHRcdE5VTExcblx0KTtcbn1cbiIsICJpbXBvcnQgeyBOVUxMIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBGaW5kIHRoZSBjbG9zZXN0IGVycm9yIGJvdW5kYXJ5IHRvIGEgdGhyb3duIGVycm9yIGFuZCBjYWxsIGl0XG4gKiBAcGFyYW0ge29iamVjdH0gZXJyb3IgVGhlIHRocm93biB2YWx1ZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IHZub2RlIFRoZSB2bm9kZSB0aGF0IHRocmV3IHRoZSBlcnJvciB0aGF0IHdhcyBjYXVnaHQgKGV4Y2VwdFxuICogZm9yIHVubW91bnRpbmcgd2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0aGUgaGlnaGVzdCBwYXJlbnQgdGhhdCB3YXMgYmVpbmdcbiAqIHVubW91bnRlZClcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBbb2xkVk5vZGVdXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5FcnJvckluZm99IFtlcnJvckluZm9dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2hFcnJvcihlcnJvciwgdm5vZGUsIG9sZFZOb2RlLCBlcnJvckluZm8pIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4uL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xuXHRsZXQgY29tcG9uZW50LFxuXHRcdC8qKiBAdHlwZSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudFR5cGV9ICovXG5cdFx0Y3Rvcixcblx0XHQvKiogQHR5cGUge2Jvb2xlYW59ICovXG5cdFx0aGFuZGxlZDtcblxuXHRmb3IgKDsgKHZub2RlID0gdm5vZGUuX3BhcmVudCk7ICkge1xuXHRcdGlmICgoY29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5fcHJvY2Vzc2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y3RvciA9IGNvbXBvbmVudC5jb25zdHJ1Y3RvcjtcblxuXHRcdFx0XHRpZiAoY3RvciAmJiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPSBOVUxMKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50LnNldFN0YXRlKGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKSk7XG5cdFx0XHRcdFx0aGFuZGxlZCA9IGNvbXBvbmVudC5fZGlydHk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29tcG9uZW50LmNvbXBvbmVudERpZENhdGNoICE9IE5VTEwpIHtcblx0XHRcdFx0XHRjb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyB8fCB7fSk7XG5cdFx0XHRcdFx0aGFuZGxlZCA9IGNvbXBvbmVudC5fZGlydHk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaGlzIGlzIGFuIGVycm9yIGJvdW5kYXJ5LiBNYXJrIGl0IGFzIGhhdmluZyBiYWlsZWQgb3V0LCBhbmQgd2hldGhlciBpdCB3YXMgbWlkLWh5ZHJhdGlvbi5cblx0XHRcdFx0aWYgKGhhbmRsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gKGNvbXBvbmVudC5fcGVuZGluZ0Vycm9yID0gY29tcG9uZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRlcnJvciA9IGU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgZXJyb3I7XG59XG4iLCAiaW1wb3J0IHsgb3B0aW9ucyBhcyBfb3B0aW9ucyB9IGZyb20gJ3ByZWFjdCc7XG5cbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IGN1cnJlbnRJbmRleDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9ICovXG5sZXQgY3VycmVudENvbXBvbmVudDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9ICovXG5sZXQgcHJldmlvdXNDb21wb25lbnQ7XG5cbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IGN1cnJlbnRIb29rID0gMDtcblxuLyoqIEB0eXBlIHtBcnJheTxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnQ+fSAqL1xubGV0IGFmdGVyUGFpbnRFZmZlY3RzID0gW107XG5cbi8vIENhc3QgdG8gdXNlIGludGVybmFsIE9wdGlvbnMgdHlwZVxuY29uc3Qgb3B0aW9ucyA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuT3B0aW9uc30gKi8gKF9vcHRpb25zKTtcblxubGV0IG9sZEJlZm9yZURpZmYgPSBvcHRpb25zLl9kaWZmO1xubGV0IG9sZEJlZm9yZVJlbmRlciA9IG9wdGlvbnMuX3JlbmRlcjtcbmxldCBvbGRBZnRlckRpZmYgPSBvcHRpb25zLmRpZmZlZDtcbmxldCBvbGRDb21taXQgPSBvcHRpb25zLl9jb21taXQ7XG5sZXQgb2xkQmVmb3JlVW5tb3VudCA9IG9wdGlvbnMudW5tb3VudDtcbmxldCBvbGRSb290ID0gb3B0aW9ucy5fcm9vdDtcblxuLy8gV2UgdGFrZSB0aGUgbWluaW11bSB0aW1lb3V0IGZvciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZW5zdXJlIHRoYXRcbi8vIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBuZXh0IGZyYW1lLiAzNW1zIGlzIGJhc2VkIG9uIGEgMzBoelxuLy8gcmVmcmVzaCByYXRlLCB3aGljaCBpcyB0aGUgbWluaW11bSByYXRlIGZvciBhIHNtb290aCB1c2VyIGV4cGVyaWVuY2UuXG5jb25zdCBSQUZfVElNRU9VVCA9IDM1O1xubGV0IHByZXZSYWY7XG5cbi8qKiBAdHlwZSB7KHZub2RlOiBpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZSkgPT4gdm9pZH0gKi9cbm9wdGlvbnMuX2RpZmYgPSB2bm9kZSA9PiB7XG5cdGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xuXHRpZiAob2xkQmVmb3JlRGlmZikgb2xkQmVmb3JlRGlmZih2bm9kZSk7XG59O1xuXG5vcHRpb25zLl9yb290ID0gKHZub2RlLCBwYXJlbnREb20pID0+IHtcblx0aWYgKHZub2RlICYmIHBhcmVudERvbS5fY2hpbGRyZW4gJiYgcGFyZW50RG9tLl9jaGlsZHJlbi5fbWFzaykge1xuXHRcdHZub2RlLl9tYXNrID0gcGFyZW50RG9tLl9jaGlsZHJlbi5fbWFzaztcblx0fVxuXG5cdGlmIChvbGRSb290KSBvbGRSb290KHZub2RlLCBwYXJlbnREb20pO1xufTtcblxuLyoqIEB0eXBlIHsodm5vZGU6IGltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlKSA9PiB2b2lkfSAqL1xub3B0aW9ucy5fcmVuZGVyID0gdm5vZGUgPT4ge1xuXHRpZiAob2xkQmVmb3JlUmVuZGVyKSBvbGRCZWZvcmVSZW5kZXIodm5vZGUpO1xuXG5cdGN1cnJlbnRDb21wb25lbnQgPSB2bm9kZS5fY29tcG9uZW50O1xuXHRjdXJyZW50SW5kZXggPSAwO1xuXG5cdGNvbnN0IGhvb2tzID0gY3VycmVudENvbXBvbmVudC5fX2hvb2tzO1xuXHRpZiAoaG9va3MpIHtcblx0XHRpZiAocHJldmlvdXNDb21wb25lbnQgPT09IGN1cnJlbnRDb21wb25lbnQpIHtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdFx0Y3VycmVudENvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzID0gW107XG5cdFx0XHRob29rcy5fbGlzdC5zb21lKGhvb2tJdGVtID0+IHtcblx0XHRcdFx0aWYgKGhvb2tJdGVtLl9uZXh0VmFsdWUpIHtcblx0XHRcdFx0XHRob29rSXRlbS5fdmFsdWUgPSBob29rSXRlbS5fbmV4dFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nQXJncyA9IGhvb2tJdGVtLl9uZXh0VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLnNvbWUoaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMuc29tZShpbnZva2VFZmZlY3QpO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0XHRjdXJyZW50SW5kZXggPSAwO1xuXHRcdH1cblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQ7XG59O1xuXG4vKiogQHR5cGUgeyh2bm9kZTogaW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGUpID0+IHZvaWR9ICovXG5vcHRpb25zLmRpZmZlZCA9IHZub2RlID0+IHtcblx0aWYgKG9sZEFmdGVyRGlmZikgb2xkQWZ0ZXJEaWZmKHZub2RlKTtcblxuXHRjb25zdCBjID0gdm5vZGUuX2NvbXBvbmVudDtcblx0aWYgKGMgJiYgYy5fX2hvb2tzKSB7XG5cdFx0aWYgKGMuX19ob29rcy5fcGVuZGluZ0VmZmVjdHMubGVuZ3RoKSBhZnRlclBhaW50KGFmdGVyUGFpbnRFZmZlY3RzLnB1c2goYykpO1xuXHRcdGMuX19ob29rcy5fbGlzdC5zb21lKGhvb2tJdGVtID0+IHtcblx0XHRcdGlmIChob29rSXRlbS5fcGVuZGluZ0FyZ3MpIHtcblx0XHRcdFx0aG9va0l0ZW0uX2FyZ3MgPSBob29rSXRlbS5fcGVuZGluZ0FyZ3M7XG5cdFx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nQXJncyA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xufTtcblxuLy8gVE9ETzogSW1wcm92ZSB0eXBpbmcgb2YgY29tbWl0UXVldWUgcGFyYW1ldGVyXG4vKiogQHR5cGUgeyh2bm9kZTogaW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGUsIGNvbW1pdFF1ZXVlOiBhbnkpID0+IHZvaWR9ICovXG5vcHRpb25zLl9jb21taXQgPSAodm5vZGUsIGNvbW1pdFF1ZXVlKSA9PiB7XG5cdGNvbW1pdFF1ZXVlLnNvbWUoY29tcG9uZW50ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3Muc29tZShpbnZva2VDbGVhbnVwKTtcblx0XHRcdGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzID0gY29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3MuZmlsdGVyKGNiID0+XG5cdFx0XHRcdGNiLl92YWx1ZSA/IGludm9rZUVmZmVjdChjYikgOiB0cnVlXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbW1pdFF1ZXVlLnNvbWUoYyA9PiB7XG5cdFx0XHRcdGlmIChjLl9yZW5kZXJDYWxsYmFja3MpIGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSk7XG5cdFx0XHRjb21taXRRdWV1ZSA9IFtdO1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjb21wb25lbnQuX3Zub2RlKTtcblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvbGRDb21taXQpIG9sZENvbW1pdCh2bm9kZSwgY29tbWl0UXVldWUpO1xufTtcblxuLyoqIEB0eXBlIHsodm5vZGU6IGltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlKSA9PiB2b2lkfSAqL1xub3B0aW9ucy51bm1vdW50ID0gdm5vZGUgPT4ge1xuXHRpZiAob2xkQmVmb3JlVW5tb3VudCkgb2xkQmVmb3JlVW5tb3VudCh2bm9kZSk7XG5cblx0Y29uc3QgYyA9IHZub2RlLl9jb21wb25lbnQ7XG5cdGlmIChjICYmIGMuX19ob29rcykge1xuXHRcdGxldCBoYXNFcnJvcmVkO1xuXHRcdGMuX19ob29rcy5fbGlzdC5zb21lKHMgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aW52b2tlQ2xlYW51cChzKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aGFzRXJyb3JlZCA9IGU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Yy5fX2hvb2tzID0gdW5kZWZpbmVkO1xuXHRcdGlmIChoYXNFcnJvcmVkKSBvcHRpb25zLl9jYXRjaEVycm9yKGhhc0Vycm9yZWQsIGMuX3Zub2RlKTtcblx0fVxufTtcblxuLyoqXG4gKiBHZXQgYSBob29rJ3Mgc3RhdGUgZnJvbSB0aGUgY3VycmVudENvbXBvbmVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaG9vayB0byBnZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIFRoZSBpbmRleCBvZiB0aGUgaG9vayB0byBnZXRcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGdldEhvb2tTdGF0ZShpbmRleCwgdHlwZSkge1xuXHRpZiAob3B0aW9ucy5faG9vaykge1xuXHRcdG9wdGlvbnMuX2hvb2soY3VycmVudENvbXBvbmVudCwgaW5kZXgsIGN1cnJlbnRIb29rIHx8IHR5cGUpO1xuXHR9XG5cdGN1cnJlbnRIb29rID0gMDtcblxuXHQvLyBMYXJnZWx5IGluc3BpcmVkIGJ5OlxuXHQvLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNoYWVsLWtsZWluL2Z1bmN5LmpzL2Jsb2IvZjZiZTczNDY4ZTZlYzQ2YjBmZjVhYTNjYzRjOWJhZjcyYTI5MDI1YS9zcmMvaG9va3MvY29yZV9ob29rcy5tanNcblx0Ly8gKiBodHRwczovL2dpdGh1Yi5jb20vbWljaGFlbC1rbGVpbi9mdW5jeS5qcy9ibG9iLzY1MGJlYWE1OGM0M2MzM2E3NDgyMGEzYzk4YjNjNzA3OWNmMmUzMzMvc3JjL3JlbmRlcmVyLm1qc1xuXHQvLyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgdG8gbG9vayBhdDpcblx0Ly8gKiBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvbW5veDA1cXA4XG5cdGNvbnN0IGhvb2tzID1cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MgfHxcblx0XHQoY3VycmVudENvbXBvbmVudC5fX2hvb2tzID0ge1xuXHRcdFx0X2xpc3Q6IFtdLFxuXHRcdFx0X3BlbmRpbmdFZmZlY3RzOiBbXVxuXHRcdH0pO1xuXG5cdGlmIChpbmRleCA+PSBob29rcy5fbGlzdC5sZW5ndGgpIHtcblx0XHRob29rcy5fbGlzdC5wdXNoKHt9KTtcblx0fVxuXG5cdHJldHVybiBob29rcy5fbGlzdFtpbmRleF07XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHt1bmtub3dufSBTXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkRpc3BhdGNoPGltcG9ydCgnLi9pbmRleCcpLlN0YXRlVXBkYXRlcjxTPj59IFtpbml0aWFsU3RhdGVdXG4gKiBAcmV0dXJucyB7W1MsIChzdGF0ZTogUykgPT4gdm9pZF19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcblx0Y3VycmVudEhvb2sgPSAxO1xuXHRyZXR1cm4gdXNlUmVkdWNlcihpbnZva2VPclJldHVybiwgaW5pdGlhbFN0YXRlKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge3Vua25vd259IFNcbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bn0gQVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5SZWR1Y2VyPFMsIEE+fSByZWR1Y2VyXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkRpc3BhdGNoPGltcG9ydCgnLi9pbmRleCcpLlN0YXRlVXBkYXRlcjxTPj59IGluaXRpYWxTdGF0ZVxuICogQHBhcmFtIHsoaW5pdGlhbFN0YXRlOiBhbnkpID0+IHZvaWR9IFtpbml0XVxuICogQHJldHVybnMge1sgUywgKHN0YXRlOiBTKSA9PiB2b2lkIF19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgaW5pdCkge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlJlZHVjZXJIb29rU3RhdGV9ICovXG5cdGNvbnN0IGhvb2tTdGF0ZSA9IGdldEhvb2tTdGF0ZShjdXJyZW50SW5kZXgrKywgMik7XG5cdGhvb2tTdGF0ZS5fcmVkdWNlciA9IHJlZHVjZXI7XG5cdGlmICghaG9va1N0YXRlLl9jb21wb25lbnQpIHtcblx0XHRob29rU3RhdGUuX3ZhbHVlID0gW1xuXHRcdFx0IWluaXQgPyBpbnZva2VPclJldHVybih1bmRlZmluZWQsIGluaXRpYWxTdGF0ZSkgOiBpbml0KGluaXRpYWxTdGF0ZSksXG5cblx0XHRcdGFjdGlvbiA9PiB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGhvb2tTdGF0ZS5fbmV4dFZhbHVlXG5cdFx0XHRcdFx0PyBob29rU3RhdGUuX25leHRWYWx1ZVswXVxuXHRcdFx0XHRcdDogaG9va1N0YXRlLl92YWx1ZVswXTtcblx0XHRcdFx0Y29uc3QgbmV4dFZhbHVlID0gaG9va1N0YXRlLl9yZWR1Y2VyKGN1cnJlbnRWYWx1ZSwgYWN0aW9uKTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlICE9PSBuZXh0VmFsdWUpIHtcblx0XHRcdFx0XHRob29rU3RhdGUuX25leHRWYWx1ZSA9IFtuZXh0VmFsdWUsIGhvb2tTdGF0ZS5fdmFsdWVbMV1dO1xuXHRcdFx0XHRcdGhvb2tTdGF0ZS5fY29tcG9uZW50LnNldFN0YXRlKHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF07XG5cblx0XHRob29rU3RhdGUuX2NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQ7XG5cblx0XHRpZiAoIWN1cnJlbnRDb21wb25lbnQuX2hhc1NjdUZyb21Ib29rcykge1xuXHRcdFx0Y3VycmVudENvbXBvbmVudC5faGFzU2N1RnJvbUhvb2tzID0gdHJ1ZTtcblx0XHRcdGxldCBwcmV2U2N1ID0gY3VycmVudENvbXBvbmVudC5zaG91bGRDb21wb25lbnRVcGRhdGU7XG5cdFx0XHRjb25zdCBwcmV2Q1dVID0gY3VycmVudENvbXBvbmVudC5jb21wb25lbnRXaWxsVXBkYXRlO1xuXG5cdFx0XHQvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBmb3JjZWQgdXBkYXRlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIHdpbGxcblx0XHRcdC8vIG5vdCBiZSBjYWxsZWQuIEJ1dCB3ZSB1c2UgdGhhdCB0byB1cGRhdGUgdGhlIGhvb2sgdmFsdWVzLCBzbyB3ZVxuXHRcdFx0Ly8gbmVlZCB0byBjYWxsIGl0LlxuXHRcdFx0Y3VycmVudENvbXBvbmVudC5jb21wb25lbnRXaWxsVXBkYXRlID0gZnVuY3Rpb24gKHAsIHMsIGMpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2ZvcmNlKSB7XG5cdFx0XHRcdFx0bGV0IHRtcCA9IHByZXZTY3U7XG5cdFx0XHRcdFx0Ly8gQ2xlYXIgdG8gYXZvaWQgb3RoZXIgc0NVIGhvb2tzIGZyb20gYmVpbmcgY2FsbGVkXG5cdFx0XHRcdFx0cHJldlNjdSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR1cGRhdGVIb29rU3RhdGUocCwgcywgYyk7XG5cdFx0XHRcdFx0cHJldlNjdSA9IHRtcDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwcmV2Q1dVKSBwcmV2Q1dVLmNhbGwodGhpcywgcCwgcywgYyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBUaGlzIFNDVSBoYXMgdGhlIHB1cnBvc2Ugb2YgYmFpbGluZyBvdXQgYWZ0ZXIgcmVwZWF0ZWQgdXBkYXRlc1xuXHRcdFx0Ly8gdG8gc3RhdGVmdWwgaG9va3MuXG5cdFx0XHQvLyB3ZSBzdG9yZSB0aGUgbmV4dCB2YWx1ZSBpbiBfbmV4dFZhbHVlWzBdIGFuZCBrZWVwIGRvaW5nIHRoYXQgZm9yIGFsbFxuXHRcdFx0Ly8gc3RhdGUgc2V0dGVycywgaWYgd2UgaGF2ZSBuZXh0IHN0YXRlcyBhbmRcblx0XHRcdC8vIGFsbCBuZXh0IHN0YXRlcyB3aXRoaW4gYSBjb21wb25lbnQgZW5kIHVwIGJlaW5nIGVxdWFsIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlXG5cdFx0XHQvLyB3ZSBhcmUgc2FmZSB0byBiYWlsIG91dCBmb3IgdGhpcyBzcGVjaWZpYyBjb21wb25lbnQuXG5cdFx0XHQvKipcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50W1wic2hvdWxkQ29tcG9uZW50VXBkYXRlXCJdfVxuXHRcdFx0ICovXG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gV2UgZG9uJ3QgdXNlIFRTIHRvIGRvd250cmFuc3BpbGVcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbm5lci1kZWNsYXJhdGlvbnNcblx0XHRcdGZ1bmN0aW9uIHVwZGF0ZUhvb2tTdGF0ZShwLCBzLCBjKSB7XG5cdFx0XHRcdGlmICghaG9va1N0YXRlLl9jb21wb25lbnQuX19ob29rcykgcmV0dXJuIHRydWU7XG5cblx0XHRcdFx0Ly8gV2UgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGNvbXBvbmVudHMgd2l0aCBhIG5leHRWYWx1ZSBzZXQgdGhhdFxuXHRcdFx0XHQvLyBoYXZlIHZhbHVlcyB0aGF0IGFyZW4ndCBlcXVhbCB0byBvbmUgYW5vdGhlciB0aGlzIHB1c2hlc1xuXHRcdFx0XHQvLyB1cyB0byB1cGRhdGUgZnVydGhlciBkb3duIHRoZSB0cmVlXG5cdFx0XHRcdGxldCB1cGRhdGVkSG9vayA9IGZhbHNlO1xuXHRcdFx0XHRsZXQgc2hvdWxkVXBkYXRlID0gaG9va1N0YXRlLl9jb21wb25lbnQucHJvcHMgIT09IHA7XG5cdFx0XHRcdGhvb2tTdGF0ZS5fY29tcG9uZW50Ll9faG9va3MuX2xpc3Quc29tZShob29rSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGhvb2tJdGVtLl9uZXh0VmFsdWUpIHtcblx0XHRcdFx0XHRcdHVwZGF0ZWRIb29rID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGhvb2tJdGVtLl92YWx1ZVswXTtcblx0XHRcdFx0XHRcdGhvb2tJdGVtLl92YWx1ZSA9IGhvb2tJdGVtLl9uZXh0VmFsdWU7XG5cdFx0XHRcdFx0XHRob29rSXRlbS5fbmV4dFZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSAhPT0gaG9va0l0ZW0uX3ZhbHVlWzBdKSBzaG91bGRVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHByZXZTY3UpIHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBwcmV2U2N1LmNhbGwodGhpcywgcCwgcywgYyk7XG5cdFx0XHRcdFx0cmV0dXJuIHVwZGF0ZWRIb29rID8gcmVzdWx0IHx8IHNob3VsZFVwZGF0ZSA6IHJlc3VsdDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAhdXBkYXRlZEhvb2sgfHwgc2hvdWxkVXBkYXRlO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50Q29tcG9uZW50LnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHVwZGF0ZUhvb2tTdGF0ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaG9va1N0YXRlLl9uZXh0VmFsdWUgfHwgaG9va1N0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdH0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBhcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUVmZmVjdChjYWxsYmFjaywgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gKi9cblx0Y29uc3Qgc3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDMpO1xuXHRpZiAoIW9wdGlvbnMuX3NraXBFZmZlY3RzICYmIGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGNhbGxiYWNrO1xuXHRcdHN0YXRlLl9wZW5kaW5nQXJncyA9IGFyZ3M7XG5cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3R9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gYXJnc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY2FsbGJhY2ssIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA0KTtcblx0aWYgKCFvcHRpb25zLl9za2lwRWZmZWN0cyAmJiBhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fdmFsdWUgPSBjYWxsYmFjaztcblx0XHRzdGF0ZS5fcGVuZGluZ0FyZ3MgPSBhcmdzO1xuXG5cdFx0Y3VycmVudENvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKiBAdHlwZSB7KGluaXRpYWxWYWx1ZTogdW5rbm93bikgPT4gdW5rbm93bn0gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG5cdGN1cnJlbnRIb29rID0gNTtcblx0cmV0dXJuIHVzZU1lbW8oKCkgPT4gKHsgY3VycmVudDogaW5pdGlhbFZhbHVlIH0pLCBbXSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJlZlxuICogQHBhcmFtIHsoKSA9PiBvYmplY3R9IGNyZWF0ZUhhbmRsZVxuICogQHBhcmFtIHt1bmtub3duW119IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZUhhbmRsZSwgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDY7XG5cdHVzZUxheW91dEVmZmVjdChcblx0XHQoKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHJlZiA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHJlZihjcmVhdGVIYW5kbGUoKSk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0cmVmKG51bGwpO1xuXHRcdFx0XHRcdGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSByZXN1bHQoKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZiAocmVmKSB7XG5cdFx0XHRcdHJlZi5jdXJyZW50ID0gY3JlYXRlSGFuZGxlKCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiAocmVmLmN1cnJlbnQgPSBudWxsKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFyZ3MgPT0gbnVsbCA/IGFyZ3MgOiBhcmdzLmNvbmNhdChyZWYpXG5cdCk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHt1bmtub3dufSBUXG4gKiBAcGFyYW0geygpID0+IFR9IGZhY3RvcnlcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBhcmdzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbW8oZmFjdG9yeSwgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLk1lbW9Ib29rU3RhdGU8VD59ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA3KTtcblx0aWYgKGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGZhY3RvcnkoKTtcblx0XHRzdGF0ZS5fYXJncyA9IGFyZ3M7XG5cdFx0c3RhdGUuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gYXJnc1xuICogQHJldHVybnMgeygpID0+IHZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDg7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNhbGxiYWNrLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlByZWFjdENvbnRleHR9IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRleHQoY29udGV4dCkge1xuXHRjb25zdCBwcm92aWRlciA9IGN1cnJlbnRDb21wb25lbnQuY29udGV4dFtjb250ZXh0Ll9pZF07XG5cdC8vIFdlIGNvdWxkIHNraXAgdGhpcyBjYWxsIGhlcmUsIGJ1dCB0aGFuIHdlJ2Qgbm90IGNhbGxcblx0Ly8gYG9wdGlvbnMuX2hvb2tgLiBXZSBuZWVkIHRvIGRvIHRoYXQgaW4gb3JkZXIgdG8gbWFrZVxuXHQvLyB0aGUgZGV2dG9vbHMgYXdhcmUgb2YgdGhpcyBob29rLlxuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbnRleHRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA5KTtcblx0Ly8gVGhlIGRldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3QgdG9cblx0Ly8gYmUgYWJsZSB0byBwdWxsIG9mIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvdmlkZXJcblx0Ly8gaXMgcHJlc2VudCBpbiB0aGUgdHJlZS5cblx0c3RhdGUuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRpZiAoIXByb3ZpZGVyKSByZXR1cm4gY29udGV4dC5fZGVmYXVsdFZhbHVlO1xuXHQvLyBUaGlzIGlzIHByb2JhYmx5IG5vdCBzYWZlIHRvIGNvbnZlcnQgdG8gXCIhXCJcblx0aWYgKHN0YXRlLl92YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3RhdGUuX3ZhbHVlID0gdHJ1ZTtcblx0XHRwcm92aWRlci5zdWIoY3VycmVudENvbXBvbmVudCk7XG5cdH1cblx0cmV0dXJuIHByb3ZpZGVyLnByb3BzLnZhbHVlO1xufVxuXG4vKipcbiAqIERpc3BsYXkgYSBjdXN0b20gbGFiZWwgZm9yIGEgY3VzdG9tIGhvb2sgZm9yIHRoZSBkZXZ0b29scyBwYW5lbFxuICogQHR5cGUgezxUPih2YWx1ZTogVCwgY2I/OiAodmFsdWU6IFQpID0+IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlcikge1xuXHRpZiAob3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKSB7XG5cdFx0b3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKFxuXHRcdFx0Zm9ybWF0dGVyID8gZm9ybWF0dGVyKHZhbHVlKSA6IC8qKiBAdHlwZSB7YW55fSovICh2YWx1ZSlcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHsoZXJyb3I6IHVua25vd24sIGVycm9ySW5mbzogaW1wb3J0KCdwcmVhY3QnKS5FcnJvckluZm8pID0+IHZvaWR9IGNiXG4gKiBAcmV0dXJucyB7W3Vua25vd24sICgpID0+IHZvaWRdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXJyb3JCb3VuZGFyeShjYikge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVycm9yQm91bmRhcnlIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMCk7XG5cdGNvbnN0IGVyclN0YXRlID0gdXNlU3RhdGUoKTtcblx0c3RhdGUuX3ZhbHVlID0gY2I7XG5cdGlmICghY3VycmVudENvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCkge1xuXHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2ggPSAoZXJyLCBlcnJvckluZm8pID0+IHtcblx0XHRcdGlmIChzdGF0ZS5fdmFsdWUpIHN0YXRlLl92YWx1ZShlcnIsIGVycm9ySW5mbyk7XG5cdFx0XHRlcnJTdGF0ZVsxXShlcnIpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIFtcblx0XHRlcnJTdGF0ZVswXSxcblx0XHQoKSA9PiB7XG5cdFx0XHRlcnJTdGF0ZVsxXSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XTtcbn1cblxuLyoqIEB0eXBlIHsoKSA9PiBzdHJpbmd9ICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSWQoKSB7XG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuSWRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMSk7XG5cdGlmICghc3RhdGUuX3ZhbHVlKSB7XG5cdFx0Ly8gR3JhYiBlaXRoZXIgdGhlIHJvb3Qgbm9kZSBvciB0aGUgbmVhcmVzdCBhc3luYyBib3VuZGFyeSBub2RlLlxuXHRcdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9ICovXG5cdFx0bGV0IHJvb3QgPSBjdXJyZW50Q29tcG9uZW50Ll92bm9kZTtcblx0XHR3aGlsZSAocm9vdCAhPT0gbnVsbCAmJiAhcm9vdC5fbWFzayAmJiByb290Ll9wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdHJvb3QgPSByb290Ll9wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0bGV0IG1hc2sgPSByb290Ll9tYXNrIHx8IChyb290Ll9tYXNrID0gWzAsIDBdKTtcblx0XHRzdGF0ZS5fdmFsdWUgPSAnUCcgKyBtYXNrWzBdICsgJy0nICsgbWFza1sxXSsrO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBBZnRlciBwYWludCBlZmZlY3RzIGNvbnN1bWVyLlxuICovXG5mdW5jdGlvbiBmbHVzaEFmdGVyUGFpbnRFZmZlY3RzKCkge1xuXHRsZXQgY29tcG9uZW50O1xuXHR3aGlsZSAoKGNvbXBvbmVudCA9IGFmdGVyUGFpbnRFZmZlY3RzLnNoaWZ0KCkpKSB7XG5cdFx0Y29uc3QgaG9va3MgPSBjb21wb25lbnQuX19ob29rcztcblx0XHRpZiAoIWNvbXBvbmVudC5fcGFyZW50RG9tIHx8ICFob29rcykgY29udGludWU7XG5cdFx0dHJ5IHtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cy5zb21lKGludm9rZUNsZWFudXApO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLnNvbWUoaW52b2tlRWZmZWN0KTtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjb21wb25lbnQuX3Zub2RlKTtcblx0XHR9XG5cdH1cbn1cblxubGV0IEhBU19SQUYgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09ICdmdW5jdGlvbic7XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBicm93c2VyIGhhcyBhIGNoYW5jZSB0byBwYWludCBhIG5ldyBmcmFtZS5cbiAqIERvIHRoaXMgYnkgY29tYmluaW5nIHJlcXVlc3RBbmltYXRpb25GcmFtZSAockFGKSArIHNldFRpbWVvdXQgdG8gaW52b2tlIGEgY2FsbGJhY2sgYWZ0ZXJcbiAqIHRoZSBuZXh0IGJyb3dzZXIgZnJhbWUuXG4gKlxuICogQWxzbywgc2NoZWR1bGUgYSB0aW1lb3V0IGluIHBhcmFsbGVsIHRvIHRoZSB0aGUgckFGIHRvIGVuc3VyZSB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZFxuICogZXZlbiBpZiBSQUYgZG9lc24ndCBmaXJlIChmb3IgZXhhbXBsZSBpZiB0aGUgYnJvd3NlciB0YWIgaXMgbm90IHZpc2libGUpXG4gKlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjYWxsYmFja1xuICovXG5mdW5jdGlvbiBhZnRlck5leHRGcmFtZShjYWxsYmFjaykge1xuXHRjb25zdCBkb25lID0gKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRpZiAoSEFTX1JBRikgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcblx0XHRzZXRUaW1lb3V0KGNhbGxiYWNrKTtcblx0fTtcblx0Y29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoZG9uZSwgUkFGX1RJTUVPVVQpO1xuXG5cdGxldCByYWY7XG5cdGlmIChIQVNfUkFGKSB7XG5cdFx0cmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRvbmUpO1xuXHR9XG59XG5cbi8vIE5vdGU6IGlmIHNvbWVvbmUgdXNlZCBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuLy8gdGhlbiBlZmZlY3RzIHdpbGwgQUxXQVlTIHJ1biBvbiB0aGUgTkVYVCBmcmFtZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IG9uZSwgaW5jdXJyaW5nIGEgfjE2bXMgZGVsYXkuXG4vLyBQZXJoYXBzIHRoaXMgaXMgbm90IHN1Y2ggYSBiaWcgZGVhbC5cbi8qKlxuICogU2NoZWR1bGUgYWZ0ZXJQYWludEVmZmVjdHMgZmx1c2ggYWZ0ZXIgdGhlIGJyb3dzZXIgcGFpbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gbmV3UXVldWVMZW5ndGhcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZnRlclBhaW50KG5ld1F1ZXVlTGVuZ3RoKSB7XG5cdGlmIChuZXdRdWV1ZUxlbmd0aCA9PT0gMSB8fCBwcmV2UmFmICE9PSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuXHRcdHByZXZSYWYgPSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblx0XHQocHJldlJhZiB8fCBhZnRlck5leHRGcmFtZSkoZmx1c2hBZnRlclBhaW50RWZmZWN0cyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkhvb2tTdGF0ZX0gaG9va1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGludm9rZUNsZWFudXAoaG9vaykge1xuXHQvLyBBIGhvb2sgY2xlYW51cCBjYW4gaW50cm9kdWNlIGEgY2FsbCB0byByZW5kZXIgd2hpY2ggY3JlYXRlcyBhIG5ldyByb290LCB0aGlzIHdpbGwgY2FsbCBvcHRpb25zLnZub2RlXG5cdC8vIGFuZCBtb3ZlIHRoZSBjdXJyZW50Q29tcG9uZW50IGF3YXkuXG5cdGNvbnN0IGNvbXAgPSBjdXJyZW50Q29tcG9uZW50O1xuXHRsZXQgY2xlYW51cCA9IGhvb2suX2NsZWFudXA7XG5cdGlmICh0eXBlb2YgY2xlYW51cCA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0aG9vay5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblx0XHRjbGVhbnVwKCk7XG5cdH1cblxuXHRjdXJyZW50Q29tcG9uZW50ID0gY29tcDtcbn1cblxuLyoqXG4gKiBJbnZva2UgYSBIb29rJ3MgZWZmZWN0XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gaG9va1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGludm9rZUVmZmVjdChob29rKSB7XG5cdC8vIEEgaG9vayBjYWxsIGNhbiBpbnRyb2R1Y2UgYSBjYWxsIHRvIHJlbmRlciB3aGljaCBjcmVhdGVzIGEgbmV3IHJvb3QsIHRoaXMgd2lsbCBjYWxsIG9wdGlvbnMudm5vZGVcblx0Ly8gYW5kIG1vdmUgdGhlIGN1cnJlbnRDb21wb25lbnQgYXdheS5cblx0Y29uc3QgY29tcCA9IGN1cnJlbnRDb21wb25lbnQ7XG5cdGhvb2suX2NsZWFudXAgPSBob29rLl92YWx1ZSgpO1xuXHRjdXJyZW50Q29tcG9uZW50ID0gY29tcDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gb2xkQXJnc1xuICogQHBhcmFtIHt1bmtub3duW119IG5ld0FyZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBhcmdzQ2hhbmdlZChvbGRBcmdzLCBuZXdBcmdzKSB7XG5cdHJldHVybiAoXG5cdFx0IW9sZEFyZ3MgfHxcblx0XHRvbGRBcmdzLmxlbmd0aCAhPT0gbmV3QXJncy5sZW5ndGggfHxcblx0XHRuZXdBcmdzLnNvbWUoKGFyZywgaW5kZXgpID0+IGFyZyAhPT0gb2xkQXJnc1tpbmRleF0pXG5cdCk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIEFyZ1xuICogQHBhcmFtIHtBcmd9IGFyZ1xuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IGFueX0gZlxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gaW52b2tlT3JSZXR1cm4oYXJnLCBmKSB7XG5cdHJldHVybiB0eXBlb2YgZiA9PSAnZnVuY3Rpb24nID8gZihhcmcpIDogZjtcbn1cbiIsICJjb25zdCBFTkNPREVEX0VOVElUSUVTID0gL1tcIiY8XS87XG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gc3RyICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRW50aXRpZXMoc3RyKSB7XG5cdC8vIFNraXAgYWxsIHdvcmsgZm9yIHN0cmluZ3Mgd2l0aCBubyBlbnRpdGllcyBuZWVkaW5nIGVuY29kaW5nOlxuXHRpZiAoc3RyLmxlbmd0aCA9PT0gMCB8fCBFTkNPREVEX0VOVElUSUVTLnRlc3Qoc3RyKSA9PT0gZmFsc2UpIHJldHVybiBzdHI7XG5cblx0bGV0IGxhc3QgPSAwLFxuXHRcdGkgPSAwLFxuXHRcdG91dCA9ICcnLFxuXHRcdGNoID0gJyc7XG5cblx0Ly8gU2VlayBmb3J3YXJkIGluIHN0ciB1bnRpbCB0aGUgbmV4dCBlbnRpdHkgY2hhcjpcblx0Zm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGkpKSB7XG5cdFx0XHRjYXNlIDM0OlxuXHRcdFx0XHRjaCA9ICcmcXVvdDsnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMzg6XG5cdFx0XHRcdGNoID0gJyZhbXA7Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDYwOlxuXHRcdFx0XHRjaCA9ICcmbHQ7Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHNraXBwZWQvYnVmZmVyZWQgY2hhcmFjdGVycyBhbmQgdGhlIGVuY29kZWQgZW50aXR5OlxuXHRcdGlmIChpICE9PSBsYXN0KSBvdXQgKz0gc3RyLnNsaWNlKGxhc3QsIGkpO1xuXHRcdG91dCArPSBjaDtcblx0XHQvLyBTdGFydCB0aGUgbmV4dCBzZWVrL2J1ZmZlciBhZnRlciB0aGUgZW50aXR5J3Mgb2Zmc2V0OlxuXHRcdGxhc3QgPSBpICsgMTtcblx0fVxuXHRpZiAoaSAhPT0gbGFzdCkgb3V0ICs9IHN0ci5zbGljZShsYXN0LCBpKTtcblx0cmV0dXJuIG91dDtcbn1cbiIsICIvKiogTm9ybWFsIGh5ZHJhdGlvbiB0aGF0IGF0dGFjaGVzIHRvIGEgRE9NIHRyZWUgYnV0IGRvZXMgbm90IGRpZmYgaXQuICovXG5leHBvcnQgY29uc3QgTU9ERV9IWURSQVRFID0gMSA8PCA1O1xuLyoqIFNpZ25pZmllcyB0aGlzIFZOb2RlIHN1c3BlbmRlZCBvbiB0aGUgcHJldmlvdXMgcmVuZGVyICovXG5leHBvcnQgY29uc3QgTU9ERV9TVVNQRU5ERUQgPSAxIDw8IDc7XG4vKiogSW5kaWNhdGVzIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGJlIGluc2VydGVkIHdoaWxlIHBhdGNoaW5nIGNoaWxkcmVuICovXG5leHBvcnQgY29uc3QgSU5TRVJUX1ZOT0RFID0gMSA8PCAyO1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTtcblxuLyoqIFJlc2V0IGFsbCBtb2RlIGZsYWdzICovXG5leHBvcnQgY29uc3QgUkVTRVRfTU9ERSA9IH4oTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERUQpO1xuXG5leHBvcnQgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5leHBvcnQgY29uc3QgWEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuZXhwb3J0IGNvbnN0IE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuXG5leHBvcnQgY29uc3QgTlVMTCA9IG51bGw7XG5leHBvcnQgY29uc3QgVU5ERUZJTkVEID0gdW5kZWZpbmVkO1xuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgb3B0aW9ucywgRnJhZ21lbnQgfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHsgZW5jb2RlRW50aXRpZXMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IElTX05PTl9ESU1FTlNJT05BTCB9IGZyb20gJy4uLy4uL3NyYy9jb25zdGFudHMnO1xuXG5sZXQgdm5vZGVJZCA9IDA7XG5cbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIFRoaXMgZmlsZSBleHBvcnRzIHZhcmlvdXMgbWV0aG9kcyB0aGF0IGltcGxlbWVudCBCYWJlbCdzIFwiYXV0b21hdGljXCIgSlNYIHJ1bnRpbWUgQVBJOlxuICogLSBqc3godHlwZSwgcHJvcHMsIGtleSlcbiAqIC0ganN4cyh0eXBlLCBwcm9wcywga2V5KVxuICogLSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgX19zb3VyY2UsIF9fc2VsZilcbiAqXG4gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgY3JlYXRlVk5vZGUgaGVyZSBpcyBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlLlxuICogQmVuY2htYXJrczogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81ZjZiNTRhMGI0NjMyMTAwYTdkY2QyYjNcbiAqL1xuXG4vKipcbiAqIEpTWC5FbGVtZW50IGZhY3RvcnkgdXNlZCBieSBCYWJlbCdzIHtydW50aW1lOlwiYXV0b21hdGljXCJ9IEpTWCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7Vk5vZGVbJ3R5cGUnXX0gdHlwZVxuICogQHBhcmFtIHtWTm9kZVsncHJvcHMnXX0gcHJvcHNcbiAqIEBwYXJhbSB7Vk5vZGVbJ2tleSddfSBba2V5XVxuICogQHBhcmFtIHt1bmtub3dufSBbaXNTdGF0aWNDaGlsZHJlbl1cbiAqIEBwYXJhbSB7dW5rbm93bn0gW19fc291cmNlXVxuICogQHBhcmFtIHt1bmtub3dufSBbX19zZWxmXVxuICovXG5mdW5jdGlvbiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBfX3NvdXJjZSwgX19zZWxmKSB7XG5cdGlmICghcHJvcHMpIHByb3BzID0ge307XG5cdC8vIFdlJ2xsIHdhbnQgdG8gcHJlc2VydmUgYHJlZmAgaW4gcHJvcHMgdG8gZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3Jcblx0Ly8gZm9yd2FyZFJlZiBjb21wb25lbnRzIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IHNob3VsZCBoYXBwZW4gdmlhXG5cdC8vIGEgc2VwYXJhdGUgUFIuXG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSBwcm9wcyxcblx0XHRyZWYsXG5cdFx0aTtcblxuXHRpZiAoJ3JlZicgaW4gbm9ybWFsaXplZFByb3BzKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzID0ge307XG5cdFx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0XHRpZiAoaSA9PSAncmVmJykge1xuXHRcdFx0XHRyZWYgPSBwcm9wc1tpXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBAdHlwZSB7Vk5vZGUgJiB7IF9fc291cmNlOiBhbnk7IF9fc2VsZjogYW55IH19ICovXG5cdGNvbnN0IHZub2RlID0ge1xuXHRcdHR5cGUsXG5cdFx0cHJvcHM6IG5vcm1hbGl6ZWRQcm9wcyxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdF9jaGlsZHJlbjogbnVsbCxcblx0XHRfcGFyZW50OiBudWxsLFxuXHRcdF9kZXB0aDogMCxcblx0XHRfZG9tOiBudWxsLFxuXHRcdF9jb21wb25lbnQ6IG51bGwsXG5cdFx0Y29uc3RydWN0b3I6IHVuZGVmaW5lZCxcblx0XHRfb3JpZ2luYWw6IC0tdm5vZGVJZCxcblx0XHRfaW5kZXg6IC0xLFxuXHRcdF9mbGFnczogMCxcblx0XHRfX3NvdXJjZSxcblx0XHRfX3NlbGZcblx0fTtcblxuXHQvLyBJZiBhIENvbXBvbmVudCBWTm9kZSwgY2hlY2sgZm9yIGFuZCBhcHBseSBkZWZhdWx0UHJvcHMuXG5cdC8vIE5vdGU6IGB0eXBlYCBpcyBvZnRlbiBhIFN0cmluZywgYW5kIGNhbiBiZSBgdW5kZWZpbmVkYCBpbiBkZXZlbG9wbWVudC5cblx0aWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmIChyZWYgPSB0eXBlLmRlZmF1bHRQcm9wcykpIHtcblx0XHRmb3IgKGkgaW4gcmVmKVxuXHRcdFx0aWYgKG5vcm1hbGl6ZWRQcm9wc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHJlZltpXTtcblx0XHRcdH1cblx0fVxuXG5cdGlmIChvcHRpb25zLnZub2RlKSBvcHRpb25zLnZub2RlKHZub2RlKTtcblx0cmV0dXJuIHZub2RlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHRlbXBsYXRlIHZub2RlLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBlY3RlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZSBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0ZW1wbGF0ZXNcbiAqIEBwYXJhbSAge0FycmF5PHN0cmluZyB8IG51bGwgfCBWTm9kZT59IGV4cHJzXG4gKiBAcmV0dXJucyB7Vk5vZGV9XG4gKi9cbmZ1bmN0aW9uIGpzeFRlbXBsYXRlKHRlbXBsYXRlcywgLi4uZXhwcnMpIHtcblx0Y29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCwgeyB0cGw6IHRlbXBsYXRlcywgZXhwcnMgfSk7XG5cdC8vIEJ5cGFzcyByZW5kZXIgdG8gc3RyaW5nIHRvcCBsZXZlbCBGcmFnbWVudCBvcHRpbWl6YXRpb25cblx0dm5vZGUua2V5ID0gdm5vZGUuX3Zub2RlO1xuXHRyZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IEpTX1RPX0NTUyA9IHt9O1xuY29uc3QgQ1NTX1JFR0VYID0gL1tBLVpdL2c7XG5cbi8qKlxuICogVW53cmFwIHBvdGVudGlhbCBzaWduYWxzLlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJWYWx1ZSh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiZcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIHZhbHVlLnZhbHVlT2YgPT09ICdmdW5jdGlvbidcblx0XHQ/IHZhbHVlLnZhbHVlT2YoKVxuXHRcdDogdmFsdWU7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIEhUTUwgYXR0cmlidXRlIHRvIGEgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdFxuICogZXhwZWN0ZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZVxuICogSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGpzeEF0dHIobmFtZSwgdmFsdWUpIHtcblx0aWYgKG9wdGlvbnMuYXR0cikge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMuYXR0cihuYW1lLCB2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0dmFsdWUgPSBub3JtYWxpemVBdHRyVmFsdWUodmFsdWUpO1xuXG5cdGlmIChuYW1lID09PSAncmVmJyB8fCBuYW1lID09PSAna2V5JykgcmV0dXJuICcnO1xuXHRpZiAobmFtZSA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG5cdFx0bGV0IHN0ciA9ICcnO1xuXHRcdGZvciAobGV0IHByb3AgaW4gdmFsdWUpIHtcblx0XHRcdGxldCB2YWwgPSB2YWx1ZVtwcm9wXTtcblx0XHRcdGlmICh2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnKSB7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPVxuXHRcdFx0XHRcdHByb3BbMF0gPT0gJy0nXG5cdFx0XHRcdFx0XHQ/IHByb3Bcblx0XHRcdFx0XHRcdDogSlNfVE9fQ1NTW3Byb3BdIHx8XG5cdFx0XHRcdFx0XHRcdChKU19UT19DU1NbcHJvcF0gPSBwcm9wLnJlcGxhY2UoQ1NTX1JFR0VYLCAnLSQmJykudG9Mb3dlckNhc2UoKSk7XG5cblx0XHRcdFx0bGV0IHN1ZmZpeCA9ICc7Jztcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmXG5cdFx0XHRcdFx0Ly8gRXhjbHVkZSBjdXN0b20tYXR0cmlidXRlc1xuXHRcdFx0XHRcdCFuYW1lLnN0YXJ0c1dpdGgoJy0tJykgJiZcblx0XHRcdFx0XHQhSVNfTk9OX0RJTUVOU0lPTkFMLnRlc3QobmFtZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c3VmZml4ID0gJ3B4Oyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RyID0gc3RyICsgbmFtZSArICc6JyArIHZhbCArIHN1ZmZpeDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG5hbWUgKyAnPVwiJyArIGVuY29kZUVudGl0aWVzKHN0cikgKyAnXCInO1xuXHR9XG5cblx0aWYgKFxuXHRcdHZhbHVlID09IG51bGwgfHxcblx0XHR2YWx1ZSA9PT0gZmFsc2UgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG5cdCkge1xuXHRcdHJldHVybiAnJztcblx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIG5hbWU7XG5cblx0cmV0dXJuIG5hbWUgKyAnPVwiJyArIGVuY29kZUVudGl0aWVzKCcnICsgdmFsdWUpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBFc2NhcGUgYSBkeW5hbWljIGNoaWxkIHBhc3NlZCB0byBganN4VGVtcGxhdGVgLiBUaGlzIGZ1bmN0aW9uXG4gKiBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGFcbiAqIHByZWNvbXBpbGUgSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZyB8IG51bGwgfCBWTm9kZSB8IEFycmF5PHN0cmluZyB8IG51bGwgfCBWTm9kZT59XG4gKi9cbmZ1bmN0aW9uIGpzeEVzY2FwZSh2YWx1ZSkge1xuXHRpZiAoXG5cdFx0dmFsdWUgPT0gbnVsbCB8fFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG5cdCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcblx0XHQvLyBDaGVjayBmb3IgVk5vZGVcblx0XHRpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0aWYgKGlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhbHVlW2ldID0ganN4RXNjYXBlKHZhbHVlW2ldKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZW5jb2RlRW50aXRpZXMoJycgKyB2YWx1ZSk7XG59XG5cbmV4cG9ydCB7XG5cdGNyZWF0ZVZOb2RlIGFzIGpzeCxcblx0Y3JlYXRlVk5vZGUgYXMganN4cyxcblx0Y3JlYXRlVk5vZGUgYXMganN4REVWLFxuXHRGcmFnbWVudCxcblx0Ly8gcHJlY29tcGlsZWQgSlNYIHRyYW5zZm9ybVxuXHRqc3hUZW1wbGF0ZSxcblx0anN4QXR0cixcblx0anN4RXNjYXBlXG59O1xuIiwgIi8qKiBAanN4SW1wb3J0U291cmNlIHByZWFjdCAqL1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdwcmVhY3QvaG9va3MnO1xuXG5cbnR5cGUgQmVoYXZpb3JUeXBlID0gJ2ltbWVkaWF0ZS1wcmludCcgfCAnYWNjdW11bGF0aW5nLWxpc3QnIHwgJ3JlY3VycmluZy1wcmludCcgfCAnb24tZGVtYW5kJztcblxuaW50ZXJmYWNlIENoYW5uZWxCZWhhdmlvckNvbmZpZyB7XG4gICAgdHlwZTogQmVoYXZpb3JUeXBlO1xuICAgIGhlYWRlcj86IHN0cmluZztcbiAgICBmb290ZXI/OiBzdHJpbmc7XG4gICAgaW5jbHVkZUljb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNoZWNrbGlzdD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDaGFubmVsTWFwcGluZyB7XG4gICAgY2hhbm5lbElkOiBzdHJpbmc7XG4gICAgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgICBjb25maWc6IENoYW5uZWxCZWhhdmlvckNvbmZpZztcbn1cblxuaW50ZXJmYWNlIERpc2NvcmRDaGFubmVsIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERpYWdub3N0aWNFdmVudCB7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN0YXR1c0RhdGEge1xuICAgIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAgIGd1aWxkczogc3RyaW5nW107XG4gICAgY29uZmlndXJlZFNlcnZlcklkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQ29uZmlnRGF0YSB7XG4gICAgZGlzY29yZFRva2VuOiBzdHJpbmc7XG4gICAgb3BlbmFpS2V5OiBzdHJpbmc7XG4gICAgc2VydmVySWQ6IHN0cmluZyB8IG51bGw7XG4gICAgZGlhZ25vc3RpY3NQb3J0OiBudW1iZXI7XG4gICAgY2hhbm5lbHM6IENoYW5uZWxNYXBwaW5nW107XG4gICAgY29uZmlnUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbm5lbHNEYXRhIHtcbiAgICBjaGFubmVsczogQ2hhbm5lbE1hcHBpbmdbXTtcbiAgICBkaXNjb3JkQ2hhbm5lbHM6IERpc2NvcmRDaGFubmVsW107XG4gICAgdW5tYXBwZWQ6IERpc2NvcmRDaGFubmVsW107XG59XG5cblxuY29uc3QgUyA9IHtcbiAgICBib3g6IHsgYmFja2dyb3VuZDogJyMxNTE5MjInLCBib3JkZXI6ICcxcHggc29saWQgIzJiMzM0MCcsIGJvcmRlclJhZGl1czogJzEwcHgnLCBwYWRkaW5nOiAnMTZweCcsIG1hcmdpbkJvdHRvbTogJzE2cHgnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgaW5wdXQ6IHsgYmFja2dyb3VuZDogJyMwZjExMTUnLCBjb2xvcjogJyNmNWY3ZmEnLCBib3JkZXI6ICcxcHggc29saWQgIzM1NDA1MScsIGJvcmRlclJhZGl1czogJzZweCcsIHBhZGRpbmc6ICc4cHggMTBweCcsIHdpZHRoOiAnMTAwJScsIGJveFNpemluZzogJ2JvcmRlci1ib3gnIGFzIGNvbnN0IH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgYnRuOiB7IGJhY2tncm91bmQ6ICcjMmU3ZGZmJywgY29sb3I6ICcjZmZmJywgYm9yZGVyOiAnbm9uZScsIGJvcmRlclJhZGl1czogJzZweCcsIHBhZGRpbmc6ICc4cHggMTRweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBtYXJnaW5SaWdodDogJzhweCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBidG5EYW5nZXI6IHsgYmFja2dyb3VuZDogJyNjMDM5MmInLCBjb2xvcjogJyNmZmYnLCBib3JkZXI6ICdub25lJywgYm9yZGVyUmFkaXVzOiAnNnB4JywgcGFkZGluZzogJzRweCAxMHB4JywgY3Vyc29yOiAncG9pbnRlcicgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBsYWJlbDogeyBkaXNwbGF5OiAnYmxvY2snLCBtYXJnaW5Cb3R0b206ICcxMnB4JyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxuICAgIGxhYmVsVGV4dDogeyBkaXNwbGF5OiAnYmxvY2snLCBtYXJnaW5Cb3R0b206ICc0cHgnLCBjb2xvcjogJyNiNGJkYzgnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgc2VsZWN0OiB7IGJhY2tncm91bmQ6ICcjMGYxMTE1JywgY29sb3I6ICcjZjVmN2ZhJywgYm9yZGVyOiAnMXB4IHNvbGlkICMzNTQwNTEnLCBib3JkZXJSYWRpdXM6ICc2cHgnLCBwYWRkaW5nOiAnOHB4IDEwcHgnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgdGg6IHsgdGV4dEFsaWduOiAnbGVmdCcgYXMgY29uc3QsIHBhZGRpbmc6ICc4cHgnLCBib3JkZXJCb3R0b206ICcxcHggc29saWQgIzJiMzM0MCcgfSxcbiAgICB0ZDogeyBwYWRkaW5nOiAnOHB4JywgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICMxYTIwMzAnLCB2ZXJ0aWNhbEFsaWduOiAndG9wJyBhcyBjb25zdCwgd29yZEJyZWFrOiAnYnJlYWstd29yZCcgYXMgY29uc3QgfSxcbiAgICByb3c6IHsgY3Vyc29yOiAncG9pbnRlcicsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICByb3dIb3ZlcjogeyBiYWNrZ3JvdW5kOiAnIzFhMjAzMCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBncmlkMjogeyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxZnIgMWZyJywgZ2FwOiAnMTJweCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBncmlkMzogeyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxZnIgMWZyIDFmcicsIGdhcDogJzhweCcsIGFsaWduSXRlbXM6ICdlbmQnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgZXJyOiB7IGNvbG9yOiAnI2ZmODA4MCcsIG1hcmdpbjogJzhweCAwJyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxuICAgIG9rOiB7IGNvbG9yOiAnIzhmZjBhNCcsIG1hcmdpbjogJzhweCAwJyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxuICAgIG1vbm86IHsgZm9udEZhbWlseTogJ21vbm9zcGFjZScsIGZvbnRTaXplOiAnMC44NWVtJyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxufTtcblxuXG5hc3luYyBmdW5jdGlvbiBhcGlGZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKSBhcyB7IGVycm9yPzogc3RyaW5nIH0gJiBUO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoanNvbi5lcnJvciA/PyAnUmVxdWVzdCBmYWlsZWQnKTtcbiAgICByZXR1cm4ganNvbjtcbn1cblxuZnVuY3Rpb24ganNvblBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHk6IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXBpRmV0Y2g8VD4odXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGpzb25QdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHk6IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXBpRmV0Y2g8VD4odXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24ganNvbkRlbGV0ZTxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhcGlGZXRjaDxUPih1cmwsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbn1cblxuXG5mdW5jdGlvbiBGaWVsZCh7IGxhYmVsLCB0eXBlID0gJ3RleHQnLCB2YWx1ZSwgb25DaGFuZ2UsIHBsYWNlaG9sZGVyIH06IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBvbkNoYW5nZTogKHY6IHN0cmluZykgPT4gdm9pZDtcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn0pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXtTLmxhYmVsVGV4dH0+e2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9e3R5cGV9XG4gICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlciA/PyAnJ31cbiAgICAgICAgICAgICAgICBvbklucHV0PXtlID0+IG9uQ2hhbmdlKChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfVxuICAgICAgICAgICAgICAgIHN0eWxlPXtTLmlucHV0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICApO1xufVxuXG5mdW5jdGlvbiBDaGVja0ZpZWxkKHsgbGFiZWwsIGNoZWNrZWQsIG9uQ2hhbmdlIH06IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgb25DaGFuZ2U6ICh2OiBib29sZWFuKSA9PiB2b2lkO1xufSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8bGFiZWwgc3R5bGU9e3sgLi4uUy5sYWJlbCwgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnOHB4JywgY3Vyc29yOiAncG9pbnRlcicgfX0+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD17Y2hlY2tlZH0gb25DaGFuZ2U9e2UgPT4gb25DaGFuZ2UoKGUuY3VycmVudFRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKX0gLz5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9sYWJlbD5cbiAgICApO1xufVxuXG5cbmZ1bmN0aW9uIEJlaGF2aW9yQ29uZmlnKHsgY29uZmlnLCBvbkNoYW5nZSB9OiB7XG4gICAgY29uZmlnOiBDaGFubmVsQmVoYXZpb3JDb25maWc7XG4gICAgb25DaGFuZ2U6IChjOiBDaGFubmVsQmVoYXZpb3JDb25maWcpID0+IHZvaWQ7XG59KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHQgPSBjb25maWcudHlwZTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmdUb3A6ICcxMnB4JyB9fT5cbiAgICAgICAgICAgIHsodCA9PT0gJ2ltbWVkaWF0ZS1wcmludCcgfHwgdCA9PT0gJ2FjY3VtdWxhdGluZy1saXN0JyB8fCB0ID09PSAncmVjdXJyaW5nLXByaW50JykgJiYgKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmZpZy5oZWFkZXIgPz8gJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17diA9PiB7IGNvbnN0IGMgPSB7IC4uLmNvbmZpZyB9OyBpZiAodikgeyBjLmhlYWRlciA9IHY7IH0gZWxzZSB7IGRlbGV0ZSBjLmhlYWRlcjsgfSBvbkNoYW5nZShjKTsgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgaGVhZGVyIHRleHRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25maWcuZm9vdGVyID8/ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3YgPT4geyBjb25zdCBjID0geyAuLi5jb25maWcgfTsgaWYgKHYpIHsgYy5mb290ZXIgPSB2OyB9IGVsc2UgeyBkZWxldGUgYy5mb290ZXI7IH0gb25DaGFuZ2UoYyk7IH19XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGZvb3RlciB0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPENoZWNrRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSW5jbHVkZSBtZXRhZGF0YSBmb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y29uZmlnLmluY2x1ZGVNZXRhZGF0YSA/PyBmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2ID0+IG9uQ2hhbmdlKHsgLi4uY29uZmlnLCBpbmNsdWRlTWV0YWRhdGE6IHYgfSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgeyh0ID09PSAnaW1tZWRpYXRlLXByaW50JyB8fCB0ID09PSAncmVjdXJyaW5nLXByaW50JykgJiYgKFxuICAgICAgICAgICAgICAgIDxDaGVja0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSW5jbHVkZSBBSS1nZW5lcmF0ZWQgaWNvbiAocmVxdWlyZXMgT3BlbkFJIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb25maWcuaW5jbHVkZUljb24gPz8gZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2ID0+IG9uQ2hhbmdlKHsgLi4uY29uZmlnLCBpbmNsdWRlSWNvbjogdiB9KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0ID09PSAnYWNjdW11bGF0aW5nLWxpc3QnICYmIChcbiAgICAgICAgICAgICAgICA8Q2hlY2tGaWVsZFxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkluY2x1ZGUgY2hlY2tsaXN0IGJveGVzXCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y29uZmlnLmluY2x1ZGVDaGVja2xpc3QgPz8gZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2ID0+IG9uQ2hhbmdlKHsgLi4uY29uZmlnLCBpbmNsdWRlQ2hlY2tsaXN0OiB2IH0pfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5cbmZ1bmN0aW9uIENoYW5uZWxSb3coeyBtYXBwaW5nLCBvbkRlbGV0ZSwgb25VcGRhdGUgfToge1xuICAgIG1hcHBpbmc6IENoYW5uZWxNYXBwaW5nO1xuICAgIG9uRGVsZXRlOiAoKSA9PiB2b2lkO1xuICAgIG9uVXBkYXRlOiAoYzogQ2hhbm5lbEJlaGF2aW9yQ29uZmlnKSA9PiB2b2lkO1xufSk6IEpTWC5FbGVtZW50IHtcbiAgICBjb25zdCBbZXhwYW5kZWQsIHNldEV4cGFuZGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbaG92ZXJlZCwgc2V0SG92ZXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICBzdHlsZT17aG92ZXJlZCA/IFMucm93SG92ZXIgOiBTLnJvd31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRFeHBhbmRlZCghZXhwYW5kZWQpfVxuICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gc2V0SG92ZXJlZCh0cnVlKX1cbiAgICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17Uy50ZH0+IyB7bWFwcGluZy5jaGFubmVsTmFtZX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17Uy50ZH0+e21hcHBpbmcuY29uZmlnLnR5cGV9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9e3sgLi4uUy50ZCwgdGV4dEFsaWduOiAncmlnaHQnIH19PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17Uy5idG5EYW5nZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtlID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgb25EZWxldGUoKTsgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAge2V4cGFuZGVkICYmIChcbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xTcGFuPXszfSBzdHlsZT17eyAuLi5TLnRkLCBiYWNrZ3JvdW5kOiAnIzBmMTExNScsIHBhZGRpbmc6ICcxNnB4JyB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCZWhhdmlvckNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZz17bWFwcGluZy5jb25maWd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2MgPT4gb25VcGRhdGUoYyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L3Rib2R5PlxuICAgICk7XG59XG5cblxuZnVuY3Rpb24gQm90U2V0dXAoeyBjb25maWcsIG9uU2F2ZSB9OiB7XG4gICAgY29uZmlnOiBDb25maWdEYXRhIHwgbnVsbDtcbiAgICBvblNhdmU6ICgpID0+IHZvaWQ7XG59KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtkaXNjb3JkVG9rZW4sIHNldERpc2NvcmRUb2tlbl0gPSB1c2VTdGF0ZShjb25maWc/LmRpc2NvcmRUb2tlbiA/PyAnJyk7XG4gICAgY29uc3QgW3NlcnZlcklkLCBzZXRTZXJ2ZXJJZF0gPSB1c2VTdGF0ZShjb25maWc/LnNlcnZlcklkID8/ICcnKTtcbiAgICBjb25zdCBbb3BlbmFpS2V5LCBzZXRPcGVuYWlLZXldID0gdXNlU3RhdGUoY29uZmlnPy5vcGVuYWlLZXkgPz8gJycpO1xuICAgIGNvbnN0IFtkaWFnbm9zdGljc1BvcnQsIHNldERpYWdub3N0aWNzUG9ydF0gPSB1c2VTdGF0ZShTdHJpbmcoY29uZmlnPy5kaWFnbm9zdGljc1BvcnQgPz8gODA4MCkpO1xuICAgIGNvbnN0IFttc2csIHNldE1zZ10gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW2Vyciwgc2V0RXJyXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0RGlzY29yZFRva2VuKGNvbmZpZz8uZGlzY29yZFRva2VuID8/ICcnKTtcbiAgICAgICAgc2V0U2VydmVySWQoY29uZmlnPy5zZXJ2ZXJJZCA/PyAnJyk7XG4gICAgICAgIHNldE9wZW5haUtleShjb25maWc/Lm9wZW5haUtleSA/PyAnJyk7XG4gICAgICAgIHNldERpYWdub3N0aWNzUG9ydChTdHJpbmcoY29uZmlnPy5kaWFnbm9zdGljc1BvcnQgPz8gODA4MCkpO1xuICAgIH0sIFtjb25maWc/LmRpc2NvcmRUb2tlbiwgY29uZmlnPy5vcGVuYWlLZXksIGNvbmZpZz8uc2VydmVySWQsIGNvbmZpZz8uZGlhZ25vc3RpY3NQb3J0XSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBzZXRTYXZpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycignJyk7IHNldE1zZygnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICAgICAgICBkaXNjb3JkVG9rZW46IGRpc2NvcmRUb2tlbi50cmltKCksXG4gICAgICAgICAgICAgICAgb3BlbmFpS2V5OiBvcGVuYWlLZXkudHJpbSgpLFxuICAgICAgICAgICAgICAgIHNlcnZlcklkOiBzZXJ2ZXJJZC50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBkaWFnbm9zdGljc1BvcnQ6IE51bWJlcihkaWFnbm9zdGljc1BvcnQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL2NvbmZpZycsIGJvZHkpO1xuICAgICAgICAgICAgc2V0TXNnKCdTYXZlZC4nKTtcbiAgICAgICAgICAgIG9uU2F2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldFNhdmluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8c2VjdGlvbiBzdHlsZT17Uy5ib3h9PlxuICAgICAgICAgICAgPGgyIHN0eWxlPXt7IG1hcmdpblRvcDogMCB9fT5Cb3QgU2V0dXA8L2gyPlxuICAgICAgICAgICAge2NvbmZpZyAmJiA8cCBzdHlsZT17eyBjb2xvcjogJyNiNGJkYzgnLCBtYXJnaW5Ub3A6IDAgfX0+Q29uZmlnOiB7Y29uZmlnLmNvbmZpZ1BhdGh9PC9wPn1cbiAgICAgICAgICAgIHtlcnIgJiYgPHAgc3R5bGU9e1MuZXJyfT57ZXJyfTwvcD59XG4gICAgICAgICAgICB7bXNnICYmIDxwIHN0eWxlPXtTLm9rfT57bXNnfTwvcD59XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEaXNjb3JkIFRva2VuXCIgdmFsdWU9e2Rpc2NvcmRUb2tlbn0gb25DaGFuZ2U9e3NldERpc2NvcmRUb2tlbn0gcGxhY2Vob2xkZXI9XCJEaXNjb3JkIGJvdCB0b2tlblwiIC8+XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTZXJ2ZXIgSUQgKHJlcXVpcmVkKVwiIHZhbHVlPXtzZXJ2ZXJJZH0gb25DaGFuZ2U9e3NldFNlcnZlcklkfSBwbGFjZWhvbGRlcj1cIlJlcXVpcmVkIFx1MjAxNCBEaXNjb3JkIHNlcnZlciBJRFwiIC8+XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJPcGVuQUkgS2V5XCIgdmFsdWU9e29wZW5haUtleX0gb25DaGFuZ2U9e3NldE9wZW5haUtleX0gcGxhY2Vob2xkZXI9XCJPcGVuQUkgQVBJIGtleVwiIC8+XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEaWFnbm9zdGljcyBQb3J0XCIgdHlwZT1cIm51bWJlclwiIHZhbHVlPXtkaWFnbm9zdGljc1BvcnR9IG9uQ2hhbmdlPXtzZXREaWFnbm9zdGljc1BvcnR9IHBsYWNlaG9sZGVyPVwiODA4MFwiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtTLmJ0bn0gb25DbGljaz17KCkgPT4gdm9pZCBzYXZlKCl9IGRpc2FibGVkPXtzYXZpbmd9PlxuICAgICAgICAgICAgICAgIHtzYXZpbmcgPyAnU2F2aW5nXHUyMDI2JyA6ICdTYXZlJ31cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gQ2hhbm5lbEJlaGF2aW9ycyh7IHJlZnJlc2hLZXkgfTogeyByZWZyZXNoS2V5PzogbnVtYmVyIH0pOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGU8Q2hhbm5lbHNEYXRhIHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW2Vyciwgc2V0RXJyXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbYWRkQ2hhbm5lbElkLCBzZXRBZGRDaGFubmVsSWRdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFthZGRCZWhhdmlvciwgc2V0QWRkQmVoYXZpb3JdID0gdXNlU3RhdGU8QmVoYXZpb3JUeXBlPignaW1tZWRpYXRlLXByaW50Jyk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IGFwaUZldGNoPENoYW5uZWxzRGF0YT4oJy9hcGkvY2hhbm5lbHMnKTtcbiAgICAgICAgICAgIHNldERhdGEoZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNldEVycihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHsgdm9pZCBsb2FkKCk7IH0sIFtyZWZyZXNoS2V5XSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBhZGRNYXBwaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWFkZENoYW5uZWxJZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkYyA9IGRhdGE/LmRpc2NvcmRDaGFubmVscy5maW5kKGMgPT4gYy5pZCA9PT0gYWRkQ2hhbm5lbElkKTtcbiAgICAgICAgaWYgKCFkYykgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBDaGFubmVsQmVoYXZpb3JDb25maWcgPSBhZGRCZWhhdmlvciA9PT0gJ2ltbWVkaWF0ZS1wcmludCdcbiAgICAgICAgICAgID8geyB0eXBlOiAnaW1tZWRpYXRlLXByaW50JywgaW5jbHVkZUljb246IGZhbHNlLCBpbmNsdWRlTWV0YWRhdGE6IGZhbHNlIH1cbiAgICAgICAgICAgIDogYWRkQmVoYXZpb3IgPT09ICdhY2N1bXVsYXRpbmctbGlzdCdcbiAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2FjY3VtdWxhdGluZy1saXN0JywgaW5jbHVkZUNoZWNrbGlzdDogZmFsc2UsIGluY2x1ZGVNZXRhZGF0YTogZmFsc2UgfVxuICAgICAgICAgICAgICAgIDogYWRkQmVoYXZpb3IgPT09ICdyZWN1cnJpbmctcHJpbnQnXG4gICAgICAgICAgICAgICAgICAgID8geyB0eXBlOiAncmVjdXJyaW5nLXByaW50JywgaW5jbHVkZUljb246IGZhbHNlLCBpbmNsdWRlTWV0YWRhdGE6IGZhbHNlIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICdvbi1kZW1hbmQnIH07XG4gICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL2NoYW5uZWxzJywgeyBjaGFubmVsSWQ6IGRjLmlkLCBjaGFubmVsTmFtZTogZGMubmFtZSwgY29uZmlnOiBkZWZhdWx0Q29uZmlnIH0pO1xuICAgICAgICBzZXRBZGRDaGFubmVsSWQoJycpO1xuICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2hhbm5lbChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGpzb25EZWxldGUoYC9hcGkvY2hhbm5lbHMvJHtpZH1gKTtcbiAgICAgICAgYXdhaXQgbG9hZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5uZWwoaWQ6IHN0cmluZywgY29uZmlnOiBDaGFubmVsQmVoYXZpb3JDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQganNvblB1dChgL2FwaS9jaGFubmVscy8ke2lkfWAsIHsgY29uZmlnIH0pO1xuICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEZyb21EaXNjb3JkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IGFwaUZldGNoPENoYW5uZWxzRGF0YT4oJy9hcGkvY2hhbm5lbHMvcmVmcmVzaCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICAgICAgICBzZXREYXRhKGQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWN0aW9uIHN0eWxlPXtTLmJveH0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzEycHgnLCBtYXJnaW5Cb3R0b206ICcxMnB4JyB9fT5cbiAgICAgICAgICAgICAgICA8aDIgc3R5bGU9e3sgbWFyZ2luVG9wOiAwLCBtYXJnaW5Cb3R0b206IDAgfX0+Q2hhbm5lbCBCZWhhdmlvcnM8L2gyPlxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3sgLi4uUy5idG4sIG1hcmdpblJpZ2h0OiAwIH19IG9uQ2xpY2s9eygpID0+IHZvaWQgcmVmcmVzaEZyb21EaXNjb3JkKCl9PlJlZnJlc2ggQ2hhbm5lbHM8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2VyciAmJiA8cCBzdHlsZT17Uy5lcnJ9PntlcnJ9PC9wPn1cbiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBib3JkZXJDb2xsYXBzZTogJ2NvbGxhcHNlJywgbWFyZ2luQm90dG9tOiAnMTZweCcgfX0+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9PkNoYW5uZWw8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPXtTLnRofT5CZWhhdmlvcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e3sgLi4uUy50aCwgdGV4dEFsaWduOiAncmlnaHQnIGFzIGNvbnN0IH19PkFjdGlvbnM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAge2RhdGE/LmNoYW5uZWxzLm1hcChtID0+IChcbiAgICAgICAgICAgICAgICAgICAgPENoYW5uZWxSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bS5jaGFubmVsSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nPXttfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGU9eygpID0+IHZvaWQgZGVsZXRlQ2hhbm5lbChtLmNoYW5uZWxJZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZT17YyA9PiB2b2lkIHVwZGF0ZUNoYW5uZWwobS5jaGFubmVsSWQsIGMpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIHsoIWRhdGEgfHwgZGF0YS5jaGFubmVscy5sZW5ndGggPT09IDApICYmIChcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xTcGFuPXszfSBzdHlsZT17eyAuLi5TLnRkLCBjb2xvcjogJyNiNGJkYzgnIH19Pk5vIGNoYW5uZWwgbWFwcGluZ3MgeWV0LjwvdGQ+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICAgICAgPGRpdiBzdHlsZT17Uy5ncmlkM30+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e1MubGFiZWxUZXh0fT5DaGFubmVsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPXtTLnNlbGVjdH0gdmFsdWU9e2FkZENoYW5uZWxJZH0gb25DaGFuZ2U9e2UgPT4gc2V0QWRkQ2hhbm5lbElkKChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGNoYW5uZWxcdTIwMjY8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy51bm1hcHBlZC5tYXAoYyA9PiA8b3B0aW9uIGtleT17Yy5pZH0gdmFsdWU9e2MuaWR9PiN7Yy5uYW1lfTwvb3B0aW9uPil9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e1MubGFiZWxUZXh0fT5CZWhhdmlvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBzdHlsZT17Uy5zZWxlY3R9IHZhbHVlPXthZGRCZWhhdmlvcn0gb25DaGFuZ2U9e2UgPT4gc2V0QWRkQmVoYXZpb3IoKGUuY3VycmVudFRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWUgYXMgQmVoYXZpb3JUeXBlKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW1tZWRpYXRlLXByaW50XCI+XHVEODNEXHVEREE4XHVGRTBGIEltbWVkaWF0ZSBQcmludDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFjY3VtdWxhdGluZy1saXN0XCI+XHVEODNEXHVERUQyIEFjY3VtdWxhdGluZyBMaXN0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVjdXJyaW5nLXByaW50XCI+XHVEODNEXHVERDA0IFJlY3VycmluZyBQcmludDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9uLWRlbWFuZFwiPlx1RDgzRFx1RENBQyBPbi1EZW1hbmQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtTLmJ0bn0gb25DbGljaz17KCkgPT4gdm9pZCBhZGRNYXBwaW5nKCl9IGRpc2FibGVkPXshYWRkQ2hhbm5lbElkfT5BZGQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbn1cblxuXG50eXBlIFByaW50TW9kZSA9ICdlc2NwJyB8ICdjdXBzJyB8ICdpbWFnZWZlZWQnO1xuXG5pbnRlcmZhY2UgRXNjcFByaW50Q29uZmlnIHsgbW9kZTogJ2VzY3AnOyBzZXJpYWxQb3J0OiBzdHJpbmc7IH1cbmludGVyZmFjZSBDdXBzUHJpbnRDb25maWcgeyBtb2RlOiAnY3Vwcyc7IHByaW50ZXJOYW1lOiBzdHJpbmc7IHBhcGVyU2l6ZTogc3RyaW5nOyBwYXBlck5hbWU6IHN0cmluZzsgfVxuaW50ZXJmYWNlIEltYWdlRmVlZENvbmZpZyB7IG1vZGU6ICdpbWFnZWZlZWQnOyB9XG50eXBlIFByaW50Q29uZmlnID0gRXNjcFByaW50Q29uZmlnIHwgQ3Vwc1ByaW50Q29uZmlnIHwgSW1hZ2VGZWVkQ29uZmlnO1xuXG5cbmZ1bmN0aW9uIFByaW50TW9kZVNlY3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtwcmludENvbmZpZywgc2V0UHJpbnRDb25maWddID0gdXNlU3RhdGU8UHJpbnRDb25maWcgfCBudWxsPihudWxsKTtcbiAgICBjb25zdCBbbW9kZSwgc2V0TW9kZV0gPSB1c2VTdGF0ZTxQcmludE1vZGU+KCdlc2NwJyk7XG4gICAgLy8gZXNjcCBmaWVsZHNcbiAgICBjb25zdCBbc2VyaWFsUG9ydCwgc2V0U2VyaWFsUG9ydF0gPSB1c2VTdGF0ZSgnL2Rldi90dHlVU0IwJyk7XG4gICAgLy8gY3VwcyBmaWVsZHNcbiAgICBjb25zdCBbcHJpbnRlck5hbWUsIHNldFByaW50ZXJOYW1lXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbcGFwZXJTaXplLCBzZXRQYXBlclNpemVdID0gdXNlU3RhdGUoJ0xldHRlcicpO1xuICAgIGNvbnN0IFtwYXBlck5hbWUsIHNldFBhcGVyTmFtZV0gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW21zZywgc2V0TXNnXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbZXJyLCBzZXRFcnJdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3Rlc3RpbmcsIHNldFRlc3RpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCBhcGlGZXRjaDx7IHByaW50Q29uZmlnOiBQcmludENvbmZpZyB8IG51bGwgfT4oJy9hcGkvcHJpbnQtY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAoZC5wcmludENvbmZpZykge1xuICAgICAgICAgICAgICAgIHNldFByaW50Q29uZmlnKGQucHJpbnRDb25maWcpO1xuICAgICAgICAgICAgICAgIHNldE1vZGUoZC5wcmludENvbmZpZy5tb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoZC5wcmludENvbmZpZy5tb2RlID09PSAnZXNjcCcpIHNldFNlcmlhbFBvcnQoZC5wcmludENvbmZpZy5zZXJpYWxQb3J0KTtcbiAgICAgICAgICAgICAgICBpZiAoZC5wcmludENvbmZpZy5tb2RlID09PSAnY3VwcycpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJpbnRlck5hbWUoZC5wcmludENvbmZpZy5wcmludGVyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFBhcGVyU2l6ZShkLnByaW50Q29uZmlnLnBhcGVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFBhcGVyTmFtZShkLnByaW50Q29uZmlnLnBhcGVyTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7IHZvaWQgbG9hZCgpOyB9LCBbXSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBzZXRTYXZpbmcodHJ1ZSk7IHNldEVycignJyk7IHNldE1zZygnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY2ZnOiBQcmludENvbmZpZztcbiAgICAgICAgICAgIGlmIChtb2RlID09PSAnZXNjcCcpIHtcbiAgICAgICAgICAgICAgICBjZmcgPSB7IG1vZGU6ICdlc2NwJywgc2VyaWFsUG9ydDogc2VyaWFsUG9ydC50cmltKCkgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2N1cHMnKSB7XG4gICAgICAgICAgICAgICAgY2ZnID0geyBtb2RlOiAnY3VwcycsIHByaW50ZXJOYW1lOiBwcmludGVyTmFtZS50cmltKCksIHBhcGVyU2l6ZTogcGFwZXJTaXplLnRyaW0oKSwgcGFwZXJOYW1lOiBwYXBlck5hbWUudHJpbSgpIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNmZyA9IHsgbW9kZTogJ2ltYWdlZmVlZCcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL3ByaW50LWNvbmZpZycsIHsgcHJpbnRDb25maWc6IGNmZyB9KTtcbiAgICAgICAgICAgIHNldFByaW50Q29uZmlnKGNmZyk7XG4gICAgICAgICAgICBzZXRNc2coJ1ByaW50IG1vZGUgc2F2ZWQuJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNldEVycihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RQcmludCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc2V0VGVzdGluZyh0cnVlKTsgc2V0RXJyKCcnKTsgc2V0TXNnKCcnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL3ByaW50ZXIvdGVzdCcsIHt9KTtcbiAgICAgICAgICAgIHNldE1zZyhtb2RlID09PSAnaW1hZ2VmZWVkJyA/ICdUZXN0IGpvYiBhZGRlZCB0byBpbWFnZSBmZWVkLicgOiAnVGVzdCBwYWdlIHNlbnQgdG8gcHJpbnRlci4nKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2V0RXJyKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZXRUZXN0aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVMYWJlbDogUmVjb3JkPFByaW50TW9kZSwgc3RyaW5nPiA9IHtcbiAgICAgICAgZXNjcDogJ1x1RDgzRFx1REQwQyBFU0MvUCB2aWEgU2VyaWFsIFBvcnQnLFxuICAgICAgICBjdXBzOiAnXHVEODNEXHVEQ0M0IFBERiB2aWEgQ1VQUycsXG4gICAgICAgIGltYWdlZmVlZDogJ1x1RDgzRFx1RERCQ1x1RkUwRiBJbWFnZSBGZWVkICh0ZXN0aW5nKScsXG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWN0aW9uIHN0eWxlPXtTLmJveH0+XG4gICAgICAgICAgICA8aDIgc3R5bGU9e3sgbWFyZ2luVG9wOiAwIH19PlByaW50IE1vZGU8L2gyPlxuICAgICAgICAgICAge2VyciAmJiA8cCBzdHlsZT17Uy5lcnJ9PntlcnJ9PC9wPn1cbiAgICAgICAgICAgIHttc2cgJiYgPHAgc3R5bGU9e1Mub2t9Pnttc2d9PC9wPn1cblxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17Uy5sYWJlbFRleHR9Pk91dHB1dCBNb2RlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1Muc2VsZWN0fVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bW9kZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0TW9kZSgoZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSBhcyBQcmludE1vZGUpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgeyhbJ2VzY3AnLCAnY3VwcycsICdpbWFnZWZlZWQnXSBhcyBQcmludE1vZGVbXSkubWFwKG0gPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e219IHZhbHVlPXttfT57bW9kZUxhYmVsW21dfTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIHttb2RlID09PSAnZXNjcCcgJiYgKFxuICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlNlcmlhbCBQb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlcmlhbFBvcnR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRTZXJpYWxQb3J0fVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gL2Rldi90dHlVU0IwIG9yIENPTTNcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7bW9kZSA9PT0gJ2N1cHMnICYmIDw+XG4gICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ1VQUyBQcmludGVyIE5hbWVcIiB2YWx1ZT17cHJpbnRlck5hbWV9IG9uQ2hhbmdlPXtzZXRQcmludGVyTmFtZX0gcGxhY2Vob2xkZXI9XCJlLmcuIFRNLVQ4OFZcIiAvPlxuICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBhcGVyIFNpemVcIiB2YWx1ZT17cGFwZXJTaXplfSBvbkNoYW5nZT17c2V0UGFwZXJTaXplfSBwbGFjZWhvbGRlcj1cImUuZy4gTGV0dGVyLCBBNCwgODB4Mjk3bW1cIiAvPlxuICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBhcGVyIE5hbWUgKGRpc3BsYXkgbGFiZWwpXCIgdmFsdWU9e3BhcGVyTmFtZX0gb25DaGFuZ2U9e3NldFBhcGVyTmFtZX0gcGxhY2Vob2xkZXI9XCJlLmcuIFJlY2VpcHQgUm9sbFwiIC8+XG4gICAgICAgICAgICA8Lz59XG5cbiAgICAgICAgICAgIHttb2RlID09PSAnaW1hZ2VmZWVkJyAmJiAoXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JywgbWFyZ2luVG9wOiAwIH19PlxuICAgICAgICAgICAgICAgICAgICBQcmludCBqb2JzIHdpbGwgYmUgcmVuZGVyZWQgYXMgUE5HcyBhbmQgc2hvd24gYXR7JyAnfVxuICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiL2ZlZWRcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+L2ZlZWQ8L2E+LlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBnYXA6ICc4cHgnLCBtYXJnaW5Ub3A6ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e1MuYnRufSBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmUoKX0gZGlzYWJsZWQ9e3NhdmluZ30+XG4gICAgICAgICAgICAgICAgICAgIHtzYXZpbmcgPyAnU2F2aW5nXHUyMDI2JyA6ICdTYXZlJ31cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLlMuYnRuLCBiYWNrZ3JvdW5kOiAnIzFhN2EzYScgfX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCB0ZXN0UHJpbnQoKX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Rlc3RpbmcgfHwgIXByaW50Q29uZmlnfVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17IXByaW50Q29uZmlnID8gJ1NhdmUgYSBtb2RlIGZpcnN0JyA6ICcnfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3Rlc3RpbmcgPyAnUHJpbnRpbmdcdTIwMjYnIDogJ1ByaW50IFRlc3QgUGFnZSd9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIFNlY3VyaXR5U2VjdGlvbih7IG9uU2F2ZSB9OiB7IG9uU2F2ZTogKCkgPT4gdm9pZCB9KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFttc2csIHNldE1zZ10gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW2Vyciwgc2V0RXJyXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc2V0U2F2aW5nKHRydWUpOyBzZXRFcnIoJycpOyBzZXRNc2coJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQganNvblBvc3QoJy9hcGkvY29uZmlnJywgeyBwYXNzd29yZCB9KTtcbiAgICAgICAgICAgIHNldFBhc3N3b3JkKCcnKTtcbiAgICAgICAgICAgIHNldE1zZyhwYXNzd29yZCA/ICdQYXNzd29yZCBzZXQuJyA6ICdQYXNzd29yZCBjbGVhcmVkLicpO1xuICAgICAgICAgICAgb25TYXZlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNldEVycihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWN0aW9uIHN0eWxlPXtTLmJveH0+XG4gICAgICAgICAgICA8aDIgc3R5bGU9e3sgbWFyZ2luVG9wOiAwIH19PlNlY3VyaXR5PC9oMj5cbiAgICAgICAgICAgIHtlcnIgJiYgPHAgc3R5bGU9e1MuZXJyfT57ZXJyfTwvcD59XG4gICAgICAgICAgICB7bXNnICYmIDxwIHN0eWxlPXtTLm9rfT57bXNnfTwvcD59XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb250cm9sIFBhbmVsIFBhc3N3b3JkXCIgdHlwZT1cInBhc3N3b3JkXCIgdmFsdWU9e3Bhc3N3b3JkfSBvbkNoYW5nZT17c2V0UGFzc3dvcmR9IHBsYWNlaG9sZGVyPVwiTGVhdmUgYmxhbmsgdG8gcmVtb3ZlIHBhc3N3b3JkXCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e1MuYnRufSBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmUoKX0gZGlzYWJsZWQ9e3NhdmluZ30+XG4gICAgICAgICAgICAgICAge3NhdmluZyA/ICdTYXZpbmdcdTIwMjYnIDogJ1NldCBQYXNzd29yZCd9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIExvZ1NlY3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtldmVudHMsIHNldEV2ZW50c10gPSB1c2VTdGF0ZTxEaWFnbm9zdGljRXZlbnRbXT4oW10pO1xuICAgIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSB1c2VTdGF0ZTxTdGF0dXNEYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgYXBpRmV0Y2g8eyBldmVudHM6IERpYWdub3N0aWNFdmVudFtdOyBzdGF0dXM6IFN0YXR1c0RhdGEgfT4oJy9hcGkvZXZlbnRzJyk7XG4gICAgICAgIHNldEV2ZW50cyhkLmV2ZW50cyk7XG4gICAgICAgIHNldFN0YXR1cyhkLnN0YXR1cyk7XG4gICAgfVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm9pZCBsb2FkKCk7XG4gICAgICAgIGNvbnN0IHQgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIGxvYWQoKSwgNDAwMCk7XG4gICAgICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKHQpO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IHR5cGVDb2xvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgc3RhcnR1cDogJyM4YWI0ZmYnLFxuICAgICAgICBzdWNjZXNzOiAnIzhmZjBhNCcsXG4gICAgICAgIGVycm9yOiAnI2ZmODA4MCcsXG4gICAgICAgIHByaW50OiAnI2ZmZDU4MCcsXG4gICAgICAgIGluZm86ICcjYjRiZGM4JyxcbiAgICAgICAgY29tbWFuZDogJyNkMmE4ZmYnLFxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8c2VjdGlvbiBzdHlsZT17Uy5ib3h9PlxuICAgICAgICAgICAgPGgyIHN0eWxlPXt7IG1hcmdpblRvcDogMCB9fT5Cb3QgU3RhdHVzICYgTG9nPC9oMj5cbiAgICAgICAgICAgIHtzdGF0dXMgJiYgKFxuICAgICAgICAgICAgICAgIDxkbCBzdHlsZT17eyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxNDBweCAxZnInLCBnYXA6ICc0cHggMTJweCcsIG1hcmdpbkJvdHRvbTogJzE2cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICA8ZHQgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JyB9fT5Db25uZWN0ZWQ8L2R0PjxkZCBzdHlsZT17eyBtYXJnaW46IDAgfX0+e3N0YXR1cy5jb25uZWN0ZWQgPyAnXHUyNzA1IHllcycgOiAnXHUyNzRDIG5vJ308L2RkPlxuICAgICAgICAgICAgICAgICAgICA8ZHQgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JyB9fT5Cb3Q8L2R0PjxkZCBzdHlsZT17eyBtYXJnaW46IDAgfX0+e3N0YXR1cy50YWcgPz8gJ1x1MjAxNCd9PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgPGR0IHN0eWxlPXt7IGNvbG9yOiAnI2I0YmRjOCcgfX0+U3RhcnRlZDwvZHQ+PGRkIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57c3RhdHVzLnN0YXJ0ZWRBdCA/PyAnXHUyMDE0J308L2RkPlxuICAgICAgICAgICAgICAgICAgICA8ZHQgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JyB9fT5TZXJ2ZXIgSUQ8L2R0PjxkZCBzdHlsZT17eyBtYXJnaW46IDAgfX0+e3N0YXR1cy5jb25maWd1cmVkU2VydmVySWQgPz8gJ1x1MjAxNCd9PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgPGR0IHN0eWxlPXt7IGNvbG9yOiAnI2I0YmRjOCcgfX0+U2VydmVyczwvZHQ+PGRkIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57c3RhdHVzLmd1aWxkcy5qb2luKCcsICcpIHx8ICdcdTIwMTQnfTwvZGQ+XG4gICAgICAgICAgICAgICAgPC9kbD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IG1heEhlaWdodDogJzQwMHB4Jywgb3ZlcmZsb3c6ICdhdXRvJywgYm9yZGVyOiAnMXB4IHNvbGlkICMyYjMzNDAnLCBib3JkZXJSYWRpdXM6ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgIHtldmVudHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT17eyBwYWRkaW5nOiAnMTJweCcsIG1hcmdpbjogMCwgY29sb3I6ICcjYjRiZGM4JyB9fT5ObyBldmVudHMgeWV0LjwvcD5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgYm9yZGVyQ29sbGFwc2U6ICdjb2xsYXBzZScgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9PlRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9PlR5cGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9Pk1lc3NhZ2U8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtldmVudHMubWFwKChlLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBrZXk9e1N0cmluZyhpKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9e3sgLi4uUy50ZCwgLi4uUy5tb25vLCB3aGl0ZVNwYWNlOiAnbm93cmFwJyBhcyBjb25zdCB9fT57ZS50aW1lc3RhbXB9PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17eyAuLi5TLnRkLCBjb2xvcjogdHlwZUNvbG9yW2UudHlwZV0gPz8gJyNiNGJkYzgnIH19PntlLnR5cGV9PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17Uy50ZH0+e2UubWVzc2FnZX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICApO1xufVxuXG5mdW5jdGlvbiBSZXN0YXJ0U2VjdGlvbigpOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgW21zZywgc2V0TXNnXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbZXJyLCBzZXRFcnJdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtyZXN0YXJ0aW5nLCBzZXRSZXN0YXJ0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHNldFJlc3RhcnRpbmcodHJ1ZSk7IHNldEVycignJyk7IHNldE1zZygnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBqc29uUG9zdCgnL2FwaS9yZXN0YXJ0Jywge30pO1xuICAgICAgICAgICAgc2V0TXNnKCdSZXN0YXJ0IHNpZ25hbCBzZW50LiBUaGUgc2VydmVyIHdpbGwgcmVzdGFydCBzaG9ydGx5LicpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgICAgIHNldFJlc3RhcnRpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPHNlY3Rpb24gc3R5bGU9e1MuYm94fT5cbiAgICAgICAgICAgIDxoMiBzdHlsZT17eyBtYXJnaW5Ub3A6IDAgfX0+U2VydmVyIENvbnRyb2w8L2gyPlxuICAgICAgICAgICAge2VyciAmJiA8cCBzdHlsZT17Uy5lcnJ9PntlcnJ9PC9wPn1cbiAgICAgICAgICAgIHttc2cgJiYgPHAgc3R5bGU9e1Mub2t9Pnttc2d9PC9wPn1cbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3sgLi4uUy5idG4sIGJhY2tncm91bmQ6ICcjOGE2ZDAwJyB9fSBvbkNsaWNrPXsoKSA9PiB2b2lkIHJlc3RhcnQoKX0gZGlzYWJsZWQ9e3Jlc3RhcnRpbmd9PlxuICAgICAgICAgICAgICAgIHtyZXN0YXJ0aW5nID8gJ1Jlc3RhcnRpbmdcdTIwMjYnIDogJ1Jlc3RhcnQgU2VydmVyJ31cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbn1cblxuXG5mdW5jdGlvbiBBcHAoKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtjb25maWcsIHNldENvbmZpZ10gPSB1c2VTdGF0ZTxDb25maWdEYXRhIHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW3JlZnJlc2hLZXksIHNldFJlZnJlc2hLZXldID0gdXNlU3RhdGUoMCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgYXBpRmV0Y2g8Q29uZmlnRGF0YT4oJy9hcGkvY29uZmlnJyk7XG4gICAgICAgIHNldENvbmZpZyhkKTtcbiAgICB9XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4geyB2b2lkIGxvYWRDb25maWcoKTsgfSwgW10pO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlU2F2ZSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCBsb2FkQ29uZmlnKCk7XG4gICAgICAgIHNldFJlZnJlc2hLZXkoayA9PiBrICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPG1haW4gc3R5bGU9e3sgbWF4V2lkdGg6ICc4NjBweCcsIG1hcmdpbjogJzAgYXV0bycsIHBhZGRpbmc6ICcyNHB4JyB9fT5cbiAgICAgICAgICAgIDxoMSBzdHlsZT17eyBtYXJnaW5Ub3A6IDAgfX0+XHVEODNEXHVEREE4XHVGRTBGIFdpbmRzb3IgQ29udHJvbCBQYW5lbDwvaDE+XG4gICAgICAgICAgICA8Qm90U2V0dXAgY29uZmlnPXtjb25maWd9IG9uU2F2ZT17aGFuZGxlU2F2ZX0gLz5cbiAgICAgICAgICAgIDxDaGFubmVsQmVoYXZpb3JzIHJlZnJlc2hLZXk9e3JlZnJlc2hLZXl9IC8+XG4gICAgICAgICAgICA8UHJpbnRNb2RlU2VjdGlvbiAvPlxuICAgICAgICAgICAgPFNlY3VyaXR5U2VjdGlvbiBvblNhdmU9eygpID0+IHZvaWQgbG9hZENvbmZpZygpfSAvPlxuICAgICAgICAgICAgPExvZ1NlY3Rpb24gLz5cbiAgICAgICAgICAgIDxSZXN0YXJ0U2VjdGlvbiAvPlxuICAgICAgICA8L21haW4+XG4gICAgKTtcbn1cblxuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKTtcbmlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nICNhcHAnKTtcbnJlbmRlcig8QXBwIC8+LCByb290KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDTyxJQzBCTUE7QUQxQk4sSUVVREM7QUZWQyxJR0dIQztBSEhHLElHOEZNQztBSDlGTixJSStLSEM7QUovS0csSUkwTEhDO0FKMUxHLElJNExEQztBSjVMQyxJSXNOREM7QUp0TkMsSUtTSEM7QUxURyxJS1VOQztBTFZNLElLV05DO0FMWE0sSUt5QkRDO0FMekJDLElLc0NIQztBTHRDRyxJS3FMREM7QUxyTEMsSUtzTERDO0FMdExDLElNRUlDO0FORkosSUFpQk1DLElBQWdDLENBQUc7QUFqQnpDLElBa0JNQyxJQUFZLENBQUE7QUFsQmxCLElBbUJNQyxJQUNaO0FBcEJNLElDQ01DLElBQVVDLE1BQU1EO0FBU3RCLFNBQVNFLEVBQU9DLElBQUtDLElBQUFBO0FBRTNCLFdBQVNSLE1BQUtRLEdBQU9ELENBQUFBLEdBQUlQLEVBQUFBLElBQUtRLEdBQU1SLEVBQUFBO0FBQ3BDLFNBQTZCTztBQUM5QjtBQVFnQixTQUFBRSxFQUFXQyxJQUFBQTtBQUN0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IiwgImlzVmFsaWRFbGVtZW50IiwgInJlcmVuZGVyUXVldWUiLCAicHJldkRlYm91bmNlIiwgImRlZmVyIiwgImRlcHRoU29ydCIsICJfaWQiLCAiRVZFTlRfRElTUEFUQ0hFRCIsICJFVkVOVF9BVFRBQ0hFRCIsICJDQVBUVVJFX1JFR0VYIiwgImV2ZW50Q2xvY2siLCAiZXZlbnRQcm94eSIsICJldmVudFByb3h5Q2FwdHVyZSIsICJpIiwgIkVNUFRZX09CSiIsICJFTVBUWV9BUlIiLCAiSVNfTk9OX0RJTUVOU0lPTkFMIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiYXNzaWduIiwgIm9iaiIsICJwcm9wcyIsICJyZW1vdmVOb2RlIiwgIm5vZGUiLCAicGFyZW50Tm9kZSIsICJyZW1vdmVDaGlsZCIsICJjcmVhdGVFbGVtZW50IiwgInR5cGUiLCAiY2hpbGRyZW4iLCAia2V5IiwgInJlZiIsICJub3JtYWxpemVkUHJvcHMiLCAiYXJndW1lbnRzIiwgImxlbmd0aCIsICJjYWxsIiwgImRlZmF1bHRQcm9wcyIsICJjcmVhdGVWTm9kZSIsICJvcmlnaW5hbCIsICJ2bm9kZSIsICJfX2siLCAiX18iLCAiX19iIiwgIl9fZSIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiX192IiwgIl9faSIsICJfX3UiLCAiRnJhZ21lbnQiLCAicHJvcHMiLCAiY2hpbGRyZW4iLCAiQmFzZUNvbXBvbmVudCIsICJjb250ZXh0IiwgInRoaXMiLCAiZ2V0RG9tU2libGluZyIsICJ2bm9kZSIsICJjaGlsZEluZGV4IiwgIl9fIiwgIl9faSIsICJzaWJsaW5nIiwgIl9fayIsICJsZW5ndGgiLCAiX19lIiwgInR5cGUiLCAicmVuZGVyQ29tcG9uZW50IiwgImNvbXBvbmVudCIsICJfX1AiLCAiX19kIiwgIm9sZFZOb2RlIiwgIl9fdiIsICJvbGREb20iLCAiY29tbWl0UXVldWUiLCAicmVmUXVldWUiLCAibmV3Vk5vZGUiLCAiYXNzaWduIiwgIm9wdGlvbnMiLCAiZGlmZiIsICJfX24iLCAibmFtZXNwYWNlVVJJIiwgIl9fdSIsICJjb21taXRSb290IiwgInVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIiwgIl9fYyIsICJiYXNlIiwgInNvbWUiLCAiY2hpbGQiLCAiZW5xdWV1ZVJlbmRlciIsICJjIiwgInJlcmVuZGVyUXVldWUiLCAicHVzaCIsICJwcm9jZXNzIiwgIl9fciIsICJwcmV2RGVib3VuY2UiLCAiZGVib3VuY2VSZW5kZXJpbmciLCAiZGVmZXIiLCAibCIsICJzb3J0IiwgImRlcHRoU29ydCIsICJzaGlmdCIsICJkaWZmQ2hpbGRyZW4iLCAicGFyZW50RG9tIiwgInJlbmRlclJlc3VsdCIsICJuZXdQYXJlbnRWTm9kZSIsICJvbGRQYXJlbnRWTm9kZSIsICJnbG9iYWxDb250ZXh0IiwgIm5hbWVzcGFjZSIsICJleGNlc3NEb21DaGlsZHJlbiIsICJpc0h5ZHJhdGluZyIsICJpIiwgImNoaWxkVk5vZGUiLCAibmV3RG9tIiwgImZpcnN0Q2hpbGREb20iLCAicmVzdWx0IiwgInNob3VsZFBsYWNlIiwgIm9sZENoaWxkcmVuIiwgIkVNUFRZX0FSUiIsICJuZXdDaGlsZHJlbkxlbmd0aCIsICJjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5IiwgIkVNUFRZX09CSiIsICJyZWYiLCAiYXBwbHlSZWYiLCAiaW5zZXJ0IiwgIm5leHRTaWJsaW5nIiwgInNrZXdlZEluZGV4IiwgIm1hdGNoaW5nSW5kZXgiLCAib2xkQ2hpbGRyZW5MZW5ndGgiLCAicmVtYWluaW5nT2xkQ2hpbGRyZW4iLCAic2tldyIsICJBcnJheSIsICJjb25zdHJ1Y3RvciIsICJTdHJpbmciLCAiY3JlYXRlVk5vZGUiLCAiaXNBcnJheSIsICJfX2IiLCAia2V5IiwgImZpbmRNYXRjaGluZ0luZGV4IiwgInVubW91bnQiLCAicGFyZW50Vk5vZGUiLCAicGFyZW50Tm9kZSIsICJpbnNlcnRCZWZvcmUiLCAibm9kZVR5cGUiLCAiZmluZE1hdGNoaW5nSW5kZXgiLCAiY2hpbGRWTm9kZSIsICJvbGRDaGlsZHJlbiIsICJza2V3ZWRJbmRleCIsICJyZW1haW5pbmdPbGRDaGlsZHJlbiIsICJ4IiwgInkiLCAiY2hpbGRJbmRleCIsICJrZXkiLCAidHlwZSIsICJvbGRWTm9kZSIsICJtYXRjaGVkIiwgIl9fdSIsICJsZW5ndGgiLCAic2V0U3R5bGUiLCAic3R5bGUiLCAidmFsdWUiLCAic2V0UHJvcGVydHkiLCAiSVNfTk9OX0RJTUVOU0lPTkFMIiwgInRlc3QiLCAiZG9tIiwgIm5hbWUiLCAib2xkVmFsdWUiLCAibmFtZXNwYWNlIiwgInVzZUNhcHR1cmUiLCAibG93ZXJDYXNlTmFtZSIsICJvIiwgImNzc1RleHQiLCAicmVwbGFjZSIsICJDQVBUVVJFX1JFR0VYIiwgInRvTG93ZXJDYXNlIiwgInNsaWNlIiwgImwiLCAiRVZFTlRfQVRUQUNIRUQiLCAiZXZlbnRDbG9jayIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50UHJveHlDYXB0dXJlIiwgImV2ZW50UHJveHkiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiY3JlYXRlRXZlbnRQcm94eSIsICJ0aGlzIiwgImV2ZW50SGFuZGxlciIsICJFVkVOVF9ESVNQQVRDSEVEIiwgIm9wdGlvbnMiLCAiZXZlbnQiLCAiZGlmZiIsICJwYXJlbnREb20iLCAibmV3Vk5vZGUiLCAiZ2xvYmFsQ29udGV4dCIsICJleGNlc3NEb21DaGlsZHJlbiIsICJjb21taXRRdWV1ZSIsICJvbGREb20iLCAiaXNIeWRyYXRpbmciLCAicmVmUXVldWUiLCAidG1wIiwgIm9sZENvbW1pdFF1ZXVlTGVuZ3RoIiwgImMiLCAiaXNOZXciLCAib2xkUHJvcHMiLCAib2xkU3RhdGUiLCAic25hcHNob3QiLCAiY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uIiwgIm5ld1Byb3BzIiwgImlzQ2xhc3NDb21wb25lbnQiLCAicHJvdmlkZXIiLCAiY29tcG9uZW50Q29udGV4dCIsICJyZW5kZXJIb29rIiwgImNvdW50IiwgInJlbmRlclJlc3VsdCIsICJpIiwgIm5ld1R5cGUiLCAiY29uc3RydWN0b3IiLCAiX19lIiwgIl9fYiIsICJvdXRlciIsICJwcm9wcyIsICJwcm90b3R5cGUiLCAicmVuZGVyIiwgImNvbnRleHRUeXBlIiwgIl9fYyIsICJfXyIsICJfX0UiLCAiQmFzZUNvbXBvbmVudCIsICJkb1JlbmRlciIsICJzdWIiLCAic3RhdGUiLCAiX19uIiwgIl9fZCIsICJfX2giLCAiX3NiIiwgIl9fcyIsICJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCAiYXNzaWduIiwgIl9fdiIsICJjb21wb25lbnRXaWxsTW91bnQiLCAiY29tcG9uZW50RGlkTW91bnQiLCAicHVzaCIsICJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwgInNob3VsZENvbXBvbmVudFVwZGF0ZSIsICJfX2siLCAic29tZSIsICJ2bm9kZSIsICJFTVBUWV9BUlIiLCAiYXBwbHkiLCAiY29tcG9uZW50V2lsbFVwZGF0ZSIsICJjb21wb25lbnREaWRVcGRhdGUiLCAiY29udGV4dCIsICJfX1AiLCAiX19yIiwgImdldENoaWxkQ29udGV4dCIsICJnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSIsICJGcmFnbWVudCIsICJjbG9uZU5vZGUiLCAiY2hpbGRyZW4iLCAiZGlmZkNoaWxkcmVuIiwgImlzQXJyYXkiLCAiYmFzZSIsICJ0aGVuIiwgIk1PREVfSFlEUkFURSIsICJub2RlVHlwZSIsICJuZXh0U2libGluZyIsICJpbmRleE9mIiwgInJlbW92ZU5vZGUiLCAibWFya0FzRm9yY2UiLCAiZGlmZkVsZW1lbnROb2RlcyIsICJkaWZmZWQiLCAiY29tbWl0Um9vdCIsICJyb290IiwgImFwcGx5UmVmIiwgImNiIiwgImNhbGwiLCAibm9kZSIsICJtYXAiLCAibmV3SHRtbCIsICJvbGRIdG1sIiwgIm5ld0NoaWxkcmVuIiwgImlucHV0VmFsdWUiLCAiY2hlY2tlZCIsICJFTVBUWV9PQkoiLCAibG9jYWxOYW1lIiwgImRvY3VtZW50IiwgImNyZWF0ZVRleHROb2RlIiwgImNyZWF0ZUVsZW1lbnROUyIsICJpcyIsICJfX20iLCAiZGF0YSIsICJkZWZhdWx0VmFsdWUiLCAiY2hpbGROb2RlcyIsICJhdHRyaWJ1dGVzIiwgIl9faHRtbCIsICJpbm5lckhUTUwiLCAiY29udGVudCIsICJnZXREb21TaWJsaW5nIiwgInVuZGVmaW5lZCIsICJyZWYiLCAiaGFzUmVmVW5tb3VudCIsICJjdXJyZW50IiwgInVubW91bnQiLCAicGFyZW50Vk5vZGUiLCAic2tpcFJlbW92ZSIsICJyIiwgImNvbXBvbmVudFdpbGxVbm1vdW50IiwgInJlcGxhY2VOb2RlIiwgImRvY3VtZW50RWxlbWVudCIsICJjcmVhdGVFbGVtZW50IiwgIm5hbWVzcGFjZVVSSSIsICJmaXJzdENoaWxkIiwgInNsaWNlIiwgIkVNUFRZX0FSUiIsICJvcHRpb25zIiwgIl9fZSIsICJlcnJvciIsICJ2bm9kZSIsICJvbGRWTm9kZSIsICJlcnJvckluZm8iLCAiY29tcG9uZW50IiwgImN0b3IiLCAiaGFuZGxlZCIsICJfXyIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwgInNldFN0YXRlIiwgIl9fZCIsICJjb21wb25lbnREaWRDYXRjaCIsICJfX0UiLCAiZSIsICJ2bm9kZUlkIiwgImlzVmFsaWRFbGVtZW50IiwgIkJhc2VDb21wb25lbnQiLCAicHJvdG90eXBlIiwgInVwZGF0ZSIsICJjYWxsYmFjayIsICJzIiwgInRoaXMiLCAiX19zIiwgInN0YXRlIiwgImFzc2lnbiIsICJwcm9wcyIsICJfX3YiLCAiX3NiIiwgInB1c2giLCAiZW5xdWV1ZVJlbmRlciIsICJmb3JjZVVwZGF0ZSIsICJfX2giLCAicmVuZGVyIiwgIkZyYWdtZW50IiwgInJlcmVuZGVyUXVldWUiLCAiZGVmZXIiLCAiUHJvbWlzZSIsICJ0aGVuIiwgImJpbmQiLCAicmVzb2x2ZSIsICJzZXRUaW1lb3V0IiwgImRlcHRoU29ydCIsICJhIiwgImIiLCAiX19iIiwgInByb2Nlc3MiLCAiX19yIiwgIl9pZCIsICJNYXRoIiwgInJhbmRvbSIsICJ0b1N0cmluZyIsICJFVkVOVF9ESVNQQVRDSEVEIiwgIkVWRU5UX0FUVEFDSEVEIiwgIkNBUFRVUkVfUkVHRVgiLCAiZXZlbnRDbG9jayIsICJldmVudFByb3h5IiwgImNyZWF0ZUV2ZW50UHJveHkiLCAiZXZlbnRQcm94eUNhcHR1cmUiLCAiaSIsICJjdXJyZW50SW5kZXgiLCAiY3VycmVudENvbXBvbmVudCIsICJwcmV2aW91c0NvbXBvbmVudCIsICJwcmV2UmFmIiwgImN1cnJlbnRIb29rIiwgImFmdGVyUGFpbnRFZmZlY3RzIiwgIm9wdGlvbnMiLCAiX29wdGlvbnMiLCAib2xkQmVmb3JlRGlmZiIsICJfX2IiLCAib2xkQmVmb3JlUmVuZGVyIiwgIl9fciIsICJvbGRBZnRlckRpZmYiLCAiZGlmZmVkIiwgIm9sZENvbW1pdCIsICJfX2MiLCAib2xkQmVmb3JlVW5tb3VudCIsICJ1bm1vdW50IiwgIm9sZFJvb3QiLCAiX18iLCAiZ2V0SG9va1N0YXRlIiwgImluZGV4IiwgInR5cGUiLCAiX19oIiwgImhvb2tzIiwgIl9fSCIsICJsZW5ndGgiLCAicHVzaCIsICJ1c2VTdGF0ZSIsICJpbml0aWFsU3RhdGUiLCAidXNlUmVkdWNlciIsICJpbnZva2VPclJldHVybiIsICJyZWR1Y2VyIiwgImluaXQiLCAiaG9va1N0YXRlIiwgIl9yZWR1Y2VyIiwgImFjdGlvbiIsICJjdXJyZW50VmFsdWUiLCAiX19OIiwgIm5leHRWYWx1ZSIsICJzZXRTdGF0ZSIsICJfX2YiLCAidXBkYXRlSG9va1N0YXRlIiwgInAiLCAicyIsICJjIiwgInVwZGF0ZWRIb29rIiwgInNob3VsZFVwZGF0ZSIsICJwcm9wcyIsICJzb21lIiwgImhvb2tJdGVtIiwgInByZXZTY3UiLCAicmVzdWx0IiwgImNhbGwiLCAidGhpcyIsICJzaG91bGRDb21wb25lbnRVcGRhdGUiLCAicHJldkNXVSIsICJjb21wb25lbnRXaWxsVXBkYXRlIiwgIl9fZSIsICJ0bXAiLCAidXNlRWZmZWN0IiwgImNhbGxiYWNrIiwgImFyZ3MiLCAic3RhdGUiLCAiX19zIiwgImFyZ3NDaGFuZ2VkIiwgIl9wZW5kaW5nQXJncyIsICJmbHVzaEFmdGVyUGFpbnRFZmZlY3RzIiwgImNvbXBvbmVudCIsICJhZnRlclBhaW50RWZmZWN0cyIsICJzaGlmdCIsICJob29rcyIsICJfX0giLCAiX19QIiwgIl9faCIsICJzb21lIiwgImludm9rZUNsZWFudXAiLCAiaW52b2tlRWZmZWN0IiwgImUiLCAib3B0aW9ucyIsICJfX2UiLCAiX192IiwgIl9fYiIsICJ2bm9kZSIsICJjdXJyZW50Q29tcG9uZW50IiwgIm9sZEJlZm9yZURpZmYiLCAiX18iLCAicGFyZW50RG9tIiwgIl9fayIsICJfX20iLCAib2xkUm9vdCIsICJfX3IiLCAib2xkQmVmb3JlUmVuZGVyIiwgImN1cnJlbnRJbmRleCIsICJfX2MiLCAicHJldmlvdXNDb21wb25lbnQiLCAiaG9va0l0ZW0iLCAiX19OIiwgIl9wZW5kaW5nQXJncyIsICJkaWZmZWQiLCAib2xkQWZ0ZXJEaWZmIiwgImMiLCAibGVuZ3RoIiwgInB1c2giLCAicHJldlJhZiIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAiYWZ0ZXJOZXh0RnJhbWUiLCAiY29tbWl0UXVldWUiLCAiZmlsdGVyIiwgImNiIiwgIm9sZENvbW1pdCIsICJ1bm1vdW50IiwgIm9sZEJlZm9yZVVubW91bnQiLCAiaGFzRXJyb3JlZCIsICJzIiwgIkhBU19SQUYiLCAiY2FsbGJhY2siLCAicmFmIiwgImRvbmUiLCAiY2xlYXJUaW1lb3V0IiwgInRpbWVvdXQiLCAiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCAic2V0VGltZW91dCIsICJob29rIiwgImNvbXAiLCAiY2xlYW51cCIsICJhcmdzQ2hhbmdlZCIsICJvbGRBcmdzIiwgIm5ld0FyZ3MiLCAiYXJnIiwgImluZGV4IiwgImludm9rZU9yUmV0dXJuIiwgImYiLCAidm5vZGVJZCIsICJjcmVhdGVWTm9kZSIsICJ0eXBlIiwgInByb3BzIiwgImtleSIsICJpc1N0YXRpY0NoaWxkcmVuIiwgIl9fc291cmNlIiwgIl9fc2VsZiIsICJyZWYiLCAiaSIsICJub3JtYWxpemVkUHJvcHMiLCAidm5vZGUiLCAiX19rIiwgIl9fIiwgIl9fYiIsICJfX2UiLCAiX19jIiwgImNvbnN0cnVjdG9yIiwgIl9fdiIsICJ2bm9kZUlkIiwgIl9faSIsICJfX3UiLCAiZGVmYXVsdFByb3BzIiwgIm9wdGlvbnMiLCAiUyIsICJ1IiwgImUiLCAidCIsICJ2IiwgImMiLCAiZCIsICJoIiwgIm0iLCAiaSIsICJrIl0KfQo=